MiCheckHoldFaultForHotPatch
INT64 __fastcall MiCheckHoldFaultForHotPatch(INT64 a1, INT64 *a2){
INT64 v2;
bool v3;
unsigned int v5;
_QWORD *v6;
_QWORD *v7;
unsigned __int64 v8;
_QWORD *v9;
_QWORD *v10;
INT64 *SharedVm;
__int128 v13;
__int128 Object;
__int64 v15;
v2 = a2[7];
v3 = (a2[1] & 2) == 0;
v15 = 0i64;
v13 = 0i64;
Object = 0i64;
if( v3 || (unsigned __int64)*a2 > 0x7FFFFFFEFFFFi64 )
return 0i64;
v5 = 0;
v6 = (_QWORD *)(a1 + 24);
while( 1 )
{
v7 = (_QWORD *)*v6;
if( (_QWORD *)*v6 == v6 )
break;
v8 = *a2;
do
{
v9 = v7;
if( v8 >= v7[2] && v8 <= v7[3] )
break;
v7 = (_QWORD *)*v7;
}
while( v7 != v6 );
if( v7 == v6 )
break;
LOWORD(Object) = 0;
DWORD1(Object) = 0;
v15 = (__int64)&Object + 8;
*((_QWORD *)&Object + 1) = (char *)&Object + 8;
BYTE2(Object) = 6;
v10 = (_QWORD *)v9[5];
if( (_QWORD *)*v10 != v9 + 4 )
__fastfail(3u);
*((_QWORD *)&v13 + 1) = v9[5];
*(_QWORD *)&v13 = v9 + 4;
*v10 = &v13;
v9[5] = &v13;
MiUnlockFaultWorkingSet((INT64)(a2 + 7));
v5 = 1;
KeWaitForSingleObject(&Object, WrKernel, 0, 0, 0i64);
SharedVm = MiGetSharedVm(v2);
ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
*((_BYTE *)a2 + 69) |= 1u;
}
return v5;
}Referenced by:
MiUserFault