MiDecommitPages
__int64 __fastcall MiDecommitPages(
unsigned __int64 a1,
unsigned __int64 a2,
ULONG_PTR a3,
__int64 a4,
int a5,
_QWORD *a6){
_QWORD *v6;
unsigned int v8;
INT64 v10;
unsigned __int64 v11;
UINT64 v12;
__int64 v13;
INT64 v14;
UINT64 v15;
_MMPTE *PteBase;
int v17;
unsigned __int64 v18;
__int64 v19;
unsigned __int64 v20;
int v21;
unsigned __int64 v22;
int v23;
__int64 v24;
UINT64 v25;
int v26;
UINT64 v27;
unsigned __int64 v28;
int v29;
INT64 v30;
unsigned __int8 v31;
LONG *v32;
KIRQL v33;
int v34;
UINT64 v35;
_MMPTE *v36;
volatile INT64 *v37;
__int64 v38;
__int64 v39;
__int64 v40;
UINT64 LeafVa;
UINT64 v42;
CHAR *AnyMultiplexedVm;
int v44;
unsigned int v45;
_MMPTE *v46;
unsigned __int64 v47;
__int64 v48;
__int64 v49;
__int64 v50;
__int64 v51;
_MMPTE *v52;
__int64 v53;
unsigned __int64 v54;
_MMPFN *UsedPtesHandle;
UINT64 v56;
UINT64 v57;
__int64 v58;
int v59;
INT64 v60;
LONG *v61;
struct _KPRCB *CurrentPrcb;
int v63;
int v64;
int v65;
_MMPTE *v66;
int v67;
unsigned __int64 v68;
_QWORD *CloneAddress;
volatile INT64 *v70;
UINT64 v71;
bool v72;
UINT64 v73;
_MMPFN *v74;
UINT8 *v75;
_MMPFN *v76;
UINT64 v77;
unsigned int v78;
unsigned __int64 v79;
_MI_PARTITION *v80;
UINT64 v81;
INT64 v82;
__int16 v83;
int v84;
UINT64 v85;
_MI_PARTITION *v86;
int v87;
INT64 v88;
__int64 v89;
INT64 updated;
__int16 v91;
unsigned __int64 v92;
INT64 v93;
__int64 v94;
volatile INT64 *v95;
INT64 a5a;
INT64 v98;
INT64 a7;
__int64 a8;
volatile INT64 *a2a;
INT64 a10;
INT64 a11;
_QWORD *a12;
unsigned int v105;
UINT64 WsInfo;
unsigned __int64 WsInfoa;
UINT64 v108;
int v109;
UINT64 v110;
_MI_PARTITION *Partition;
__int64 CurrentIrql;
unsigned __int64 v113;
CHAR v114[4];
_DWORD LogAccess[3];
UINT64 v116;
INT64 v117;
unsigned __int64 v118;
UINT64 INCR;
INT64 v120;
unsigned __int64 v121;
__int128 v122;
INT64 v123[2];
INT64 v124[2];
__int16 v125;
_BYTE v126[14];
__int64 v127;
CHAR *v128;
__int64 v129;
__int64 v130;
INT64(__fastcall *v131)(INT64);
__int128 *v132;
int v133;
__int16 v134;
__int16 v135;
__int64 v136;
__int64 v137;
__int64 v138;
__int128 v139;
__int128 v140;
__int128 v141;
__int128 v142;
__int128 v143;
__int128 v144;
__int128 v145;
__int128 v146;
__int128 v147;
__int64 v148;
int a1a;
__int16 a1_4;
int v151;
__int64 v152;
__int64 v153;
INT64 v154;
__int64 v155;
__int64 v156;
__int64 v157;
INT64 result[256];
v6 = a6;
a2a = (volatile INT64 *)a3;
v113 = a2;
v8 = 0;
a12 = a6;
v116 = 0i64;
*(_QWORD *)&LogAccess[1] = a4;
memset((INT64)result, 0i64);
v155 = 256i64;
v154 = 1i64;
*(_OWORD *)v124 = 0i64;
LODWORD(v124[1]) = 2;
*(_OWORD *)v123 = 0i64;
v156 = 0i64;
v157 = 0i64;
a8 = 1i64;
v109 = 0;
v10 = MiSwizzleInvalidPte(512i64);
v13 = *(unsigned __int8 *)(a4 + 33);
v14 = v10;
v120 = v10;
v15 = v10;
PteBase = MmGetPteBase();
v17 = *(_DWORD *)(a4 + 52);
v18 = (unsigned __int64)PteBase + 8 * ((*(unsigned int *)(a4 + 28) | (unsigned __int64)(v13 << 32)) & 0xFFFFFFFFFi64);
v19 = (unsigned int)v17;
LODWORD(v19) = v17 & 0x7FFFFFFF;
v20 = v19 | ((unsigned __int64)*(unsigned __int8 *)(a4 + 34) << 31);
v118 = v18;
if( v20 == 0x7FFFFFFFEi64 )
{
v14 = MiSwizzleInvalidPte(32i64 * ((*(_DWORD *)(a4 + 48) >> 7) & 0x1F));
v120 = v14;
v15 = v14;
}
else if( v17 >= 0 )
{
v21 = *(_DWORD *)(a4 + 48);
if( (v21 & 0x100000) == 0 || (v21 & 0x1000000) != 0 || (v21 & 0x2000000) == 0 )
v15 = 0i64;
v118 = 0i64;
v109 = MiVadPureReserve(a4);
}
v22 = *(unsigned int *)(a4 + 48);
v23 = *(_DWORD *)(a4 + 48) & 0x500000;
INCR = v12;
v105 = 3;
if( v23 == 5242880 )
{
v24 = (v22 >> 18) & 3;
v25 = 16i64;
a8 = MiVadPageSizes[v24];
if( a8 != 16 )
v25 = v12;
v105 = MiVadPageIndices[v24];
INCR = v25;
v11 = 2i64;
}
v26 = v11;
v108 = 0i64;
if( a5 )
v26 = 0;
v27 = 0i64;
*(_DWORD *)v114 = v26;
v28 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
LODWORD(a11) = v12;
WsInfo = a1 & 0xFFFFFFFFFFFFF000ui64;
v29 = v12;
v30 = (INT64)(a2a + 208);
LODWORD(a7) = 0;
a10 = (INT64)(a2a + 208);
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *((unsigned __int16 *)a2a + 919));
v31 = a2a[231] & 7;
if( v31 < 6u )
{
if( v31 == 2 )
v32 = &dword_140C4F4C0;
else
v32 = (LONG *)(a2a + 232);
v33 = ExAcquireSpinLockShared(v32);
if( v32[1] )
_InterlockedExchange(v32 + 1, 0);
v29 = a11;
LODWORD(v12) = 1;
v30 = (INT64)(a2a + 208);
LOBYTE(CurrentIrql) = v33;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(v11);
}
if( v28 > v113 )
goto LABEL_192;
while( 1 )
{
v34 = 0;
v35 = v28;
if( v29 == 1 )
{
v34 = v12;
LABEL_26:
v36 = MmGetPteBase();
goto LABEL_27;
}
if( v105 > 1 )
goto LABEL_26;
v36 = MmGetPteBase();
v38 = 2 - v105;
do
{
v35 = (UINT64)v36 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
--v38;
}
while( v38 );
LABEL_27:
if( (v35 & 0xFFF) == 0 || v34 )
break;
LABEL_65:
v54 = *(_QWORD *)v35;
v121 = v54;
if( !v54 )
{
if( v28 > v118 )
v6[3] += a8;
if( v15 )
{
UsedPtesHandle = MiGetUsedPtesHandle((__int64)((v35 << 25) - ((_QWORD)v36 << 25)) >> 16);
v56 = INCR;
MiIncreaseUsedPtesCount(UsedPtesHandle, (unsigned int)INCR);
v57 = v56;
do
{
*(_QWORD *)v35 = v15;
v35 += 8i64;
--v57;
}
while( v57 );
v14 = v120;
}
LABEL_72:
v58 = a8;
LABEL_73:
v59 = 1;
goto LABEL_74;
}
if( (v54 & 1) != 0 )
{
if( a8 != 1 )
goto LABEL_84;
LogAccess[0] = 0;
if( (HIBYTE(*(_QWORD *)((char *)v36 + ((WsInfo >> 9) & 0x7FFFFFFFF8i64))) & 0xF) == 8
|| !(unsigned int)MiAppendWsleCluster((INT64)v123, a10, (UINT64 *)v28) )
{
MiTerminateWsle((PVOID)a10, (_MMSUPPORT_INSTANCE *)WsInfo, 0i64, (UINT64)LogAccess);
MiInsertTbFlushEntry((INT64)&v154, WsInfo, 1i64, 0i64);
v121 = v54 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
*(_QWORD *)v28 = v121;
}
if( HIDWORD(v155) != (_DWORD)v155 - 1 )
goto LABEL_72;
if( (unsigned int)MiDeletePteWsleCluster((INT64)v123, a2a, v15, v6) )
v8 = 1;
LODWORD(a5a) = 1;
LODWORD(a7) = v8;
v65 = MiDeletePteList((INT64)&v154, a2a, v15, v6, a5a);
v59 = 1;
LABEL_122:
v72 = v65 == 0;
v58 = a8;
if( !v72 )
{
v8 = 1;
LODWORD(a7) = 1;
}
goto LABEL_74;
}
if( (v54 & 0x400) != 0 )
{
if( MI_PROTO_FORMAT_COMBINED(v54) )
{
v67 = MiDecrementCombinedPte(a10, v66);
LABEL_98:
if( v67 == 3 )
{
++v6[1];
}
else if( v67 == 5 )
{
++v6[2];
}
}
else if( !MiIsPrototypePteVadLookup(v54) )
{
CloneAddress = MiLocateCloneAddress((__int64)a2a, v68);
if( CloneAddress )
{
v67 = MiDecrementCloneBlockReference((UINT64)CloneAddress, v70, v71);
goto LABEL_98;
}
}
*(_QWORD *)v28 = v15;
v72 = v15 == 0;
LABEL_120:
v59 = 1;
if( !v72 )
goto LABEL_161;
v65 = MiReducePteUseCount(v28, 1u);
goto LABEL_122;
}
if( (v54 & 0x800) != 0 )
{
if( a8 != 1 )
{
LABEL_84:
v65 = MiDecommitLargePte(*(INT64 *)&LogAccess[1], v35, v15, (INT64)v6, (INT64)&v154);
v59 = 1;
goto LABEL_122;
}
v116 = 0i64;
v73 = 0i64;
v74 = MiLockTransitionLeafPage((_MMPTE *)v28, 0i64);
v76 = v74;
if( !v74 )
goto LABEL_188;
v77 = 0i64;
v78 = 1;
if( !*((_WORD *)v74 + 16) )
{
v73 = *((_QWORD *)v74 + 2);
v79 = *((_QWORD *)v74 + 5);
v77 = v73;
v116 = v73;
v80 = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((v79 >> 39) & 0x3FF));
Partition = v80;
if( (v73 & 2) != 0 && !(unsigned int)MI_IS_PTE_IN_WS_SWAP_SET((MMPTE *)v80) )
v78 = 0;
}
LOBYTE(v75) = 17;
if( (unsigned int)MiDeleteTransitionPte((_MMPTE *)v28, v76, v75, 0i64) == 3 )
++a12[1];
if( v77 )
MiReleasePageFileSpace(Partition, v73, v78);
_InterlockedExchangeAdd64(a2a + 159, 0xFFFFFFFFFFFFFFFFui64);
v81 = v15;
if( !v78 )
{
v82 = *((_QWORD *)Partition + ((unsigned __int16)v77 >> 12) + 868);
if( qword_140C4DC80 && (v77 & 0x10) == 0 )
v77 &= ~qword_140C4DC80;
v81 = MiTransferSoftwarePte(v14, v82, HIDWORD(v77));
}
*(_QWORD *)v28 = v81;
v72 = v81 == 0;
goto LABEL_120;
}
if( ((v54 >> 5) & 0x1F) == 16 )
{
v58 = a8;
v6[3] += a8;
goto LABEL_73;
}
v83 = v54;
if( qword_140C4DC80 && (v54 & 0x10) == 0 )
v83 = v54 & ~(_WORD)qword_140C4DC80;
if( (v83 & 0x400) != 0 || (v83 & 0x800) != 0 || (v83 & 4) != 0 )
_InterlockedExchangeAdd64(a2a + 159, 0xFFFFFFFFFFFFFFFFui64);
v84 = 1;
v85 = v15;
v86 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a10 + 174));
Partition = v86;
if( ((v54 >> 1) & 1) != 0 && !(unsigned int)MI_IS_PTE_IN_WS_SWAP_SET((MMPTE *)v86) )
{
v84 = v87;
v110 = v14;
MiSetNonResidentPteHeat(&v110, 0i64);
v85 = v110;
if( (v14 & 0x400) == 0 )
{
v85 = v110 & 0xFFFFFFFFFFFFFFF9ui64;
v110 &= 0xFFFFFFFFFFFFFFF9ui64;
}
if( v89 )
{
if( v85 )
updated = MiUpdatePageFileHighInPte(v85, v88);
else
updated = MiSwizzleInvalidPte(v88 << 32);
v85 = updated ^ (unsigned __int16)(updated ^ (v91 << 12)) & 0xF000 | 2;
v110 = v85;
}
}
v92 = v85;
if( v28 >= (unsigned __int64)MmGetPml4eBase()
&& v28 <= (unsigned __int64)MmGetPxeUserLimit()
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (v85 & 1) != 0 )
{
v92 = v85 | 0x8000000000000000ui64;
}
*(_QWORD *)v28 = v92;
v117 = v54;
if( (v54 & 4) != 0 )
{
v93 = MI_READ_PTE_LOCK_FREE((INT64)&v117);
if( !v84 )
v93 &= ~2ui64;
}
else if( v84 && ((v54 >> 1) & 1) != 0 )
{
v93 = MI_READ_PTE_LOCK_FREE((INT64)&v117);
}
else
{
v93 = 0i64;
}
v117 = v93;
if( v93 )
MiReleasePageFileInfo((INT64)Partition, v93, 0, (INT64)v86, a5a, v98, a7, a8, (INT64)a2a, a10, a11, (INT64)a12);
v59 = 1;
if( v85 )
{
v8 = a7;
LABEL_161:
v58 = a8;
goto LABEL_74;
}
v8 = a7;
v72 = !MiReducePteUseCount(v28, 1u);
v58 = a8;
if( !v72 )
v8 = 1;
LODWORD(a7) = v8;
LABEL_74:
v28 += 8 * v58;
if( (v28 & 0x78) == 0 )
{
v60 = a10;
v61 = &dword_140C4F4C0;
if( (*(_BYTE *)(a10 + 184) & 7) != 2 )
v61 = (LONG *)(a10 + 192);
if( (*v61 & 0x40000000) != 0 )
goto LABEL_178;
}
CurrentPrcb = KeGetCurrentPrcb();
v63 = *((_DWORD *)CurrentPrcb + 3147);
if( (v63 & 1) == 0 )
{
v64 = 0;
if( (v63 & 0x1E) != 0 )
{
v59 = 2;
goto LABEL_176;
}
if( *((_BYTE *)CurrentPrcb + 12585) )
{
v59 = 3;
goto LABEL_176;
}
v94 = *((_QWORD *)CurrentPrcb + 2);
if( v94 && v94 != *((_QWORD *)CurrentPrcb + 1) )
{
v59 = 4;
goto LABEL_176;
}
LABEL_169:
if( *((_DWORD *)CurrentPrcb + 7931) <= 7u )
goto LABEL_187;
if( v64 )
{
LABEL_171:
if( (v63 & 0x1E) != 0 )
{
v59 = 5;
goto LABEL_176;
}
if( *((_QWORD *)CurrentPrcb + 1) != *((_QWORD *)CurrentPrcb + 3) )
{
v59 = 6;
goto LABEL_176;
}
}
_disable();
v59 = 0;
*((_DWORD *)CurrentPrcb + 7931) = 0;
*((_DWORD *)CurrentPrcb + 8103) = 0;
KiResetGlobalDpcWatchdogProfiler((INT64)CurrentPrcb);
_enable();
goto LABEL_176;
}
v64 = 1;
if( *((_DWORD *)CurrentPrcb + 8103) <= 7u )
goto LABEL_169;
if( !*((_BYTE *)CurrentPrcb + 12585) )
goto LABEL_171;
LABEL_176:
if( v59 )
{
v60 = a10;
LABEL_178:
if( (unsigned int)MiDeletePteWsleCluster((INT64)v123, a2a, v15, a12) )
v8 = 1;
LODWORD(a7) = v8;
if( HIDWORD(v155) )
{
LODWORD(a5a) = 1;
if( (unsigned int)MiDeletePteList((INT64)&v154, a2a, v15, a12, a5a) )
v8 = 1;
LODWORD(a7) = v8;
}
if( v108 )
{
MiUnlockPageTableInternal(v60, v108);
v108 = 0i64;
}
MiUnlockWorkingSetShared(v60, CurrentIrql);
LODWORD(a11) = 1;
MiLockWorkingSetShared(v60);
}
LABEL_187:
WsInfo += a8 << 12;
LABEL_188:
v6 = a12;
if( v28 > v113 )
goto LABEL_191;
v29 = a11;
LODWORD(v12) = 1;
v30 = a10;
}
memset((INT64)&a1a, 0i64);
if( v123[1] )
{
a1a = 1;
v152 = 0i64;
v153 = 0i64;
a1_4 = 0;
v151 = 20;
MiInsertTbFlushEntry((INT64)&a1a, ((v123[1] << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v124[0], 0i64);
MiTerminateWsleCluster((INT64)v123);
LODWORD(a5a) = 0;
v37 = a2a;
if( (unsigned int)MiDeletePteList((INT64)&a1a, a2a, v15, v6, a5a) )
v8 = 1;
LODWORD(a7) = v8;
}
else
{
v37 = a2a;
}
if( HIDWORD(v155) )
{
LODWORD(a5a) = 1;
if( (unsigned int)MiDeletePteList((INT64)&v154, v37, v15, v6, a5a) )
v8 = 1;
LODWORD(a7) = v8;
}
if( v108 )
{
MiUnlockPageTableInternal(v30, v108);
v108 = 0i64;
}
if( !v109 )
{
v35 = v28;
if( v105 <= 1 )
{
v52 = MmGetPteBase();
v53 = 2 - v105;
do
{
v35 = (UINT64)v52 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
--v53;
}
while( v53 );
v6 = a12;
}
MiMakeSystemAddressValid(
v35,
0i64,
(*(_DWORD *)(*(_QWORD *)&LogAccess[1] + 48i64) >> 12) & 0x3F,
CurrentIrql,
v114[0]);
goto LABEL_64;
}
v122 = 0i64;
memset((INT64)v126, 0i64);
v39 = (_QWORD)MmGetPteBase() << 25;
WsInfoa = (__int64)((v28 << 25) - v39) >> 16;
v40 = (__int64)((v113 << 25) - v39) >> 16;
v125 = 2145;
LeafVa = MiGetLeafVa(WsInfoa);
if( LeafVa < 0xFFFF800000000000ui64 || LeafVa >= qword_140C4F878 && LeafVa <= qword_140C4E0A8 )
AnyMultiplexedVm = (CHAR *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1664i64);
else
AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
v44 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v42);
if( v44 )
{
v45 = v44 - 1;
LODWORD(v122) = v44 - 1;
v46 = MmGetPteBase();
v47 = (unsigned __int64)v46 + ((WsInfoa >> 9) & 0x7FFFFFFFF8i64);
*((_QWORD *)&v122 + 1) = v47;
}
else
{
v125 |= 4u;
v132 = &v122;
v127 = 0i64;
v128 = AnyMultiplexedVm;
v126[0] = v126[0] & 0xE3 | 4;
v131 = MiGetNextPageTableTail;
v126[4] = CurrentIrql;
v129 = (__int64)((v28 << 25) - v39) >> 16;
v130 = v40;
MiWalkPageTables((INT64)&v125);
v45 = v122;
v47 = *((_QWORD *)&v122 + 1);
v46 = MmGetPteBase();
}
v48 = a12[3];
if( v47 )
{
v49 = v47 - v28;
v28 = v47;
a12[3] = v48 + (v49 >> 3);
v35 = v47;
if( v45 )
{
v35 = (UINT64)v46 + ((v47 >> 9) & 0x7FFFFFFFF8i64);
if( v45 > 1 )
{
v50 = v45 - 1;
do
{
v35 = (UINT64)v46 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
--v50;
}
while( v50 );
}
}
v51 = (v47 << 25) - v39;
v6 = a12;
WsInfo = v51 >> 16;
LABEL_64:
v36 = MmGetPteBase();
v108 = (UINT64)v36 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
LODWORD(a11) = 0;
goto LABEL_65;
}
v6 = a12;
a12[3] = v48 + ((__int64)(v113 - v28) >> 3) + 1;
LABEL_191:
v27 = v108;
LABEL_192:
v135 = 0;
v148 = 0i64;
v139 = 0i64;
v140 = 0i64;
v141 = 0i64;
v142 = 0i64;
v143 = 0i64;
v144 = 0i64;
v145 = 0i64;
v146 = 0i64;
v147 = 0i64;
if( v123[1] )
{
v134 = 0;
v137 = 0i64;
v138 = 0i64;
v136 = 20i64;
v133 = 1;
MiInsertTbFlushEntry((INT64)&v133, ((v123[1] << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v124[0], 0i64);
MiTerminateWsleCluster((INT64)v123);
LODWORD(a5a) = 0;
v95 = a2a;
if( (unsigned int)MiDeletePteList((INT64)&v133, a2a, v15, v6, a5a) )
v8 = 1;
}
else
{
v95 = a2a;
}
if( HIDWORD(v155) )
{
LODWORD(a5a) = 1;
if( (unsigned int)MiDeletePteList((INT64)&v154, v95, v15, v6, a5a) )
v8 = 1;
}
if( v27 )
MiUnlockPageTableInternal(a10, v27);
MiUnlockWorkingSetShared(a10, CurrentIrql);
return v8;
}Referenced by:
MiDecommitRegion
MmStoreAllocateVirtualMemory
MmStoreDecommitVirtualMemory