/** * Read and parse an ADB message from the supplied input stream. * This message is NOT validated. * @param in InputStream object to read data from * @return An AdbMessage object represented the message read */ public static AdbMessage ReadAdbMessage(BinaryStream inStream) { AdbMessage msg = new AdbMessage(); inStream.IsLittleEndian = true; /* Pull out header fields */ msg.command = inStream.ReadUInt32(); msg.arg0 = inStream.ReadUInt32(); msg.arg1 = inStream.ReadUInt32(); uint payloadLength = inStream.ReadUInt32(); uint checksum = inStream.ReadUInt32(); uint magic = inStream.ReadUInt32(); if (msg.command != (magic ^ 0xFFFFFFFF)) { throw new IOException("message error"); } /* If there's a payload supplied, read that too */ if (payloadLength > 0) { msg.payload = new byte[payloadLength]; inStream.Fill(msg.payload); if (GetPayloadChecksum(msg.payload) != checksum) { throw new IOException("checksum error"); } } return(msg); }