--- /dev/null
+segment 0, byte 0 is a request code. Codes are:
+ 0: Invoke Method
+ 1: Get Interface List
+ 2: Return Interface List
+
+Bytes 1-3 (32-bit) and 1-7 (64-bit) are reserved, and must be zero.
+All offsets described in the rest of this file are relative to the
+first non-reserved byte (a.k.a. the message payload). The reserved
+bytes do not need to be included in the message if the payload is
+empty.
+
+Op0: Invoke Method
+------------------
+
+The segment 0 payload contains the method's arguments as if they were
+a struct, followed by a depth-first traversal of any referenced
+structs, excluding references which could potentially lead to loops
+(i.e. references to types that exist in a parent node in the
+traversal, or their supertypes) or aliases (i.e. references to types
+that exist elsewhere in the traversal, or their supertypes). Where
+loops or aliases are possible, the reference is encoded as a
+segment/offset pair (a 32-bit word, segment is upper 6 bits), and the
+data may be placed wherever the sender wishes. Non-inline arrays are
+also encoded with segment/offset pairs. Object references are
+encoded as 16-bit offsets into the objlist array.
+
+Op1: Get Interface List
+-----------------------
+
+Return a "Return Interface List" message corresponding to the object
+in objlist[0]. For async requests, objlist[1] is the destination for
+the return message.
+
+Op2: Return Interface List
+--------------------------
+
+For async requests, objlist[1] is the object whose interfaces were
+requested.
+
+The payload consists of a list of GUIDs of interfaces that the object
+supports.