MiWaitForInPageComplete
NTSTATUS __stdcall MiWaitForInPageComplete(
_MMINPAGE_SUPPORT *InPageSupport,
PVOID ProtoContents,
_MMSUPPORT_INSTANCE *Vm,
VOID *PreviousMode,
INT64 HardFaultInfo,
PF_HARD_FAULT_INFO **a6){
_MMSUPPORT_INSTANCE *Blink;
char *v7;
_MMINPAGE_SUPPORT *v8;
__int64 v9;
__int64 v10;
unsigned __int64 v12;
_MMPFN *PfnDb;
UINT64 *v14;
__int64 v15;
void *v16;
int v17;
_MI_PARTITION *v18;
VOID(__stdcall *v19)(VOID *);
__int64 v20;
int v21;
int v22;
_LIST_ENTRY *Flink;
_MI_FAULT_VA_LIST *v24;
INT64 v25;
int v26;
__int64 v27;
unsigned __int8 v28;
NTSTATUS v29;
int v30;
int v31;
int v32;
_MMSUPPORT_INSTANCE *v33;
int v34;
bool v35;
void *v36;
unsigned __int64 v37;
unsigned int v38;
char *v39;
unsigned __int64 v40;
_MMPFN *v41;
unsigned __int64 v42;
NTSTATUS result;
__int64 v44;
UINT64 PreferredNode;
UINT64 Flags;
UINT64 *StartingPfn;
int v48;
_MMSUPPORT_INSTANCE *v49;
_BOOL4 IsRetryIoStatus;
void *v51;
void *v52;
unsigned __int64 v53;
__int64 v54;
void *v55;
unsigned int v57;
unsigned __int64 v58;
UINT8 OldIrql;
_MMSUPPORT_INSTANCE *v60;
_MI_STORE_INPAGE_COMPLETE_FLAGS OutFlags;
v60 = Vm;
Blink = (_MMSUPPORT_INSTANCE *)InPageSupport->ListHead[2].Blink;
v7 = (char *)ProtoContents + 272;
OldIrql = 0;
OutFlags.EntireFlags = 0;
v8 = InPageSupport;
v9 = -1i64;
v10 = *((_QWORD *)ProtoContents + 31);
v55 = (void *)*((_QWORD *)ProtoContents + 29);
v51 = (void *)*((_QWORD *)ProtoContents + 28);
v12 = *(_QWORD *)(v10 + 40);
if( *((_QWORD *)ProtoContents + 32) )
v7 = (char *)*((_QWORD *)ProtoContents + 32);
v49 = Blink;
v54 = *((_QWORD *)ProtoContents + 31);
PfnDb = MmGetPfnDb();
v14 = (UINT64 *)(v7 + 48);
if( (v12 & 0x1000000000i64) == 0 && *(__int64 *)(v10 + 8) > 0 )
{
v15 = (unsigned __int128)((v10 - (__int64)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
v16 = (void *)(((unsigned __int64)v15 >> 63) + (v15 >> 3));
v52 = v16;
if( (unsigned __int64)v16 < 0xFFFFFFFFFi64 )
{
v17 = ~(v8->IoStatus.Status << 11) & 0x20000 | 0x40000000;
v18 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((v12 >> 39) & 0x3FF));
v19 = (VOID(__stdcall *)(VOID *))KeGetCurrentThread()[1].ApcState.ApcListHead[0].Blink;
LODWORD(v20) = MiSearchNumaNodeTable(v16);
v21 = v17 | 8;
v22 = *(_DWORD *)(v20 + 8);
if( v19 != KeSwapProcessOrStack )
v21 = v17;
LODWORD(StartingPfn) = v21;
LODWORD(Flags) = 0x80000000;
LODWORD(PreferredNode) = v22;
MiFindContiguousPages(
v18,
(UINT64)v52 + 1,
0xFFFFFFFFFui64,
0i64,
1ui64,
(_MI_PFN_CACHE_ATTRIBUTE)(*(unsigned __int8 *)(v54 + 34) >> 6),
PreferredNode,
Flags,
StartingPfn);
v8 = InPageSupport;
Blink = v49;
}
}
Flink = v8->ListHead[0].Flink;
if( ((unsigned __int8)Flink & 1) != 0 )
{
v24 = (_MI_FAULT_VA_LIST *)((unsigned __int64)Flink & 0xFFFFFFFFFFFFFFFEui64);
if( *(_BYTE *)v24 == 2 )
{
if( Blink )
MiPrefetchRestOfCluster((_MMINPAGE_SUPPORT *)ProtoContents, v24, Blink);
}
}
KeWaitForSingleObject((UINT64)ProtoContents + 32, 9, 0, 0, 0i64);
if( *((_QWORD *)ProtoContents + 33) )
KeBugCheckEx(0x1Au, (PVOID)0x61947, ProtoContents, *((PVOID *)ProtoContents + 33), 0i64);
if( Blink && (Blink->Flags._bf_0 & 0x60) == 96 && !MiGetSharedVm(Blink)->CommitReleaseContext )
KiUnstackDetachProcess((_KAPC_STATE *)((char *)ProtoContents + 104), 0i64);
if( (*((_WORD *)v7 + 5) & 0x200) != 0 )
{
MiRetardMdl((_MDL *)v7);
*((_DWORD *)ProtoContents + 20) = -1073741670;
*((_QWORD *)ProtoContents + 11) = 0i64;
}
v26 = *((_DWORD *)ProtoContents + 48);
if( (v26 & 0x10) != 0 )
{
v27 = *((_QWORD *)ProtoContents + 42);
if( v27 )
{
v28 = ExAcquireSpinLockExclusive((INT64 *)(v27 + 232));
RtlAvlRemoveNode((UINT64 *)(v27 + 240), (INT64 *)ProtoContents + 44);
ExReleaseSpinLockExclusive((PEX_SPIN_LOCK)(v27 + 232), v28);
v26 = *((_DWORD *)ProtoContents + 48);
Blink = v49;
}
}
v29 = 0;
v57 = *((_DWORD *)ProtoContents + 46);
v53 = (unsigned __int64)&v14[((((*((_DWORD *)v7 + 8) + *((_DWORD *)v7 + 11)) & 0xFFF)
+ (unsigned __int64)*((unsigned int *)v7 + 10)
+ 4095) >> 12)
- 1];
if( (v26 & 0x100) != 0 )
MiStoreFaultComplete((ULONG_PTR)ProtoContents, &OutFlags);
v30 = *((_DWORD *)ProtoContents + 20);
if( *((_QWORD *)ProtoContents + 26) )
{
if( v30 >= 0 )
{
v29 = MiValidateInPage((_MMINPAGE_SUPPORT *)ProtoContents);
if( v29 == -1073740748 )
*((_DWORD *)ProtoContents + 48) |= 0x100000u;
}
MiDereferenceControlAreaProbe(*((_CONTROL_AREA **)ProtoContents + 26), 0i64);
}
else if( v30 >= 0 && (*((_DWORD *)ProtoContents + 48) & 0x400000) != 0 )
{
v29 = MiValidatePagefilePageHash((_MMINPAGE_SUPPORT *)ProtoContents);
}
v31 = *((_DWORD *)ProtoContents + 20);
v32 = OutFlags.EntireFlags & 1;
v48 = v32;
if( (OutFlags.EntireFlags & 1) == 0 )
{
__incgsdword(0x2EA4u);
__addgsdword(0x2EA0u, (v57 >> 12) + ((v57 & 0xFFF) != 0));
if( Blink )
{
if( (*((_DWORD *)ProtoContents + 48) & 8) == 0 )
_InterlockedIncrement((volatile signed __int32 *)&Blink->HardFaultCount);
}
}
v33 = v60;
v34 = 2 * v32;
if( *(_QWORD *)&v60->NextPageColor )
{
PfHardFaultLog(*(_QWORD **)&v60->NextPageColor, v34, v25);
v33 = v60;
}
v35 = (v7[10] & 1) == 0;
v33->NextPageColor = v34;
if( !v35 )
MmUnmapLockedPages(*((VOID **)v7 + 3), (_MDL *)v7);
IsRetryIoStatus = 0;
*((_DWORD *)ProtoContents + 47) = -1;
if( v31 < 0 )
{
if( v31 != -1073741807 )
{
if( v31 == -2147483626 )
goto LABEL_75;
IsRetryIoStatus = MiIsRetryIoStatus((unsigned int)v31, *((unsigned int *)v7 + 10));
if( IsRetryIoStatus && !*(&stru_140C4DB30 + 948) && (!v48 || (OutFlags.EntireFlags & 2) != 0) )
*(&stru_140C4DB30 + 948) = 32;
if( (*((_DWORD *)ProtoContents + 48) & 8) != 0 )
{
v31 = -1073741801;
goto LABEL_75;
}
goto LABEL_53;
}
if( (*((_DWORD *)ProtoContents + 48) & 0x200000) != 0 )
KeBugCheckEx(0x7Au, (PVOID)3, (PVOID)0xFFFFFFFFC0000011i64, ProtoContents, v51);
v40 = 1i64;
v41 = MmGetPfnDb();
v42 = (v53 - (unsigned __int64)v14 + 8) >> 3;
if( (unsigned __int64)v14 > v53 )
v42 = 0i64;
if( v42 )
{
do
{
MiZeroPhysicalPage(*v14, 3ui64, (_MI_PFN_CACHE_ATTRIBUTE)(*((unsigned __int8 *)&v41[*v14].u3 + 2) >> 6));
++v40;
++v14;
}
while( v40 <= v42 );
}
v31 = 0;
}
else
{
v36 = (void *)*((_QWORD *)ProtoContents + 11);
if( v36 != (void *)v57 )
{
if( v36 || (*((_DWORD *)ProtoContents + 48) & 8) == 0 )
{
if( (*((_DWORD *)ProtoContents + 48) & 0x200000) != 0 && !v48 )
KeBugCheckEx(0x7Au, (PVOID)4, v36, ProtoContents, v51);
v37 = 8
* (((unsigned __int64)v36
+ ((*((_DWORD *)v7 + 8) + *((_DWORD *)v7 + 11)) & 0xFFF)
- (unsigned __int64)(v57 - *((_DWORD *)v7 + 10))
+ 4095) >> 12)
+ 40;
v58 = v37;
v38 = (unsigned __int16)v36 & 0xFFF;
if( v38 )
{
v39 = (char *)MiMapPageInHyperSpaceWorker(*(_QWORD *)&v7[v37], &OldIrql, 0x80000000ui64) + v38;
memset(v39, 0i64, 4096 - v38);
MiUnmapPageInHyperSpaceWorker(v39, OldIrql, 0x80000000ui64);
v37 = v58;
}
if( (unsigned __int64)&v7[v37 + 8] <= v53 )
*((_DWORD *)ProtoContents + 47) = ((__int64)(v37 - 48) >> 3) + 1;
}
else
{
v31 = -1073741801;
}
}
if( v29 == -1073741761 )
{
LABEL_53:
if( (unsigned __int64)v51 > 0x7FFFFFFEFFFFi64
&& MiGetSystemRegionType((UINT64)v51) != 8
&& !MiExceptionForMappedVa(v51) )
{
if( !IsRetryIoStatus )
{
if( MmIsAddressValidEx((INT64)v55) )
{
LODWORD(v44) = MI_READ_PTE_LOCK_FREE((INT64)v55);
v9 = v44;
}
MiFlushAllFilesystemPages();
if( v29 >= 0 )
v29 = v31;
KeBugCheckEx(0x7Au, v55, (PVOID)v29, (PVOID)v9, v51);
}
if( v29 != -1073741761 )
v31 = -1073741801;
}
}
}
LABEL_75:
result = OutFlags._bf_0;
*((_MI_STORE_INPAGE_COMPLETE_FLAGS *)ProtoContents + 28) = OutFlags;
*((_QWORD *)ProtoContents + 13) = 0i64;
*((_DWORD *)ProtoContents + 20) = v31;
return result;
}Referenced by:
MiIssueHardFault
MiPfCompleteInPageSupport