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