KdpReadPhysicalMemory
INT64 __fastcall KdpReadPhysicalMemory(INT64 a1, INT64 a2, UINT64 a3, INT64 a4){
unsigned __int64 v4;
unsigned int v8;
int v9;
int v10;
int v11;
int v12;
int v13;
NTSTATUS v14;
UINT64 Flags;
__int64 v17[3];
UINT64 ActualSize;
ActualSize = a3;
v4 = *(unsigned int *)(a1 + 24);
v17[0] = 56i64;
v17[1] = a1;
if( v4 > (unsigned __int64)(unsigned int)KdTransportMaxPacketSize - 56 )
LODWORD(v4) = KdTransportMaxPacketSize - 56;
v8 = *(unsigned __int16 *)(a2 + 2);
v9 = 6;
v10 = *(_DWORD *)(a1 + 28);
if( (unsigned int)v4 > v8 )
LODWORD(v4) = v8;
LODWORD(ActualSize) = v4;
v11 = v10 - 1;
if( v11 )
{
v12 = v11 - 1;
if( v12 )
{
if( v12 == 1 )
v9 = 38;
}
else
{
v9 = 22;
}
}
else
{
v9 = 14;
}
if( *(_DWORD *)a1 == 12642 )
{
LODWORD(Flags) = v9;
if( (unsigned int)v4 > 4096 - (*(_DWORD *)(a1 + 16) & 0xFFFu) )
LODWORD(v4) = 4096 - (*(_DWORD *)(a1 + 16) & 0xFFF);
v13 = MmDbgCopyMemory(*(_QWORD *)(a1 + 16), *(VOID **)(a2 + 8), (unsigned int)v4, 0i64, Flags);
*(_DWORD *)(a1 + 8) = v13;
if( v13 < 0 )
LODWORD(v4) = 0;
}
else
{
LODWORD(Flags) = v9;
v14 = KdpCopyMemoryChunks(*(_QWORD *)(a1 + 16), *(PVOID *)(a2 + 8), (unsigned int)v4, 0i64, Flags, &ActualSize);
LODWORD(v4) = ActualSize;
*(_DWORD *)(a1 + 8) = v14;
}
*(_DWORD *)(a1 + 28) = v4;
if( *(_DWORD *)a1 == 12642 && (unsigned int)v4 >= 4 && RunLengthEncode(*(UINT64 **)(a2 + 8), (unsigned int)v4) )
{
*(_DWORD *)(a1 + 28) = ((unsigned int)v4 >> 2) | 0x40000000;
LOWORD(v4) = 4;
}
*(_WORD *)a2 = v4;
return KdSendPacket(2i64, v17, a2, a4);
}Referenced by:
KdpReadPhysicalMemoryLong
KdpSendWaitContinue