MiProtectPrivateMemory

__int64 __fastcall MiProtectPrivateMemory(
        ULONG_PTR a1,
        unsigned __int64 a2,
        unsigned __int64 a3,
        unsigned int a4,
        __int16 a5,
        int a6,
        int *a7,
        _DWORD *a8){
  unsigned __int64 v10; 
  _MMPTE *PteBase; 
  INT64 v12; 
  ULONG_PTR v13; 
  _MMPTE *v14; 
  unsigned int v15; 
  unsigned int v16; 
  UINT64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 result; 
  unsigned __int64 v22; 
  _MMPTE *v23; 
  UINT64 v24; 
  __int64 v25; 
  UINT8 v26; 
  char *v27; 
  INT64 v28; 
  INT64 v29; 
  int v30; 
  UINT8 v31; 
  WCHAR *v32; 
  UINT64 v33; 
  ULONG_PTR v34; 
  int v35; 
  int v36; 
  unsigned __int64 v37; 
  UNICODE_STRING *PxeUserLimit; 
  UINT64 v39; 
  __int64 v40; 
  UNICODE_STRING *v41; 
  int v42; 
  int ProtoPrivate; 
  INT64 v44; 
  unsigned int updated; 
  int v46; 
  _MMPFN *UsedPtesHandle; 
  UINT64 v48; 
  unsigned int v49; 
  INT64 v50; 
  UINT64 v51; 
  CHAR BugCheckParameter4; 
  int BugCheckParameter4a; 
  char v54; 
  int v55; 
  unsigned int NewProtectionMask; 
  __int16 NewProtectionMask_4; 
  int v59; 
  UINT64 v60; 
  __int64 v61; 
  unsigned __int64 v62; 
  __int64 v63; 
  UINT64 v64; 
  UINT64 v65; 
  ULONG_PTR v66; 
  _DWORD *v67; 
  INT64 v68[4]; 
  __int128 v69; 
  __int128 v70; 
  __int128 v71; 
  __int128 v72; 
  __int128 v73; 
  __int128 v74; 
  __int128 v75; 
  __int128 v76; 
  __int128 v77; 
  __int64 v78; 
  v67 = a8;
  v68[0] = 1i64;
  v78 = 0i64;
  v69 = 0i64;
  v68[1] = 20i64;
  v70 = 0i64;
  v68[2] = 0i64;
  v71 = 0i64;
  v68[3] = 0i64;
  v72 = 0i64;
  v73 = 0i64;
  NewProtectionMask = a4;
  v74 = 0i64;
  v10 = (a2 >> 9) & 0x7FFFFFFFF8i64;
  v75 = 0i64;
  v65 = 0i64;
  v76 = 0i64;
  NewProtectionMask_4 = 0;
  v77 = 0i64;
  v59 = 0;
  v62 = 0i64;
  PteBase = MmGetPteBase();
  v66 = *((_QWORD *)KeGetCurrentThread() + 23);
  v12 = v66 + 1664;
  v13 = (ULONG_PTR)PteBase + v10;
  v14 = PteBase;
  v15 = *(_DWORD *)(a1 + 48);
  v16 = 3;
  v17 = (UINT64)v14 + ((a3 >> 9) & 0x7FFFFFFFF8i64);
  v63 = 1i64;
  v60 = v17;
  if( (v15 & 0x500000) == 5242880 )
  {
    v18 = (v15 >> 18) & 3;
    v19 = MiVadPageSizes[v18];
    v16 = MiVadPageIndices[v18];
    v20 = 16i64;
    v61 = v19;
    if( v19 != 16 )
      v20 = 1i64;
    v63 = v20;
  }
  else
  {
    v61 = 1i64;
  }
  v55 = 0;
  v64 = (v15 >> 12) & 0x3F;
  v54 = MiLockWorkingSetShared(v66 + 1664);
  if( MiComputePageCommitment(a2, a3, a1, v54, 0, &v62) != ((__int64)(v17 - v13) >> 3) + 1 )
  {
    MiUnlockWorkingSetShared(v12, v54);
    return 3221225517i64;
  }
  v22 = v62;
  if( v62 )
  {
    MiUnlockWorkingSetShared(v12, v54);
    result = MiChargeFullProcessCommitment(v66, v22);
    if( (int)result < 0 )
      return result;
    v54 = MiLockWorkingSetShared(v12);
  }
  v23 = MmGetPteBase();
  v24 = v13;
  if( v16 <= 1 )
  {
    v25 = 2 - v16;
    do
    {
      v24 = (UINT64)v23 + ((v24 >> 9) & 0x7FFFFFFFF8i64);
      v17 = (UINT64)v23 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
      --v25;
    }
    while( v25 );
    v60 = v17;
  }
  v26 = v54;
  v27 = (char *)v23 + ((v24 >> 9) & 0x7FFFFFFFF8i64);
  MiMakeSystemAddressValid(v24, 0i64, (unsigned int)v64, v54, 0);
  if( MI_READ_PTE_LOCK_FREE(v24) )
  {
    while( 1 )
    {
      MiGetPageProtection(a1, v24, (__int64 **)&v65, &v59, &NewProtectionMask_4);
      v33 = v65;
      if( !v65 )
        break;
      MiUnlockPageTableInternal(v12, (UINT64)v27);
      MiUnlockWorkingSetShared(v12, v54);
      MiFaultInPagedPool(v33);
      MiLockWorkingSetShared(v12);
      MiMakeSystemAddressValid(v24, 0i64, (unsigned int)v64, v54, 0);
      if( !MI_READ_PTE_LOCK_FREE(v24) )
        goto LABEL_18;
    }
    v34 = a1;
    LODWORD(v32) = MmProtectToValue[v30];
    v36 = 1;
    v35 = v59;
    v55 = 1;
  }
  else
  {
LABEL_18:
    v34 = a1;
    v35 = MI_GET_GRAPHICS_PROTECTION_FROM_VAD(
            a1,
            v28,
            v29,
            (UINT64 *)(unsigned int)MmProtectToValue[(*(_DWORD *)(a1 + 48) >> 7) & 0x1F],
            BugCheckParameter4);
    v36 = 0;
    v59 = v35;
  }
  *a7 = v35 | (unsigned int)v32;
  v37 = v60;
  if( v24 <= v60 )
  {
    PxeUserLimit = (UNICODE_STRING *)MmGetPxeUserLimit();
    do
    {
      if( (v24 & 0xFFF) == 0 || v36 == 1 )
      {
        v55 = 0;
        if( v27 )
        {
          MiFlushTbList((__int64)v68);
          MiUnlockPageTableInternal(v12, (UINT64)v27);
        }
        if( MiWorkingSetIsContended(v12) || KeShouldYieldProcessor() )
        {
          MiUnlockWorkingSetShared(v12, v26);
          MiLockWorkingSetShared(v12);
        }
        v27 = (char *)MmGetPteBase() + ((v24 >> 9) & 0x7FFFFFFFF8i64);
        MiMakeSystemAddressValid(v24, (INT64)v68, (unsigned int)v64, v26, 0);
        PxeUserLimit = (UNICODE_STRING *)MmGetPxeUserLimit();
      }
      v39 = *(_QWORD *)v24;
      v60 = v39;
      if( (v39 & 1) != 0 )
      {
        v40 = (v39 >> 12) & 0xFFFFFFFFFi64;
        v41 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * v40);
        if( (*(_DWORD *)(a1 + 48) & 0x70) == 64 && (unsigned int)MiRotatedToFrameBuffer((MMPTE *)v24) == 1 )
        {
          v34 = a1;
          updated = NewProtectionMask;
        }
        else
        {
          LOBYTE(v42) = MI_PFN_IS_PROTO(v41, PxeUserLimit, v31, v32);
          if( v42 )
          {
            MiFlushTbList((__int64)v68);
            v26 = v54;
            ProtoPrivate = MiMakeProtoPrivate(v12, v54, v24);
            if( ProtoPrivate )
            {
              if( ProtoPrivate == 1 )
              {
                --v62;
              }
              else
              {
                v27 = 0i64;
                v55 = 1;
                MiLockWorkingSetShared(v12);
              }
            }
            v34 = a1;
            goto LABEL_37;
          }
          if( (a5 & 0x101) != 0 )
          {
            v34 = a1;
            v26 = v54;
            if( (unsigned int)MiMakeVaRangeNoAccess(a1, v24, v37, (__int64)v68, BugCheckParameter4a, v67) )
            {
              v13 += 8 * v61;
              v24 += 8 * v63;
            }
            goto LABEL_37;
          }
          v44 = (INT64)v41;
          v34 = a1;
          updated = MiUpdatePfnProtection(a1, v44, NewProtectionMask);
          NewProtectionMask = updated;
        }
        MiRevertValidPte(v34, v24, updated, v40, (INT64)v68);
        v13 += 8 * v61;
        v24 += 8 * v63;
      }
      else
      {
        if( (v39 & 0x400) != 0 )
        {
          MiFlushTbList((__int64)v68);
          v26 = v54;
          if( (int)MiMakeProtoLeafValid((MMPTE *)v24, 1ui64, v54) < 0 )
          {
            v13 += 8i64;
            v24 += 8i64;
          }
          v36 = 1;
          v55 = 1;
          goto LABEL_38;
        }
        if( (v39 & 0x800) == 0 )
        {
          if( v61 != 1 )
            KeBugCheckEx(0x1Au, 0x44000ui64, v13, v39, 0i64);
          if( v39 )
          {
            v48 = v39 >> 5;
          }
          else
          {
            UsedPtesHandle = MiGetUsedPtesHandle((__int64)((v13 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
            MiIncreaseUsedPtesCount(UsedPtesHandle, 1ui64);
            LODWORD(v48) = *(_DWORD *)(v34 + 48) >> 7;
          }
          MiSanitizePfnProtection((_MMVAD_SHORT *)v34, v48 & 0x1F, NewProtectionMask);
          NewProtectionMask = v49;
          v50 = 32i64 * (v49 & 0x1F);
          if( v39 )
            v51 = v50 | v39 & 0xFFFFFFFFFFFFFC1Fui64;
          else
            v51 = MiSwizzleInvalidPte(v50);
          v60 = v51;
          *(_QWORD *)v13 = v51;
          v34 = a1;
          v13 += 8i64;
          v26 = v54;
          v24 += 8i64;
          goto LABEL_37;
        }
        v46 = MiSetProtectionOnTransitionPte(v34, (UINT64 *)v24, NewProtectionMask, 1i64);
        if( v61 != 1 )
        {
          v13 += 8 * v61;
          v26 = v54;
          v24 += 8 * v63;
          goto LABEL_37;
        }
        if( !v46 )
        {
          v26 = v54;
          v13 += 8i64;
          v24 += 8i64;
          goto LABEL_37;
        }
      }
      v26 = v54;
LABEL_37:
      v36 = v55;
LABEL_38:
      PxeUserLimit = (UNICODE_STRING *)MmGetPxeUserLimit();
    }
    while( v24 <= v37 );
  }
  MiFlushTbList((__int64)v68);
  if( v27 )
    MiUnlockPageTableInternal(v12, (UINT64)v27);
  MiUnlockWorkingSetShared(v12, v26);
  if( v62 )
    MiReturnFullProcessCommitment(v66, v62);
  return 0i64;
}

Referenced by:

MmProtectVirtualMemory