MiWaitForRotateToComplete
UINT64 __stdcall MiWaitForRotateToComplete(PVOID Va, UINT8 WsIrql){
_ETHREAD *CurrentThread;
unsigned int v3;
INT64 v4;
unsigned __int64 v5;
__int64 v6;
_QWORD *i;
__int64 v8;
INT64 *v10;
INT64 *SharedVm;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
v4 = WsIrql;
v5 = (unsigned __int64)Va >> 12;
v6 = *((_QWORD *)CurrentThread + 23);
LABEL_2:
for( i = *(_QWORD **)(v6 + 1240); i; i = (_QWORD *)*i )
{
v8 = i[1];
if( v5 >= (*(unsigned int *)(v8 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v8 + 32) << 32))
&& v5 <= (*(unsigned int *)(v8 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v8 + 33) << 32)) )
{
if( (_ETHREAD *)i[2] == CurrentThread )
return v3;
v3 = 1;
if( (*(_BYTE *)(v4 + 13) & 1) != 0 )
{
if( !_InterlockedIncrement((volatile signed __int32 *)(v8 + 36)) )
__fastfail(0xEu);
MiUnlockWorkingSetExclusive(v6 + 1664, *(_BYTE *)(v4 + 12));
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx(v8 + 40, 0i64);
*((_BYTE *)CurrentThread + 1305) |= 0x40u;
MiUnlockAndDereferenceVadShared((PVOID)v8);
SharedVm = MiGetSharedVm(v6 + 1664);
ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
}
else
{
MiUnlockFaultWorkingSet(v4);
v10 = MiGetSharedVm(v6 + 1664);
ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v10);
*((_DWORD *)v10 + 1) = 0;
*(_BYTE *)(v4 + 13) |= 1u;
}
goto LABEL_2;
}
}
return v3;
}Referenced by:
MiUserFault