MiGetPoolPages

NTSTATUS __stdcall MiGetPoolPages(INT64 a1, INT64 a2, INT64 a3){
  int v3; 
  _QWORD *v4; 
  _MMPFN *v5; 
  int v7; 
  signed __int32 v8; 
  __int64 v9; 
  _MMPFN *v10; 
  unsigned __int64 v12; 
  INT64 v13; 
  _MMPFN *bf_0; 
  $559D8309DABD45803AD694472C7FC28A *v15; 
  $559D8309DABD45803AD694472C7FC28A *v16; 
  _MMPFN *PfnDb; 
  int v18; 
  _MI_COLOR_BASE ColorBase[4]; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 v21; 
  __int128 v22; 
  INT64 v23; 
  __int128 v24; 

  v3 = a2;
  memset(&LockHandle, 0, sizeof(LockHandle));
  *(_OWORD *)ColorBase = 0i64;
  v4 = (_QWORD *)(*(&stru_140C4DB30 + 22) + 176i64 * (unsigned int)a2);
  v5 = 0i64;
  v7 = a1;
  if( v4[17] )
  {
    KeAcquireInStackQueuedSpinLock(v4 + 18, &LockHandle);
    v12 = v4[17];
    v13 = v12;
    if( v12 > a3 )
      v13 = a3;
    if( v13 )
    {
      bf_0 = (_MMPFN *)v4[19];
      a3 -= v13;
      v5 = bf_0;
      v4[17] = v12 - v13;
      do
      {
        v15 = ($559D8309DABD45803AD694472C7FC28A *)bf_0;
        bf_0 = (_MMPFN *)bf_0->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
        --v13;
      }
      while( v13 );
      v15->_bf_0 = 0i64;
      v4[19] = bf_0;
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( (v7 & 0x40000000) != 0 )
    {
      v16 = ($559D8309DABD45803AD694472C7FC28A *)v5;
      if( v5 )
      {
        PfnDb = MmGetPfnDb();
        do
        {
          MiFillPhysicalPages((PVOID)(((char *)v16 - (char *)PfnDb) / 48));
          v16 = ($559D8309DABD45803AD694472C7FC28A *)v16->_bf_0;
        }
        while( v16 );
      }
    }
    if( !a3 )
      return(int)v5;
  }
  if( MiObtainPoolCharges(a3, 0i64) )
  {
    MiInitializePageColorBase(0i64, (unsigned int)(v3 + 1), ColorBase);
    if( a3 )
    {
      while( (unsigned __int64)a3 <= 1
           || (*(_DWORD *)&KeGetCurrentThread()[1].gapD8[12] & 2) == 0
           || MiSufficientAvailablePages((INT64)&Irp, a3 + 160) )
      {
        MiRetryNonPagedAllocation();
        v8 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
        LODWORD(v9) = MiGetPage(
                        (ULONG_PTR *)&Irp.Core.PartitionId,
                        ColorBase[3] | (unsigned int)v8 & ColorBase[2],
                        (v7 & 0x40000000) != 0 ? 782 : 524);
        if( v9 == -1 )
        {
          MiRetryNonPagedAllocation();
          if( !v18 )
            break;
        }
        else
        {
          v10 = &MmGetPfnDb()[v9];
          MiSetPfnTbFlushStamp(v10, 0i64, 0i64);
          v10->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v5;
          --a3;
          v5 = v10;
        }
        if( !a3 )
          break;
      }
      if( a3 )
      {
        v22 = 0i64;
        v24 = 0i64;
        if( v5 )
        {
          MiReturnPhysicalPoolPages(v5);
          LODWORD(v5) = 0;
        }
        v21 = a3;
        v23 = a3;
        MiReturnPoolCharges(&v21, 0i64);
      }
    }
    return(int)v5;
  }
  if( v5 )
    MiReturnPhysicalPoolPages(v5);
  return 0;
}

Referenced by:

MiInitializePoolCommitPacket