MiCommitPoolMemory

INT64 __fastcall MiCommitPoolMemory(INT64 a1){
  _MMPTE *PteBase; 
  UINT64 v3; 
  unsigned int v4; 
  INT64 v5; 
  UINT64 v6; 
  unsigned __int64 v7; 
  unsigned int v8; 
  __int64 v10; 
  int v11; 
  INT64 v12; 
  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 && (MiWorkingSetIsContended(*(_QWORD *)(a1 + 48)) || KeShouldYieldProcessor()) )
    {
      MiUnlockPoolCommitWs(a1);
      MiLockPoolCommitWs(a1);
    }
    v7 = v3 & 0xFFFFFFFFFFFFF000ui64;
    if( (unsigned int)MiLockPoolCommitPageTable(a1, (INT64 *)v3) )
    {
      MiLinkPoolCommitChain(a1, v3);
      v3 = v7 + 4096;
    }
    else
    {
      MiUnlockPoolCommitWs(a1);
      v5 = v7 + 4088;
      if( v7 + 4088 > *(_QWORD *)(a1 + 56) )
        v5 = *(_QWORD *)(a1 + 56);
      LODWORD(v12) = *(_DWORD *)(a1 + 72) + 1;
      if( !(unsigned int)MiMakeZeroedPageTablesEx(
                            v3,
                            v5,
                            (*(_WORD *)(a1 + 78) & 4 | 0x400u) >> 1,
                            *(unsigned int *)(a1 + 40),
                            v12) )
      {
        *(_WORD *)(a1 + 78) |= 1u;
        MiLockPoolCommitWs(a1);
        break;
      }
      MiLockPoolCommitWs(a1);
    }
  }
  MiFillPoolCommitPageTable(a1);
  MiUnlockPoolCommitWs(a1);
  v8 = *(unsigned __int16 *)(a1 + 78);
  if( (v8 & 1) != 0 )
  {
    if( (v8 & 2) == 0 )
    {
      v10 = (*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64;
      if( (_MMPTE *)v3 != (_MMPTE *)((char *)PteBase + v10) )
      {
        v11 = (v8 >> 2) & 1 | 2;
        if( (v8 & 0x100) == 0 )
          v11 = (v8 >> 2) & 1;
        MiClearNonPagedPtes(*(_QWORD *)a1, (__int64)(v3 - v10 - (_QWORD)PteBase) >> 3, 0x4000u, v11);
      }
    }
    v4 = -1073741670;
  }
  else
  {
    MiCountSystemPool(*(unsigned int *)(a1 + 40), *(_QWORD *)(a1 + 24), 1i64);
  }
  MiReturnExcessPoolCommit(a1);
  return v4;
}

Referenced by:

MmAllocatePoolMemory
MmAllocateSecurePoolMemory