MiQueryLoadedPatches

INT64 __stdcall MiQueryLoadedPatches(PSID SourceSid, INT64 a2){
  _DWORD *v2; 
  __int64 v3; 
  _ETHREAD *CurrentThread; 
  RTL_BALANCED_NODE **v5; 
  unsigned __int64 j; 
  __int64 v7; 
  _DWORD *v8; 
  _QWORD *v9; 
  _QWORD *UserSidHotPatchContext; 
  unsigned __int64 v12; 
  unsigned int v13; 
  RTL_BALANCED_NODE *v14; 
  unsigned __int64 i; 
  unsigned __int64 v16; 
  _QWORD **v17; 
  _QWORD *v18; 
  unsigned int v19; 
  int v20; 
  _DWORD *v21; 
  UNICODE_STRING *v22; 
  _DWORD *v23; 
  __int64 v24; 
  UNICODE_STRING *v25; 
  char *v26; 
  char *v27; 
  wchar_t *v28; 
  unsigned __int16 v29; 
  unsigned __int64 v30; 
  _QWORD **v31; 
  _QWORD *v32; 
  _ETHREAD *v34; 
  _DWORD *v36; 
  unsigned int v37; 
  v36 = v2;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = 0i64;
  j = 0i64;
  v34 = CurrentThread;
  v7 = v3;
  v8 = v2;
  v9 = (_QWORD *)a2;
  --*((_WORD *)CurrentThread + 243);
  ExAcquirePushLockSharedEx((UINT64)&MiHotPatchListLock, 0i64);
  if( SourceSid )
  {
    UserSidHotPatchContext = MiFindUserSidHotPatchContext((UINT8 *)SourceSid);
    if( UserSidHotPatchContext )
      v5 = (RTL_BALANCED_NODE **)(UserSidHotPatchContext + 3);
  }
  else
  {
    v5 = &MiGlobalHotPatchList;
  }
  v12 = 96i64;
  v13 = 0;
  if( v5 )
  {
    v14 = *v5;
    j = 0i64;
    while( v14 )
    {
      j = (unsigned __int64)v14;
      v14 = v14->Children[0];
    }
    i = j;
    while( i )
    {
      ++v13;
      v16 = i;
      v12 += *(unsigned __int16 *)(i + 32) + 24i64;
      v17 = *(_QWORD ***)(i + 8);
      if( v17 )
      {
        v18 = *v17;
        for( i = *(_QWORD *)(i + 8); v18; v18 = (_QWORD *)*v18 )
          i = (unsigned __int64)v18;
      }
      else
      {
        while( 1 )
        {
          i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
          if( !i || *(_QWORD *)i == v16 )
            break;
          v16 = i;
        }
      }
    }
  }
  if( v37 >= v12 )
  {
    v20 = v12;
    LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
    v23 = v21;
    if( !v21 )
    {
      v19 = -1073741670;
      goto LABEL_40;
    }
    *v21 = 2;
    if( SourceSid )
      RtlCopySid(0x44u, v21 + 1, SourceSid);
    if( v13 )
    {
      v24 = v13;
      v25 = (UNICODE_STRING *)(v23 + 24);
      *((_QWORD *)v23 + 10) = v23 + 24;
      v26 = (char *)v23 - v7;
      v27 = (char *)&v23[4 * v24 + 24];
      *((_QWORD *)v23 + 11) = v27;
      v28 = (wchar_t *)&v27[8 * v24];
      if( j )
      {
        do
        {
          *(_DWORD *)v27 = *(_DWORD *)(j + 24);
          *((_DWORD *)v27 + 1) = *(_DWORD *)(j + 28);
          v29 = *(_WORD *)(j + 32);
          v25->Length = v29;
          v25->MaximumLength = v29;
          v25->Buffer = v28;
          RtlCopyUnicodeString(v25, (UNICODE_STRING *)(j + 32), v22);
          v25->Buffer = (wchar_t *)((char *)v25->Buffer - v26);
          v27 += 8;
          ++v23[18];
          v30 = j;
          v28 = (wchar_t *)((char *)v28 + v25->Length);
          ++v25;
          v31 = *(_QWORD ***)(j + 8);
          if( v31 )
          {
            v32 = *v31;
            for( j = *(_QWORD *)(j + 8); v32; v32 = (_QWORD *)*v32 )
              j = (unsigned __int64)v32;
          }
          else
          {
            while( 1 )
            {
              j = *(_QWORD *)(j + 16) & 0xFFFFFFFFFFFFFFFCui64;
              if( !j || *(_QWORD *)j == v30 )
                break;
              v30 = j;
            }
          }
        }
        while( j );
        v27 = (char *)*((_QWORD *)v23 + 11);
        v25 = (UNICODE_STRING *)*((_QWORD *)v23 + 10);
      }
      v9 = (_QWORD *)a2;
      *((_QWORD *)v23 + 11) = v27 - v26;
      *((_QWORD *)v23 + 10) = (char *)v25 - v26;
      CurrentThread = v34;
    }
    *v9 = v23;
    *v36 = v20;
  }
  else
  {
    if( v12 > 0xFFFFFFFF )
    {
      v19 = -1073741675;
      goto LABEL_40;
    }
    *v9 = 0i64;
    *v8 = v12;
  }
  v19 = 0;
LABEL_40:
  if( _InterlockedCompareExchange64((volatile signed __int64 *)&MiHotPatchListLock, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)&MiHotPatchListLock);
  KeAbPostRelease(&MiHotPatchListLock);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  return v19;
}

Referenced by:

NtManageHotPatch