MiComparePteProtections

NTSTATUS __stdcall MiComparePteProtections(_EPROCESS *TargetProcess, VOID *Va, UINT64 WsIrql, INT64 a4, INT64 a5){
  NTSTATUS v5; 
  int v7; 
  _EPROCESS *Process; 
  UINT64 v11; 
  _MMVAD_SHORT *v12; 
  char v13; 
  char v14; 
  int v15; 
  bool v16; 
  char ReturnedProtect[12]; 
  VOID *NextVaToQuery; 
  VOID *VaWithProto; 

  v5 = 0;
  v7 = a4;
  LODWORD(VaWithProto) = 0;
  memset(ReturnedProtect, 0, sizeof(ReturnedProtect));
  LOWORD(NextVaToQuery) = 0;
  Process = KeGetCurrentThread()->ApcState.Process;
  MiLockWorkingSetShared();
  v14 = v13;
  while( (unsigned __int64)Va <= WsIrql )
  {
    LOBYTE(v12) = v14;
    MiQueryAddressState(Va, WsIrql, v12, TargetProcess, 0i64, &VaWithProto, (UINT64 *)ReturnedProtect, &NextVaToQuery);
    v15 = (int)VaWithProto;
    if( !(_DWORD)VaWithProto )
    {
      v16 = ((LODWORD(TargetProcess->Pcb.ThreadListHead.Flink) >> 7) & 0x1F) == 0;
      v15 = (LODWORD(TargetProcess->Pcb.ThreadListHead.Flink) >> 7) & 0x1F;
      LODWORD(VaWithProto) = v15;
      if( v16 )
        goto LABEL_13;
    }
    if( (_DWORD)a5 == 1 )
    {
      if( v15 != v7 )
        goto LABEL_13;
    }
    else if( v15 == -1 || (v15 & 0xFFFFFFF8) == 16 || (v7 != 1 ? (v16 = (v15 & 4) == 0) : (v16 = (v15 & 7) == 0), v16) )
    {
LABEL_13:
      v5 = -1073741755;
      break;
    }
    Va = *(VOID **)&ReturnedProtect[4];
  }
  LOBYTE(v11) = v14;
  MiUnlockWorkingSetShared(&Process->Vm.Instance, v11);
  return v5;
}

Referenced by:

MiCheckSecuredVad
MiSecureVad