Well, you knew this was coming– xbfuse. This is a program that leverages the wonderful FUSE paradigm to mount a Microsoft Xbox disc filesystem — the so-called XDVD filesystem — under Linux. I hammered out the bug mentioned in yesterday’s post (sure enough, a 64-bit offset was being demoted to a signed 32-bit quantity at one point, and that matters for filesystems this large). This is what the program looks like in action:
$ xbfuse Halo-3.iso mnt/ $ ls -al mnt/ total 4 dr-xr-xr-x 6 melanson melanson 0 2007-11-07 20:00 . drwxr-xr-x 47 melanson melanson 4096 2007-11-10 17:31 .. dr-xr-xr-x 2 melanson melanson 0 2007-11-07 20:00 bink -r--r--r-- 1 melanson melanson 8929280 2007-11-07 20:00 default.xex dr-xr-xr-x 5 melanson melanson 0 2007-11-07 20:00 maps dr-xr-xr-x 2 melanson melanson 0 2007-11-07 20:00 $SystemUpdate dr-xr-xr-x 2 melanson melanson 0 2007-11-07 20:00 waves -r--r--r-- 1 melanson melanson 561152 2007-11-07 20:00 WaveShell-Xbox.dll -r--r--r-- 1 melanson melanson 724992 2007-11-07 20:00 WavesLibDLL.dll $ ls -al mnt/bink/ total 0 dr-xr-xr-x 2 melanson melanson 0 2007-11-07 20:00 . dr-xr-xr-x 6 melanson melanson 0 2007-11-07 20:00 .. -r--r--r-- 1 melanson melanson 77940860 2007-11-07 20:00 attract_1_60.bik -r--r--r-- 1 melanson melanson 61324440 2007-11-07 20:00 attract_2_60.bik -r--r--r-- 1 melanson melanson 72829508 2007-11-07 20:00 attract_3_60.bik -r--r--r-- 1 melanson melanson 69631000 2007-11-07 20:00 credits_60.bik -r--r--r-- 1 melanson melanson 21163412 2007-11-07 20:00 intro_60.bik $ fusermount -u mnt/
So Halo 3 uses Bink files, some very high resolution ones, rather than any Xbox-specific multimedia formats, like XMV. Actually, Bungie (the company behind Halo) may have a history with Bink, as I seem to recall that the FMV for the PC demo version of Halo was also Bink (or at least one promotional file).
I actually just thought to look up whether there are other options for mounting Xbox filesystem images under Linux. The format certainly seems to be of much greater interest than, say, GameCube filesystem images. I did find a project called Mount ISO Image that is supposed to be able to handle XDVD filesystems. Though I can’t really figure out if it’s a KDE application, a script, or a KDE script.
I took a slightly different approach to writing this one. All in all, I suppose the result is much simpler than gcfuse. The GameCube filesystem is an odd beast and required a lot of custom hacks to parse all of the data structures. However, writing xbfuse scared me more because I had to write 2 mutually recursive functions: After loading the volume descriptor, call xbfs_recurse_directory(), which then calls xbfs_recurse_file_subtree(), which calls not only itself, but also xbfs_recurse_directory() when a file entry happens to be a directory. I thought about writing xbfuse in such a way that it would traverse the data structures on demand when loading a file, since the data structures are laid out to be conducive to binary searching. I also thought about only loading the first level of the directory tree, and loading other levels on demand. But in the end, I just went with the full tree load at the outset and finally squashed the 64 -> 32-bit bug and the program seems to work quite well.
What next? Wii discs seem to use a different format than the GameCube discs and I would like to find out what that is. Plus, I am still dogged by the slightly custom Dreamcast ISO-9660-style format. There is a lot of interesting Sofdec media on those Dreamcast games. And it only takes about 26 hours to rip the contents of a Dreamcast disc onto your PC, provided that you have the right serial cable.