MiLoadHotPatchForUserSid

NTSTATUS __stdcall MiLoadHotPatchForUserSid(_UNICODE_STRING *a1, VOID *a2, INT64 *a3){
  NTSTATUS v6; 
  _RTL_BALANCED_NODE *HotPatchRecord; 
  _ETHREAD *CurrentThread; 
  __int64 v9; 
  _RTL_BALANCED_NODE *Root; 
  char v11; 
  BOOL v12; 
  int v13; 
  _RTL_BALANCED_NODE *v14; 
  _RTL_BALANCED_NODE *Pool; 
  _RTL_BALANCED_NODE *v16; 
  PADAPTER_OBJECT DmaAdapter; 
  VOID *Handle; 
  __int128 v20; 
  ULONG DestinationSidLength; 

  Handle = 0i64;
  DmaAdapter = 0i64;
  v20 = 0i64;
  v6 = MiOpenHotPatchFile(a1, 1, 0, &Handle, (_SECTION **)&DmaAdapter, 0i64, a3, 0i64);
  if( v6 < 0 )
    goto LABEL_23;
  HotPatchRecord = (_RTL_BALANCED_NODE *)MiAllocateHotPatchRecord(*(_DWORD *)a3, *((_DWORD *)a3 + 1), (const VOID **)a1);
  if( !HotPatchRecord )
  {
    v6 = -1073741670;
    goto LABEL_23;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  DestinationSidLength = RtlLengthSid((INT64)a2);
  LODWORD(v9) = RtlHashBytes2((const UINT8 *)a2, DestinationSidLength);
  *(_QWORD *)&v20 = v9;
  *((_QWORD *)&v20 + 1) = a2;
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockExclusiveEx(&MiHotPatchListLock, 0i64);
  Root = MiUserSidPatchLists.Root;
  v11 = 0;
  v12 = 0;
  if( !MiUserSidPatchLists.Root )
    goto LABEL_12;
  while( 1 )
  {
    v13 = MiCompareUserSidHotPatchNodes(&v20, (__int64)Root);
    if( v13 <= 0 )
      break;
    v14 = Root->Children[1];
    if( !v14 )
    {
      v12 = 1;
      goto LABEL_13;
    }
LABEL_10:
    Root = v14;
  }
  if( v13 < 0 )
  {
    v14 = Root->Children[0];
    if( !Root->Children[0] )
      goto LABEL_13;
    goto LABEL_10;
  }
  v11 = 1;
LABEL_12:
  if( !v11 )
  {
LABEL_13:
    Pool = (_RTL_BALANCED_NODE *)MiAllocatePool(256i64, DestinationSidLength + 40, 0x73486D4Dui64);
    v16 = Pool;
    if( !Pool )
    {
      if( (_InterlockedExchangeAdd64(&MiHotPatchListLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(&MiHotPatchListLock);
      KeAbPostRelease(&MiHotPatchListLock);
      KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      v6 = -1073741670;
      goto LABEL_21;
    }
    Pool[1].Children[0] = 0i64;
    Pool[1].Children[1] = (_RTL_BALANCED_NODE *)v20;
    RtlCopySid(DestinationSidLength, &Pool[1].16, a2);
    RtlAvlInsertNodeEx(&MiUserSidPatchLists.Root, (UINT64)Root, v12, v16);
    Root = v16;
  }
  MiInsertHotPatchRecord(Root[1].Children, HotPatchRecord, 1i64);
  if( (_InterlockedExchangeAdd64(&MiHotPatchListLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&MiHotPatchListLock);
  KeAbPostRelease(&MiHotPatchListLock);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  HotPatchRecord = 0i64;
  MiHotPatchAllProcesses(*(unsigned int *)a3, *((unsigned int *)a3 + 1));
  v6 = 0;
LABEL_21:
  if( HotPatchRecord )
    ExFreePoolWithTag(HotPatchRecord, 0);
LABEL_23:
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  if( Handle )
    ObCloseHandle(Handle, 0);
  return v6;
}

Referenced by:

NtManageHotPatch