MmSecureVirtualMemoryAgainstWrites
NTSTATUS __fastcall MmSecureVirtualMemoryAgainstWrites(_EPROCESS *Process, VOID *Base, UINT64 Size){
VOID *v3;
_DWORD *v7;
unsigned __int64 v8;
INT64 v9;
INT64 v10;
int v11;
_MMVAD_SHORT *v12;
int v13;
_MMVAD *v14;
int v15;
_EPROCESS *v17;
INT64 v18;
_KAPC_STATE ApcState;
v3 = (VOID *)((unsigned __int64)Base & 0xFFFFFFFFFFFFF000ui64);
memset(&ApcState, 0, sizeof(ApcState));
if( (VOID *)((unsigned __int64)Base & 0xFFFFFFFFFFFFF000ui64) != Base || (Size & 0xFFF) != 0 )
return 0;
v7 = 0i64;
v8 = ((unsigned __int64)Base + Size - 1) | 0xFFF;
v17 = KeGetCurrentThread()->ApcState.Process;
if( v17 == Process )
v17 = 0i64;
else
KiStackAttachProcess(Process, 0i64, &ApcState);
LODWORD(v9) = MiObtainReferencedVadEx((UINT64)v3, 0, &v18);
v10 = v9;
if( v9 )
{
if( v8 >> 12 <= (*(unsigned int *)(v9 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v9 + 33) << 32)) )
{
LOBYTE(v11) = MiVadSupportsPrivateCommit(v9);
if( v11 )
{
if( ((*(_DWORD *)(v10 + 48) & 8) == 0 || MiCheckSecuredVad(v12, Base, Size, 1ui64) >= 0)
&& (*(_DWORD *)(v10 + 48) & 0x100000) == 0
&& (*(_DWORD *)(v10 + 64) & 0x4000000) == 0
&& (MmCompatibleProtectionMask[(*(_DWORD *)(v10 + 48) >> 7) & 7] | 0x702) == (MmCompatibleProtectionMask[(*(_DWORD *)(v10 + 48) >> 7) & 7] | 0x700) )
{
if( (v13 = *(_DWORD *)(**(_QWORD **)(v10 + 72) + 56i64), (v13 & 0x80u) != 0) && (v13 & 0x20) == 0
|| !MiVadMapsLargeImage((_MMVAD *)v10) && (MiIsRangeFullyCommitted(v14, v3, (VOID *)v8), v15) )
{
if( MiSetReadOnlyOnSectionView(Process, (_MMVAD *)v10, v3, (VOID *)v8) >= 0 )
{
v7 = MiAddSecureEntry((_MI_PARTITION *)v10, (__int64)v3, v8, -1073741823, 0);
if( !v7 )
MiUnsecureVirtualMemoryAgainstWrites((_MMVAD *)v10, v3, (VOID *)v8);
}
}
}
}
}
MiUnlockAndDereferenceVad((_MMVAD_SHORT *)v10);
}
if( v17 )
KiUnstackDetachProcess(&ApcState, 0i64);
if( v7 )
LODWORD(v7) = (unsigned int)Process ^ *(&stru_140C4DB30 + 24) ^ (unsigned int)v7;
return(int)v7;
}Referenced by:
AlpcpExposeViewAttributeInSenderContext
AlpcpPrepareViewForDelivery