MiGetKernelStackSwapSupport

__int64 __fastcall MiGetKernelStackSwapSupport(__int64 a1, __int64 a2){
  unsigned int v2; 
  unsigned int v3; 
  _MI_PARTITION *v5; 
  volatile unsigned int NumberOfPagingFiles; 
  _MMPAGING_FILE **PagingFile; 
  _MMPAGING_FILE *v8; 
  unsigned int v9; 
  _MI_WS_SWAP_SUPPORT *WorkingSetSwapSupport; 
  __int64 v11; 
  _MMPTE *v12; 
  unsigned int v14; 

  v2 = -1;
  v3 = 0;
  v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * *(unsigned __int16 *)(a2 + 1838));
  NumberOfPagingFiles = v5->Vp.NumberOfPagingFiles;
  if( !NumberOfPagingFiles )
    return 3221225799i64;
  PagingFile = v5->Vp.PagingFile;
  do
  {
    v8 = *PagingFile;
    if( ((*PagingFile)->_bf_cc & 0x50) == 0 )
    {
      if( v2 == -1 || (v14 = MiPageFileLargestBitmapsRun(v5->Vp.PagingFile[v2]), MiPageFileLargestBitmapsRun(v8) > v14) )
        v2 = v3;
    }
    ++v3;
    ++PagingFile;
  }
  while( v3 < NumberOfPagingFiles );
  if( v2 == -1 )
    return 3221225799i64;
  v9 = *(_DWORD *)(a2 + 1520);
  if( !v9 )
    return 3221225738i64;
  if( v9 > 0x2AAAAAAA )
    v9 = 715827882;
  WorkingSetSwapSupport = MiAllocateWorkingSetSwapSupport(2 * v9);
  *(_QWORD *)(a1 + 56) = WorkingSetSwapSupport;
  if( !WorkingSetSwapSupport )
    return 3221225626i64;
  v11 = MiSwizzleInvalidPte(0i64);
  v12->u.Long = ((unsigned __int64)(v2 & 0xF) << 12) | v11 & 0xFFFFFFFFFFFF0FFFui64;
  *(_DWORD *)(a1 + 72) = MiFindFreePageFileSpace(v5, v12, 6 * v9, 0x21ui64);
  return 0i64;
}

Referenced by:

MmOutSwapWorkingSet