|
DSDownloadStation
Wiki page about the DS Download Station protocol.
Protocol DS Download Station protocolThis page contains technical information on the DS Download Station protocol, in a wiki format, based on Filb's gbadev posts and images. This wiki page is conversion of that information into a wiki format. Some of the information was found by yellowstar6, but most of it is Filb's, rewritten/redone in wiki format. DetailsDownload procedure: Download DLStation client over WMB -> Get clientID -> Request Menu -> Download Menu -> Request a menu item to download -> Download the item WMB client downloadThe WMB transfer is different from a normal transfer. The header size is 250 bytes long, about half the size of the normal header. The rest of the header needs appended with the header data from a official demo in order to get a complete header. The first data packet, after the header, is "fake". The real data doesn't start until the next packet. The data size is 102 bytes. Some demos transferred over WMB do the same thing. If a packet with data size 102 is detected as the first data seq, it can be ignored safely, and only the next data packets can be used for the actual data. Obtaining the clientIDAfter the client is downloaded and booted, the client connects to the host. The AID value, Association ID, in the Association Response packet is the clientID for the client. This is needed so the clients can check which data/menu packets are intended for itself, the client. DLStation packet formatThe first byte after the 802.11 frame header is the type of this packet. 0x04 is download request, 0x06 is data packets. The data packets are very similar to WMB data packets. The main differences are the fact that the flags field was removed, and the data added after the actual data being transferred in the packets. Some packets can be mistaken as DLStation download request packets when they are really WMB ack packets. WMB Client-to-host ack packets use the same 0x04 byte for the first byte in the payload, but the byte after that is fixed. Filtering out the values of the second byte used in WMB ack packets fixes this problem. Note that the format used for the table for the formats isn't very good, due to issues with Google Code wiki. None of these DLStation fields overlap. Download request packet format byte 0 | byte 1 | byte 2 - end of data
0x04 | Unknown | Request
then this packet is a menu request. When the first 4 characters are not "menu", it is a download request for a demo/download. Data packet format byte 0 - 3 | byte 4 | byte 5 | byte 6 - 7 | byte 8 - byte 8 + size | 2 bytes | rest of packet 06 02 01 00 | size | type | seq number | data | clientID | Unknown
Packet request, menu, and download stageAfter the clientID is obtained, the client sends a menu request to the host. The first four bytes are menu, the next character is an underscore, and the last 3 are the client's language. ger is for German. eng is for English. jpn is for Japanese. It seems the host always sends the same menu no matter what the client's language is. When the host receives the menu request packet, the host will eventually start sending the menu data packets with type 0x1e. Before the actual LZO compressed data for the menu, there is a header. Once the whole menu has been transferred, the host will idle and send pings for a while. Then it will send a data packet with data sequence number 0xFFFF. This seems to tell the client that the whole menu/download has been transferred. Following this, the client will decompress the LZO compressed data, then the menu will be displayed and viewed. When the first 4 characters of the download request are not "menu", it is a download request for a demo/download. The request contains a 8-byte gameID, from one of the menu items' gameID. This request is sent when the client chooses a item to download. After many handshakes and other things, the item will be transferred, in the same way as the menu, with the same LZO compression and header. The decompressed data is an .nds. It contains extra data from the DLStation, including controls, maybe the ESRB rating, and other unknown data. Menu data formatThe first 4 bytes of the decompressed menu are either an magic number, or the DLStation volume/version number minus one, for example: DS Download Station vol. 7. In one menu from vol. 7, this was 08 00 00 00. Following this, is the menu items. Each item is 0x72C bytes long. First, there is 0x200 bytes of icon data, and 0x20 bytes of palette data, similar to the banner in a .nds. Following this, is the title of the item, 0x80 bytes long. Next is a subtitle, 0x80 bytes long. The next 0x402 bytes contain ESRB and controls information. The format of this section is unknown. Lastly, there is the 8-byte UTF-8 gameID string, without any null-terminating characters, then the item ends with two zero bytes. |