MiAllowProtectionChange

VOID __fastcall MiAllowProtectionChange(
        _EPROCESS *Process,
        _EPROCESS *CreatingProcess,
        _MMVAD *Vad,
        UINT64 NewProtectionMask,
        VOID *StartingAddress,
        VOID *EndingAddress){
  char v6; 
  int v9; 
  UINT64 v10; 
  _MMVAD_SHORT *v11; 
  char v12; 
  char v13; 
  VOID *v14; 
  int v15; 
  VOID *VaWithProto; 
  int v17; 
  __int64 ReturnedProtect[2]; 

  v6 = NewProtectionMask;
  *(__int64 *)((char *)ReturnedProtect + 4) = 0i64;
  LODWORD(ReturnedProtect[0]) = 0;
  HIDWORD(VaWithProto) = 0;
  v17 = 0;
  LOWORD(VaWithProto) = 0;
  if( (NewProtectionMask & 2) == 0 || (Vad->Core.u.LongFlags & 0xC00) != 3072 || (Vad->Core.u.LongFlags & 0x380) == 0 )
  {
    v9 = 0;
    MiLockWorkingSetShared();
    v13 = v12;
    v14 = StartingAddress;
    if( StartingAddress <= EndingAddress )
    {
      while( 1 )
      {
        LOBYTE(v11) = v13;
        MiQueryAddressState(
          v14,
          (UINT8)EndingAddress,
          v11,
          (_EPROCESS *)Vad,
          0i64,
          (VOID **)((char *)&VaWithProto + 4),
          (UINT64 *)ReturnedProtect,
          &VaWithProto);
        v15 = HIDWORD(VaWithProto);
        if( HIDWORD(VaWithProto) == -1 )
          v15 = 0;
        HIDWORD(VaWithProto) = v15;
        if( (v15 & 2) == 0 && (v6 & 2) != 0 || (v15 & 2) != 0 && (v6 & 4) != 0 )
          break;
        v14 = *(VOID **)((char *)ReturnedProtect + 4);
        if( *(__int64 *)((char *)ReturnedProtect + 4) > (unsigned __int64)EndingAddress )
          goto LABEL_11;
      }
      v9 = 1;
    }
LABEL_11:
    LOBYTE(v10) = v13;
    MiUnlockWorkingSetShared(&Process->Vm.Instance, v10);
    if( v9 )
      MiArbitraryCodeBlocked(CreatingProcess);
  }
}

Referenced by:

MiResetVirtualMemory
MmProtectVirtualMemory