MiDecommitPages
VOID __stdcall MiDecommitPages(
VOID *StartingAddress,
_MMPTE *EndingPte,
ULONG_PTR Process,
_MMVAD_SHORT *Vad,
UINT64 VadLockHeld,
_MI_DELETE_VA_INFO *DeleteInfo){
_MI_DELETE_VA_INFO *v6;
int v8;
__int64 v10;
unsigned __int64 v11;
VOID *v12;
__int64 EndingVpnHigh;
__int64 v14;
INT64 v15;
_MMPTE *PteBase;
union {unsigned int LongFlags1;_MMVAD_FLAGS1 VadFlags1;} v17;
unsigned __int64 v18;
__int64 LongFlags1;
unsigned __int64 v20;
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;} v21;
unsigned __int64 LongFlags;
unsigned int v23;
__int64 v24;
__int64 v25;
int v26;
UINT64 v27;
unsigned __int64 v28;
int v29;
INT64 p_Vm;
unsigned __int8 v31;
_MMSUPPORT_SHARED *p_Shared;
char v33;
int v34;
UINT64 v35;
_MMPTE *v36;
_EPROCESS *v37;
int v38;
__int64 v39;
int v40;
__int64 v41;
__int64 v42;
unsigned __int64 v43;
VOID *v44;
UINT64 v45;
_MMSUPPORT_FULL *AnyMultiplexedVm;
NTSTATUS v47;
unsigned int v48;
_MMPTE *v49;
unsigned __int64 v50;
__int64 v51;
__int64 v52;
__int64 v53;
__int64 v54;
_MMPTE *v55;
__int64 v56;
_MMPTE v57;
VOID *v58;
char *v59;
char *v60;
unsigned __int64 v61;
int v62;
__int64 v63;
int v64;
_MMSUPPORT_INSTANCE *p_Instance;
_MMSUPPORT_SHARED *v66;
struct _KPRCB *CurrentPrcb;
volatile int DpcRequestSummary;
int v69;
int v70;
int v71;
_MI_PAGE_DELETE_RESULT v72;
int v73;
VOID *v74;
_MMCLONE_DESCRIPTOR *CloneAddress;
ULONG_PTR v76;
ULONG_PTR v77;
unsigned __int64 v78;
int v79;
bool v80;
_MMPTE v81;
_MMPFN *v82;
_MMPFN *v83;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v84;
unsigned int v85;
unsigned __int64 EntireField;
_MI_PARTITION *v87;
unsigned __int64 v88;
_MMPAGING_FILE *v89;
unsigned __int64 v90;
unsigned __int64 v91;
int v92;
__int16 v93;
int v94;
UINT64 v95;
_MI_PARTITION *v96;
int v97;
INT64 v98;
__int64 v99;
__int64 v100;
__int16 v101;
unsigned __int64 v102;
INT64 v103;
int v104;
_ETHREAD *NextThread;
int v106;
int v107;
_EPROCESS *v108;
UINT64 Flags;
int v110;
__int64 v111;
_EPROCESS *CurrentProcess;
_MMPTE *v113;
int v114;
unsigned int v115;
unsigned __int64 WsInfo;
unsigned __int64 WsInfoa;
UINT64 v118;
NTSTATUS v119;
UINT64 v120;
_MI_PARTITION *Partition;
__int64 CurrentIrql;
_MMPTE *v123;
int LogAccess;
int LogAccess_4;
INT64 v126;
__int64 bf_0;
INT64 v128;
unsigned __int64 v129;
VOID *INCR;
__int64 v131;
unsigned __int64 Long;
__int128 v133;
INT64 v134[2];
UINT64 NumberOfEntries[2];
_QWORD v136[22];
_MI_TB_FLUSH_LIST v137;
__int16 v138;
__int16 v139;
__int64 v140;
__int64 v141;
__int64 v142;
__int128 v143;
__int128 v144;
__int128 v145;
__int128 v146;
__int128 v147;
__int128 v148;
__int128 v149;
__int128 v150;
__int128 v151;
__int64 v152;
_MI_TB_FLUSH_LIST TbFlushList[48];
_MI_TB_FLUSH_LIST v154;
__int16 v155;
__int16 v156;
__int64 v157;
__int64 v158;
__int64 v159;
char v160[2040];
v6 = DeleteInfo;
CurrentProcess = *(_EPROCESS **)&Process;
v123 = EndingPte;
v8 = 0;
bf_0 = 0i64;
v156 = 0;
v126 = (INT64)Vad;
memset(v160, 0i64, sizeof(v160));
v157 = 256i64;
v155 = 0;
v154 = 1;
*(_OWORD *)NumberOfEntries = 0i64;
LODWORD(NumberOfEntries[1]) = 2;
*(_OWORD *)v134 = 0i64;
v158 = 0i64;
v159 = 0i64;
v111 = 1i64;
v119 = 0;
v10 = MiSwizzleInvalidPte(512i64);
EndingVpnHigh = Vad->EndingVpnHigh;
v14 = v10;
v131 = v10;
v15 = v10;
PteBase = MmGetPteBase();
v17.LongFlags1 = (unsigned int)Vad->u1;
v18 = (unsigned __int64)&PteBase[(Vad->EndingVpn | (unsigned __int64)(EndingVpnHigh << 32)) & 0xFFFFFFFFFi64];
LongFlags1 = v17.LongFlags1;
LODWORD(LongFlags1) = v17.LongFlags1 & 0x7FFFFFFF;
v20 = LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
v129 = v18;
if( v20 == 0x7FFFFFFFEi64 )
{
v14 = MiSwizzleInvalidPte(32i64 * ((Vad->u.LongFlags >> 7) & 0x1F));
v131 = v14;
v15 = v14;
}
else if( (v17.LongFlags1 & 0x80000000) == 0 )
{
v21.LongFlags = (unsigned int)Vad->u;
if( (v21.LongFlags & 0x100000) == 0 || (v21.LongFlags & 0x1000000) != 0 || (v21.LongFlags & 0x2000000) == 0 )
v15 = 0i64;
v129 = 0i64;
v119 = MiVadPureReserve(Vad);
}
LongFlags = Vad->u.LongFlags;
v23 = Vad->u.LongFlags & 0x500000;
INCR = v12;
v115 = 3;
if( v23 == 5242880 )
{
v24 = (LongFlags >> 18) & 3;
v25 = 16i64;
v111 = MiVadPageSizes[v24];
if( v111 != 16 )
v25 = (__int64)v12;
v115 = MiVadPageIndices[v24];
INCR = (VOID *)v25;
v11 = 2i64;
}
v26 = v11;
v118 = 0i64;
if( (_DWORD)VadLockHeld )
v26 = 0;
v27 = 0i64;
LogAccess = v26;
v28 = (unsigned __int64)PteBase + (((unsigned __int64)StartingAddress >> 9) & 0x7FFFFFFFF8i64);
v114 = (int)v12;
WsInfo = (unsigned __int64)StartingAddress & 0xFFFFFFFFFFFFF000ui64;
v29 = (int)v12;
p_Vm = (INT64)&CurrentProcess->Vm;
v110 = 0;
v113 = (_MMPTE *)&CurrentProcess->Vm;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * CurrentProcess->Vm.Instance.PartitionId);
v31 = CurrentProcess->Vm.Instance.Flags._bf_0 & 7;
if( v31 < 6u )
{
if( v31 == 2 )
p_Shared = (_MMSUPPORT_SHARED *)((char *)&stru_140C4DB30 + 6544);
else
p_Shared = &CurrentProcess->Vm.Shared;
v33 = ExAcquireSpinLockShared((INT64 *)&p_Shared->WorkingSetLock);
if( p_Shared->GoodCitizenWaiting )
_InterlockedExchange(&p_Shared->GoodCitizenWaiting, 0);
v29 = v114;
LODWORD(v12) = 1;
p_Vm = (INT64)&CurrentProcess->Vm;
LOBYTE(CurrentIrql) = v33;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(v11);
}
if( v28 > (unsigned __int64)v123 )
goto LABEL_204;
while( 1 )
{
v34 = 0;
v35 = v28;
if( v29 == 1 )
{
v34 = (int)v12;
LABEL_26:
v36 = MmGetPteBase();
goto LABEL_27;
}
if( v115 > 1 )
goto LABEL_26;
v36 = MmGetPteBase();
v39 = 2 - v115;
do
{
v35 = (UINT64)v36 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
--v39;
}
while( v39 );
LABEL_27:
if( (v35 & 0xFFF) == 0 || v34 )
break;
LABEL_65:
v57.u.Long = *(_QWORD *)v35;
Long = v57.u.Long;
if( !v57.u.Long )
{
if( v28 > v129 )
*(_QWORD *)&v6[1].ReducedCommitClonePages += v111;
if( v15 )
{
LODWORD(v58) = MiGetUsedPtesHandle((PSLIST_ENTRY)((__int64)((v35 << 25) - ((_QWORD)v36 << 25)) >> 16));
v59 = (char *)INCR;
MiIncreaseUsedPtesCount(v58, (VOID *)(unsigned int)INCR);
v60 = v59;
do
{
v61 = v15;
LOBYTE(v62) = MiPteInShadowRange(v35);
if( v62 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
v61 = v15 | 0x8000000000000000ui64;
*(_QWORD *)v35 = v61;
v35 += 8i64;
--v60;
}
while( v60 );
v14 = v131;
}
LABEL_76:
v63 = v111;
LABEL_77:
v64 = 1;
goto LABEL_78;
}
if( (v57.u.Long & 1) != 0 )
{
if( v111 != 1 )
goto LABEL_88;
LogAccess_4 = 0;
if( (HIBYTE(*(unsigned __int64 *)((char *)&v36->u.Long + ((WsInfo >> 9) & 0x7FFFFFFFF8i64))) & 0xF) == 8
|| !MiAppendWsleCluster((INT64)v134, (INT64)v113, (UINT64 *)v28) )
{
MiTerminateWsle(v113, (_MMSUPPORT_INSTANCE *)WsInfo, 0i64, (UINT64)&LogAccess_4);
MiInsertTbFlushEntry(&v154, (VOID *)WsInfo, 1ui64, 0i64);
Long = v57.u.Long & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
*(_QWORD *)v28 = Long;
}
if( HIDWORD(v157) != (_DWORD)v157 - 1 )
goto LABEL_76;
MiDeletePteWsleCluster((INT64)v134, CurrentProcess, (_MMPTE)v15, v6);
if( v71 )
v8 = 1;
v110 = v8;
MiDeletePteList(&v154, CurrentProcess, (_MMPTE)v15, v6);
v64 = 1;
LABEL_134:
v80 = v70 == 0;
v63 = v111;
if( !v80 )
{
v8 = 1;
v110 = 1;
}
goto LABEL_78;
}
if( (v57.u.Long & 0x400) != 0 )
{
if( MI_PROTO_FORMAT_COMBINED(v57) )
{
v72 = MiDecrementCombinedPte(v113);
LABEL_102:
if( v72 == PageStillReferenced )
{
++*(_QWORD *)&v6->ReducedCommitClonePages;
}
else if( v72 == PageCommitNotCharged )
{
++*(_QWORD *)&v6[1].ResidentPages;
}
}
else
{
LOBYTE(v73) = MiIsPrototypePteVadLookup(v57.u.Long);
if( !v73 )
{
CloneAddress = MiLocateCloneAddress(CurrentProcess, v74);
if( CloneAddress )
{
v72 = MiDecrementCloneBlockReference((ULONG_PTR)CloneAddress, v76, v77);
goto LABEL_102;
}
}
}
v78 = v15;
LOBYTE(v79) = MiPteInShadowRange(v28);
if( v79 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
v78 = v15 | 0x8000000000000000ui64;
*(_QWORD *)v28 = v78;
v80 = v15 == 0;
LABEL_132:
v64 = 1;
if( !v80 )
goto LABEL_173;
LOBYTE(v70) = MiReducePteUseCount(v28, 1u);
goto LABEL_134;
}
if( (v57.u.Long & 0x800) != 0 )
{
if( v111 != 1 )
{
LABEL_88:
LOBYTE(v70) = MiDecommitLargePte(v126, v35, v15, (INT64)v6, (INT64)&v154);
v64 = 1;
goto LABEL_134;
}
bf_0 = 0i64;
v81.u.Long = 0i64;
v82 = MiLockTransitionLeafPage(v28, 0i64);
v83 = v82;
if( !v82 )
goto LABEL_200;
v84.Long = 0i64;
v85 = 1;
if( !v82->u3.ReferenceCount )
{
v81.u.Long = v82->OriginalPte.u.Long;
EntireField = v82->u4.EntireField;
v84.Long = v81.u.Long;
bf_0 = v81.u.Hard._bf_0;
v87 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF));
Partition = v87;
if( (v81.u.Long & 2) != 0 && !MI_IS_PTE_IN_WS_SWAP_SET((_MMPTE *)v87) )
v85 = 0;
}
if( MiDeleteTransitionPte((_MMPTE *)v28, v83, 0x11u, 0i64) == PageStillReferenced )
++*(_QWORD *)&DeleteInfo->ReducedCommitClonePages;
if( v84.Long )
MiReleasePageFileSpace(Partition, v81, v85);
_InterlockedExchangeAdd64(
(volatile signed __int64 *)&CurrentProcess->NumberOfPrivatePages,
0xFFFFFFFFFFFFFFFFui64);
v88 = v15;
if( !v85 )
{
v89 = Partition->Vp.PagingFile[LOWORD(v84.Long) >> 12];
if( *(&stru_140C4DB30 + 42) && (v84.Long & 0x10) == 0 )
v84.Long &= ~*(&stru_140C4DB30 + 42);
LODWORD(v90) = MiTransferSoftwarePte(v14, (INT64)v89, HIDWORD(v84.Proto._bf_0));
v88 = v90;
}
v91 = v88;
LOBYTE(v92) = MiPteInShadowRange(v28);
if( v92 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v88 & 1) != 0 )
v91 = v88 | 0x8000000000000000ui64;
*(_QWORD *)v28 = v91;
v80 = v88 == 0;
goto LABEL_132;
}
if( ((v57.u.Long >> 5) & 0x1F) == 16 )
{
v63 = v111;
*(_QWORD *)&v6[1].ReducedCommitClonePages += v111;
goto LABEL_77;
}
v93 = v57.u.Long;
if( *(&stru_140C4DB30 + 42) && (v57.u.Long & 0x10) == 0 )
v93 = LOWORD(v57.u.Long) & ~*(&stru_140C4DB30 + 168);
if( (v93 & 0x400) != 0 || (v93 & 0x800) != 0 || (v93 & 4) != 0 )
_InterlockedExchangeAdd64(
(volatile signed __int64 *)&CurrentProcess->NumberOfPrivatePages,
0xFFFFFFFFFFFFFFFFui64);
v94 = 1;
v95 = v15;
v96 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * CurrentProcess->Vm.Instance.PartitionId);
Partition = v96;
if( ((v57.u.Long >> 1) & 1) != 0 && !MI_IS_PTE_IN_WS_SWAP_SET((_MMPTE *)v96) )
{
v94 = v97;
v120 = v14;
MiSetNonResidentPteHeat(&v120, 0i64);
v95 = v120;
if( (v14 & 0x400) == 0 )
{
v95 = v120 & 0xFFFFFFFFFFFFFFF9ui64;
v120 &= 0xFFFFFFFFFFFFFFF9ui64;
}
if( v99 )
{
if( v95 )
LODWORD(v100) = MiUpdatePageFileHighInPte(v95, v98);
else
v100 = MiSwizzleInvalidPte(v98 << 32);
v95 = v100 ^ (unsigned __int16)(v100 ^ (v101 << 12)) & 0xF000 | 2;
v120 = v95;
}
}
v102 = v95;
if( v28 >= (unsigned __int64)MmGetPml4eBase()
&& v28 <= (unsigned __int64)MmGetPxeUserLimit()
&& (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
&& (v95 & 1) != 0 )
{
v102 = v95 | 0x8000000000000000ui64;
}
*(_QWORD *)v28 = v102;
v128 = v57.u.Hard._bf_0;
if( (v57.u.Long & 4) != 0 )
{
LODWORD(v103) = MI_READ_PTE_LOCK_FREE((INT64)&v128);
if( !v94 )
v103 &= ~2ui64;
}
else if( v94 && ((v57.u.Long >> 1) & 1) != 0 )
{
LODWORD(v103) = MI_READ_PTE_LOCK_FREE((INT64)&v128);
}
else
{
v103 = 0i64;
}
v128 = v103;
if( v103 )
MiReleasePageFileInfo(Partition, (_MMPTE)v103, 0i64);
v64 = 1;
if( v95 )
{
v8 = v110;
LABEL_173:
v63 = v111;
goto LABEL_78;
}
LOBYTE(v104) = MiReducePteUseCount(v28, 1u);
v8 = v110;
v80 = v104 == 0;
v63 = v111;
if( !v80 )
v8 = 1;
v110 = v8;
LABEL_78:
v28 += 8 * v63;
if( (v28 & 0x78) == 0 )
{
p_Instance = &CurrentProcess->Vm.Instance;
v66 = (_MMSUPPORT_SHARED *)((char *)&stru_140C4DB30 + 6544);
if( (CurrentProcess->Vm.Instance.Flags._bf_0 & 7) != 2 )
v66 = &CurrentProcess->Vm.Shared;
if( (v66->WorkingSetLock & 0x40000000) != 0 )
goto LABEL_190;
}
CurrentPrcb = KeGetCurrentPrcb();
DpcRequestSummary = CurrentPrcb->DpcRequestSummary;
if( (DpcRequestSummary & 1) == 0 )
{
v69 = 0;
if( (DpcRequestSummary & 0x1E) != 0 )
{
v64 = 2;
goto LABEL_188;
}
if( CurrentPrcb->QuantumEnd )
{
v64 = 3;
goto LABEL_188;
}
NextThread = CurrentPrcb->NextThread;
if( NextThread && NextThread != CurrentPrcb->CurrentThread )
{
v64 = 4;
goto LABEL_188;
}
LABEL_181:
if( CurrentPrcb->DpcWatchdogCount <= 7u )
goto LABEL_199;
if( v69 )
{
LABEL_183:
if( (DpcRequestSummary & 0x1E) != 0 )
{
v64 = 5;
goto LABEL_188;
}
if( CurrentPrcb->CurrentThread != CurrentPrcb->IdleThread )
{
v64 = 6;
goto LABEL_188;
}
}
_disable();
v64 = 0;
CurrentPrcb->DpcWatchdogCount = 0;
CurrentPrcb->DpcTimeCount = 0;
KiResetGlobalDpcWatchdogProfiler((INT64)CurrentPrcb);
_enable();
goto LABEL_188;
}
v69 = 1;
if( CurrentPrcb->DpcTimeCount <= 7 )
goto LABEL_181;
if( !CurrentPrcb->QuantumEnd )
goto LABEL_183;
LABEL_188:
if( v64 )
{
p_Instance = &CurrentProcess->Vm.Instance;
LABEL_190:
MiDeletePteWsleCluster((INT64)v134, CurrentProcess, (_MMPTE)v15, DeleteInfo);
if( v106 )
v8 = 1;
v110 = v8;
if( HIDWORD(v157) )
{
MiDeletePteList(&v154, CurrentProcess, (_MMPTE)v15, DeleteInfo);
if( v107 )
v8 = 1;
v110 = v8;
}
if( v118 )
{
MiUnlockPageTableInternal((INT64)p_Instance, v118);
v118 = 0i64;
}
MiUnlockWorkingSetShared(p_Instance, (unsigned __int8)CurrentIrql);
v114 = 1;
MiLockWorkingSetShared();
}
LABEL_199:
WsInfo += v111 << 12;
LABEL_200:
v6 = DeleteInfo;
if( v28 > (unsigned __int64)v123 )
goto LABEL_203;
v29 = v114;
LODWORD(v12) = 1;
p_Vm = (INT64)&CurrentProcess->Vm;
}
memset(TbFlushList, 0i64, 0xB8u);
if( v134[1] )
{
TbFlushList[0] = 1;
*(_QWORD *)&TbFlushList[4] = 0i64;
*(_QWORD *)&TbFlushList[6] = 0i64;
LOWORD(TbFlushList[1]) = 0;
TbFlushList[2] = 20;
MiInsertTbFlushEntry(
TbFlushList,
(VOID *)(((v134[1] << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
NumberOfEntries[0],
0i64);
MiTerminateWsleCluster((INT64)v134);
v37 = CurrentProcess;
MiDeletePteList(TbFlushList, CurrentProcess, (_MMPTE)v15, v6);
if( v38 )
v8 = 1;
v110 = v8;
}
else
{
v37 = CurrentProcess;
}
if( HIDWORD(v157) )
{
MiDeletePteList(&v154, v37, (_MMPTE)v15, v6);
if( v40 )
v8 = 1;
v110 = v8;
}
if( v118 )
{
MiUnlockPageTableInternal(p_Vm, v118);
v118 = 0i64;
}
if( !v119 )
{
v35 = v28;
if( v115 <= 1 )
{
v55 = MmGetPteBase();
v56 = 2 - v115;
do
{
v35 = (UINT64)v55 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
--v56;
}
while( v56 );
v6 = DeleteInfo;
}
LODWORD(Flags) = LogAccess;
MiMakeSystemAddressValid((VOID *)v35, 0i64, (*(_DWORD *)(v126 + 48) >> 12) & 0x3F, CurrentIrql, Flags);
goto LABEL_64;
}
v133 = 0i64;
memset((char *)v136 + 2, 0i64, 0xAEu);
v41 = (_QWORD)MmGetPteBase() << 25;
WsInfoa = (__int64)((v28 << 25) - v41) >> 16;
v42 = (((_QWORD)v123 << 25) - v41) >> 16;
LOWORD(v136[0]) = 2145;
LODWORD(v43) = MiGetLeafVa(WsInfoa);
if( v43 < 0xFFFF800000000000ui64 || v43 >= *(&stru_140C4DB30 + 937) && v43 <= *(&stru_140C4DB30 + 175) )
AnyMultiplexedVm = &KeGetCurrentThread()->ApcState.Process->Vm;
else
AnyMultiplexedVm = (_MMSUPPORT_FULL *)MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v44);
v47 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v45);
if( v47 )
{
v48 = v47 - 1;
LODWORD(v133) = v47 - 1;
v49 = MmGetPteBase();
v50 = (unsigned __int64)v49 + ((WsInfoa >> 9) & 0x7FFFFFFFF8i64);
*((_QWORD *)&v133 + 1) = v50;
}
else
{
LOWORD(v136[0]) |= 4u;
v136[21] = &v133;
v136[2] = 0i64;
v136[3] = AnyMultiplexedVm;
BYTE2(v136[0]) = BYTE2(v136[0]) & 0xE3 | 4;
v136[20] = MiGetNextPageTableTail;
BYTE6(v136[0]) = CurrentIrql;
v136[4] = (__int64)((v28 << 25) - v41) >> 16;
v136[5] = v42;
MiWalkPageTables((INT64)v136);
v48 = v133;
v50 = *((_QWORD *)&v133 + 1);
v49 = MmGetPteBase();
}
v51 = *(_QWORD *)&DeleteInfo[1].ReducedCommitClonePages;
if( v50 )
{
v52 = v50 - v28;
v28 = v50;
*(_QWORD *)&DeleteInfo[1].ReducedCommitClonePages = v51 + (v52 >> 3);
v35 = v50;
if( v48 )
{
v35 = (UINT64)v49 + ((v50 >> 9) & 0x7FFFFFFFF8i64);
if( v48 > 1 )
{
v53 = v48 - 1;
do
{
v35 = (UINT64)v49 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
--v53;
}
while( v53 );
}
}
v54 = (v50 << 25) - v41;
v6 = DeleteInfo;
WsInfo = v54 >> 16;
LABEL_64:
v36 = MmGetPteBase();
v118 = (UINT64)v36 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
v114 = 0;
goto LABEL_65;
}
v6 = DeleteInfo;
*(_QWORD *)&DeleteInfo[1].ReducedCommitClonePages = v51 + ((__int64)((__int64)v123 - v28) >> 3) + 1;
LABEL_203:
v27 = v118;
LABEL_204:
v139 = 0;
v152 = 0i64;
v143 = 0i64;
v144 = 0i64;
v145 = 0i64;
v146 = 0i64;
v147 = 0i64;
v148 = 0i64;
v149 = 0i64;
v150 = 0i64;
v151 = 0i64;
if( v134[1] )
{
v138 = 0;
v141 = 0i64;
v142 = 0i64;
v140 = 20i64;
v137 = 1;
MiInsertTbFlushEntry(
&v137,
(VOID *)(((v134[1] << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
NumberOfEntries[0],
0i64);
MiTerminateWsleCluster((INT64)v134);
v108 = CurrentProcess;
MiDeletePteList(&v137, CurrentProcess, (_MMPTE)v15, v6);
}
else
{
v108 = CurrentProcess;
}
if( HIDWORD(v157) )
MiDeletePteList(&v154, v108, (_MMPTE)v15, v6);
if( v27 )
MiUnlockPageTableInternal((INT64)v113, v27);
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)v113, (unsigned __int8)CurrentIrql);
}Referenced by:
MiDecommitRegion
MmStoreAllocateVirtualMemory
MmStoreDecommitVirtualMemory