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