MiCompleteProtoPteFault
__int64 __fastcall MiCompleteProtoPteFault(INT64 rcx0, unsigned __int64 a2, __int64 r8_0, int a4, __int64 a5){
unsigned int v5;
unsigned __int64 v6;
__int64 v7;
UNICODE_STRING *v8;
_DWORD *p_Length;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
_EX_FAST_REF *v14;
signed __int64 v15;
signed __int64 v16;
char *v17;
unsigned int v18;
INT64 v19;
signed __int64 v20;
signed __int64 v21;
signed __int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
__int64 v25;
__int64 v26;
unsigned int v27;
unsigned __int64 v28;
__int64 v29;
INT64 v30;
__int64 v31;
_ETHREAD *CurrentThread;
__int64 v33;
int v34;
signed __int64 v35;
signed __int64 v36;
unsigned __int64 v37;
UINT64 v38;
bool v39;
unsigned __int8 v40;
unsigned __int64 v41;
signed __int64 v42;
signed __int64 v43;
signed __int64 v44;
signed __int64 v45;
unsigned __int64 v46;
_ETHREAD *v47;
unsigned __int64 v48;
int v49;
unsigned __int64 v50;
BOOL v51;
int LogEntry;
unsigned __int64 *v53;
_QWORD *v54;
__int64 v55;
signed __int32 v56;
char v57;
signed __int32 v58;
UINT64 v59;
CHAR *v60;
unsigned __int8 v61;
unsigned __int64 v62;
CHAR **v63;
signed __int32 v64;
unsigned __int64 *v65;
unsigned __int64 v66;
signed __int64 Value;
signed __int64 v68;
char *v69;
unsigned __int64 v70;
unsigned __int64 v71;
int v72;
unsigned __int64 v73;
__int64 v74;
_MMPTE *PteLimit;
UINT64 PteBase;
int v77;
UINT64 v78;
char v79;
char PagePrivilege;
unsigned int v81;
char v82;
unsigned __int64 v83;
unsigned __int64 v84;
int v85;
int v86;
INT64 v87;
__int64 v88;
__int64 v89;
bool v90;
UINT64 v91;
unsigned __int8 v92;
INT64 v93;
char MaximumLength;
unsigned __int64 v95;
UINT64 v96;
__int64 v97;
int v98;
unsigned int v99;
UINT64 v100;
unsigned __int64 ParentValue;
unsigned int v102;
INT64 v103;
__int64 v104;
RTL_BALANCED_NODE *Address;
RTL_BALANCED_NODE *v106;
int v107;
UNICODE_STRING *v108;
char v110;
_BYTE *v111;
UNICODE_STRING *v112;
__int64 v113;
int v114;
__int16 v115;
WCHAR *v116;
int v117;
char v118;
__int16 v119;
UNICODE_STRING *v120;
UNICODE_STRING *v121;
int v122;
char v123;
__int64 v124;
char v125;
UINT64 *v126;
int v127;
ULONG_PTR BugCheckParameter4;
char v129[8];
INT64 v130;
INT64 v131;
UNICODE_STRING *a9;
INT64 a10;
INT64 a11;
INT64 a12;
INT64 v136;
UINT64 v137;
UINT64 v138;
unsigned __int64 v139;
UINT64 SpinCount;
_EX_FAST_REF *v141;
PVOID Object;
unsigned __int64 v143;
__int64 v144;
unsigned __int64 *a3;
__int64 v146;
char *v147;
__int64 v148;
__int64 v149;
INT64 a1;
__int64 v151;
__int128 v152;
__int64 v153;
v149 = *(_QWORD *)(rcx0 + 56);
v5 = 0;
v137 = *(_QWORD *)rcx0;
v148 = 0i64;
a10 = 0i64;
LODWORD(v138) = 0;
v6 = (unsigned __int64)MmGetPteBase() + ((v137 >> 9) & 0x7FFFFFFFF8i64);
a11 = v6;
v7 = (a2 >> 12) & 0xFFFFFFFFFi64;
v146 = v7;
v8 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * v7);
p_Length = &v8[1].Length;
a9 = v8;
v147 = (char *)&v8[1];
v10 = *(_QWORD *)&v8[1].Length;
a1 = *(_QWORD *)(qword_140C4E388 + 8 * (((unsigned __int64)v8[2].Buffer >> 39) & 0x3FF));
v151 = v10;
v139 = v10;
if( (v10 & 0x400) == 0 )
{
v144 = 0i64;
v136 = 0i64;
goto LABEL_102;
}
v11 = v10;
if( qword_140C4DC80 && (v10 & 0x10) == 0 )
v11 = v10 & ~qword_140C4DC80;
v12 = v11 >> 16;
v144 = v12;
v13 = *(_QWORD *)v12;
v136 = *(_QWORD *)v12;
if( PfSnNumActiveTraces )
{
v14 = (_EX_FAST_REF *)(v13 + 64);
v141 = (_EX_FAST_REF *)(v13 + 64);
_m_prefetchw((const void *)(v13 + 64));
v15 = *(_QWORD *)(v13 + 64);
if( (v15 & 0xF) != 0 )
{
do
{
v16 = _InterlockedCompareExchange64((volatile signed __int64 *)v14, v15 - 1, v15);
if( v15 == v16 )
break;
v15 = v16;
}
while( (v16 & 0xF) != 0 );
}
v17 = (char *)(v15 & 0xFFFFFFFFFFFFFFF0ui64);
v18 = v15 & 0xF;
Object = v17;
if( v18 <= 1 )
{
if( !v18 )
{
LABEL_20:
v23 = ExAcquireSpinLockShared((PEX_SPIN_LOCK)(v136 + 72));
Object = (PVOID)ObFastReferenceObjectLocked(v14);
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(v136 + 72));
__writecr8(v23);
v12 = v144;
LABEL_21:
v24 = (unsigned __int64)v8->Buffer | 0x8000000000000000ui64;
if( (v137 < 0xFFFF800000000000ui64 || (unsigned int)MiGetSystemRegionType(v137) == 1)
&& (v25 = *((_QWORD *)KeGetCurrentThread() + 23), (v26 = *(_QWORD *)(v25 + 1368)) != 0)
&& (*(_DWORD *)(v25 + 2172) & 0x1000) == 0 )
{
v27 = *(_DWORD *)(v26 + 8);
}
else
{
v27 = -1;
}
v28 = *(_QWORD *)(v12 + 8);
if( (*(_DWORD *)(*(_QWORD *)v12 + 56i64) & 0x20) != 0 )
{
if( v24 < v28 || v24 >= v28 + 8i64 * *(unsigned int *)(v12 + 44) )
{
if( (*(_BYTE *)(v12 + 34) & 2) != 0 )
v29 = (v24 << 9) - (MiGetSharedProtos(*(_QWORD *)v12, v27, v12)[9] << 9);
else
v29 = (v24 << 9) - (*(_QWORD *)(MiGetSubsectionDriverProtos((_QWORD *)v12) + 72) << 9);
}
else
{
v29 = (v24 << 9) - (v28 << 9);
}
v30 = ((unsigned __int64)*(unsigned int *)(v12 + 36) << 9) + (v29 & 0xFFFFFFFFFFFFF000ui64);
}
else
{
if( v28 )
v31 = (__int64)(v24 - v28) >> 3 << 12;
else
v31 = 0i64;
v30 = ((*(unsigned int *)(v12 + 36) | ((unsigned __int64)(*(_WORD *)(v12 + 32) & 0xFFC0) << 26)) << 12) + v31;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
a12 = v30;
v33 = *((_QWORD *)CurrentThread + 23);
v34 = *(_DWORD *)(v136 + 56) & 0x20;
_m_prefetchw((const void *)(v33 + 1536));
v35 = *(_QWORD *)(v33 + 1536);
if( (v35 & 0xF) != 0 )
{
do
{
v36 = _InterlockedCompareExchange64((volatile signed __int64 *)(v33 + 1536), v35 - 1, v35);
if( v35 == v36 )
break;
v35 = v36;
}
while( (v36 & 0xF) != 0 );
}
v37 = v35 & 0xFFFFFFFFFFFFFFF0ui64;
if( (v35 & 0xFFFFFFFFFFFFFFF0ui64) == 0 )
goto LABEL_97;
v38 = v35 & 0xF;
if( (unsigned int)v38 <= 1 )
{
if( (_DWORD)v38 )
{
if( ExAcquireRundownProtectionEx((EX_RUNDOWN_REF *)(v37 + 360), 0xFui64) )
{
_m_prefetchw((const void *)(v33 + 1536));
v42 = *(_QWORD *)(v33 + 1536);
while( (v42 & 0xF) == 0 )
{
if( v37 != (v42 & 0xFFFFFFFFFFFFFFF0ui64) )
break;
v43 = v42;
v42 = _InterlockedCompareExchange64((volatile signed __int64 *)(v33 + 1536), v42 + 15, v42);
if( v43 == v42 )
goto LABEL_60;
}
v152 = 0i64;
v153 = 0i64;
_m_prefetchw((const void *)(v37 + 360));
v44 = *(_QWORD *)(v37 + 360);
if( (v44 & 1) != 0 )
{
LABEL_57:
v46 = v44 & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v46, 0xFFFFFFFFFFFFFFF1ui64) == 15
&& !_interlockedbittestandreset((volatile signed __int32 *)(v46 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v46 + 8), 0);
}
}
else
{
while( 1 )
{
v45 = v44;
v44 = _InterlockedCompareExchange64((volatile signed __int64 *)(v37 + 360), v44 - 30, v44);
if( v45 == v44 )
break;
if( (v44 & 1) != 0 )
goto LABEL_57;
}
}
}
}
else
{
v39 = 1;
KeAcquireSpinLockRaiseToDpc(&SpinLock, v38);
v41 = v40;
v37 = *(_QWORD *)(v33 + 1536) & 0xFFFFFFFFFFFFFFF0ui64;
if( v37 )
v39 = ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v37 + 360));
KxReleaseSpinLock(&SpinLock);
__writecr8(v41);
if( !v39 )
{
LABEL_96:
v14 = v141;
LABEL_97:
_m_prefetchw(v14);
Value = v14->Value;
if( ((unsigned __int64)Object ^ v14->Value) >= 0xF )
{
LABEL_100:
ObDereferenceObjectDeferDelete(Object);
}
else
{
while( 1 )
{
v68 = Value;
Value = _InterlockedCompareExchange64((volatile signed __int64 *)v14, Value + 1, Value);
if( v68 == Value )
break;
if( ((unsigned __int64)Object ^ Value) >= 0xF )
goto LABEL_100;
}
}
p_Length = v147;
v6 = a11;
v8 = a9;
v7 = v146;
goto LABEL_102;
}
}
}
LABEL_60:
if( v37 )
{
if( (*((_BYTE *)CurrentThread + 1304) & 0x40) == 0 )
{
if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 68) + 1124i64) & 0x100000) == 0
&& (*((_DWORD *)CurrentThread + 324) & 0xE00u) >= 0x400
|| CurrentThread == (_ETHREAD *)KeGetCurrentThread() && *((_DWORD *)CurrentThread + 340) )
{
v47 = *(_ETHREAD **)(v37 + 432);
if( !v47 || v47 == CurrentThread && *(_QWORD *)(v37 + 440) == *((_QWORD *)CurrentThread + 144) )
{
v48 = *((_QWORD *)Object + 3);
PfSnGetFileInformation(v37, Object);
if( (*(_BYTE *)(v37 + 484) & 1) == 0 && *(_BYTE *)(*(_QWORD *)(v37 + 352) + 1850i64) == 2 )
_InterlockedOr16((volatile signed __int16 *)(v37 + 484), 1u);
if( (unsigned __int64)a12 < 0x20000000000i64 )
{
v49 = dword_140CEBED0;
v50 = (unsigned __int64)a12 >> 9;
a12 = (unsigned __int64)a12 >> 9;
a3 = 0i64;
v51 = v34 != 0;
if( dword_140CEBED0 != *(_DWORD *)(v37 + 404) )
{
LogEntry = PfSnTraceGetLogEntry(v37, 1ui64, &a3);
v50 = a12;
if( LogEntry >= 0 )
{
v53 = a3;
*a3 = *a3 & 0xFFFFFFFFFFFFFFF8ui64 | 2;
*((_DWORD *)v53 + 2) = v49;
*(_DWORD *)(v37 + 404) = v49;
*(_QWORD *)(v37 + 408) = v37 + 416;
}
}
if( v34 || (v54 = *(_QWORD **)(v37 + 408), *v54 >> 3 != v50) || v54[1] != v48 )
{
if( _InterlockedIncrement((volatile signed __int32 *)(v37 + 344)) <= *(_DWORD *)(v37 + 340) )
{
v55 = *(_QWORD *)(v37 + 96);
v56 = _InterlockedExchangeAdd((volatile signed __int32 *)(v55 + 16), 1u);
v57 = (v56 + 1 < 0) ^ __OFADD__(1, v56) | (v56 == -1);
v58 = v56 + 1;
if( v57 )
{
LABEL_90:
_InterlockedExchangeAdd((volatile signed __int32 *)(v37 + 344), 0xFFFFFFFF);
}
else
{
while( v58 > *(_DWORD *)(v55 + 20) )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v55 + 16), 0xFFFFFFFF);
v60 = PfSnTraceBufferAllocate();
if( v60 )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)(v37 + 128), v59);
v62 = v61;
if( *(_QWORD *)(v37 + 96) == v55 )
{
v63 = *(CHAR ***)(v37 + 112);
if( *v63 != (CHAR *)(v37 + 104) )
__fastfail(3u);
*((_QWORD *)v60 + 1) = v63;
*(_QWORD *)v60 = v37 + 104;
*v63 = v60;
*(_QWORD *)(v37 + 112) = v60;
++*(_DWORD *)(v37 + 120);
*(_QWORD *)(v37 + 96) = v60;
KxReleaseSpinLock((UINT64 *)(v37 + 128));
__writecr8(v62);
}
else
{
KxReleaseSpinLock((UINT64 *)(v37 + 128));
__writecr8(v62);
ExFreePoolWithTag(v60, 0);
}
v55 = *(_QWORD *)(v37 + 96);
v64 = _InterlockedExchangeAdd((volatile signed __int32 *)(v55 + 16), 1u);
v57 = (v64 + 1 < 0) ^ __OFADD__(1, v64) | (v64 == -1);
v58 = v64 + 1;
if( !v57 )
continue;
}
goto LABEL_90;
}
v65 = (unsigned __int64 *)(v55 + 16i64 * v58 + 8);
v66 = v51 | (unsigned __int64)(8 * a12);
v65[1] = v48;
*v65 = v66;
_InterlockedIncrement((volatile signed __int32 *)(v37 + 332));
if( !v51 )
*(_QWORD *)(v37 + 408) = v65;
}
}
else
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v37 + 344), 0xFFFFFFFF);
if( !_InterlockedCompareExchange((volatile signed __int32 *)(v37 + 400), 3, 0) )
ExQueueWorkItem((WORK_QUEUE_ITEM *)(v37 + 368), DelayedWorkQueue);
}
}
}
}
}
else
{
_InterlockedIncrement((volatile signed __int32 *)(v37 + 336));
}
}
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v37 + 360));
}
goto LABEL_96;
}
ObReferenceObjectExWithTag(v17, 0xFui64);
_m_prefetchw(v14);
v20 = v14->Value;
while( (v20 & 0xF) == 0 )
{
if( v17 != (char *)(v20 & 0xFFFFFFFFFFFFFFF0ui64) )
break;
v21 = v20;
v20 = _InterlockedCompareExchange64((volatile signed __int64 *)v14, v20 + 15, v20);
if( v21 == v20 )
goto LABEL_19;
}
ObpTraceObjectDereferenceIfActive((INT64)(v17 - 48), (_BYTE *)0xF, 1953261124i64, v19, BugCheckParameter4);
v22 = _InterlockedExchangeAdd64((volatile signed __int64 *)v17 - 6, 0xFFFFFFFFFFFFFFF1ui64) - 15;
if( v22 <= 0 )
{
if( *((_QWORD *)v17 - 5) )
KeBugCheckEx(
0x18u,
ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v17 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v17 - 48) >> 8)],
(ULONG_PTR)v17,
6ui64,
*((_QWORD *)v17 - 5));
if( v22 < 0 )
KeBugCheckEx(0x18u, 0i64, (ULONG_PTR)v17, 5ui64, v22);
ObpDeferObjectDeletion((INT64)(v17 - 48));
}
}
LABEL_19:
if( v17 )
goto LABEL_21;
goto LABEL_20;
}
LABEL_102:
v143 = *(_QWORD *)((char *)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64));
v69 = (char *)MmGetPfnDb() + 48 * ((v143 >> 12) & 0xFFFFFFFFFi64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v69 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v69 + 3) < 0 );
}
*((_QWORD *)v69 + 3) ^= (*((_QWORD *)v69 + 3) ^ (*((_QWORD *)v69 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v69 + 3, 0x7FFFFFFFFFFFFFFFui64);
v70 = *(_QWORD *)v6;
if( (*(_QWORD *)v6 & 0x400i64) == 0 )
goto LABEL_112;
v71 = *(_QWORD *)v6;
if( qword_140C4DC80 && (v70 & 0x10) == 0 )
v71 = v70 & ~qword_140C4DC80;
if( HIDWORD(v71) == 0xFFFFFFFF )
{
v72 = (v70 >> 5) & 0x1F;
}
else
{
LABEL_112:
v73 = (v139 >> 5) & 0x1F;
v5 = 1;
if( (v70 & 8) != 0 )
LODWORD(v73) = 1;
v74 = r8_0;
v72 = v73;
if( r8_0 )
{
if( (v73 & 4) == 0 )
v74 = 0i64;
r8_0 = v74;
}
}
PteLimit = MmGetPteLimit();
PteBase = (UINT64)MmGetPteBase();
if( (MiFlags & 0x10000) != 0
&& v137 >= 0xFFFF800000000000ui64
&& (v137 < PteBase || v137 > (unsigned __int64)PteLimit)
&& (v72 & 2) != 0 )
{
if( (MiFlags & 0x20000) != 0
|| (LOBYTE(v77) = MI_PFN_IS_PROTO(v8, (UNICODE_STRING *)v137, (UINT8)PteLimit, 0i64), !v77)
|| (*p_Length & 0x400i64) != 0 )
{
PagePrivilege = MiGetPagePrivilege((ULONG_PTR)v8, 0, 0i64);
}
else
{
PagePrivilege = v79;
if( (unsigned int)MiIsAddressInDriverView(v78) )
PagePrivilege = 1;
}
PteBase = (UINT64)MmGetPteBase();
if( (PagePrivilege & 1) != 0 )
{
v72 = 3;
r8_0 = 0i64;
}
else if( (PagePrivilege & 8) != 0 )
{
v72 = 1;
r8_0 = 0i64;
}
else
{
v72 &= ~2u;
if( !v72 )
v72 = 1;
}
PteLimit = MmGetPteLimit();
}
v81 = v72 & 0xFFFFFFE7;
v82 = LOBYTE(v8[2].MaximumLength) >> 6;
if( v82 != 1 )
{
if( v82 )
{
if( v82 == 2 )
v81 |= 0x18u;
}
else
{
v81 |= 8u;
}
}
v83 = (v7 << 12) | MmProtectToPteMask[v81] & 0xFFFF000000000E7Fui64 | 0x21;
if( v6 < PteBase || v6 > (unsigned __int64)PteLimit )
{
LABEL_161:
v83 |= 0x100ui64;
goto LABEL_162;
}
v84 = (__int64)((v6 << 25) - (PteBase << 25)) >> 16;
if( v6 >= (unsigned __int64)MmGetPdeBase() && v6 <= (unsigned __int64)MmGetPdeLimit() )
{
if( (_MMPTE *)v6 == MmGetPxeSelfRef() )
v83 |= 0x8000000000000000ui64;
else
v83 &= ~0x8000000000000000ui64;
v85 = MiUserPdeOrAbove(v6);
PteBase = (UINT64)MmGetPteBase();
if( v85 )
v83 |= 4ui64;
}
if( v6 <= PteBase + 0x3FFFFFFF78i64 )
v83 |= 4ui64;
if( v84 < 0xFFFF800000000000ui64 )
{
v86 = HIBYTE(word_140C4DD48);
goto LABEL_160;
}
if( (unsigned int)MiGetSystemRegionType(v84) != 1
&& (v84 < (unsigned __int64)MmGetPteBase() || v84 > (unsigned __int64)MmGetPteLimit()) )
{
if( v84 < qword_140C4F878 || (v86 = HIBYTE(word_140C4DD48), v84 > qword_140C4E0A8) )
v86 = (unsigned __int8)word_140C4DD48;
LABEL_160:
if( !v86 )
goto LABEL_162;
goto LABEL_161;
}
LABEL_162:
v87 = v83 & 0xF0FFFFFFFFFFFFFFui64 | 0xA00000000000000i64;
a10 = v87;
if( r8_0 )
{
if( *(_QWORD *)rcx0 <= 0x7FFFFFFEFFFFui64 )
{
v88 = *((_QWORD *)KeGetCurrentThread() + 23);
if( v87 >= 0 && (*(_DWORD *)(v88 + 1124) & 0x10) != 0
|| (v89 = *(_QWORD *)(v88 + 2552)) != 0 && *(_QWORD *)(v89 + 24) != v89 + 24 )
{
v87 = a10;
r8_0 = 0i64;
goto LABEL_185;
}
v87 = a10;
}
if( (v72 & 5) != 5 )
{
v87 |= 0x42ui64;
v90 = (v8[2].MaximumLength & 0x10) == 0;
a10 = v87;
if( v90 && (*(_DWORD *)&v8[1].Length & 0x400i64) == 0 && (unsigned int)MiGetPagingFileOffset((MMPTE *)&v8[1]) )
{
v91 = 0i64;
v92 = MiLockPageInline((INT64)v8);
MaximumLength = v8[2].MaximumLength;
v95 = v92;
if( (MaximumLength & 0x10) == 0 && (*(_DWORD *)&v8[1].Length & 0x400i64) == 0 )
{
if( (MaximumLength & 8) == 0 )
{
v96 = MiCapturePageFileInfoInline((UINT64 *)&v8[1].Length, 1i64, 0i64);
MaximumLength = v8[2].MaximumLength;
v91 = v96;
}
LOBYTE(v8[2].MaximumLength) = MaximumLength | 0x10;
}
_InterlockedAnd64((volatile signed __int64 *)&v8[1].Buffer, 0x7FFFFFFFFFFFFFFFui64);
if( v91 )
MiReleasePageFileInfo(
a1,
v91,
1,
v93,
BugCheckParameter4,
*(INT64 *)v129,
v130,
v131,
(INT64)a9,
a10,
a11,
a12);
__writecr8(v95);
v87 = a10;
}
if( (v151 & 0x400) != 0 && (*(_BYTE *)(v149 + 184) & 7) != 2 )
MiCheckAndUpdateIoAttribution((INT64)v8);
}
}
LABEL_185:
v97 = 0i64;
v98 = 0;
v99 = 0;
if( a4 || ((__int64)v8[2].Buffer & 0x1000000000i64) == 0 && (__int64)v8->Buffer > 0 )
goto LABEL_216;
v100 = v137;
if( v137 < 0xFFFF800000000000ui64 )
{
if( v144 )
{
if( (*(_DWORD *)(v136 + 56) & 0x20) == 0 )
{
LABEL_216:
v108 = a9;
goto LABEL_217;
}
}
else
{
v104 = *((_QWORD *)KeGetCurrentThread() + 23);
if( *(_QWORD *)(v104 + 1264) && MiLocateCloneAddress(v104, (unsigned __int64)v8->Buffer | 0x8000000000000000ui64) )
goto LABEL_215;
}
if( *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1680i64) + 384i64) != v97 )
{
Address = MiLocateAddress(v100);
v106 = Address;
if( Address )
{
v107 = (int)Address[2].Children[0];
if( (v107 & 0x70) == 32 && (v107 & 0x100000) == 0 && (v107 & 0x200000) != 0 )
{
v103 = (INT64)v106[3].Children[0]->Children[0];
v102 = (v137 >> 12)
+ (((__int64)v106[3].Children[1] - *(_QWORD *)(v103 + 136)) >> 3)
- LODWORD(v106[1].Children[0]);
if( _bittest((const signed __int32 *)v106[6].Children[1], v102) )
{
ParentValue = v106[5].ParentValue;
v87 = a10;
goto LABEL_204;
}
}
}
}
LABEL_215:
v87 = a10;
goto LABEL_216;
}
if( v136 && (*(_DWORD *)(v136 + 56) & 0x20) == 0 )
goto LABEL_216;
ParentValue = MiSystemImageHasPrivateFixups(v137, &v136, &v138);
v102 = v138;
LOBYTE(v97) = 0;
v103 = v136;
LABEL_204:
if( !ParentValue )
goto LABEL_216;
v99 = MiPrivateFixup(rcx0, v103, v102, (INT64)v8, ParentValue);
MiLockAndDecrementShareCount((UINT64)v8, 0);
if( v99 == 297 || v99 == -1073741670 )
{
MiLockAndDecrementShareCount((UINT64)v69, 0);
if( v99 == 297 )
return(unsigned int)-1073740748;
return v99;
}
if( (v99 & 0x80000000) != 0 )
return v99;
a10 = MiMakeTransitionPteValid(a11);
v87 = a10;
v108 = (UNICODE_STRING *)((char *)MmGetPfnDb()
+ 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&a10) >> 12) & 0xFFFFFFFFFi64));
v5 = 2;
a9 = v108;
if( v137 >= 0xFFFF800000000000ui64 && (v108[2].MaximumLength & 0x800) != 0 )
v98 = 2;
LOBYTE(v97) = 0;
LOBYTE(v72) = 0;
LABEL_217:
v110 = v97;
if( (v5 & 1) == 0 )
v110 = v72;
v111 = (_BYTE *)(a5 & 0xFFFFFFFFFFFFFFFEui64);
if( (a5 & 1) != 0 )
{
if( *v111 == 5 )
v148 = a5 & 0xFFFFFFFFFFFFFFFEui64;
if( (a5 & 1) != 0 && *v111 == 3 )
v98 |= 1u;
}
v112 = (UNICODE_STRING *)*(unsigned __int8 *)(rcx0 + 69);
if( ((unsigned __int8)v112 & 8) != 0 )
{
v113 = *(_QWORD *)(rcx0 + 16);
if( (v113 & 1) == 0 || *(_BYTE *)(v113 & 0xFFFFFFFFFFFFFFFEui64) != 2 )
v87 &= ~0x20ui64;
}
if( ((unsigned __int8)v112 & 5) != 4 || ((unsigned __int8)v112 & 2) != 0 )
{
v121 = a9;
goto LABEL_245;
}
v114 = *(unsigned __int16 *)(rcx0 + 66);
v115 = 511;
v116 = (WCHAR *)a11;
if( (_WORD)v114 )
{
if( v114 + *(unsigned __int16 *)(rcx0 + 64) == (((unsigned int)a11 >> 3) & 0x1FF) )
{
LOBYTE(v112) = (unsigned __int8)v112 & 0x10;
LOBYTE(v117) = MI_PFN_IS_PROTO(v108, v112, (UINT8)v108, (PWCHAR)a11);
if( v117 )
{
if( !v118 )
goto LABEL_238;
}
else if( v118 )
{
goto LABEL_238;
}
}
MiEmptyDeferredWorkingSetEntries(rcx0 + 56);
v115 = 511;
v116 = (WCHAR *)a11;
}
LABEL_238:
v119 = *(_WORD *)(rcx0 + 66);
if( v119 )
{
*(_WORD *)(rcx0 + 66) = v119 + 1;
v98 |= 4u;
v121 = a9;
}
else
{
v120 = (UNICODE_STRING *)*(unsigned __int8 *)(rcx0 + 69);
*(_WORD *)(rcx0 + 66) = 1;
*(_WORD *)(rcx0 + 64) = v115 & ((unsigned int)v116 >> 3);
v121 = a9;
LOBYTE(v122) = MI_PFN_IS_PROTO(a9, v120, (UINT8)v108, v116);
if( v122 )
v125 = v123 & 0xEF;
else
v125 = v123 | 0x10;
*(_BYTE *)(v124 + 69) = v125;
v98 |= 4u;
}
LABEL_245:
*(_DWORD *)v129 = v98;
v126 = (UINT64 *)a11;
if( !(unsigned int)MiAllocateWsle(v149, a11, v121, v110, v87, *(__int64 *)v129, v148) )
{
MiLockAndDecrementShareCount((UINT64)v121, 0);
if( v5 < 2 )
MiLockAndDecrementShareCount((UINT64)v69, 0);
return(unsigned int)-1073741801;
}
if( !r8_0
|| (v87 & 0x800) != 0
|| (v87 & 0x200) == 0
|| *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1248i64) )
{
return v99;
}
if( *(_QWORD *)(rcx0 + 72) && (*(_BYTE *)(rcx0 + 69) & 1) == 0 && *(_WORD *)(rcx0 + 66) )
MiEmptyDeferredWorkingSetEntries(rcx0 + 56);
v127 = MiCopyOnWrite(v137, v126, -1i64, 0i64);
v99 = v127;
if( v127 >= 0 )
return v99;
MiSetFaultPacketDirectives(rcx0, (unsigned int)v127);
return 3221226548i64;
}Referenced by:
MiIssueHardFault
MiResolveDemandZeroFault
MiResolveProtoPteFault
MiResolveTransitionFault