MiReadWriteVirtualMemory
VOID __fastcall MiReadWriteVirtualMemory(VOID *ProcessHandle, VOID *BaseAddress, VOID *Buffer, UINT64 BufferSize){
UINT64 v7;
_ETHREAD *CurrentThread;
INT8 PreviousMode;
_QWORD *v10;
__int64 v11;
_EPROCESS *Process;
INT64 *v13;
VOID *v14;
_EPROCESS *v15;
VOID *v16;
_EPROCESS *v17;
unsigned int v18;
unsigned int v19;
INT64 v20;
int v21;
UINT64 Tag;
CHAR v23;
UINT64 NumberOfBytesRead;
PVOID Object[2];
unsigned __int64 v27;
unsigned int DesiredAccess;
v7 = 0i64;
Object[0] = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
v23 = PreviousMode;
if( PreviousMode )
{
if( (char *)BaseAddress + BufferSize < BaseAddress
|| (unsigned __int64)BaseAddress + BufferSize > 0x7FFFFFFF0000i64
|| (char *)Buffer + BufferSize < Buffer
|| (unsigned __int64)Buffer + BufferSize > 0x7FFFFFFF0000i64 )
{
return;
}
v10 = (_QWORD *)v27;
if( v27 )
{
v11 = v27;
if( v27 >= 0x7FFFFFFF0000i64 )
v11 = 0x7FFFFFFF0000i64;
*(_QWORD *)v11 = *(_QWORD *)v11;
}
}
else
{
v10 = (_QWORD *)v27;
}
NumberOfBytesRead = 0i64;
if( BufferSize )
{
LODWORD(Tag) = 1834380621;
if( ObReferenceObjectByHandleWithTag(
ProcessHandle,
DesiredAccess,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Tag,
Object,
0i64) >= 0 )
{
Process = CurrentThread->Tcb.ApcState.Process;
Object[1] = Process;
v13 = (INT64 *)Object[0];
if( (*((_BYTE *)Object[0] + 992) & 1) == 0 || Process == Object[0] || *((_QWORD *)Object[0] + 175) )
{
if( DesiredAccess == 16 )
{
v14 = Buffer;
v15 = Process;
v16 = BaseAddress;
v17 = (_EPROCESS *)Object[0];
}
else
{
v14 = BaseAddress;
v15 = (_EPROCESS *)Object[0];
v16 = Buffer;
v17 = Process;
}
MmCopyVirtualMemory(v17, v16, v15, v14, BufferSize, v23, &NumberOfBytesRead);
v7 = NumberOfBytesRead;
v19 = v18;
}
else
{
v19 = -1073741819;
}
PsIsProcessLoggingEnabled(v13, DesiredAccess);
if( v21 )
EtwTiLogReadWriteVm(v19, v20, (INT64)v13, DesiredAccess, (CHAR)BaseAddress, v7);
ObfDereferenceObjectWithTag(v13, 0x6D566D4Dui64);
}
}
if( v10 )
*v10 = v7;
}Referenced by:
NtReadVirtualMemory
NtWriteVirtualMemory