MiWaitForRotateToComplete
NTSTATUS __stdcall MiWaitForRotateToComplete(VOID *Va, UINT8 WsIrql){
_ETHREAD *CurrentThread;
NTSTATUS v3;
INT64 v4;
unsigned __int64 v5;
_EPROCESS *Process;
_ETHREAD *i;
__int64 v8;
_MMSUPPORT_SHARED *v10;
_MMSUPPORT_SHARED *SharedVm;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
v4 = WsIrql;
v5 = (unsigned __int64)Va >> 12;
Process = CurrentThread->Tcb.ApcState.Process;
LABEL_2:
for( i = Process->RotateInProgress; i; i = *(_ETHREAD **)i->Tcb.gap0 )
{
v8 = *(_QWORD *)&i->Tcb.gap0[8];
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->Tcb.gap0[16] == CurrentThread )
return v3;
v3 = 1;
if( (*(_BYTE *)(v4 + 13) & 1) != 0 )
{
if( !_InterlockedIncrement((volatile signed __int32 *)(v8 + 36)) )
__fastfail(0xEu);
MiUnlockWorkingSetExclusive(&Process->Vm.Instance, *(_BYTE *)(v4 + 12));
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(v8 + 40), 0i64);
CurrentThread->_bf_1 |= 0x40u;
MiUnlockAndDereferenceVadShared((PVOID)v8);
SharedVm = MiGetSharedVm(&Process->Vm.Instance);
ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
}
else
{
MiUnlockFaultWorkingSet(v4, (_XSTATE_CONFIGURATION *)WsIrql);
v10 = MiGetSharedVm(&Process->Vm.Instance);
ExAcquireSpinLockExclusive((INT64 *)&v10->WorkingSetLock);
v10->GoodCitizenWaiting = 0;
*(_BYTE *)(v4 + 13) |= 1u;
}
goto LABEL_2;
}
}
return v3;
}Referenced by:
MiUserFault