MiReservePageFileSpaceForPage

INT64 __fastcall MiReservePageFileSpaceForPage(INT64 rcx0, UINT64 a2, CHAR a3, UINT64 *a4){
  INT64 v4; 
  INT64 v5; 
  unsigned int v6; 
  int v7; 
  UINT64 v10; 
  int v11; 
  _MMPFN *v12; 
  unsigned __int64 v13; 
  UNICODE_STRING *v14; 
  UINT8 v15; 
  WCHAR *v16; 
  UINT64 v17; 
  UNICODE_STRING *v18; 
  UINT8 v19; 
  WCHAR *v20; 
  int v21; 
  INT64 v22; 
  bool v23; 
  int v24; 
  char v25; 
  __int64 v26; 
  __int64 v27; 
  INT64 v28; 
  bool v29; 
  UINT64 v30; 
  INT64 updated; 
  __int16 v32; 
  UINT64 PteBase; 
  _MMPFN *UsedPtesHandle; 
  INT64 a5; 
  UINT64 SpinCount; 
  UINT64 v38; 
  UINT64 v39; 
  INT64 a9; 
  INT64 v41; 
  INT64 v42; 
  INT64 v43; 
  int v45; 
  v6 = 0;
  v7 = a3 & 0x80;
  v43 = v4;
  HIDWORD(a5) = 0;
  v45 = v7;
  v10 = 0i64;
  v42 = v5;
  do
  {
    LODWORD(a5) = 0;
    v11 = 0;
    if( v7 )
    {
      v12 = 0i64;
    }
    else
    {
      v12 = MiLockLeafPage((_MMPTE *)a2, 0i64);
      if( v12 )
        v11 = 1;
      LODWORD(a5) = v11;
    }
    v13 = MI_READ_PTE_LOCK_FREE(a2);
    v38 = v13;
    v17 = v13;
    if( (v13 & 1) != 0 )
    {
      if( v45 )
      {
        v12 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v13 >> 12) & 0xFFFFFFFFFi64));
        if( (a3 & 1) == 0 )
        {
          LODWORD(SpinCount) = 0;
          LODWORD(a5) = 1;
          while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
          {
            do
              KeYieldProcessorEx(&SpinCount);
            while( *((__int64 *)v12 + 3) < 0 );
          }
          LOBYTE(v17) = v38;
        }
        LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)v12, v14, v15, v16);
        if( v24 )
          goto LABEL_76;
      }
      if( (*(_BYTE *)v12 & 1) == 0 )
        goto LABEL_76;
      if( *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v12 + 5) >> 39) & 0x3FFi64)) != rcx0 )
        goto LABEL_76;
      if( (*((_BYTE *)v12 + 35) & 8) != 0 )
        goto LABEL_76;
      v25 = v17;
      v17 = *((_QWORD *)v12 + 2);
      LODWORD(a9) = (_DWORD)v12 + 16;
      v38 = v17;
      if( (v17 & 1) != 0 || v17 && qword_140C4DC80 && (v17 & qword_140C4DC80) == 0 )
        goto LABEL_76;
      if( !MI_IS_RESET_PTE(v17) || (*((_BYTE *)v12 + 34) & 0x10) != 0 )
      {
LABEL_41:
        v22 = rcx0;
        goto LABEL_42;
      }
      if( !v45 )
        goto LABEL_76;
      v23 = (v25 & 0x42) == 0;
LABEL_40:
      if( v23 )
        goto LABEL_76;
      goto LABEL_41;
    }
    if( (v13 & 0x400) != 0 )
      goto LABEL_76;
    if( (v13 & 0x800) == 0 )
    {
      if( !v13 )
      {
        if( (a3 & 2) == 0 )
          goto LABEL_76;
        v17 = MiSwizzleInvalidPte(8i64 * (a3 & 0x7C));
        v38 = v17;
        HIDWORD(a5) = 1;
        goto LABEL_41;
      }
      if( !MiInvalidPteConforms(v13) )
        goto LABEL_76;
      v23 = ((v17 >> 5) & 0xF) == 0;
      goto LABEL_40;
    }
    if( !v45 )
      goto LABEL_13;
    v12 = MiLockTransitionLeafPage((_MMPTE *)a2, 0i64);
    v7 = v45;
  }
  while( !v12 );
  LODWORD(a5) = 1;
  LOBYTE(v21) = MI_PFN_IS_PROTO((UNICODE_STRING *)v12, v18, v19, v20);
  if( v21 )
    goto LABEL_77;
LABEL_13:
  v22 = rcx0;
  if( *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v12 + 5) >> 39) & 0x3FFi64)) == rcx0 )
  {
    v38 = MI_READ_PTE_LOCK_FREE((INT64)v12 + 16);
    v17 = v38;
    if( !MI_IS_RESET_PTE(v38) || (*((_BYTE *)v12 + 34) & 0x10) != 0 )
    {
LABEL_42:
      if( (v17 & 2) != 0 )
      {
        if( (a3 & 1) != 0 )
          *a4 = v17;
        goto LABEL_76;
      }
      if( v12 && (*((_BYTE *)v12 + 34) & 0x28) != 0 )
        goto LABEL_76;
      if( (v17 & 4) != 0 )
      {
        if( !v12 )
          goto LABEL_76;
        if( (a3 & 1) == 0 )
        {
          if( !*((_WORD *)v12 + 16) )
          {
            if( !(unsigned int)MiUnlinkPageFromList(v12, 0i64) )
            {
              MiDiscardTransitionPteEx((UINT64)v12, 0i64);
              goto LABEL_76;
            }
            v6 = 1;
          }
          v10 = MiCapturePageFileInfoInline((UINT64 *)v12 + 2, 1i64, 0i64);
          *((_BYTE *)v12 + 34) |= 0x10u;
          goto LABEL_55;
        }
      }
      else
      {
LABEL_55:
        if( (a3 & 1) == 0 )
        {
          v26 = *(_QWORD *)(v22 + 8i64 * ((unsigned __int8)HIBYTE(*(_WORD *)a4) >> 4) + 6944);
          v39 = v17;
          MiSetNonResidentPteHeat(&v39, 0i64);
          v29 = (v17 & 0x400) != 0;
          v30 = v39;
          if( !v29 )
          {
            v30 = v39 & 0xFFFFFFFFFFFFFFF9ui64;
            v39 &= 0xFFFFFFFFFFFFFFF9ui64;
          }
          if( v26 )
          {
            if( v30 )
              updated = MiUpdatePageFileHighInPte(v30, v28);
            else
              updated = MiSwizzleInvalidPte(v27 & 0xFFFFFFFF00000000ui64);
            v30 = updated ^ (unsigned __int16)(updated ^ (v32 << 12)) & 0xF000 | 2;
            v39 = v30;
          }
          if( v12 )
          {
            if( !*((_WORD *)v12 + 16) && (*((_BYTE *)v12 + 34) & 0x10) != 0 && !v6 )
            {
              MiUnlinkPageFromList(v12, 0i64);
              v6 = 1;
            }
            *((_QWORD *)v12 + 2) = v30;
            if( v6 )
              MiInsertPageInList(v12, 8ui64);
          }
          else
          {
            *(_QWORD *)a2 = v30;
          }
          if( HIDWORD(a5) )
          {
            PteBase = (UINT64)MmGetPteBase();
            if( a2 <= PteBase + 0x3FFFFFFF78i64 && a2 >= PteBase )
            {
              UsedPtesHandle = MiGetUsedPtesHandle((__int64)((a2 << 25) - (PteBase << 25)) >> 16);
              MiIncreaseUsedPtesCount(UsedPtesHandle, 1ui64);
            }
          }
        }
      }
      v6 = 1;
    }
  }
LABEL_76:
  if( (_DWORD)a5 != 1 )
    goto LABEL_78;
LABEL_77:
  _InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_78:
  if( v10 )
    MiReleasePageFileInfo(rcx0, v10, 1, (INT64)v16, a5, SpinCount, v38, v39, a9, v41, v42, v43);
  return v6;
}

Referenced by:

MiOutSwapWorkingSetPte
MiReservePageFileSpace