MiGetKernelStackSwapSupport

INT64 __fastcall MiGetKernelStackSwapSupport(INT64 a1, INT64 a2){
  unsigned int v2; 
  unsigned int v3; 
  __int64 v5; 
  unsigned int v6; 
  __int64 *v7; 
  __int64 v8; 
  unsigned int v9; 
  __int64 v10; 
  INT64 v11; 
  _MMPTE *v12; 
  unsigned int v14; 
  unsigned int v15; 
  v2 = -1;
  v3 = 0;
  v5 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a2 + 1838));
  v6 = *(_DWORD *)(v5 + 6936);
  if( !v6 )
    return 3221225799i64;
  v7 = (__int64 *)(v5 + 6944);
  do
  {
    v8 = *v7;
    if( (*(_BYTE *)(*v7 + 204) & 0x50) == 0 )
    {
      if( v2 == -1
        || (v14 = MiPageFileLargestBitmapsRun(*(_QWORD *)(v5 + 8i64 * v2 + 6944)),
            (unsigned int)MiPageFileLargestBitmapsRun(v8) > v14) )
      {
        v2 = v3;
      }
    }
    ++v3;
    ++v7;
  }
  while( v3 < v6 );
  if( v2 == -1 )
    return 3221225799i64;
  v9 = *(_DWORD *)(a2 + 1520);
  if( !v9 )
    return 3221225738i64;
  if( v9 > 0x2AAAAAAA )
    v9 = 715827882;
  LODWORD(v10) = MiAllocateWorkingSetSwapSupport(2 * v9);
  *(_QWORD *)(a1 + 56) = v10;
  if( !v10 )
    return 3221225626i64;
  v11 = MiSwizzleInvalidPte(0i64);
  *(_QWORD *)v12 = ((unsigned __int64)(v2 & 0xF) << 12) | v11 & 0xFFFFFFFFFFFF0FFFui64;
  *(_DWORD *)(a1 + 72) = MiFindFreePageFileSpace((_MI_PARTITION *)v5, v12, 6 * v9, 0x21u, v15);
  return 0i64;
}

Referenced by:

MmOutSwapWorkingSet