MiResolveProtoPteFault
INT64 __fastcall MiResolveProtoPteFault(
UINT64 StoreInstruction,
VOID *FaultingAddress,
_MMPTE *PoINTerPte,
_MMSUPPORT_INSTANCE *Vm,
UINT8 VmIrql,
_MMPTE *PoINTerProtoPte,
VOID *TrapInformation,
CHAR PreviousMode,
_MMINPAGE_SUPPORT **ReadBlock){
_MMPTE *PteBase;
__int64 v12;
UINT64 *v13;
UINT64 v14;
UINT64 v15;
__int64 v16;
__int64 v17;
char *v18;
UINT64 v19;
INT64 v20;
UNICODE_STRING *v21;
unsigned __int64 v22;
char *v23;
wchar_t *Buffer;
WCHAR *v25;
WCHAR v26;
WCHAR *v27;
__int64 v28;
bool v29;
int v30;
__int64 v31;
unsigned __int64 v32;
__int64 v33;
_MMPTE *v34;
unsigned __int64 v35;
_MI_PARTITION *v36;
struct _KPRCB *CurrentPrcb;
signed __int32 v38;
signed __int32 v39;
char *v40;
MMPTE *v41;
char *v42;
char v43;
char *v44;
int v45;
char *v46;
unsigned __int64 *v47;
unsigned __int64 v48;
unsigned __int64 v49;
char *v50;
_MMPTE *v51;
UNICODE_STRING *Pml4eBase;
unsigned __int64 v53;
unsigned __int64 v54;
WCHAR *PxeUserLimit;
unsigned int PfnPriority;
UINT64 v57;
unsigned __int64 v58;
INT64 result;
int v60;
UINT64 v61;
__int64 v62;
__int64 v63;
__int64 v64;
__int64 v65;
__int64 v66;
int v67;
char *v68;
UINT64 v69;
RTL_BALANCED_NODE *Address;
char v71;
__int64 v72;
int v73;
UNICODE_STRING *v74;
bool v75;
__int16 v76;
__int64 v77;
WCHAR *v78;
unsigned __int64 v79;
int v80;
_MMPTE *v81;
UNICODE_STRING *v82;
char *v83;
char v84;
int v85;
unsigned __int64 v86;
unsigned __int64 v87;
__int64 v88;
unsigned __int64 v89;
__int64 v90;
__int64 v91;
signed __int32 v92;
__int64 v93;
unsigned __int64 v94;
unsigned __int64 v95;
_BYTE *v96;
__int64 v97;
unsigned int v98;
unsigned int v99;
__int16 v100;
__int64 v101;
char *v102;
unsigned __int64 v103;
void *v104;
unsigned __int64 v105;
char v106;
int v107;
unsigned int v108;
INT64 v109;
_MMPTE *v110;
unsigned __int64 v111;
void *v112;
void *v113;
_MMINPAGE_SUPPORT **v114;
UNICODE_STRING *antNameA;
__int64 v116;
UINT64 v117;
__int64 v118;
INT64 v119;
UINT64 v120;
char *v121;
unsigned __int64 v122;
UINT64 v123;
UINT64 SpinCount;
UINT64 v125;
unsigned __int64 *v126;
MMPTE *v127;
_QWORD *v128;
__int64 v129;
__int64 v130;
char *v131;
PteBase = MmGetPteBase();
v119 = 0i64;
*(_QWORD *)PoINTerPte = 0i64;
v129 = *(_QWORD *)(StoreInstruction + 56);
v123 = *(_QWORD *)StoreInstruction;
v126 = (unsigned __int64 *)((char *)PteBase + ((v123 >> 9) & 0x7FFFFFFFF8i64));
v12 = *(_QWORD *)(StoreInstruction + 16);
v116 = v12;
v118 = v12 & 1;
if( (v12 & 1) == 0 || (v122 = v12 & 0xFFFFFFFFFFFFFFFEui64, *(_BYTE *)(v12 & 0xFFFFFFFFFFFFFFFEui64) != 1) )
v122 = 0i64;
v120 = *(_QWORD *)(StoreInstruction + 96);
v13 = (UINT64 *)((char *)PteBase + ((v120 >> 9) & 0x7FFFFFFFF8i64));
v117 = *v13;
v14 = v117 & 1;
do
{
if( !v14 )
return 3221225494i64;
v15 = v117;
if( (v117 & 0x200) != 0 )
return 3221225494i64;
MiPteInShadowRange((UINT64)&v117);
v16 = (v15 >> 12) & 0xFFFFFFFFFi64;
v17 = 48 * v16;
v130 = 48 * v16;
}
while( (*((_QWORD *)MmGetPfnDb() + 6 * v16 + 5) & 0x4000000000000i64) == 0 );
LODWORD(SpinCount) = 0;
antNameA = (UNICODE_STRING *)((char *)MmGetPfnDb() + v17);
v18 = (char *)MmGetPfnDb() + 24;
while( _interlockedbittestandset64((volatile signed __int32 *)&v18[v17], 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)&v18[v17] < 0 );
}
v19 = *v13;
v117 = v19;
if( (v19 & 1) == 0 || (v19 & 0x200) != 0 || v16 != ((v19 >> 12) & 0xFFFFFFFFFi64) )
{
_InterlockedAnd64((volatile signed __int64 *)&v18[v17], 0x7FFFFFFFFFFFFFFFui64);
return 3221225494i64;
}
v20 = (INT64)antNameA;
v21 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 8);
v22 = 1i64;
v23 = (char *)MmGetPfnDb() + 34;
Buffer = antNameA[2].Buffer;
v25 = (WCHAR *)((char *)MmGetPfnDb() + 32);
if( ((unsigned __int64)Buffer & 0x1000000000i64) != 0 || ((unsigned __int64)Buffer & 0x2000000000000i64) != 0 )
goto LABEL_39;
v26 = v25[(unsigned __int64)v17 / 2];
v27 = &v25[(unsigned __int64)v17 / 2];
v28 = *(_QWORD *)&v18[v17] & 0x3FFFFFFFFFFFFFFFi64;
if( v26 )
{
if( v26 != 1 )
{
if( v26 != 2 || !v28 )
goto LABEL_39;
LABEL_22:
if( (v23[v17] & 8) == 0 )
goto LABEL_39;
goto LABEL_23;
}
if( !v28 )
goto LABEL_22;
}
LABEL_23:
v29 = 0;
LOBYTE(v30) = MI_PFN_IS_PROTO(antNameA, v21, (UINT8)Buffer, v25);
if( v30 && (*(_DWORD *)((char *)MmGetPfnDb() + v17 + 16) & 0x400i64) != 0 )
{
v29 = 1;
}
else
{
v34 = MmGetPteBase();
v35 = *(_QWORD *)(v17 + v31) | 0x8000000000000000ui64;
if( v35 <= (unsigned __int64)v34 + 0x3FFFFFFF78i64 && v35 >= (unsigned __int64)v34 )
v29 = (*(_BYTE *)(v17 + v33) & 0x20) != 0;
}
v36 = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((v32 >> 39) & 0x3FF));
if( v29 )
{
v121 = (char *)v27;
if( !(unsigned int)MiChargeCommit(v36, 1ui64, 4ui64) )
goto LABEL_40;
}
if( v36 == (_MI_PARTITION *)&MiSystemPartition )
{
CurrentPrcb = KeGetCurrentPrcb();
v38 = *((_DWORD *)CurrentPrcb + 8391);
while( v38 )
{
if( v38 == -1 )
break;
v39 = v38;
v38 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v38 - 1, v38);
if( v39 == v38 )
goto LABEL_39;
}
}
if( !(unsigned int)MiChargePartitionResidentAvailable((INT64)v36, 1ui64, 0xFFFFFFFFi64) )
{
v121 = (char *)v27;
if( v29 )
{
MiReturnCommit(v36, 1ui64);
v121 = (char *)v27;
}
goto LABEL_40;
}
LABEL_39:
v40 = (char *)MmGetPfnDb() + 32;
++*(_WORD *)&v40[v17];
v121 = &v40[v17];
v20 = (INT64)antNameA;
LABEL_40:
v128 = (_QWORD *)((char *)MmGetPfnDb() + v17 + 8);
v41 = (MMPTE *)(*v128 | 0x8000000000000000ui64);
v127 = v41;
v42 = &v23[v17];
v43 = *v42;
v131 = v42;
if( (v43 & 0x20) != 0 )
{
v44 = (char *)MmGetPfnDb() + 24;
do
{
_InterlockedAnd64((volatile signed __int64 *)&v44[v17], 0x7FFFFFFFFFFFFFFFui64);
v45 = 0;
while( (*v42 & 0x20) != 0 )
{
++v45;
_mm_pause();
}
MiLockPageInline(v20);
v43 = *v42;
}
while( (*v42 & 0x20) != 0 );
v41 = v127;
v22 = 1i64;
}
*v42 = v43 | 0x20;
v46 = (char *)MmGetPfnDb() + 24;
if( (*(_QWORD *)&v46[v17] & 0x4000000000000000i64) == 0 && (*(_BYTE *)v41 & 0x20) == 0 )
MiWriteValidPteVolatile(v41, 1ui64);
_InterlockedAnd64((volatile signed __int64 *)&v46[v17], 0x7FFFFFFFFFFFFFFFui64);
v47 = (unsigned __int64 *)v120;
while( 1 )
{
while( 1 )
{
v48 = *v47;
if( (*v47 & 1) == 0 )
break;
v49 = *v47;
LABEL_60:
if( (*((_QWORD *)MmGetPfnDb() + 6 * ((v49 >> 12) & 0xFFFFFFFFFi64) + 5) & 0x4000000000000i64) != 0 )
{
v50 = (char *)MmGetPfnDb() + 48 * ((v49 >> 12) & 0xFFFFFFFFFi64);
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v50 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( *((__int64 *)v50 + 3) < 0 );
}
if( *v47 == v48 )
goto LABEL_67;
_InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
}
if( (v48 & 0x400) != 0 || (v48 & 0x800) == 0 )
break;
if( !v48 || !qword_140C4DC80 || (v48 & qword_140C4DC80) != 0 )
{
v49 = *v47;
if( qword_140C4DC80 && (v48 & 0x10) == 0 )
v49 = v48 & ~qword_140C4DC80;
goto LABEL_60;
}
}
v50 = 0i64;
LABEL_67:
v51 = (_MMPTE *)v47;
Pml4eBase = (UNICODE_STRING *)MmGetPml4eBase();
v53 = *v47;
v54 = v53;
PxeUserLimit = (WCHAR *)MmGetPxeUserLimit();
if( v51 >= (_MMPTE *)Pml4eBase && v51 <= (_MMPTE *)PxeUserLimit )
Pml4eBase = (UNICODE_STRING *)MmGetPml4eBase();
v119 = v53;
if( (v53 & 1) == 0 )
{
if( !v53 )
{
LABEL_150:
LOBYTE(Pml4eBase) = 17;
MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
return 3221225477i64;
}
LOBYTE(v93) = 0;
v94 = *v126;
if( v126 >= (unsigned __int64 *)Pml4eBase && v126 <= (unsigned __int64 *)PxeUserLimit )
Pml4eBase = (UNICODE_STRING *)MmGetPml4eBase();
if( (v94 & 0x400) != 0 )
{
v95 = *v126;
if( qword_140C4DC80 && (v94 & 0x10) == 0 )
v95 = v94 & ~qword_140C4DC80;
if( HIDWORD(v95) == 0xFFFFFFFF )
{
v96 = (_BYTE *)StoreInstruction;
v93 = (v94 >> 5) & 0x1F;
if( ((v94 >> 5) & 0x18) == 16 && (*(_BYTE *)(StoreInstruction + 69) & 8) != 0 )
goto LABEL_263;
v97 = v118;
Pml4eBase = (UNICODE_STRING *)FaultingAddress;
LABEL_187:
v100 = v53;
if( qword_140C4DC80 && (v53 & 0x10) == 0 )
v100 = v53 & ~(_WORD)qword_140C4DC80;
if( (v100 & 0x400) == 0
&& (v100 & 0x800) == 0
&& (v100 & 4) == 0
&& (v93 & 5) == 5
&& (Pml4eBase || (((unsigned __int8)MI_READ_PTE_LOCK_FREE((INT64)&v119) >> 5) & 5) != 4)
&& ((*(_BYTE *)(v129 + 184) & 7) != 0 || !*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1264i64))
&& ((MiFlags & 0x10000) == 0 || v123 < 0xFFFF800000000000ui64 || (v93 & 2) == 0) )
{
v101 = v130;
HIDWORD(v125) = 0;
v102 = (char *)MmGetPfnDb() + 24;
if( _interlockedbittestandset64((volatile signed __int32 *)&v102[v130], 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx((UINT64 *)((char *)&v125 + 4));
while( *(__int64 *)&v102[v101] < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&v102[v101], 0x3Fui64) );
}
*v131 &= ~0x20u;
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)antNameA);
_InterlockedAnd64((volatile signed __int64 *)&v102[v101], 0x7FFFFFFFFFFFFFFFui64);
if( v122 )
{
if( !v97 )
return 0i64;
v103 = v116 & 0xFFFFFFFFFFFFFFFEui64;
if( *(_BYTE *)(v116 & 0xFFFFFFFFFFFFFFFEui64) != 1 || (*(_DWORD *)(v103 + 80) & 0x4000) == 0 )
return 0i64;
v104 = (void *)v116;
}
else
{
v104 = (void *)v116;
v103 = v116 & 0xFFFFFFFFFFFFFFFEui64;
}
if( v97 )
{
if( *(_BYTE *)v103 != 1 && *(_BYTE *)v103 != 3 && *(_BYTE *)v103 != 6 )
goto LABEL_220;
}
else if( KeInvalidAccessAllowed(v104) != 1 )
{
goto LABEL_220;
}
if( (!v97 || *(_BYTE *)v103 != 6) && v123 >= 0xFFFF800000000000ui64 )
return 3221225477i64;
LABEL_220:
if( (v94 & 0x400) == 0 )
goto LABEL_225;
v105 = v94;
if( qword_140C4DC80 && (v94 & 0x10) == 0 )
v105 = v94 & ~qword_140C4DC80;
if( HIDWORD(v105) != 0xFFFFFFFF )
LABEL_225:
v94 = v53;
v106 = v94 >> 5;
v107 = v106 & 0x18;
v108 = v106 & 2 | 4;
if( v107 == 8 )
{
v108 |= 8u;
}
else if( v107 == 24 )
{
v108 |= 0x18u;
}
v109 = MiSwizzleInvalidPte(32i64 * v108);
v110 = (_MMPTE *)v126;
if( v126 >= (unsigned __int64 *)MmGetPml4eBase()
&& v126 <= (unsigned __int64 *)MmGetPxeUserLimit()
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (v109 & 1) != 0 )
{
v109 |= 0x8000000000000000ui64;
}
*v126 = v109;
return MiResolveDemandZeroFault(
v96,
v110,
0i64,
(_MMSUPPORT_INSTANCE *)FaultingAddress,
v113,
(unsigned __int64)v114,
(unsigned int)antNameA);
}
if( (v53 & 0x400) != 0 )
{
if( (v96[69] & 8) == 0 )
return MiResolveMappedFileFault(v96, v51, (_MMPFN *)antNameA, (_MMSUPPORT_INSTANCE *)PoINTerPte, v113, v114);
goto LABEL_263;
}
if( (v53 & 0x800) != 0 )
return MiResolveTransitionFault(
v96,
v51,
(_MMPFN *)antNameA,
(_MMSUPPORT_INSTANCE *)FaultingAddress,
PoINTerPte,
(UINT64)v114,
(INT64)antNameA,
v116,
(_MMINPAGE_SUPPORT **)v117);
if( (v53 & 4) == 0 )
{
if( v122 )
{
if( !v97
|| (v111 = v116 & 0xFFFFFFFFFFFFFFFEui64, *(_BYTE *)(v116 & 0xFFFFFFFFFFFFFFFEui64) != 1)
|| (*(_DWORD *)(v111 + 80) & 0x4000) == 0 )
{
LOBYTE(Pml4eBase) = 17;
MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
return 0i64;
}
v112 = (void *)v116;
}
else
{
v112 = (void *)v116;
v111 = v116 & 0xFFFFFFFFFFFFFFFEui64;
}
if( v97 )
{
if( *(_BYTE *)v111 != 1 && *(_BYTE *)v111 != 3 && *(_BYTE *)v111 != 6 )
return MiResolveDemandZeroFault(
v96,
(_MMPTE *)v120,
(_MMPFN *)antNameA,
(_MMSUPPORT_INSTANCE *)FaultingAddress,
v113,
(unsigned __int64)v114,
(unsigned int)antNameA);
}
else if( KeInvalidAccessAllowed(v112) != 1 )
{
return MiResolveDemandZeroFault(
v96,
(_MMPTE *)v120,
(_MMPFN *)antNameA,
(_MMSUPPORT_INSTANCE *)FaultingAddress,
v113,
(unsigned __int64)v114,
(unsigned int)antNameA);
}
if( (!v97 || *(_BYTE *)v111 != 6) && v123 >= 0xFFFF800000000000ui64 )
{
if( !MiIsPrototypePteVadLookup(v94) )
v94 = MI_READ_PTE_LOCK_FREE((INT64)&v119);
if( ((v94 >> 5) & 0x18) == 16 )
goto LABEL_150;
}
return MiResolveDemandZeroFault(
v96,
(_MMPTE *)v120,
(_MMPFN *)antNameA,
(_MMSUPPORT_INSTANCE *)FaultingAddress,
v113,
(unsigned __int64)v114,
(unsigned int)antNameA);
}
if( (v96[69] & 8) == 0 )
return MiResolvePageFileFault(v96, v51, (_MMPFN *)antNameA, (_MMSUPPORT_INSTANCE *)PoINTerPte, v113, v114);
LABEL_263:
LOBYTE(Pml4eBase) = 17;
MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
return 3221226548i64;
}
}
if( (v94 & 8) != 0 )
{
Pml4eBase = (UNICODE_STRING *)FaultingAddress;
}
else
{
v93 = (v53 >> 5) & 0x1F;
v98 = ((v53 >> 5) & 0x1F) >> 3;
if( v98 == 2 && (*(_BYTE *)(StoreInstruction + 69) & 8) != 0 )
goto LABEL_263;
if( (v53 & 1) == 0 )
{
Pml4eBase = (UNICODE_STRING *)FaultingAddress;
if( !FaultingAddress )
LOBYTE(v22) = 0;
if( *((char *)&MiReadWrite + ((unsigned __int8)v53 >> 5)) - (char)v22 < 10 )
{
v99 = -1073741819;
goto LABEL_180;
}
v97 = v118;
if( v98 == 2 && (!v118 || *(_BYTE *)(v116 & 0xFFFFFFFFFFFFFFFEui64) != 1) )
{
if( (unsigned int)MiAllowGuardFault((PVOID)v116) )
{
*(_QWORD *)v120 = v53 & 0xFFFFFFFFFFFFFC1Fui64 | (32 * ((v53 >> 5) & 0xF));
v99 = -2147483647;
}
else
{
v99 = -1073741819;
}
goto LABEL_180;
}
v51 = (_MMPTE *)v120;
LABEL_186:
v96 = (_BYTE *)StoreInstruction;
goto LABEL_187;
}
Pml4eBase = (UNICODE_STRING *)FaultingAddress;
if( FaultingAddress && (v53 & 0xA00) == 0 )
{
v99 = -1073741819;
LABEL_180:
if( v50 )
_InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
LOBYTE(Pml4eBase) = 17;
MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
return v99;
}
}
v97 = v118;
goto LABEL_186;
}
if( v122 )
{
PfnPriority = MiGetPfnPriority((INT64)v50);
if( (unsigned int)v57 > PfnPriority )
v50[35] = v57 | v50[35] & 0xF8;
_InterlockedAnd64((volatile signed __int64 *)v50 + 3, v58);
LOBYTE(v57) = 17;
MiUnlockProtoPoolPage((_MMPFN *)antNameA, v57);
return 0i64;
}
LOBYTE(v60) = MI_PFN_IS_PROTO((UNICODE_STRING *)v50, Pml4eBase, 0xFFu, PxeUserLimit);
if( v60 )
{
v62 = *((_QWORD *)v50 + 2);
if( (v62 & 0x400) != 0 && ((*((_QWORD *)v50 + 5) >> 60) & 7) != 3 )
{
v63 = *((_QWORD *)v50 + 2);
if( qword_140C4DC80 && (v62 & 0x10) == 0 )
v63 = ~qword_140C4DC80 & v62;
v64 = v63 >> 16;
if( (*(_DWORD *)(*(_QWORD *)v64 + 56i64) & 0x20) != 0 )
{
v65 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)v64 + 96i64) + 40i64);
if( v65 )
{
if( (v65 & 0xFFFFFFFFFFFFFFF8ui64) != 8 && (v65 & 3) != 2 )
{
if( v123 >= 0xFFFF800000000000ui64 )
{
if( (MiFlags & 0x10000) == 0 || (v62 & 0x40) == 0 )
goto LABEL_88;
LABEL_101:
_InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
LOBYTE(v61) = 17;
MiUnlockProtoPoolPage((_MMPFN *)antNameA, v61);
return 3221226536i64;
}
Address = MiLocateAddress(v123);
v61 = (UINT64)Address;
if( !Address )
goto LABEL_101;
v73 = (int)Address[2].Children[0];
if( (v73 & 0x70) != 32 )
goto LABEL_101;
if( (v73 & 0xF80) != 128
&& ((*(_DWORD *)&Address[2].0 & 0x8000000) == 0 || (v71 & 4) != 0)
&& ((MiFlags & 0x400) == 0 || (*(_BYTE *)(v72 + 34) & 2) == 0) )
{
goto LABEL_101;
}
}
}
}
}
}
LABEL_88:
v66 = 0x3FFFFFFFFFFFFFFFi64;
*((_QWORD *)v50 + 3) ^= (*((_QWORD *)v50 + 3) ^ (*((_QWORD *)v50 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
v67 = 0;
LODWORD(v125) = 0;
v68 = (char *)MmGetPfnDb() + 24;
if( _interlockedbittestandset64((volatile signed __int32 *)&v68[v17], 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&v125);
while( *(__int64 *)&v68[v17] < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&v68[v17], 0x3Fui64) );
v66 = 0x3FFFFFFFFFFFFFFFi64;
}
*v42 &= ~0x20u;
v69 = *(unsigned __int16 *)v121;
if( !(_WORD)v69 )
MiBadRefCount((_MMPFN *)antNameA, v69);
v74 = antNameA;
v75 = (_WORD)v69 == 1;
v76 = v69 - 1;
*(_WORD *)v121 = v76;
if( v75 && MiIsPfnFileOnly((INT64)antNameA) )
goto LABEL_145;
v77 = (__int64)v74[2].Buffer;
if( (v77 & 0x1000000000i64) == 0 && (v77 & 0x2000000000000i64) == 0 )
{
v78 = *(WCHAR **)&v68[v17];
v79 = v66 & (unsigned __int64)v78;
if( !v76 )
{
v80 = 1;
goto LABEL_115;
}
if( v76 != 1 )
{
if( v76 == 2 && v79 )
{
LABEL_112:
if( (*v42 & 8) != 0 )
goto LABEL_113;
}
goto LABEL_146;
}
if( !v79 )
goto LABEL_112;
LABEL_113:
v80 = 0;
LABEL_115:
v81 = MmGetPteBase();
v82 = (UNICODE_STRING *)(*v128 | 0x8000000000000000ui64);
if( v82 <= (UNICODE_STRING *)((char *)v81 + 0x3FFFFFFF78i64) && v82 >= (UNICODE_STRING *)v81 )
{
v83 = (char *)MmGetPfnDb() + 35;
}
else
{
v83 = (char *)MmGetPfnDb() + 35;
v84 = v83[v17];
if( (v84 & 0x20) != 0 )
{
v83[v17] = v84 & 0xDF;
goto LABEL_144;
}
}
LOBYTE(v85) = MI_PFN_IS_PROTO(v74, v82, v77, v78);
if( v85 && (*(_DWORD *)((char *)MmGetPfnDb() + v17 + 16) & 0x400i64) != 0 )
{
v67 = 1;
}
else if( v86 <= v89 && v86 >= (unsigned __int64)MmGetPteBase() && (v83[v17] & 0x20) != 0 )
{
v67 = 1;
}
else if( v80 == 1 && (v88 & 0x4000000000000000i64) != 0 )
{
v67 = 1;
}
v77 = (v87 >> 39) & 0x3FF;
v90 = *(_QWORD *)(qword_140C4E388 + 8 * v77);
if( v67 == 1 )
{
MiReturnCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v77), 1ui64);
v74 = antNameA;
}
if( (ULONG_PTR *)v90 == &MiSystemPartition )
{
v77 = (__int64)KeGetCurrentPrcb();
v91 = *(int *)(v77 + 33564);
if( (_DWORD)v91 != -1 )
{
if( (unsigned __int64)(v91 + 1) <= 0x100 )
{
while( 1 )
{
v92 = _InterlockedCompareExchange((volatile signed __int32 *)(v77 + 33564), v91 + 1, v91);
v75 = (_DWORD)v91 == v92;
LODWORD(v91) = v92;
if( v75 )
break;
if( v92 == -1 || (unsigned __int64)(v92 + 1i64) > 0x100 )
goto LABEL_138;
}
LABEL_144:
if( v80 )
LABEL_145:
MiPfnReferenceCountIsZero((_MMPFN *)v74, v17 / 48, (UINT8 *)v77);
goto LABEL_146;
}
LABEL_138:
if( (int)v91 > 192
&& (_DWORD)v91 != -1
&& (_DWORD)v91 == _InterlockedCompareExchange((volatile signed __int32 *)(v77 + 33564), 192, v91) )
{
v22 = (int)v91 - 192 + 1i64;
}
if( !v22 )
goto LABEL_144;
}
}
_InterlockedExchangeAdd64((volatile signed __int64 *)(v90 + 7168), v22);
goto LABEL_144;
}
LABEL_146:
_InterlockedAnd64((volatile signed __int64 *)((char *)MmGetPfnDb() + v17 + 24), 0x7FFFFFFFFFFFFFFFui64);
__incgsdword(0x2E98u);
result = MiCompleteProtoPteFault(StoreInstruction, v54, (__int64)FaultingAddress, 0, v116);
if( (int)result >= 0 )
return 272i64;
return result;
}Referenced by:
MiDispatchFault