MiInsertHotPatchRecord
VOID __fastcall MiInsertHotPatchRecord(RTL_BALANCED_NODE **a1, RTL_BALANCED_NODE *a2, INT64 a3){
__int64 *v3;
int v4;
RTL_BALANCED_NODE *v5;
_ETHREAD *CurrentThread;
bool v8;
__int64 *v9;
int v10;
int v11;
__int64 v12;
v3 = 0i64;
v4 = a3;
v5 = a2;
if( (_DWORD)a3 )
{
CurrentThread = 0i64;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)&MiHotPatchListLock, 0i64);
v5 = a2;
}
v8 = 0;
LABEL_5:
v9 = (__int64 *)*a1;
v10 = 1;
if( *a1 )
{
while( 1 )
{
v11 = MiCompareHotPatchNodes((INT64)v5, (INT64)v9);
if( v11 <= 0 )
{
if( v11 >= 0 )
{
v3 = v9;
RtlAvlRemoveNode((unsigned __int64 *)a1, v9);
v5 = a2;
goto LABEL_5;
}
v12 = *v9;
if( !*v9 )
break;
}
else
{
v12 = v9[1];
if( !v12 )
{
v8 = 1;
break;
}
}
v9 = (__int64 *)v12;
v5 = a2;
}
}
RtlAvlInsertNodeEx((unsigned __int64 *)a1, (__int64)v9, v8, a2);
if( MiHotPatchGeneration != -1 )
v10 = MiHotPatchGeneration + 1;
MiHotPatchGeneration = v10;
if( !v4 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&MiHotPatchListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&MiHotPatchListLock);
KeAbPostRelease(&MiHotPatchListLock);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( v3 )
ExFreePoolWithTag(v3, 0);
}Referenced by:
MiLoadHotPatch
MiLoadHotPatchForUserSid
MmRegisterHotPatch