MiResolvePrivateZeroFault
INT64 __fastcall MiResolvePrivateZeroFault(INT64 rcx0){
int v1;
INT64 v2;
unsigned __int64 v3;
__int64 v4;
unsigned int v5;
__int64 v7;
__int64 v8;
_ETHREAD *v9;
unsigned int v10;
__int64 v11;
unsigned int v12;
char *v13;
_MMPFN *PageChain;
unsigned __int64 v15;
int v16;
int v17;
unsigned __int64 v18;
unsigned int v19;
_MMPFN *ClusterPage;
unsigned __int64 v21;
unsigned __int64 v22;
char *v23;
UINT64 i;
int v25;
__int64 *v26;
__int64 v27;
bool v28;
unsigned __int64 v29;
unsigned int v30;
UINT64 v31;
KQUEUE *LargePage;
__int64 v33;
_MI_PARTITION *v34;
unsigned int v35;
UINT8 *SuboptimalPage;
INT64 v37;
UINT64 NumberOfPages;
unsigned __int64 v39;
INT64 a1;
INT64 v41[2];
__int64 v42[2];
_QWORD v43[2];
__int128 v44;
__int128 v45;
__int128 v46;
__int128 v47;
__int128 v48;
int v50;
_MMPFN *v51;
_MMPFN *v52;
v1 = *(_DWORD *)rcx0;
v2 = rcx0;
v3 = *(_QWORD *)(rcx0 + 16);
v4 = *(_QWORD *)(rcx0 + 56);
if( (*(_DWORD *)rcx0 & 2) != 0 )
{
v5 = *(_DWORD *)(rcx0 + 32);
if( v5 >> 3 == 3 )
{
if( (v5 & 7) == 0 )
{
LABEL_4:
MiAdvanceFaultList(*(_QWORD **)(rcx0 + 56));
return 0i64;
}
}
else if( v5 >> 3 != 1 )
{
goto LABEL_4;
}
if( (v1 & 4) == 0 )
goto LABEL_4;
}
if( (v1 & 8) != 0 && (*(_DWORD *)(v4 + 56) & 8) != 0 )
return 3221225495i64;
v7 = *(_QWORD *)(rcx0 + 8);
v8 = *(_QWORD *)(v7 + 56);
v37 = v8;
a1 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v8 + 174));
if( (v1 & 0x40) != 0 )
{
v9 = *(_ETHREAD **)(*((_QWORD *)KeGetCurrentThread() + 23) + 1248i64);
if( v9 )
{
if( v9 != (_ETHREAD *)KeGetCurrentThread() )
{
*(_DWORD *)(v7 + 80) |= 4u;
return 0i64;
}
}
}
v10 = 1;
NumberOfPages = 1i64;
v39 = -1i64;
v11 = *(_QWORD *)(rcx0 + 64);
v12 = *(_DWORD *)(rcx0 + 48);
v13 = (char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64);
v50 = 0;
PageChain = 0i64;
v51 = 0i64;
if( v11 )
{
v17 = v1 & 0x15;
if( v17 )
{
v18 = MiComputeZeroClusterMaximum(v4, v8, v11);
PageChain = 0i64;
v8 = v37;
v39 = v18;
v50 = 1;
}
v19 = *(_DWORD *)(v11 + 48);
v12 = (v19 >> 12) & 0x3F;
if( (v19 & 0x100000) != 0 && MiVadPageSizes[(v19 >> 18) & 3] == 16 )
{
LODWORD(SuboptimalPage) = *(_DWORD *)(v2 + 36);
ClusterPage = MiGetClusterPage((_MMVAD *)v11, (VOID *)v3, 0x10ui64, *(unsigned int *)(v2 + 32), SuboptimalPage);
v51 = ClusterPage;
PageChain = ClusterPage;
if( ClusterPage && (*((_QWORD *)ClusterPage + 3) & 0xFFFFFFFFFi64) != 0xFFFFFFFFFi64 )
{
v21 = v3 & 0xFFFFFFFFFFFF0000ui64;
NumberOfPages = 16i64;
*(_QWORD *)(v2 + 16) = v21;
v13 = (char *)MmGetPteBase() + ((v21 >> 9) & 0x7FFFFFFFF8i64);
}
}
else if( !v17
&& ((unsigned __int8)v13 & 0x7F) == 0
&& (*(_DWORD *)(v11 + 48) & 0x100000) != 0
&& (v19 & 0x300000) != 3145728
&& !*(_DWORD *)(v2 + 36)
&& v3 >= ((*(unsigned int *)(v11 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v11 + 32) << 32)) + 16) << 12
&& ((unsigned __int16)v13 & 0xFFF) != 0
&& (v3 < (unsigned __int64)MmGetPteBase() || v3 > (unsigned __int64)MmGetPteLimit()) )
{
v22 = 0i64;
v23 = v13 - 8;
do
{
if( (*(_QWORD *)v23 & 1) == 0 )
break;
if( (*(_QWORD *)v23 & 0x20) == 0 )
break;
++v22;
v23 -= 8;
}
while( v22 < 0x10 );
v2 = rcx0;
if( v22 == 16 )
{
v42[1] = 0x10000i64;
v44 = 1ui64;
v43[0] = 0i64;
v43[1] = v42;
v45 = 0ui64;
v46 = 0i64;
v42[0] = v3 & 0xFFFFFFFFFFFFF000ui64;
v47 = 0i64;
v48 = 0i64;
if( MiComputeZeroClusterMaximum((__int64)v43, v8, v11) >= 0x10 )
{
v16 = 2;
v15 = 16i64;
LABEL_48:
v25 = *(_DWORD *)(v2 + 36);
v26 = (__int64 *)(v13 + 8);
for( i = 1i64; i < v15; ++i )
{
v27 = *v26;
if( v25 )
{
if( IS_PTE_NOT_DEMAND_ZERO(v27) )
break;
v28 = v25 == ((v29 >> 5) & 0x1F);
}
else
{
v28 = v27 == 0;
}
if( !v28 )
break;
++v26;
}
v2 = rcx0;
v10 = 1;
LABEL_56:
if( v16 == 2 )
{
if( i == v15 )
{
*(_OWORD *)v41 = 0i64;
MiInitializePageColorBase(v37, v12, (INT64)v41);
_InterlockedExchangeAdd((volatile signed __int32 *)v41[0], 1u);
v30 = MiProtectionToCacheAttribute(*(unsigned int *)(v2 + 32));
LODWORD(SuboptimalPage) = 4;
LargePage = (KQUEUE *)MiGetLargePage(a1, 2ui64, v30, v31, (INT64)SuboptimalPage, 0i64);
v52 = (_MMPFN *)LargePage;
PageChain = (_MMPFN *)LargePage;
if( LargePage )
{
*(_DWORD *)v2 |= 0x80u;
MiConvertEntireLargePageToSmall(LargePage, 2, 2u, (LARGE_INTEGER *)1, 0i64, 0i64);
PageChain = v52;
NumberOfPages = i;
LABEL_64:
v8 = v37;
goto LABEL_65;
}
LABEL_62:
NumberOfPages = i;
goto LABEL_64;
}
i = 1i64;
}
PageChain = v51;
goto LABEL_62;
}
goto LABEL_63;
}
PageChain = 0i64;
}
v16 = v50;
if( !v50 || PageChain )
goto LABEL_64;
v15 = v39;
LABEL_47:
i = 1i64;
if( v15 <= 1 )
goto LABEL_56;
goto LABEL_48;
}
if( (v1 & 0x40) == 0 && (v1 & 1) != 0 && (*(_BYTE *)(v8 + 184) & 7u) >= 2 )
{
v15 = MiComputeZeroClusterMaximum(v4, v8, 0i64);
if( v15 > 1 )
{
v16 = 1;
goto LABEL_47;
}
LABEL_63:
PageChain = 0i64;
goto LABEL_64;
}
LABEL_65:
v33 = *(_QWORD *)(v2 + 72);
if( v33 )
v34 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v33 + 544) + 1838i64));
else
v34 = (_MI_PARTITION *)a1;
if( !PageChain )
{
v35 = *(_DWORD *)(v2 + 32);
if( v35 )
{
if( v35 != 31 )
{
if( v35 >> 3 == 3 )
{
if( (v35 & 7) != 0 )
v10 = 2;
}
else if( v35 >> 3 == 1 )
{
v10 = 0;
}
}
}
else
{
v10 = 3;
}
LODWORD(SuboptimalPage) = 258;
PageChain = MiGetPageChain(
v34,
(_MMSUPPORT_INSTANCE *)v8,
v12,
v10,
(UINT64)SuboptimalPage,
0xFFFFFFFFFFFFFFFFui64,
&NumberOfPages);
if( !PageChain )
return 3221225495i64;
}
return MiCompletePrivateZeroFault(v2, (INT64)PageChain, NumberOfPages);
}Referenced by:
MiResolveDemandZeroFault
MiZeroFault