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