MiLoadHotPatchForUserSid

INT64 __fastcall MiLoadHotPatchForUserSid(UNICODE_STRING *rcx0, VOID *a2, INT64 *a3){
  int v6; 
  CHAR *HotPatchRecord; 
  _ETHREAD *CurrentThread; 
  INT64 v9; 
  char v10; 
  bool v11; 
  int v12; 
  INT64 v13; 
  _QWORD *v14; 
  _QWORD *v15; 
  PADAPTER_OBJECT DmaAdapter; 
  HANDLE Handle; 
  _QWORD a1[2]; 
  ULONG DestinationSidLength; 
  Handle = 0i64;
  DmaAdapter = 0i64;
  *(_OWORD *)a1 = 0i64;
  v6 = MiOpenHotPatchFile((INT64)rcx0, 1i64, 0, &Handle, (INT64 *)&DmaAdapter, 0i64, a3, 0i64);
  if( v6 < 0 )
    goto LABEL_23;
  HotPatchRecord = MiAllocateHotPatchRecord(*(unsigned int *)a3, *((unsigned int *)a3 + 1), (UINT8 **)rcx0);
  if( !HotPatchRecord )
  {
    v6 = -1073741670;
    goto LABEL_23;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  DestinationSidLength = RtlLengthSid(a2);
  a1[0] = RtlHashBytes2((const UINT8 *)a2, DestinationSidLength);
  a1[1] = a2;
  --*((_WORD *)CurrentThread + 243);
  ExAcquirePushLockExclusiveEx((UINT64)&MiHotPatchListLock, 0i64);
  v9 = MiUserSidPatchLists;
  v10 = 0;
  v11 = 0;
  if( !MiUserSidPatchLists )
    goto LABEL_12;
  while( 1 )
  {
    v12 = MiCompareUserSidHotPatchNodes(a1, v9);
    if( v12 <= 0 )
      break;
    v13 = *(_QWORD *)(v9 + 8);
    if( !v13 )
    {
      v11 = 1;
      goto LABEL_13;
    }
LABEL_10:
    v9 = v13;
  }
  if( v12 < 0 )
  {
    v13 = *(_QWORD *)v9;
    if( !*(_QWORD *)v9 )
      goto LABEL_13;
    goto LABEL_10;
  }
  v10 = 1;
LABEL_12:
  if( !v10 )
  {
LABEL_13:
    LODWORD(v14) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
    v15 = v14;
    if( !v14 )
    {
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&MiHotPatchListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)&MiHotPatchListLock);
      KeAbPostRelease(&MiHotPatchListLock);
      KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      v6 = -1073741670;
      goto LABEL_21;
    }
    v14[3] = 0i64;
    v14[4] = a1[0];
    RtlCopySid(DestinationSidLength, v14 + 5, a2);
    RtlAvlInsertNodeEx((unsigned __int64 *)&MiUserSidPatchLists, v9, v11, v15);
    v9 = (INT64)v15;
  }
  MiInsertHotPatchRecord((RTL_BALANCED_NODE **)(v9 + 24), (RTL_BALANCED_NODE *)HotPatchRecord, 1i64);
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&MiHotPatchListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&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(unsigned int)v6;
}

Referenced by:

NtManageHotPatch