MiReadWriteVirtualMemory
INT64 __stdcall MiReadWriteVirtualMemory(
VOID *ProcessHandle,
VOID *BaseAddress,
VOID *Buffer,
UINT64 BufferSize,
UINT64 *BytesTransferred,
UINT64 VmOperation){
_ETHREAD *CurrentThread;
KPROCESSOR_MODE v9;
UINT64 *v10;
__int64 v11;
int v12;
_LIST_ENTRY *v13;
PVOID v14;
_LIST_ENTRY *v15;
VOID *v16;
_HHIVE *v17;
INT64 v18;
PVOID Object[2];
Object[0] = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = *((_BYTE *)CurrentThread + 562);
if( v9 )
{
if( (char *)BaseAddress + BufferSize < BaseAddress
|| (unsigned __int64)BaseAddress + BufferSize > 0x7FFFFFFF0000i64
|| (char *)Buffer + BufferSize < Buffer
|| (unsigned __int64)Buffer + BufferSize > 0x7FFFFFFF0000i64 )
{
return 3221225477i64;
}
v10 = BytesTransferred;
if( BytesTransferred )
{
v11 = (__int64)BytesTransferred;
if( (unsigned __int64)BytesTransferred >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
*(_QWORD *)v11 = *(_QWORD *)v11;
}
}
else
{
v10 = BytesTransferred;
}
v12 = 0;
if( BufferSize )
{
v12 = ObReferenceObjectByHandleWithTag(
ProcessHandle,
VmOperation,
(POBJECT_TYPE)PsProcessType,
v9,
0x6D566D4Du,
Object,
0i64);
if( v12 >= 0 )
{
v13 = (_LIST_ENTRY *)*((_QWORD *)CurrentThread + 23);
Object[1] = v13;
v14 = Object[0];
if( (*((_BYTE *)Object[0] + 992) & 1) == 0 || v13 == Object[0] || *((_QWORD *)Object[0] + 175) )
{
if( (_DWORD)VmOperation == 16 )
{
v15 = v13;
v16 = BaseAddress;
v17 = (_HHIVE *)Object[0];
}
else
{
v15 = (_LIST_ENTRY *)Object[0];
v16 = Buffer;
v17 = (_HHIVE *)v13;
}
v12 = MmCopyVirtualMemory(v17, (INT64)v16, v15);
}
else
{
v12 = -1073741819;
}
if( PsIsProcessLoggingEnabled((INT64)v14, (unsigned int)VmOperation) )
EtwTiLogReadWriteVm((unsigned int)v12, v18, (INT64)v14, (unsigned int)VmOperation, (CHAR)BaseAddress, 0);
ObfDereferenceObjectWithTag(v14, 0x6D566D4Dui64);
}
}
if( v10 )
*v10 = 0i64;
return(unsigned int)v12;
}Referenced by:
NtReadVirtualMemory
NtWriteVirtualMemory