MiResolvePrivateZeroFault
NTSTATUS __stdcall MiResolvePrivateZeroFault(_MI_ZERO_FAULT_PACKET *ZeroPacket){
_MI_ZERO_FAULT_PACKET v1;
_MI_ZERO_FAULT_PACKET *v2;
unsigned __int64 v3;
_MI_FAULT_VA_LIST *v4;
unsigned int v5;
__int64 v7;
_MMSUPPORT_INSTANCE *v8;
_ETHREAD *ForkInProgress;
unsigned int v10;
_MMVAD *v11;
unsigned int v12;
char *v13;
_MMPFN *PageChain;
unsigned __int64 v15;
unsigned __int64 v16;
int v17;
int v18;
__int64 v19;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v20;
_MMPFN *ClusterPage;
unsigned __int64 v22;
unsigned __int64 v23;
char *v24;
unsigned __int64 v25;
UINT64 i;
_MI_ZERO_FAULT_PACKET v27;
_QWORD *v28;
bool v29;
unsigned __int64 v30;
int v31;
_MI_PFN_CACHE_ATTRIBUTE v32;
unsigned int v33;
_KQUEUE *LargePage;
__int64 v35;
PVOID *v36;
unsigned int v37;
UINT8 *SuboptimalPage;
_MMSUPPORT_INSTANCE *Vm;
UINT64 NumberOfPages;
__int64 v41;
INT64 v42;
_MI_COLOR_BASE ColorBase[4];
__int64 v44[2];
_MI_FAULT_VA_LIST FaultHead[4];
__int128 v46;
__int128 v47;
__int128 v48;
__int128 v49;
__int128 v50;
int v52;
_MMPFN *v53;
_KQUEUE *v54;
v1 = *ZeroPacket;
v2 = ZeroPacket;
v3 = *((_QWORD *)ZeroPacket + 2);
v4 = (_MI_FAULT_VA_LIST *)*((_QWORD *)ZeroPacket + 7);
if( (*ZeroPacket & 2) != 0 )
{
v5 = ZeroPacket[8];
if( v5 >> 3 == 3 )
{
if( (v5 & 7) == 0 )
{
LABEL_4:
MiAdvanceFaultList(*((_MI_FAULT_VA_LIST **)ZeroPacket + 7));
return 0;
}
}
else if( v5 >> 3 != 1 )
{
goto LABEL_4;
}
if( (v1 & 4) == 0 )
goto LABEL_4;
}
if( (v1 & 8) != 0 && (v4[14] & 8) != 0 )
return -1073741801;
v7 = *((_QWORD *)ZeroPacket + 1);
v8 = *(_MMSUPPORT_INSTANCE **)(v7 + 56);
Vm = v8;
v42 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * v8->PartitionId);
if( (v1 & 0x40) != 0 )
{
ForkInProgress = KeGetCurrentThread()->ApcState.Process->ForkInProgress;
if( ForkInProgress )
{
if( ForkInProgress != (_ETHREAD *)KeGetCurrentThread() )
{
*(_DWORD *)(v7 + 80) |= 4u;
return 0;
}
}
}
v10 = 1;
NumberOfPages = 1i64;
v41 = -1i64;
v11 = (_MMVAD *)*((_QWORD *)ZeroPacket + 8);
v12 = ZeroPacket[12];
v13 = (char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64);
v52 = 0;
PageChain = 0i64;
v53 = 0i64;
if( v11 )
{
v18 = v1 & 0x15;
if( v18 )
{
LODWORD(v19) = MiComputeZeroClusterMaximum(v4, (_MMVAD *)v8);
PageChain = 0i64;
v8 = Vm;
v41 = v19;
v52 = 1;
}
v20.LongFlags = (unsigned int)v11->Core.u;
v12 = (v20.LongFlags >> 12) & 0x3F;
if( (v20.LongFlags & 0x100000) != 0 && MiVadPageSizes[(v20.LongFlags >> 18) & 3] == 16 )
{
LODWORD(SuboptimalPage) = v2[9];
ClusterPage = MiGetClusterPage(v11, (VOID *)v3, 0x10ui64, (unsigned int)v2[8], SuboptimalPage);
v53 = ClusterPage;
PageChain = ClusterPage;
if( ClusterPage && (ClusterPage->u2._bf_0 & 0xFFFFFFFFFi64) != 0xFFFFFFFFFi64 )
{
v22 = v3 & 0xFFFFFFFFFFFF0000ui64;
NumberOfPages = 16i64;
*((_QWORD *)v2 + 2) = v22;
v13 = (char *)MmGetPteBase() + ((v22 >> 9) & 0x7FFFFFFFF8i64);
}
}
else if( !v18
&& ((unsigned __int8)v13 & 0x7F) == 0
&& (v11->Core.u.LongFlags & 0x100000) != 0
&& (v20.LongFlags & 0x300000) != 3145728
&& !v2[9]
&& v3 >= ((v11->Core.StartingVpn | ((unsigned __int64)v11->Core.StartingVpnHigh << 32)) + 16) << 12
&& ((unsigned __int16)v13 & 0xFFF) != 0
&& (v3 < (unsigned __int64)MmGetPteBase() || v3 > (unsigned __int64)MmGetPteLimit()) )
{
v23 = 0i64;
v24 = v13 - 8;
do
{
if( (*(_QWORD *)v24 & 1) == 0 )
break;
if( (*(_QWORD *)v24 & 0x20) == 0 )
break;
++v23;
v24 -= 8;
}
while( v23 < 0x10 );
v2 = ZeroPacket;
if( v23 == 16 )
{
v44[1] = 0x10000i64;
v46 = 1ui64;
*(_QWORD *)FaultHead = 0i64;
*(_QWORD *)&FaultHead[2] = v44;
v47 = 0ui64;
v48 = 0i64;
v44[0] = v3 & 0xFFFFFFFFFFFFF000ui64;
v49 = 0i64;
v50 = 0i64;
LODWORD(v25) = MiComputeZeroClusterMaximum(FaultHead, (_MMVAD *)v8);
if( v25 >= 0x10 )
{
v17 = 2;
v16 = 16i64;
LABEL_48:
v27 = v2[9];
v28 = v13 + 8;
for( i = 1i64; i < v16; ++i )
{
if( v27 )
{
IS_PTE_NOT_DEMAND_ZERO();
if( v31 )
break;
v29 = v27 == ((v30 >> 5) & 0x1F);
}
else
{
v29 = *v28 == 0i64;
}
if( !v29 )
break;
++v28;
}
v2 = ZeroPacket;
v10 = 1;
LABEL_56:
if( v17 == 2 )
{
if( i == v16 )
{
*(_OWORD *)ColorBase = 0i64;
MiInitializePageColorBase(Vm, v12, ColorBase);
_InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
v32 = MiProtectionToCacheAttribute((unsigned int)v2[8]);
LargePage = (_KQUEUE *)MiGetLargePage(v42, 2u, v32, v33, 4, 0i64);
v54 = LargePage;
PageChain = (_MMPFN *)LargePage;
if( LargePage )
{
*v2 |= 0x80u;
MiConvertEntireLargePageToSmall(LargePage, 2, 2u, (_LARGE_INTEGER *)1, 0i64, 0i64);
PageChain = (_MMPFN *)v54;
NumberOfPages = i;
LABEL_64:
v8 = Vm;
goto LABEL_65;
}
LABEL_62:
NumberOfPages = i;
goto LABEL_64;
}
i = 1i64;
}
PageChain = v53;
goto LABEL_62;
}
goto LABEL_63;
}
PageChain = 0i64;
}
v17 = v52;
if( !v52 || PageChain )
goto LABEL_64;
v16 = v41;
LABEL_47:
i = 1i64;
if( v16 <= 1 )
goto LABEL_56;
goto LABEL_48;
}
if( (v1 & 0x40) == 0 && (v1 & 1) != 0 && (v8->Flags._bf_0 & 7u) >= 2 )
{
LODWORD(v15) = MiComputeZeroClusterMaximum(v4, (_MMVAD *)v8);
v16 = v15;
if( v15 > 1 )
{
v17 = 1;
goto LABEL_47;
}
LABEL_63:
PageChain = 0i64;
goto LABEL_64;
}
LABEL_65:
v35 = *((_QWORD *)v2 + 9);
if( v35 )
v36 = *(PVOID **)(*(&stru_140C4DB30 + 267) + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v35 + 544) + 1838i64));
else
v36 = (PVOID *)v42;
if( !PageChain )
{
v37 = v2[8];
if( v37 )
{
if( v37 != 31 )
{
if( v37 >> 3 == 3 )
{
if( (v37 & 7) != 0 )
v10 = 2;
}
else if( v37 >> 3 == 1 )
{
v10 = 0;
}
}
}
else
{
v10 = 3;
}
LODWORD(SuboptimalPage) = 258;
PageChain = MiGetPageChain(v36, v8, v12, v10, (UINT64)SuboptimalPage, 0xFFFFFFFFFFFFFFFFui64, &NumberOfPages);
if( !PageChain )
return -1073741801;
}
return MiCompletePrivateZeroFault(v2, PageChain, NumberOfPages);
}Referenced by:
MiResolveDemandZeroFault
MiZeroFault