KdpReadPhysicalMemory

VOID __stdcall KdpReadPhysicalMemory(
        _DBGKD_MANIPULATE_STATE64 *m,
        _STRING *AdditionalData,
        _KD_CONTEXT *KdContext,
        _KD_CONTEXT *a4){
  unsigned __int64 TransferCount; 
  unsigned int MaximumLength; 
  int v9; 
  unsigned int ActualBytesRead; 
  unsigned int v11; 
  unsigned int v12; 
  int v13; 
  int v14; 
  char v15; 
  UINT64 Flags; 
  __int64 v17[3]; 
  UINT64 ActualSize; 

  ActualSize = (UINT64)KdContext;
  TransferCount = m->u.ReadMemory.TransferCount;
  v17[0] = 56i64;
  v17[1] = (__int64)m;
  if( TransferCount > (unsigned __int64)(unsigned int)KdTransportMaxPacketSize - 56 )
    LODWORD(TransferCount) = KdTransportMaxPacketSize - 56;
  MaximumLength = AdditionalData->MaximumLength;
  v9 = 6;
  ActualBytesRead = m->u.ReadMemory.ActualBytesRead;
  if( (unsigned int)TransferCount > MaximumLength )
    LODWORD(TransferCount) = MaximumLength;
  LODWORD(ActualSize) = TransferCount;
  v11 = ActualBytesRead - 1;
  if( v11 )
  {
    v12 = v11 - 1;
    if( v12 )
    {
      if( v12 == 1 )
        v9 = 38;
    }
    else
    {
      v9 = 22;
    }
  }
  else
  {
    v9 = 14;
  }
  if( m->ApiNumber == 12642 )
  {
    LODWORD(Flags) = v9;
    if( (unsigned int)TransferCount > 4096 - (m->u.GetContext.Unused & 0xFFF) )
      LODWORD(TransferCount) = 4096 - (m->u.GetContext.Unused & 0xFFF);
    v13 = MmDbgCopyMemory(
            m->u.ReadMemory.TargetBaseAddress,
            AdditionalData->Buffer,
            (unsigned int)TransferCount,
            0i64,
            Flags);
    m->ReturnStatus = v13;
    if( v13 < 0 )
      LODWORD(TransferCount) = 0;
  }
  else
  {
    LODWORD(Flags) = v9;
    v14 = KdpCopyMemoryChunks(
            m->u.ReadMemory.TargetBaseAddress,
            AdditionalData->Buffer,
            (unsigned int)TransferCount,
            0i64,
            Flags,
            &ActualSize);
    LODWORD(TransferCount) = ActualSize;
    m->ReturnStatus = v14;
  }
  m->u.ReadMemory.ActualBytesRead = TransferCount;
  if( m->ApiNumber == 12642 && (unsigned int)TransferCount >= 4 )
  {
    RunLengthEncode((UINT64 *)AdditionalData->Buffer, (unsigned int)TransferCount);
    if( v15 )
    {
      m->u.ReadMemory.ActualBytesRead = ((unsigned int)TransferCount >> 2) | 0x40000000;
      LOWORD(TransferCount) = 4;
    }
  }
  AdditionalData->Length = TransferCount;
  KdSendPacket(2i64, v17, AdditionalData, a4);
}

Referenced by:

KdpReadPhysicalMemoryLong
KdpSendWaitContinue