MiQueryLoadedPatches
__int64 __fastcall MiQueryLoadedPatches(UINT8 *a1, _QWORD *a2, _DWORD *a3, __int64 a4, int a5){
_ETHREAD *CurrentThread;
INT64 *v6;
unsigned __int64 j;
_QWORD *v10;
_RTL_BALANCED_NODE *UserSidHotPatchContext;
unsigned __int64 v13;
unsigned int v14;
_QWORD *v15;
unsigned __int64 i;
unsigned __int64 v17;
_QWORD **v18;
_QWORD *v19;
unsigned int v20;
int v21;
_DWORD *Pool;
_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;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = 0i64;
j = 0i64;
v34 = CurrentThread;
v10 = a2;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(&MiHotPatchListLock, 0i64);
if( a1 )
{
UserSidHotPatchContext = MiFindUserSidHotPatchContext(a1);
if( UserSidHotPatchContext )
v6 = (INT64 *)&UserSidHotPatchContext[1];
}
else
{
v6 = &MiGlobalHotPatchList;
}
v13 = 96i64;
v14 = 0;
if( v6 )
{
v15 = (_QWORD *)*v6;
j = 0i64;
while( v15 )
{
j = (unsigned __int64)v15;
v15 = (_QWORD *)*v15;
}
i = j;
while( i )
{
++v14;
v17 = i;
v13 += *(unsigned __int16 *)(i + 32) + 24i64;
v18 = *(_QWORD ***)(i + 8);
if( v18 )
{
v19 = *v18;
for( i = *(_QWORD *)(i + 8); v19; v19 = (_QWORD *)*v19 )
i = (unsigned __int64)v19;
}
else
{
while( 1 )
{
i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !i || *(_QWORD *)i == v17 )
break;
v17 = i;
}
}
}
}
if( (unsigned int)a5 >= v13 )
{
v21 = v13;
Pool = MiAllocatePool(256i64, (unsigned int)v13, 0x71486D4Dui64);
v23 = Pool;
if( !Pool )
{
v20 = -1073741670;
goto LABEL_40;
}
*Pool = 2;
if( a1 )
RtlCopySid(0x44ui64, Pool + 1, a1);
if( v14 )
{
v24 = v14;
v25 = (_UNICODE_STRING *)(v23 + 24);
*((_QWORD *)v23 + 10) = v23 + 24;
v26 = (char *)v23 - a4;
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, (PCUNICODE_STRING)(j + 32));
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);
}
v10 = a2;
*((_QWORD *)v23 + 11) = v27 - v26;
*((_QWORD *)v23 + 10) = (char *)v25 - v26;
CurrentThread = v34;
}
*v10 = v23;
*a3 = v21;
}
else
{
if( v13 > 0xFFFFFFFF )
{
v20 = -1073741675;
goto LABEL_40;
}
*v10 = 0i64;
*a3 = v13;
}
v20 = 0;
LABEL_40:
if( _InterlockedCompareExchange64(&MiHotPatchListLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&MiHotPatchListLock);
KeAbPostRelease(&MiHotPatchListLock);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v20;
}Referenced by:
NtManageHotPatch