MiQueueWorkingSetRequest
VOID __stdcall MiQueueWorkingSetRequest(_MI_PARTITION *Partition, UINT64 RequestFlags){
int v2;
union {unsigned int LongFlags;_MI_PARTITION_FLAGS Flags;} v3;
char *WorkingSetControl;
int v5;
_KLOCK_QUEUE_HANDLE LockHandle;
v2 = RequestFlags;
v3.LongFlags = (unsigned int)Partition->Core.u;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (v3.Flags._bf_0 & 0x20) == 0 )
{
WorkingSetControl = (char *)Partition->WorkingSetControl;
if( WorkingSetControl )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
v5 = *((_DWORD *)WorkingSetControl + 10);
if( !v5 )
{
KeResetEvent((_KEVENT *)WorkingSetControl);
v5 = *((_DWORD *)WorkingSetControl + 10);
}
*((_DWORD *)WorkingSetControl + 10) = v2 | v5;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeSetEvent((PRKEVENT)(WorkingSetControl + 96), 0, 0);
KeWaitForSingleObject((UINT64)WorkingSetControl, 18, 0, 0, 0i64);
}
}
}Referenced by:
MiCaptureAllWorkingSetAccessBits
MiEmptyAllWorkingSets
MiFindContiguousPages
MmTrimFilePagesFromWorkingSets