MiCommitPoolMemory

NTSTATUS __stdcall MiCommitPoolMemory(INT64 a1){
  _MMPTE *PteBase; 
  UINT64 v3; 
  NTSTATUS v4; 
  INT64 v5; 
  UINT64 v6; 
  int v7; 
  unsigned __int64 v8; 
  unsigned int v9; 
  __int64 v11; 
  int v12; 
  INT64 v13; 

  PteBase = MmGetPteBase();
  v3 = (UINT64)PteBase + ((*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64);
  MiLockPoolCommitWs(a1);
  v4 = 0;
  while( v3 <= *(_QWORD *)(a1 + 56) )
  {
    v6 = *(_QWORD *)(a1 + 64);
    if( v6 )
    {
      MiUnlockPageTableInternal(*(_QWORD *)(a1 + 48), v6);
      *(_QWORD *)(a1 + 64) = 0i64;
    }
    if( *(_BYTE *)(a1 + 76) < 2u )
    {
      LOBYTE(v7) = MiWorkingSetIsContended(*(_QWORD *)(a1 + 48));
      if( v7 || (unsigned int)KeShouldYieldProcessor() )
      {
        MiUnlockPoolCommitWs(a1);
        MiLockPoolCommitWs(a1);
      }
    }
    v8 = v3 & 0xFFFFFFFFFFFFF000ui64;
    if( MiLockPoolCommitPageTable(a1, (INT64 *)v3) )
    {
      MiLinkPoolCommitChain(a1, v3);
      v3 = v8 + 4096;
    }
    else
    {
      MiUnlockPoolCommitWs(a1);
      v5 = v8 + 4088;
      if( v8 + 4088 > *(_QWORD *)(a1 + 56) )
        v5 = *(_QWORD *)(a1 + 56);
      LODWORD(v13) = *(_DWORD *)(a1 + 72) + 1;
      if( !MiMakeZeroedPageTablesEx(v3, v5, (*(_WORD *)(a1 + 78) & 4 | 0x400u) >> 1, *(unsigned int *)(a1 + 40), v13) )
      {
        *(_WORD *)(a1 + 78) |= 1u;
        MiLockPoolCommitWs(a1);
        break;
      }
      MiLockPoolCommitWs(a1);
    }
  }
  MiFillPoolCommitPageTable(a1);
  MiUnlockPoolCommitWs(a1);
  v9 = *(unsigned __int16 *)(a1 + 78);
  if( (v9 & 1) != 0 )
  {
    if( (v9 & 2) == 0 )
    {
      v11 = (*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64;
      if( (_MMPTE *)v3 != (_MMPTE *)((char *)PteBase + v11) )
      {
        v12 = (v9 >> 2) & 1 | 2;
        if( (v9 & 0x100) == 0 )
          v12 = (v9 >> 2) & 1;
        MiClearNonPagedPtes(*(VOID **)a1, (__int64)(v3 - v11 - (_QWORD)PteBase) >> 3, 0x4000i64, (_KTBFLUSH_TYPE)v12);
      }
    }
    v4 = -1073741670;
  }
  else
  {
    MiCountSystemPool(*(unsigned int *)(a1 + 40), *(_QWORD *)(a1 + 24), 1i64);
  }
  MiReturnExcessPoolCommit(a1);
  return v4;
}

Referenced by:

MmAllocatePoolMemory
MmAllocateSecurePoolMemory