MiGetPoolPages

INT64 __fastcall MiGetPoolPages(INT64 a1, INT64 a2, INT64 a3){
  int v3; 
  _QWORD *v4; 
  _MMPFN *v5; 
  int v7; 
  signed __int32 v8; 
  UINT64 Page; 
  _MMPFN *v10; 
  unsigned __int64 v12; 
  INT64 v13; 
  _MMPFN *v14; 
  _MMPFN *v15; 
  char *v16; 
  _MMPFN *PfnDb; 
  int v18; 
  INT64 v19[2]; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 v21; 
  __int128 v22; 
  INT64 v23; 
  __int128 v24; 
  v3 = a2;
  memset(&LockHandle, 0, sizeof(LockHandle));
  *(_OWORD *)v19 = 0i64;
  v4 = (_QWORD *)((char *)SListHead + 176 * (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 )
    {
      v14 = (_MMPFN *)v4[19];
      a3 -= v13;
      v5 = v14;
      v4[17] = v12 - v13;
      do
      {
        v15 = v14;
        v14 = *(_MMPFN **)v14;
        --v13;
      }
      while( v13 );
      *(_QWORD *)v15 = 0i64;
      v4[19] = v14;
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( (v7 & 0x40000000) != 0 )
    {
      v16 = (char *)v5;
      if( v5 )
      {
        PfnDb = MmGetPfnDb();
        do
        {
          MiFillPhysicalPages((PVOID)((v16 - (char *)PfnDb) / 48));
          v16 = *(char **)v16;
        }
        while( v16 );
      }
    }
    if( !a3 )
      return(INT64)v5;
  }
  if( (unsigned int)MiObtainPoolCharges(a3, 0i64) )
  {
    MiInitializePageColorBase(0i64, (unsigned int)(v3 + 1), (INT64)v19);
    if( a3 )
    {
      while( (unsigned __int64)a3 <= 1
           || (*((_DWORD *)KeGetCurrentThread() + 325) & 2) == 0
           || (unsigned int)MiSufficientAvailablePages((INT64)&MiSystemPartition, a3 + 160) )
      {
        MiRetryNonPagedAllocation();
        v8 = _InterlockedExchangeAdd((volatile signed __int32 *)v19[0], 1u);
        Page = MiGetPage(
                 (_MI_PARTITION *)&MiSystemPartition,
                 HIDWORD(v19[1]) | (unsigned int)v8 & v19[1],
                 (v7 & 0x40000000) != 0 ? 782 : 524);
        if( Page == -1i64 )
        {
          MiRetryNonPagedAllocation();
          if( !v18 )
            break;
        }
        else
        {
          v10 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * Page);
          MiSetPfnTbFlushStamp(v10, 0i64, 0i64);
          *(_QWORD *)v10 = v5;
          --a3;
          v5 = v10;
        }
        if( !a3 )
          break;
      }
      if( a3 )
      {
        v22 = 0i64;
        v24 = 0i64;
        if( v5 )
        {
          MiReturnPhysicalPoolPages(v5);
          v5 = 0i64;
        }
        v21 = a3;
        v23 = a3;
        MiReturnPoolCharges(&v21, 0i64);
      }
    }
    return(INT64)v5;
  }
  if( v5 )
    MiReturnPhysicalPoolPages(v5);
  return 0i64;
}

Referenced by:

MiInitializePoolCommitPacket