MiWaitForCollidedFaultComplete
INT64 __fastcall MiWaitForCollidedFaultComplete(
_MMPFN *CollidedPfn,
_MMPFN *LockedPfn,
VOID *FaultingAddress,
_MMSUPPORT_INSTANCE *Vm,
int *WsIrql,
UINT64 PageIrql,
UINT *MandatoryRetry){
int *v8;
UINT64 v11;
int v12;
__int64 v13;
int v14;
MMPTE *v15;
void *v16;
void *v18;
unsigned int v19;
MMPTE *PointerPteContents;
UINT64 v21;
LOBYTE(v21) = (_BYTE)Vm;
v8 = WsIrql;
PointerPteContents = (MMPTE *)(*((_QWORD *)LockedPfn + 1) | 0x8000000000000000ui64);
MI_READ_PTE_LOCK_FREE((INT64)PointerPteContents);
v12 = *v8;
v13 = *(_QWORD *)LockedPfn - 32i64;
if( !*v8 )
{
if( (unsigned int)MiAddLockedPageCharge((INT64)LockedPfn, 2) )
{
v14 = *v8;
}
else
{
*v8 = 1;
v14 = 1;
}
v12 = v14;
if( !v14 && FaultingAddress && *((_WORD *)FaultingAddress + 16) >= 0x7FFFu )
{
*v8 = 1;
MiRemoveLockedPageChargeAndDecRef(LockedPfn);
v12 = *v8;
}
}
if( v12 == 1 && FaultingAddress )
{
MiLockNestedPageAtDpcInline((INT64)FaultingAddress);
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)FaultingAddress);
_InterlockedAnd64((volatile signed __int64 *)FaultingAddress + 3, 0x7FFFFFFFFFFFFFFFui64);
}
_InterlockedAdd((volatile signed __int32 *)(v13 + 176), 1u);
_InterlockedAnd64((volatile signed __int64 *)LockedPfn + 3, 0x7FFFFFFFFFFFFFFFui64);
if( FaultingAddress )
{
LOBYTE(v11) = v21;
MiUnlockProtoPoolPage((_MMPFN *)FaultingAddress, v11);
}
else
{
__writecr8((unsigned __int8)v21);
}
v15 = 0i64;
if( *((_QWORD *)CollidedPfn + 7) )
v15 = (MMPTE *)MiReleaseFaultState((INT64)CollidedPfn + 56, 0x11u, 0i64);
if( *(_QWORD *)(v13 + 216) )
{
LODWORD(v18) = KeAbPreAcquire((PVOID)v13, 0i64, 0i64);
v16 = v18;
if( v18 )
KeAbPreWait(v18);
}
else
{
v16 = 0i64;
}
KeWaitForSingleObject((PVOID)(v13 + 56), WrPageIn, 0, 0, 0i64);
if( v16 )
{
KeAbPreAcquire((PVOID)v13, v16, 0i64);
KeAbPostReleaseEx((PVOID)v13, v16);
}
MiFreeInPageSupportBlock((PSLIST_ENTRY)v13);
if( *((_QWORD *)CollidedPfn + 7) )
MiRelockFaultState((__int64)CollidedPfn + 56, v15);
if( *v8 == 1 )
return 3221226548i64;
if( FaultingAddress )
{
MiRelockProtoPoolPage((INT64)FaultingAddress, (UINT8 *)&v21);
LODWORD(WsIrql) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)LockedPfn + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)&WsIrql);
while( *((__int64 *)LockedPfn + 3) < 0 );
}
}
else
{
MiLockPageInline((INT64)LockedPfn);
}
if( (*((_QWORD *)LockedPfn + 3) & 0x4000000000000000i64) == 0 )
{
if( (unsigned int)MiIsFaultPteIntact(CollidedPfn, *(MMPTE **)CollidedPfn, PointerPteContents)
&& MiImagePageOk(*(_QWORD *)CollidedPfn, (INT64)LockedPfn) )
{
return 0i64;
}
MiRemoveLockedPageChargeAndDecRef(LockedPfn);
return 3221226548i64;
}
v19 = (*((_BYTE *)LockedPfn + 35) & 0x10) != 0 ? 0xFFFFFBE3 : 0;
MiRemoveLockedPageChargeAndDecRef(LockedPfn);
return v19 - 1073740748;
}Referenced by:
MiFlushSectionInternal
MiHandleCollidedFault
MiTranslatePageForCopy
MiWalkEntireImage