MiClearNonPagedPtes
_MMPFN *__stdcall MiClearNonPagedPtes(VOID *StartingAddress, UINT64 NumberOfPages, INT64 PoolType, _KTBFLUSH_TYPE a4){
unsigned int v4;
char v8;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
char *v10;
__int64 v11;
UINT64 v12;
char v13;
__int64 v14;
unsigned __int64 *v15;
UINT64 v16;
__int64 v17;
unsigned __int64 v18;
__int64 v19;
unsigned __int64 v20;
char *v21;
UINT64 v23[2];
__int128 v24;
__int64 BugCheckParameter2[22];
__int64 v26[28];
v4 = PoolType;
memset(BugCheckParameter2, 0i64, sizeof(BugCheckParameter2));
memset(v26, 0i64, sizeof(v26));
v8 = 0;
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeNonPagedPool, 0i64);
BugCheckParameter2[4] = (__int64)StartingAddress;
LOWORD(BugCheckParameter2[0]) = 2183;
v26[25] = __PAIR64__(a4, v4);
BugCheckParameter2[19] = (__int64)MiDeleteNonPagedPoolPte;
v10 = (char *)StartingAddress + 4096 * NumberOfPages - 1;
BugCheckParameter2[5] = (__int64)v10;
BugCheckParameter2[20] = (__int64)MiDeleteNonPagedPoolTail;
BugCheckParameter2[21] = (__int64)v26;
v26[1] = 20i64;
LODWORD(v26[0]) = v11;
WORD2(v26[0]) = v11;
v26[2] = v11;
v26[3] = v11;
BugCheckParameter2[3] = (__int64)AnyMultiplexedVm;
MiLockWorkingSetShared();
BYTE6(BugCheckParameter2[0]) = v13;
if( StartingAddress <= v10 )
{
do
{
*(_OWORD *)v23 = 0i64;
v24 = 0i64;
if( !MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, (UINT64)StartingAddress) )
break;
MiFillPteHierarchy((UINT64)StartingAddress, v23);
v15 = (unsigned __int64 *)v23[v14];
v16 = v23[(int)v14 - 1];
MiFillPteHierarchy((UINT64)v10, v23);
v18 = v23[v17];
if( v18 > (v16 & 0xFFFFFFFFFFFFF000ui64 | 0xFF8) )
v18 = v16 & 0xFFFFFFFFFFFFF000ui64 | 0xFF8;
while( v16 <= v18 )
{
MiDeleteNonPagedPoolPte(BugCheckParameter2);
v19 = (unsigned int)BYTE3(BugCheckParameter2[0]) + 1;
BYTE3(BugCheckParameter2[0]) = 0;
v16 += 8 * v19;
}
MiDeleteNonPagedPoolTail((INT64)BugCheckParameter2);
v20 = *v15;
MiPteInShadowRange((UINT64)v15);
if( (MmGetPfnDb()[(v20 >> 12) & 0xFFFFFFFFFi64].u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
v8 = 1;
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, (UINT64)v15);
LODWORD(v21) = MiGetLeafVa(v16);
StartingAddress = v21;
}
while( v21 <= v10 );
if( !v8 )
{
if( StartingAddress > v10 )
goto LABEL_13;
BugCheckParameter2[4] = (__int64)StartingAddress;
}
MiWalkPageTables((INT64)BugCheckParameter2);
}
LABEL_13:
LOBYTE(v12) = BYTE6(BugCheckParameter2[0]);
MiUnlockWorkingSetShared(AnyMultiplexedVm, v12);
if( v26[23] )
MiReturnPhysicalPoolPages((_MMPFN *)v26[23]);
if( v26[24] )
MiReturnPhysicalPoolPages((_MMPFN *)v26[24]);
return(_MMPFN *)HIDWORD(v26[26]);
}Referenced by:
MiCommitPoolMemory
MmFreePoolMemory
MmFreeSecurePoolMemory