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