MiSharePages
char *__fastcall MiSharePages(__int64 a1, _QWORD *a2, _LIST_ENTRY *a3, _MI_PAGE_COMBINING_SUPPORT **a4, int a5){
_LIST_ENTRY *v5;
__int64 v8;
_QWORD *v10;
_MMSUPPORT_INSTANCE *v11;
_KTBFLUSH_TYPE v12;
unsigned __int64 v13;
UINT64 *v14;
_MI_TB_FLUSH_LIST *v15;
__int64 v16;
int v17;
_EPROCESS *v18;
int v19;
_MMSUPPORT_INSTANCE *v20;
char v21;
UINT64 v22;
unsigned __int8 v23;
unsigned __int8 v24;
unsigned __int8 v25;
unsigned __int64 v26;
int v27;
int v28;
int v29;
_MI_COMBINE_BLOCK *PrivatePfn;
UINT64 v31;
_MMPTE *PteBase;
UINT64 v33;
_MMPTE *v34;
_MMPTE *v35;
INT64 v36;
unsigned __int64 v37;
_MMPFN *v38;
int v39;
char v40;
unsigned int v41;
__int64 v42;
_UNICODE_STRING *v43;
UINT8 v44;
wchar_t *v45;
int v46;
__int64 bf_0;
__int64 v48;
VOID *v49;
_MMPTE *v50;
_MMVAD *v51;
_MMVAD *Address;
int v53;
unsigned int v54;
__int64 *v55;
UINT64 v56;
UINT64 v57;
NTSTATUS IsZero;
__int64 v59;
__int64 v60;
__int64 v61;
__int64 v62;
__int64 v63;
UINT64 v64;
_MI_COMBINE_BLOCK *CombineProto;
__int64 v66;
__int64 v67;
_LIST_ENTRY *Flink;
__int64 v69;
_MMPFN *v70;
__int64 v71;
bool v72;
char v73;
unsigned __int64 v74;
UINT64 v75;
unsigned __int64 *v76;
__int64 v77;
_MI_PAGE_COMBINING_SUPPORT *v78;
_MI_ARBITRARY_PAGE_MAP *v79;
unsigned __int64 Long;
int v81;
char v82;
__int64 v83;
__int64 v84;
unsigned __int64 v85;
int v86;
UINT64 v87;
_MI_COMBINE_BLOCK v88;
UINT64 v89;
unsigned int v90;
INT64 *v91;
unsigned __int64 v92;
BOOL v93;
_MI_COMBINE_PAGE_LISTHEAD *v94;
_RTL_BALANCED_NODE *Root;
UINT64 v96;
unsigned int v97;
__int64 *v98;
int i;
__int64 v100;
__int64 v101;
_MI_COMBINE_BLOCK *v102;
__int64 v103;
__int64 v104;
unsigned __int64 v105;
_MI_COMBINE_BLOCK *v106;
UINT64 *v107;
char *result;
char v109;
char v110;
_MMSUPPORT_INSTANCE *v111;
UINT64 v112;
UINT64 *v113;
unsigned __int8 v115;
_MI_COMBINE_CANDIDATE InputPfn[3];
int v117;
unsigned int v118;
int v119;
_MI_PAGE_COMBINING_SUPPORT *Pcs;
UINT64 HashValue;
__int64 v122;
int v123;
NTSTATUS v124;
UINT64 *v125;
_MI_TB_FLUSH_LIST *TbFlushList;
int v127;
_DWORD StandbyOnly[3];
_QWORD *v129;
_EPROCESS *Process;
UINT64 v131;
INT64 v132;
_MI_ARBITRARY_PAGE_MAP *PageMap;
UINT64 SpinCount;
INT64 v135;
__int64 v136;
_KTHREAD *Thread;
INT64 *v138;
_KLOCK_QUEUE_HANDLE LockHandle;
__int128 v140;
_DWORD *v141;
__int128 v142;
__int128 v143;
__int64 v144;
_KAPC_STATE ApcState;
_BYTE v146[184];
char v147[208];
__int64 v148;
__int64 v149;
__int64 v150[5];
__int64 v151;
*(_QWORD *)&StandbyOnly[1] = a1;
v5 = a3;
v144 = 0i64;
v141 = 0i64;
v8 = 0i64;
v135 = 0i64;
v138 = 0i64;
v142 = 0i64;
v143 = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
v140 = 0i64;
memset(v146, 0i64, sizeof(v146));
memset(v147, 0i64, 0xB8u);
v10 = *(_QWORD **)(a1 + 24);
PageMap = *(_MI_ARBITRARY_PAGE_MAP **)(a1 + 16);
InputPfn[0] = *(_MI_COMBINE_CANDIDATE *)(a1 + 60);
Pcs = *a4;
v11 = (_MMSUPPORT_INSTANCE *)a2[4];
*(_QWORD *)&InputPfn[1] = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
v129 = v10;
v118 = 0;
v122 = 0i64;
v111 = v11;
v12 = MiTbFlushType(v11);
v13 = a2[3];
v14 = (UINT64 *)a2[6];
v123 = v12;
v119 = 0;
v124 = 0;
v136 = a1 + 64;
v15 = (_MI_TB_FLUSH_LIST *)v147;
TbFlushList = (_MI_TB_FLUSH_LIST *)v147;
if( v13 <= 0x14 )
{
LODWORD(v16) = v13;
}
else
{
v16 = 509i64;
if( v13 < 0x1FD )
v16 = v13;
TbFlushList = (_MI_TB_FLUSH_LIST *)MiAllocatePool(64i64, 8 * v16 + 24, 0x73576D4Dui64);
v15 = TbFlushList;
if( !TbFlushList )
{
v15 = (_MI_TB_FLUSH_LIST *)v147;
TbFlushList = (_MI_TB_FLUSH_LIST *)v147;
LODWORD(v16) = 20;
}
}
v17 = v123;
v15[3] = 0;
*((_WORD *)v15 + 2) = 0;
*((_QWORD *)v15 + 2) = 0i64;
*((_QWORD *)v15 + 3) = 0i64;
*v15 = v17;
v15[2] = v16;
v18 = (_EPROCESS *)a2[5];
Process = v18;
if( v18 && v18 != KeGetCurrentThread()->ApcState.Process )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
v124 = MiPrepareAttachThread(v18, &v18->Vm.Instance);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v124 )
goto LABEL_187;
KeForceAttachProcess(v18);
}
Thread = (_ETHREAD *)KeGetCurrentThread();
--Thread->Tcb.KernelApcDisable;
v19 = a5;
v20 = v111;
while( 2 )
{
v21 = 0;
v148 = 0i64;
v149 = 0i64;
v22 = 0i64;
v150[0] = 0i64;
v23 = 0;
v151 = 0i64;
v112 = 0i64;
v109 = 0;
MiLockWorkingSetShared();
v25 = v24;
v115 = v24;
if( Process && ((Process->Flags & 0xC00) < 0xC00 || v20->ExitOutswapGate || MiIsStoreProcess(Process)) )
{
MiUnlockWorkingSetShared(v20, v25);
KeLeaveCriticalRegionThread(&Thread->Tcb);
v15 = TbFlushList;
goto LABEL_186;
}
while( 1 )
{
v26 = v23;
v23 = 0;
v125 = v14;
if( (_BYTE)v26 != 1 )
v23 = v26;
v27 = 0;
v110 = v23;
if( (_BYTE)v26 != 1 )
v27 = v119 + 1;
v119 = v27;
if( v21 )
{
v109 = 0;
LOBYTE(v26) = 1;
goto LABEL_31;
}
if( (v27 & 7) != 0 )
goto LABEL_28;
LOBYTE(v28) = MiWorkingSetIsContended((INT64)v20);
if( v28 )
{
LOBYTE(v26) = 1;
goto LABEL_31;
}
if( v22 && (unsigned int)MiPageTableLockIsContended((__int64)v20, v22) )
{
LOBYTE(v26) = 1;
}
else
{
LABEL_28:
if( (unsigned int)KeShouldYieldProcessor() )
{
LOBYTE(v26) = 1;
}
else
{
MiFlushTbListEarly(TbFlushList, (_BYTE *)2);
v26 = v29 != 0;
}
}
LABEL_31:
if( !v14 )
break;
if( (_BYTE)v26 )
goto LABEL_167;
PrivatePfn = (_MI_COMBINE_BLOCK *)v14[4];
v31 = v14[1];
v113 = (UINT64 *)v14[2];
HashValue = *v14;
v131 = v31;
if( (unsigned __int64)PrivatePfn >= 0x100 )
{
v127 = PrivatePfn[10] & 0x1F;
}
else
{
v127 = (int)PrivatePfn;
PrivatePfn = 0i64;
}
PteBase = MmGetPteBase();
v33 = (UINT64)PteBase + ((v31 >> 9) & 0x7FFFFFFFF8i64);
v132 = v33;
v34 = (_MMPTE *)((char *)PteBase + ((v33 >> 9) & 0x7FFFFFFFF8i64));
if( (_MMPTE *)v112 == v34 )
goto LABEL_41;
if( v112 )
{
v20 = v111;
v21 = 1;
v109 = 1;
v22 = v112;
}
else
{
v35 = MiLockLowestValidPageTable(
(INT64)v111,
(INT64 *)((char *)PteBase + ((v31 >> 9) & 0x7FFFFFFFF8i64)),
&v138);
v112 = (UINT64)v35;
if( v35 == v34 )
{
LABEL_41:
if( !MiRecheckVaVm((_MMSUPPORT_INSTANCE *)v26, (VOID *)v31) )
goto LABEL_53;
v36 = *(_QWORD *)v33;
MiPteInShadowRange(v33);
v135 = v36;
if( (v36 & 1) != 0 )
{
LODWORD(v37) = MI_READ_PTE_LOCK_FREE((INT64)&v135);
if( (MmGetPfnDb()[(v37 >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) == 0 )
goto LABEL_53;
v38 = &MmGetPfnDb()[(v37 >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v38->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v38->u2._bf_0 < 0 );
}
}
else
{
if( (v36 & 0x400) != 0 )
goto LABEL_53;
if( (v36 & 0x800) == 0 )
goto LABEL_53;
v38 = MiLockTransitionLeafPage(v33, 0i64);
if( !v38 )
goto LABEL_53;
}
StandbyOnly[0] = MiCombineCandidate(Pcs, (_MMPFN *)(unsigned int)InputPfn[0]);
v39 = StandbyOnly[0];
if( !StandbyOnly[0] )
{
_InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_53:
MiDereferenceCombineBlock(a3, PrivatePfn);
goto LABEL_54;
}
v40 = *(_BYTE *)(&v38->u3 + 1) & 7;
v41 = (*((_DWORD *)&v38->3 + 4) >> 5) & 0x1F;
v117 = 3;
*(_QWORD *)&InputPfn[1] = v125[3];
LODWORD(v42) = MiSearchNumaNodeTable((PVOID)(v38 - MmGetPfnDb()));
if( *(_DWORD *)(v42 + 8) != v19 )
{
_InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_57:
MiDereferenceCombineBlock(a3, PrivatePfn);
v23 = v110;
goto LABEL_54;
}
_InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v40 == 6 )
{
if( v132 != (v38->PteLong | 0x8000000000000000ui64) )
goto LABEL_57;
LOBYTE(v46) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v38, v43, v44, v45);
if( v46 )
goto LABEL_57;
bf_0 = v38->u4._bf_0;
if( (bf_0 & 0x1000000000i64) != 0 )
goto LABEL_57;
if( (*((_BYTE *)&v38->u3 + 3) & 8) != 0 )
goto LABEL_57;
v48 = bf_0 & 0xFFFFFFFFFi64;
if( v48 == 0xFFFFFFFFDi64 )
goto LABEL_57;
v49 = (VOID *)v131;
if( (MiGetWsleContents(v48, v131) & 0xF) == 8 )
goto LABEL_57;
if( v38->u3.ReferenceCount != 1 )
goto LABEL_57;
v51 = 0i64;
if( v39 == 1 )
{
Address = MiLocateAddress(v49);
if( !Address )
goto LABEL_57;
if( MiVadPageSizes[((unsigned __int64)Address->Core.u.LongFlags >> 18) & 3] == 16 )
goto LABEL_57;
LOBYTE(v53) = MiVadSupportsPrivateCommit((INT64)Address);
if( !v53 )
goto LABEL_57;
}
v54 = (*((_DWORD *)&v38->3 + 4) >> 5) & 0x1F;
if( v54 != v127 )
goto LABEL_57;
if( (v36 & 0x42) != 0 )
{
if( v118 < 8 )
{
v55 = v150;
LABEL_87:
MiInsertTbFlushEntry(TbFlushList, v49, 1ui64, 0i64);
v59 = (__int64)v125;
v60 = *v55;
v23 = v110;
*v55 = (__int64)v125;
*(_QWORD *)(v59 + 16) = v60;
goto LABEL_54;
}
MiMakeCombineCandidateClean(v50, v51);
*(_WORD *)&v146[4] = 0;
*(_QWORD *)&v146[16] = 0i64;
*(_QWORD *)&v146[24] = 0i64;
*(_QWORD *)&v146[8] = 1i64;
*(_DWORD *)v146 = v123;
MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v146, v49, 1ui64, 0i64);
MiFlushTbList((_MI_TB_FLUSH_LIST *)v146);
v50 = (_MMPTE *)v132;
v56 = HashValue;
goto LABEL_75;
}
v56 = HashValue;
if( HashValue == *(&stru_140C4DB30 + 501) )
{
if( ((*((_DWORD *)&v38->3 + 4) >> 5) & 0x18) == 0 && (v36 & 0x20) != 0 && v118 < 3 )
{
v55 = &v151;
goto LABEL_87;
}
LABEL_75:
v20 = v111;
if( v56 != *(&stru_140C4DB30 + 501) || !MiPageMightBeZero((INT64)v111, (INT64)v38, (INT64)v50) )
goto LABEL_90;
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v38->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( v38->u2._bf_0 < 0 );
}
IsZero = MiConfirmPageIsZero(v38, v57);
_InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( !IsZero )
goto LABEL_90;
*(_QWORD *)&v146[16] = 0i64;
*(_QWORD *)&v146[24] = 0i64;
*(_QWORD *)&v146[8] = 1i64;
*(_DWORD *)v146 = v123;
*(_WORD *)&v146[4] = 4;
MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v146, v49, 1ui64, 0i64);
MiFreeWsleList(v111, (_MMWSLE_FLUSH_LIST *)v146, 0i64);
++v122;
++v129[1];
MiDereferenceCombineBlock(a3, PrivatePfn);
v23 = v110;
v14 = v113;
v22 = v112;
v21 = v109;
}
else
{
v20 = v111;
LABEL_90:
v23 = v110;
if( (v54 & 0x18) != 0 )
v23 = 1;
v110 = v23;
if( *(_QWORD *)&InputPfn[1] == *(&stru_140C4DB30 + 236)
|| v39 != 1
|| *(_QWORD *)&InputPfn[1] == v20[4].AgeDistribution[7] && (Process->MitigationFlags2 & 0x1000) == 0 )
{
v61 = -1i64;
if( PrivatePfn )
{
LODWORD(v66) = v117;
LABEL_111:
v69 = (__int64)v125;
goto LABEL_112;
}
LODWORD(v62) = MiComputeHash64((UINT64 *)v131);
if( v62 != v64 )
goto LABEL_54;
if( v63 == *(&stru_140C4DB30 + 236) )
{
if( !MiHashIsCommon(*(_MI_COMBINE_CONTROL_BLOCK **)&StandbyOnly[1], v64) )
goto LABEL_54;
v64 = HashValue;
}
CombineProto = MiAllocateCombineProto(Pcs, v64, v54, (UINT64)&InputPfn[1]);
PrivatePfn = CombineProto;
if( !CombineProto )
{
PrivatePfn = (_MI_COMBINE_BLOCK *)MiPopCombineBlock(a3);
if( !PrivatePfn )
goto LABEL_54;
v66 = MiProtectionToCacheAttribute(v54);
v67 = *(_QWORD *)(v136 + 8 * v66);
if( !v67 || *(_DWORD *)(v67 + 44) >= *(_DWORD *)(v67 + 40) )
{
Flink = a3->Flink;
if( a3->Flink->Blink != a3 )
__fastfail(3u);
*(_QWORD *)PrivatePfn = Flink;
*((_QWORD *)PrivatePfn + 1) = a3;
Flink->Blink = (_LIST_ENTRY *)PrivatePfn;
a3->Flink = (_LIST_ENTRY *)PrivatePfn;
goto LABEL_54;
}
PrivatePfn[10] = v54 | PrivatePfn[10] & 0xFFFFFFE0;
*((_QWORD *)PrivatePfn + 8) = *(_QWORD *)&InputPfn[1];
v61 = *(_QWORD *)(v67 + 8 * ((unsigned __int64)*(unsigned int *)(v67 + 44) >> 12) + 48);
goto LABEL_111;
}
v69 = (__int64)v125;
LODWORD(v66) = v117;
v125[4] = (UINT64)CombineProto;
LABEL_112:
v70 = MiConvertPrivateToProto(
v111,
(_MMPTE *)v132,
(_MMPTE *)PrivatePfn,
(_MI_PAGE_COMBINING_SUPPORT *)(unsigned int)InputPfn[0],
(_MI_TB_FLUSH_LIST *)Pcs,
(UINT64)TbFlushList);
if( !v70 )
goto LABEL_53;
++v129[1];
if( v61 == -1 )
{
PrivatePfn = 0i64;
++v122;
}
else
{
MiIncrementCombineMdl(*(__int64 *)&StandbyOnly[1], v66);
}
v71 = v148;
*(_QWORD *)(v69 + 8) = v70;
v72 = v61 != -1;
*(_QWORD *)(v69 + 16) = v71;
v148 = v69;
LABEL_152:
if( v72 )
{
v87 = HashValue;
v88 = PrivatePfn[10];
v89 = HashValue & 0xF;
*((_QWORD *)PrivatePfn + 3) = HashValue;
*(_QWORD *)&v140 = v87;
v90 = v88 & 0x1F;
v91 = (INT64 *)((char *)Pcs + 16 * (unsigned int)v89);
DWORD2(v140) = v90;
v141 = PrivatePfn + 16;
v92 = (unsigned __int8)ExAcquireSpinLockExclusive(v91 + 13);
v93 = 0;
v94 = &Pcs->CombinePageListHeads[v89];
Root = v94->Table.Root;
if( v94->Table.Root )
{
while( 1 )
{
while( 1 )
{
v96 = (UINT64)Root[1].Children[0];
if( HashValue > v96 )
break;
if( HashValue >= v96 )
{
v97 = *(_DWORD *)&Root[1]._bf_0 & 0x1F;
if( v90 > v97
|| v90 >= v97
&& (PrivatePfn == (_MI_COMBINE_BLOCK *)-64i64
|| *((_QWORD *)PrivatePfn + 8) >= Root[2].ParentValue) )
{
break;
}
}
if( !Root->Children[0] )
goto LABEL_165;
Root = Root->Children[0];
}
if( !Root->Children[1] )
break;
Root = Root->Children[1];
}
v93 = 1;
}
LABEL_165:
RtlAvlInsertNodeEx(&v94->Table.Root, (UINT64)Root, v93, (_RTL_BALANCED_NODE *)PrivatePfn);
ExReleaseSpinLockExclusiveFromDpcLevel(v91 + 13);
__writecr8(v92);
v23 = v110;
}
LABEL_54:
v14 = v113;
v22 = v112;
v21 = v109;
v20 = v111;
}
else
{
MiDereferenceCombineBlock(a3, PrivatePfn);
v14 = v113;
v22 = v112;
v21 = v109;
}
}
}
else
{
v73 = 0;
MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)(*(_QWORD *)&StandbyOnly[1] + 208i64), 3i64);
v75 = StandbyOnly[0];
v76 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + ((v74 >> 9) & 0x7FFFFFFFF8i64));
v20 = v111;
if( *(_QWORD *)&InputPfn[1] == *(&stru_140C4DB30 + 236)
|| StandbyOnly[0] != 1
|| (LODWORD(v77) = MiGetCombineDomain(1i64, (INT64)v111), *(_QWORD *)&InputPfn[1] == v77)
&& (Process->MitigationFlags2 & 0x1000) == 0 )
{
if( v76 )
{
v78 = Pcs;
v79 = PageMap;
*((_QWORD *)PageMap + 9) = v76;
*((_QWORD *)v79 + 8) = v38;
if( !MiMapArbitraryPage(v78, v79, InputPfn[0], v75) )
{
Long = ZeroPte.u.Long;
LOBYTE(v81) = MiPteInShadowRange((UINT64)v76);
if( v81
&& (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
&& (ZeroPte.u.Long & 1) != 0 )
{
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
}
*v76 = Long;
goto LABEL_57;
}
v82 = v110;
if( (v41 & 0x18) != 0 )
v82 = 1;
v110 = v82;
v83 = -1i64;
if( !PrivatePfn )
{
if( !MiPerformCombineScan(
*(_MI_COMBINE_CONTROL_BLOCK **)&StandbyOnly[1],
PageMap,
(_MI_PAGE_CRCS *)(*(_QWORD *)&InputPfn[1] == *(&stru_140C4DB30 + 236)))
|| (_QWORD)v142 != HashValue )
{
goto LABEL_145;
}
PrivatePfn = MiAllocateCombineProto(Pcs, HashValue, v41, (UINT64)&InputPfn[1]);
if( !PrivatePfn )
{
PrivatePfn = (_MI_COMBINE_BLOCK *)MiPopCombineBlock(a3);
if( PrivatePfn )
{
v117 = MiProtectionToCacheAttribute(v41);
v84 = *(_QWORD *)(v136 + 8i64 * v117);
if( v84 )
{
if( *(_DWORD *)(v84 + 44) < *(_DWORD *)(v84 + 40) )
{
PrivatePfn[10] = v41 | PrivatePfn[10] & 0xFFFFFFE0;
*((_QWORD *)PrivatePfn + 8) = *(_QWORD *)&InputPfn[1];
v83 = *(_QWORD *)(v84 + 8 * ((unsigned __int64)*(unsigned int *)(v84 + 44) >> 12) + 48);
goto LABEL_141;
}
}
}
LABEL_145:
v72 = 0;
LABEL_146:
MiReleaseArbitraryPage(PageMap);
v85 = ZeroPte.u.Long;
LOBYTE(v86) = MiPteInShadowRange((UINT64)v76);
if( v86
&& (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
&& (ZeroPte.u.Long & 1) != 0 )
{
v85 = ZeroPte.u.Long | 0x8000000000000000ui64;
}
*v76 = v85;
if( !v73 )
goto LABEL_57;
v23 = v110;
goto LABEL_152;
}
v125[4] = (UINT64)PrivatePfn;
}
LABEL_141:
if( !MiConvertStandbyToProto(
v111,
Pcs,
PageMap,
(_MI_COMBINE_BLOCK *)(unsigned int)InputPfn[0],
(_MMPFN *)PrivatePfn,
(_MMPTE *)v38,
v132) )
goto LABEL_145;
++v129[1];
if( v83 == -1 )
{
PrivatePfn = 0i64;
v73 = 1;
++v122;
v72 = 0;
}
else
{
MiIncrementCombineMdl(*(__int64 *)&StandbyOnly[1], v117);
v72 = 1;
v73 = 1;
}
goto LABEL_146;
}
}
MiDereferenceCombineBlock(a3, PrivatePfn);
v23 = v110;
v14 = v113;
v22 = v112;
v21 = v109;
}
}
else
{
v20 = v111;
MiUnlockPageTable((INT64)v111, (UINT64)v35);
v22 = 0i64;
v112 = 0i64;
MiDereferenceCombineBlock(a3, PrivatePfn);
v14 = v113;
v21 = v109;
}
}
}
++v118;
LABEL_167:
v98 = v150;
v131 = (UINT64)v150;
for( i = 2; i <= 3; ++i )
{
v100 = *v98;
if( *v98 )
{
do
{
v101 = *(_QWORD *)(v100 + 16);
if( MiCrcStillIntact(Pcs, v111, (_MI_PAGE_CRCS *)(unsigned int)InputPfn[0], (_MI_COMBINE_DEFER_TYPE)v100) )
{
*(_QWORD *)(v100 + 16) = v14;
v14 = (UINT64 *)v100;
}
else
{
v102 = *(_MI_COMBINE_BLOCK **)(v100 + 32);
if( (unsigned __int64)v102 >= 0x100 )
MiDereferenceCombineBlock(a3, v102);
}
v100 = v101;
}
while( v101 );
v98 = (__int64 *)v131;
}
*v98 = 0i64;
v98 += 5;
v131 = (UINT64)v98;
}
v15 = TbFlushList;
v19 = a5;
MiFlushTbList(TbFlushList);
v20 = v111;
if( v112 )
MiUnlockPageTable((INT64)v111, v112);
MiUnlockWorkingSetShared(v111, v115);
v103 = v148;
if( v148 )
{
do
{
v104 = *(_QWORD *)(v103 + 8);
v105 = MiLockPageInline((_MMPFN *)v104);
*(_BYTE *)(v104 + 34) = *(_BYTE *)(v104 + 34) & 0xF8 | 6;
MiDecrementShareCount((_MMPFN *)v104);
_InterlockedAnd64((volatile signed __int64 *)(v104 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v105);
v103 = *(_QWORD *)(v103 + 16);
}
while( v103 );
v19 = a5;
v20 = v111;
}
if( v14 )
{
v5 = a3;
continue;
}
break;
}
KeLeaveCriticalRegionThread(&Thread->Tcb);
v5 = a3;
LABEL_186:
v18 = Process;
v10 = v129;
v8 = v122;
LABEL_187:
if( v14 )
{
do
{
v106 = (_MI_COMBINE_BLOCK *)v14[4];
v107 = (UINT64 *)v14[2];
if( (unsigned __int64)v106 >= 0x100 )
MiDereferenceCombineBlock(v5, v106);
v14 = v107;
}
while( v107 );
}
if( v124 == 1 )
{
KeForceDetachProcess(&ApcState, 0);
MiAttachThreadDone(&v18->Vm.Instance);
}
result = v147;
if( v15 != (_MI_TB_FLUSH_LIST *)v147 )
result = (char *)ExFreePoolWithTag(v15, 0);
*v10 += v8;
return result;
}Referenced by:
MiProcessCrcList