MiGetPageProtection

void MiGetPageProtection(ULONG_PTR BugCheckParameter2, ULONG_PTR a2, __int64 **a3, _DWORD *a4, ...){
  _WORD *v4; 
  ULONG_PTR v5; 
  ULONG_PTR v7; 
  _MMPTE *Pml4eBase; 
  _MMPTE *PxeUserLimit; 
  int v11; 
  int v12; 
  ULONG_PTR v13; 
  UNICODE_STRING *v14; 
  wchar_t *Buffer; 
  int v16; 
  _MMPTE *PteBase; 
  __int64 v18; 
  unsigned __int64 v19; 
  _MMPTE *ProtoPteAddress; 
  _QWORD *v21; 
  UINT64 v22; 
  __int64 v23; 
  __int64 v24; 
  _WORD *v25; 
  __int64 CurrentProcess; 
  _QWORD *CloneAddress; 
  _MMPFN *v28; 
  _SUBSECTION *ContainingSubsection; 
  _MMPFN *a3a; 
  __int64 **v31; 
  _DWORD *v32; 
  __int64 v33; 
  va_list va; 
  va_list va1; 
  va_start(va1, a4);
  va_start(va, a4);
  v33 = va_arg(va1, _QWORD);
  v32 = a4;
  v31 = a3;
  v4 = (_WORD *)v33;
  v5 = *(_QWORD *)a2;
  v7 = a2;
  a3a = 0i64;
  ContainingSubsection = 0i64;
  *(_WORD *)v33 = 0;
  *a3 = 0i64;
  *a4 = 0;
  Pml4eBase = MmGetPml4eBase();
  PxeUserLimit = MmGetPxeUserLimit();
  v11 = *(_DWORD *)(BugCheckParameter2 + 48);
  v12 = v11 & 0x70;
  v33 = v5;
  if( v12 == 48 && ((v11 & 0x100000) == 0 || (v11 & 0x1000000) != 0 || (v11 & 0x2000000) == 0) )
  {
    *v4 = MiGetValidAwePartitionId(v5);
    MiGetValidAweProtection(BugCheckParameter2, v5);
    return;
  }
  if( (v5 & 1) != 0 )
  {
    if( va < (va_list)Pml4eBase || va > (va_list)PxeUserLimit )
      a2 = v5;
    v13 = (a2 >> 12) & 0xFFFFFFFFFi64;
    v14 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * v13);
    if( v12 == 16 )
    {
      if( (unsigned int)MiIsPfn(v13) )
        *v4 = ((unsigned __int64)v14[2].Buffer >> 39) & 0x3FF;
    }
    else if( v12 != 64 || !(unsigned int)MiRotatedToFrameBuffer((MMPTE *)v7) )
    {
      Buffer = v14[2].Buffer;
      *v4 = ((unsigned __int64)Buffer >> 39) & 0x3FF;
      if( ((unsigned __int64)Buffer & 0x1000000000i64) != 0 )
      {
        MiGetProtectionFromPte((PVOID)BugCheckParameter2, (PVOID)v5);
        if( (*(_DWORD *)(BugCheckParameter2 + 48) & 0x1100000) == 17825792 )
          *v32 = 0;
      }
      else
      {
        LOBYTE(v16) = MI_PFN_IS_PROTO(v14, (UNICODE_STRING *)0x3FF, (UINT8)a3, (PWCHAR)a4);
        if( v16 )
        {
          PteBase = MmGetPteBase();
          if( ((*(_QWORD *)((char *)PteBase
                           + ((((__int64)((v7 << 25) - ((_QWORD)PteBase << 25)) >> 16) & 0xFFFFFFFFF000ui64) >> 9)) >> 60) & 7) == 0
            && (__int64)v14->Buffer <= 0 )
          {
            v18 = *((_QWORD *)KeGetCurrentThread() + 23);
            if( *(_QWORD *)(v18 + 1264) )
              MiLocateCloneAddress(v18, (unsigned __int64)v14->Buffer | 0x8000000000000000ui64);
          }
        }
      }
    }
    return;
  }
  if( (v5 & 0x400) != 0 )
  {
    if( MiIsPrototypePteVadLookup(v5) )
    {
      if( (v11 & 0x100000) == 0 )
      {
        *v4 = **(_WORD **)(qword_140C4E388 + 8i64 * (*(_WORD *)(**(_QWORD **)(BugCheckParameter2 + 72) + 60i64) & 0x3FF));
        v19 = (unsigned __int64)((__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) >> 12;
        ProtoPteAddress = MiGetProtoPteAddress((_MMVAD *)BugCheckParameter2, v19, 4ui64, &ContainingSubsection);
        if( ProtoPteAddress )
        {
          v21 = *(_QWORD **)(BugCheckParameter2 + 120);
          if( ((__int64)v21 >= 0
             || v19
              - (*(unsigned int *)(BugCheckParameter2 + 24) | ((unsigned __int64)*(unsigned __int8 *)(BugCheckParameter2 + 32) << 32)) <= (unsigned __int64)(*v21 - 1i64) >> 12)
            && !*(_QWORD *)(*(_QWORD *)ContainingSubsection + 64i64)
            && (*(_DWORD *)(*(_QWORD *)ContainingSubsection + 56i64) & 0x2000) == 0 )
          {
            if( (int)MiTryLockProtoPoolPageAtDpc((INT64 *)ProtoPteAddress, (INT64)v21, &a3a, 0i64) < 0 )
            {
              *v31 = (__int64 *)ProtoPteAddress;
            }
            else
            {
              MI_READ_PTE_LOCK_FREE((INT64)ProtoPteAddress);
              LOBYTE(v22) = 2;
              MiUnlockProtoPoolPage(a3a, v22);
            }
          }
        }
      }
      return;
    }
    v23 = v5;
    if( qword_140C4DC80 && (v5 & 0x10) == 0 )
      v23 = v5 & ~qword_140C4DC80;
    v24 = v23 >> 16;
    if( MI_PROTO_FORMAT_COMBINED(v5) )
    {
      v25 = **(_WORD ***)(((v24 - 48) & 0xFFFFFFFFFFFFF000ui64) + 0x10);
LABEL_45:
      *v4 = *v25;
      MiCaptureProtectionFromLockedProto((MMPTE *)v24);
      return;
    }
    CurrentProcess = PsGetCurrentProcess();
    if( *(_QWORD *)(CurrentProcess + 1264) )
    {
      CloneAddress = MiLocateCloneAddress(CurrentProcess, v24);
      if( CloneAddress )
      {
        v25 = *(_WORD **)(CloneAddress[7] + 24i64);
        goto LABEL_45;
      }
    }
    if( v12 != 32 || (v11 & 0xF80) != 896 )
      KeBugCheckEx(0x1Au, 0x41202ui64, v7, v5, BugCheckParameter2);
    *v4 = **(_WORD **)(qword_140C4E388 + 8i64 * (*(_WORD *)(**(_QWORD **)(BugCheckParameter2 + 72) + 60i64) & 0x3FF));
    MiGetImageProtoProtection((_MMVAD_SHORT *)BugCheckParameter2, (_MMPTE *)v24);
  }
  else
  {
    if( (v5 & 0x800) != 0 && (v28 = MiLockTransitionLeafPage((_MMPTE *)a2, 0i64)) != 0i64 )
    {
      *v4 = (*((_QWORD *)v28 + 5) >> 39) & 0x3FF;
      _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
    }
    else
    {
      *v4 = **(_WORD **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(PsGetCurrentProcess() + 1838));
    }
    if( (*(_DWORD *)(BugCheckParameter2 + 48) & 0x1100000) == 17825792 )
      *a4 = 0;
  }
}

Referenced by:

MiCommitExistingVad
MiProtectPrivateMemory
MiQueryAddressState