MiEmptyWorkingSetPrivatePagesByVa
VOID __fastcall MiEmptyWorkingSetPrivatePagesByVa(_MMSUPPORT_INSTANCE *WsInfo){
char v1;
_ETHREAD *CurrentThread;
char v3;
_EPROCESS *Process;
_MMVAD_SHORT *Root;
_MMVAD_SHORT *i;
_MMVAD_SHORT *NextVad;
int v9;
_MMVAD *v10;
_MMVAD_SHORT **ExtraCreateInfo;
_MMVAD_SHORT *v12;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = v1;
Process = CurrentThread->Tcb.ApcState.Process;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(&Process->AddressCreationLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 2u;
if( (Process->Flags & 0x20) == 0 )
{
Root = (_MMVAD_SHORT *)Process->VadRoot.Root;
i = 0i64;
while( Root )
{
i = Root;
Root = Root->NextVad;
}
while( i )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&i->PushLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 0x80u;
if( (i->u.LongFlags & 4) == 0 )
{
LOBYTE(v9) = MiVadSupportsPrivateCommit((INT64)i);
if( v9 )
{
if( !MiVadMapsLargeImage(v10) )
MiEmptyWorkingSetInitiate(
(INT64)WsInfo,
v3 | 2,
(i->StartingVpn | ((unsigned __int64)i->StartingVpnHigh << 32)) << 12,
((i->EndingVpn | ((unsigned __int64)i->EndingVpnHigh << 32)) << 12) | 0xFFF);
}
}
MiUnlockVad(CurrentThread, i);
ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
v12 = i;
if( ExtraCreateInfo )
{
NextVad = *ExtraCreateInfo;
for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
i = NextVad;
}
else
{
while( 1 )
{
i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
if( !i || i->NextVad == v12 )
break;
v12 = i;
}
}
}
}
UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, Process);
}Referenced by:
MiFlushAllPages
MmProcessWorkingSetControl