MiUpdateVadBits
VOID __stdcall MiUpdateVadBits(VOID *UserVa, VOID *LastUserVa){
bool v2;
_ETHREAD *CurrentThread;
unsigned __int64 v5;
_MMVAD_SHORT *LowestConflictingVad;
_MMVAD_SHORT **ExtraCreateInfo;
_MMVAD_SHORT *v8;
_MMVAD_SHORT *NextVad;
v2 = LastUserVa < UserVa;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = 0x7FFFFFFEFFFFi64;
if( !v2 )
v5 = (unsigned __int64)LastUserVa;
LowestConflictingVad = (_MMVAD_SHORT *)MiLocateLowestConflictingVad(
(INT64)CurrentThread->Tcb.ApcState.Process,
(UINT64)UserVa,
v5 - 1);
if( LowestConflictingVad )
{
do
{
MiSetVadBits(LowestConflictingVad);
ExtraCreateInfo = (_MMVAD_SHORT **)LowestConflictingVad->ExtraCreateInfo;
v8 = LowestConflictingVad;
if( ExtraCreateInfo )
{
NextVad = *ExtraCreateInfo;
for( LowestConflictingVad = (_MMVAD_SHORT *)LowestConflictingVad->ExtraCreateInfo;
NextVad;
NextVad = NextVad->NextVad )
{
LowestConflictingVad = NextVad;
}
}
else
{
while( 1 )
{
LowestConflictingVad = (_MMVAD_SHORT *)(LowestConflictingVad->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
if( !LowestConflictingVad || LowestConflictingVad->NextVad == v8 )
break;
v8 = LowestConflictingVad;
}
}
}
while( LowestConflictingVad
&& (LowestConflictingVad->StartingVpn | ((unsigned __int64)LowestConflictingVad->StartingVpnHigh << 32)) << 12 < v5 );
}
}Referenced by:
MiExpandVadBitMap
MiExpandVadBitMapDown