NtProtectVirtualMemory
NTSTATUS __stdcall NtProtectVirtualMemory(
VOID *ProcessHandle,
VOID **BaseAddress,
UINT64 *RegionSize,
UINT64 NewProtectWin32,
UINT64 *OldProtect){
unsigned int v5;
VOID *v7;
UINT64 *v8;
int v9;
NTSTATUS ProtectionMask;
_ETHREAD *CurrentThread;
_EPROCESS *Process;
INT8 PreviousMode;
__int64 v14;
__int64 v15;
__int64 v16;
VOID *v17;
UINT64 v18;
NTSTATUS result;
PFN_WDFDRIVERERRORREPORTAPIMISSING *v20;
NTSTATUS v21;
NTSTATUS v22;
int v23;
INT64 Tag;
INT64 Taga;
INT64 Tagb;
PVOID *Object;
char v28;
char DeviceObject[12];
PVOID v30;
_XSTATE_FEATURE *v31;
UINT64 *v32;
UINT64 *v33;
_KAPC_STATE ApcState;
v5 = NewProtectWin32;
v32 = RegionSize;
v7 = ProcessHandle;
v8 = OldProtect;
v33 = OldProtect;
memset(&ApcState, 0, sizeof(ApcState));
v9 = 0;
v30 = 0i64;
v31 = 0i64;
memset(DeviceObject, 0, sizeof(DeviceObject));
if( v5 == 0x80000000 || v5 == 0x10000000 )
{
LOBYTE(ProtectionMask) = 24;
}
else
{
ProtectionMask = MiMakeProtectionMask(v5 & 0xFF807FF);
if( ProtectionMask == -1 )
return -1073741755;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Process = CurrentThread->Tcb.ApcState.Process;
PreviousMode = CurrentThread->Tcb.PreviousMode;
v28 = PreviousMode;
if( PreviousMode )
{
v14 = (__int64)BaseAddress;
if( (unsigned __int64)BaseAddress >= 0x7FFFFFFF0000i64 )
v14 = 0x7FFFFFFF0000i64;
*(_QWORD *)v14 = *(_QWORD *)v14;
v15 = (__int64)RegionSize;
if( (unsigned __int64)RegionSize >= 0x7FFFFFFF0000i64 )
v15 = 0x7FFFFFFF0000i64;
*(_QWORD *)v15 = *(_QWORD *)v15;
v16 = (__int64)v8;
if( (unsigned __int64)v8 >= 0x7FFFFFFF0000i64 )
v16 = 0x7FFFFFFF0000i64;
*(_DWORD *)v16 = *(_DWORD *)v16;
v17 = *BaseAddress;
*(_QWORD *)&DeviceObject[4] = *BaseAddress;
v18 = *RegionSize;
v31 = (_XSTATE_FEATURE *)*RegionSize;
PreviousMode = v28;
}
else
{
v18 = *RegionSize;
v31 = (_XSTATE_FEATURE *)*RegionSize;
v17 = *BaseAddress;
*(_QWORD *)&DeviceObject[4] = *BaseAddress;
}
if( (unsigned __int64)v17 > 0x7FFFFFFEFFFFi64 )
return -1073741584;
if( 0x7FFFFFFF0000i64 - (__int64)v17 < v18 || !v18 )
return -1073741583;
LODWORD(Tag) = 1984982349;
result = ObReferenceObjectByHandleWithTag(v7, 8ui64, (_OBJECT_TYPE *)PsProcessType, PreviousMode, Tag, &v30, 0i64);
if( result >= 0 )
{
v20 = (PFN_WDFDRIVERERRORREPORTAPIMISSING *)v30;
if( Process != v30 )
{
KeStackAttachProcess((PRKPROCESS)v30, &ApcState);
v9 = 1;
}
LODWORD(Taga) = v5;
if( ((_BYTE)v20[124] & 1) != 0 )
v21 = VslDebugProtectSecureProcessMemory(
(__int64)v20,
(__int64)Process,
(__int64 *)&DeviceObject[4],
(__int64 *)&v31,
v5,
DeviceObject);
else
v21 = MmProtectVirtualMemory(
(PFN_WDFDRIVERERRORREPORTAPIMISSING *)Process,
v20,
(PFN_WDFDEVICEWDMDISPATCHPREPROCESSEDIRP **)&DeviceObject[4],
&v31,
Taga,
(PFN_WDFDEVICEWDMDISPATCHPREPROCESSEDIRP *)DeviceObject);
v22 = v21;
LODWORD(v30) = v21;
if( v9 )
KeUnstackDetachProcess(&ApcState);
if( v22 >= 0
&& (((unsigned __int8)MiMakeProtectionMask(*(unsigned int *)DeviceObject) | (unsigned __int8)ProtectionMask) & 2) != 0 )
{
LODWORD(Object) = v23;
LODWORD(Tagb) = v5;
EtwTiLogProtectExecVm((__int64)v20, v28, *(_QWORD *)&DeviceObject[4], v18, Tagb, Object);
}
ObfDereferenceObjectWithTag(v20, 0x76506D4Dui64);
*v32 = (UINT64)v31;
*BaseAddress = *(VOID **)&DeviceObject[4];
*(_DWORD *)v33 = *(_DWORD *)DeviceObject;
return v22;
}
return result;
}Referenced by:
No references.