MiLockPageTablePage

INT64 __fastcall MiLockPageTablePage(_MMPFN *a1, INT64 a2){
  unsigned int v2; 
  int v3; 
  _MMPFN *v4; 
  _MMPFN *v5; 
  _MMPFN *PfnDb; 
  unsigned int v7; 
  unsigned __int64 v8; 
  UINT64 v9; 
  INT64 v10; 
  struct _KPRCB *CurrentPrcb; 
  UINT64 v12; 
  unsigned __int32 v13; 
  unsigned int i; 
  bool v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  struct _KPRCB *v18; 
  __int64 v19; 
  signed __int32 v20; 
  char v22; 
  UINT64 v23; 
  char v24; 
  unsigned __int64 v25; 
  struct _KPRCB *v26; 
  __int64 v27; 
  signed __int32 v28; 
  INT64 v29; 
  INT64 v30; 
  INT64 v31; 
  INT64 v32; 
  INT64 v33; 
  INT64 v34; 
  INT64 v35; 
  INT64 v36; 
  UINT64 v37; 
  UINT64 SpinCount; 
  _MMPFN *v39; 
  v2 = 0;
  v3 = a2;
  v4 = a1;
  if( (_DWORD)a2 == 1 )
  {
    v5 = a1;
  }
  else
  {
    v5 = 0i64;
    if( !(_DWORD)a2 )
      v5 = a1;
  }
  v39 = v5;
  PfnDb = MmGetPfnDb();
  v7 = 1;
  while( 1 )
  {
LABEL_6:
    if( v3 == 1 )
      v4 = (_MMPFN *)((char *)PfnDb + 48 * (*((_QWORD *)v5 + 5) & 0xFFFFFFFFFi64));
    if( (*((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFui64) < 0x10000 )
      goto LABEL_18;
    LODWORD(SpinCount) = 0;
    if( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
    {
      do
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *((__int64 *)v4 + 3) < 0 );
      }
      while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) );
      PfnDb = MmGetPfnDb();
    }
    if( v3 == 1 && v4 != (_MMPFN *)((char *)PfnDb + 48 * (*((_QWORD *)v5 + 5) & 0xFFFFFFFFFi64)) )
    {
      _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
      continue;
    }
    v8 = *((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64;
    if( v8 >= 0x10000 )
      break;
    _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_18:
    if( v3 == 2 )
    {
      v9 = 3i64;
    }
    else
    {
      v9 = 1i64;
      if( !v3 )
        v9 = 4i64;
    }
    v10 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v4 + 5) >> 39) & 0x3FFi64));
    if( (ULONG_PTR *)v10 == &MiSystemPartition )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      v12 = *((unsigned int *)CurrentPrcb + 8391);
      if( v9 <= v12 )
      {
        do
        {
          if( (_DWORD)v12 == -1 )
            break;
          v13 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v12 - v9, v12);
          v15 = (_DWORD)v12 == v13;
          LODWORD(v12) = v13;
          if( v15 )
            goto LABEL_28;
        }
        while( v9 <= v13 );
      }
    }
    if( !(unsigned int)MiChargePartitionResidentAvailable(v10, v9, 512i64) )
      return 0i64;
LABEL_28:
    for( i = 0; ; ++i )
    {
      v15 = i == v9;
      if( i >= v9 )
        goto LABEL_39;
      LODWORD(v37) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&v37);
        while( *((__int64 *)v4 + 3) < 0 );
      }
      if( v3 == 1 )
      {
        PfnDb = MmGetPfnDb();
        if( v4 != (_MMPFN *)((char *)PfnDb + 48 * (*((_QWORD *)v39 + 5) & 0xFFFFFFFFFi64)) )
          break;
      }
      v16 = *((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64;
      if( i )
      {
        if( v16 >= 0x3FFFFFFFFFFEFDFFi64 )
          goto LABEL_56;
      }
      else if( v16 >= 0x3FFFFFFFFFFEFDFFi64 )
      {
        v7 = 0;
LABEL_38:
        _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
        v15 = i == v9;
LABEL_39:
        if( !v15 )
        {
          v17 = v9 - i;
          if( (ULONG_PTR *)v10 == &MiSystemPartition )
          {
            v18 = KeGetCurrentPrcb();
            v19 = *((int *)v18 + 8391);
            if( (_DWORD)v19 != -1 )
            {
              if( v17 + v19 <= 0x100 )
              {
                do
                {
                  if( v17 >= 0x80000 )
                    break;
                  v20 = _InterlockedCompareExchange((volatile signed __int32 *)v18 + 8391, v17 + v19, v19);
                  v15 = (_DWORD)v19 == v20;
                  LODWORD(v19) = v20;
                  if( v15 )
                    return v7;
                }
                while( v20 != -1 && v17 + v20 <= 0x100 );
              }
              if( (int)v19 > 192
                && (_DWORD)v19 != -1
                && (_DWORD)v19 == _InterlockedCompareExchange((volatile signed __int32 *)v18 + 8391, 192, v19) )
              {
                v17 += (int)v19 - 192;
              }
            }
          }
          if( v17 )
            _InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 7168), v17);
        }
        return v7;
      }
      *((_QWORD *)v4 + 3) ^= ((v16 + 0x10000) ^ *((_QWORD *)v4 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
LABEL_56:
      if( v16 >= 0x10000 )
        goto LABEL_38;
      v22 = *((_BYTE *)v4 + 34);
      v23 = 0i64;
      if( (v22 & 0x10) == 0 )
      {
        v24 = *((_BYTE *)v4 + 34);
        if( (*((_DWORD *)v4 + 4) & 0x400i64) == 0 && (v22 & 8) == 0 )
        {
          v23 = MiCapturePageFileInfoInline((UINT64 *)v4 + 2, 1i64, 0i64);
          v24 = *((_BYTE *)v4 + 34);
        }
        *((_BYTE *)v4 + 34) = v24 | 0x10;
      }
      _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
      if( v23 )
        MiReleasePageFileInfo(v10, v23, 1, 0x7FFFFFFFFFFFFFFFi64, v29, v30, v31, v32, v33, v34, v35, v36);
      v4 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * (*((_QWORD *)v4 + 5) & 0xFFFFFFFFFi64));
    }
    _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
    v25 = v9 - i;
    if( (ULONG_PTR *)v10 == &MiSystemPartition )
    {
      v26 = KeGetCurrentPrcb();
      v27 = *((int *)v26 + 8391);
      if( (_DWORD)v27 != -1 )
      {
        if( v25 + v27 <= 0x100 )
        {
          do
          {
            if( v25 >= 0x80000 )
              break;
            v28 = _InterlockedCompareExchange((volatile signed __int32 *)v26 + 8391, v25 + v27, v27);
            v15 = (_DWORD)v27 == v28;
            v5 = v39;
            LODWORD(v27) = v28;
            if( v15 )
              goto LABEL_6;
          }
          while( v28 != -1 && v25 + v28 <= 0x100 );
        }
        if( (int)v27 > 192
          && (_DWORD)v27 != -1
          && (_DWORD)v27 == _InterlockedCompareExchange((volatile signed __int32 *)v26 + 8391, 192, v27) )
        {
          v25 += (int)v27 - 192;
        }
      }
    }
    v5 = v39;
    if( v25 )
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 7168), v25);
  }
  if( v8 < 0x3FFFFFFFFFFEFDFFi64 )
  {
    v2 = 1;
    *((_QWORD *)v4 + 3) ^= (*((_QWORD *)v4 + 3) ^ (*((_QWORD *)v4 + 3) + 0x10000i64)) & 0x3FFFFFFFFFFFFFFFi64;
  }
  _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
  return v2;
}

Referenced by:

MiBuildForkPte
MiLockPageTableRange
MiProbeLockFrame
NtLockVirtualMemory