<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://xboxdevwiki.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Qubits</id>
		<title>xboxdevwiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://xboxdevwiki.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Qubits"/>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/Special:Contributions/Qubits"/>
		<updated>2026-04-26T12:57:16Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7031</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7031"/>
				<updated>2022-03-06T15:47:40Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Volume descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor islocated at Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Sector #32:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|0x0 || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|-&lt;br /&gt;
|0x14 || u32 || Root Directory Table Sector || Multiply with 0x800 for offset&lt;br /&gt;
|-&lt;br /&gt;
|0x18 || u32 || Root Directory Table Size || Size in bytes. Always multiple of 0x800&lt;br /&gt;
|-&lt;br /&gt;
|0x1C || u64 || || Timestamp (LDAP/Win32 FILETIME)&lt;br /&gt;
|-&lt;br /&gt;
|0x7EC || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Sector #33:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
Edit: This assumption is not true, at least not for all instances. For example, all region variants of Conker Live &amp;amp; Reloaded share the same padding stream.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7030</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7030"/>
				<updated>2022-03-06T09:09:36Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Version 4831 - 5849 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Sector #32:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|0x0 || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|-&lt;br /&gt;
|0x14 || u32 || Root Directory Table Sector || Multiply with 0x800 for offset&lt;br /&gt;
|-&lt;br /&gt;
|0x18 || u32 || Root Directory Table Size || Size in bytes. Always multiple of 0x800&lt;br /&gt;
|-&lt;br /&gt;
|0x1C || u64 || || Timestamp (LDAP/Win32 FILETIME)&lt;br /&gt;
|-&lt;br /&gt;
|0x7EC || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Sector #33:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
Edit: This assumption is not true, at least not for all instances. For example, all region variants of Conker Live &amp;amp; Reloaded share the same padding stream.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7029</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7029"/>
				<updated>2022-03-06T09:09:06Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Version 3926 - 4808 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Sector #32:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|0x0 || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|-&lt;br /&gt;
|0x14 || u32 || Root Directory Table Sector || Multiply with 0x800 for offset&lt;br /&gt;
|-&lt;br /&gt;
|0x18 || u32 || Root Directory Table Size || Size in bytes. Always multiple of 0x800&lt;br /&gt;
|-&lt;br /&gt;
|0x1C || u64 || || Timestamp (LDAP/Win32 FILETIME)&lt;br /&gt;
|-&lt;br /&gt;
|0x7EC || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Sector #33:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7028</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7028"/>
				<updated>2022-03-06T09:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Version 3926 - 4808 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Sector #32:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|0x0 || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|-&lt;br /&gt;
|0x14 || u32 || Root Directory Table Sector || Multiply with 0x800 for offset&lt;br /&gt;
|-&lt;br /&gt;
|0x18 || u32 || Root Directory Table Size || Size in bytes. Always multiple of 0x800&lt;br /&gt;
|-&lt;br /&gt;
|0x1C || u64 || || Timestamp (LDAP/Win32 FILETIME)&lt;br /&gt;
|-&lt;br /&gt;
|0x7EC || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Sector #33:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
Edit: This assumption is not true, at least not for all instances. For example, all region variants of Conker Live &amp;amp; Reloaded share the same padding stream.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7027</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7027"/>
				<updated>2022-03-06T07:15:17Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Volume descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Sector #32:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|0x0 || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|-&lt;br /&gt;
|0x14 || u32 || Root Directory Table Sector || Multiply with 0x800 for offset&lt;br /&gt;
|-&lt;br /&gt;
|0x18 || u32 || Root Directory Table Size || Size in bytes. Always multiple of 0x800&lt;br /&gt;
|-&lt;br /&gt;
|0x1C || u64 || || Timestamp (LDAP/Win32 FILETIME)&lt;br /&gt;
|-&lt;br /&gt;
|0x7EC || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Sector #33:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7026</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7026"/>
				<updated>2022-03-06T07:11:22Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Volume descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Sector #32:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Field !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|0x0 || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|-&lt;br /&gt;
|0x14 || u32 || Root Directory Table Sector || Multiply with 0x800 for offset&lt;br /&gt;
|-&lt;br /&gt;
|0x18 || u32 || Root Directory Table Size || Size in bytes. Always multiple of 0x800&lt;br /&gt;
|-&lt;br /&gt;
|0x1C || u64 || || Timestamp&lt;br /&gt;
|-&lt;br /&gt;
|0x7EC || ascii_char[20] || MAGIC|| MICROSOFT*XBOX*MEDIA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Sector #33:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7025</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7025"/>
				<updated>2022-03-06T07:03:02Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Volume descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
The Volume descriptor Sector #32 and #33 of the game partition.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first 20 Bits is the magic. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first 24 Bits is the magic. It is always &amp;quot;XBOX_DVD_LAYOUT_TOOL_SIG&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7023</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7023"/>
				<updated>2022-03-02T12:49:29Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA), Syberia (USA, Europe)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7011</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7011"/>
				<updated>2022-02-22T09:44:03Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA), Phantom Crash (USA)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7010</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7010"/>
				<updated>2022-02-17T22:24:21Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA), NCAA Football 2003 (USA)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7009</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=7009"/>
				<updated>2022-02-15T21:56:31Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
Other Examples of games with 1.0.4721.1 version that don't use the old algorithm: Mat Hoffman's Pro BMX 2 (France), MLB SlugFest 2003 (USA)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6984</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6984"/>
				<updated>2022-02-09T10:47:02Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic Edition)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6983</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6983"/>
				<updated>2022-02-09T10:45:17Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/09/18&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
** DMI Timestamp: 2002/12/03&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6982</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6982"/>
				<updated>2022-02-09T10:07:54Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
Sometime during this wave, the new padding algorithm got introduced. Judging from the examples below, the padding algorithm does not seem to be bound to the xblayout version or to a specific date.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6981</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6981"/>
				<updated>2022-02-09T10:04:47Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
All games with xblayout &amp;gt; 4808 use a new random padding algorithm.&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Original)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (France) (Classic)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6980</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6980"/>
				<updated>2022-02-09T08:19:59Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
All games with xblayout &amp;gt; 4808 use a new random padding algorithm.&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (old algorithm)&lt;br /&gt;
* [[Hitman 2 - Silent Assassin]] (Europe) (Rev 1)&lt;br /&gt;
** xblayout version: 1.0.4721.1 (new algorithm)&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1 (old algorithm)&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1 (new algorithm)&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6979</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6979"/>
				<updated>2022-02-04T11:27:03Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Version 3926 - 4808 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
All games with xblayout &amp;gt; 4808 use a new random padding algorithm.&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4808 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6978</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6978"/>
				<updated>2022-02-04T11:25:17Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
All games with xblayout &amp;gt; 4808 use a new random padding algorithm.&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4721 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6977</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6977"/>
				<updated>2022-02-04T11:24:45Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft&lt;br /&gt;
&lt;br /&gt;
All games with xblayout &amp;gt; 4808 use a new random padding algorithm.&lt;br /&gt;
&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2, but Microsoft upgraded their tool to use new random padding.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4721 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	<entry>
		<id>https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6976</id>
		<title>XDVDFS</title>
		<link rel="alternate" type="text/html" href="https://xboxdevwiki.net/index.php?title=XDVDFS&amp;diff=6976"/>
				<updated>2022-02-04T11:23:15Z</updated>
		
		<summary type="html">&lt;p&gt;Qubits: /* Wave 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XDVDFS (Also known as XISO) is the image format used for [[Xbox Game Disc|Xbox Game Discs]].&lt;br /&gt;
It is stored in the data area.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
&lt;br /&gt;
Each sector is 2048 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Filesystem ===&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=More info}}&lt;br /&gt;
&lt;br /&gt;
=== Volume descriptor ===&lt;br /&gt;
&lt;br /&gt;
32 sectors which are zero-filled.&lt;br /&gt;
The Volume descriptor is 4096 bytes, but split into 2x 2048 sections.&lt;br /&gt;
&lt;br /&gt;
* '''Section 1:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=How does this work?}}&lt;br /&gt;
* '''Section 2:''' The first data is the magic at sector 32. It is always &amp;quot;MICROSOFT*XBOX*MEDIA&amp;quot;. {{FIXME|reason=Describe version information}}&lt;br /&gt;
&lt;br /&gt;
==== Examples ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The &amp;quot;Wave n&amp;quot; is not a standard naming and I just made it up myself; we should confirm these and possibly find a better name - JayFoxRox --&amp;gt;&lt;br /&gt;
{{FIXME|reason=The tool names appearing in this section are guessed by me, we should confirm each of these - JayFoxRox}}&lt;br /&gt;
{{FIXME|reason=This lacks a couple of XDK versions}}&lt;br /&gt;
{{FIXME|reason=The byte offsets of each version field are missing}}&lt;br /&gt;
&lt;br /&gt;
===== Wave 1 =====&lt;br /&gt;
&lt;br /&gt;
Developers used xblayout to create DVD layout.&lt;br /&gt;
Then generated the final image using xbpremaster.&lt;br /&gt;
The final image was submitted to Microsoft.&lt;br /&gt;
&lt;br /&gt;
* [[Azurik: Rise of Perathia]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.3926.1&lt;br /&gt;
** xbpremaster version: 1.0.3926.1&lt;br /&gt;
* [[Genma Onimusha]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4039.1&lt;br /&gt;
** xbpremaster version: 1.0.4039.2&lt;br /&gt;
* [[Max Payne]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4134.1&lt;br /&gt;
** xbpremaster version: 1.0.4242.1&lt;br /&gt;
* [[Petit Copter]] (Japanese)&lt;br /&gt;
** xblayout version: 1.0.4361.1&lt;br /&gt;
** xbpremaster version: 1.0.4361.2&lt;br /&gt;
* [[007 - Agent Under Fire]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4432.1&lt;br /&gt;
** xbpremaster version: 1.0.4432.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 2 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Developers used a new version of xblayout and submitted the layout + content to Microsoft  &lt;br /&gt;
All games with xblayout &amp;gt; 4808 use a new random padding algorithm.&lt;br /&gt;
Microsoft generated the final image.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4721.1&lt;br /&gt;
* [[Blade II]] (NTSC)&lt;br /&gt;
** xblayout version: 1.0.4808.1&lt;br /&gt;
* [[Battle Engine Aquila]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.4831.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 3 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 2, but Microsoft upgraded their tool to use new random padding.&lt;br /&gt;
&lt;br /&gt;
* [[Metal Gear Solid 2 - Substance]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
* [[Shenmue II]] (PAL)&lt;br /&gt;
** xblayout version: 1.0.5120.1&lt;br /&gt;
&lt;br /&gt;
===== Wave 4 =====&lt;br /&gt;
&lt;br /&gt;
{{FIXME|reason=This is a theory. Confirm please}}.&lt;br /&gt;
Same as wave 3, but developers now had to use the xbgamedisc tool instead of xblayout.&lt;br /&gt;
The mastering tool used by microsoft also leaves a version identifier now.&lt;br /&gt;
&lt;br /&gt;
* [[Star Wars - Knights of the Old Republic]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Indiana Jones and the Emperor's Tomb]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5233.1&lt;br /&gt;
** mastering tool version: 2.1.0.5233.1&lt;br /&gt;
* [[Dynasty Warriors 4]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5344.1&lt;br /&gt;
** mastering tool version: 2.1.0.5344.1&lt;br /&gt;
* [[The Matrix - Path of Neo]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[The Suffering - Ties That Bind]]&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
* [[Reservoir Dogs]] (PAL)&lt;br /&gt;
** xbgamedisc version: 2.1.0.5849.1&lt;br /&gt;
** mastering tool version: 2.1.0.5849.1&lt;br /&gt;
&lt;br /&gt;
=== Directory Entry ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
File entry flags:&lt;br /&gt;
* READONLY  = 0x01&lt;br /&gt;
* HIDDEN    = 0x02&lt;br /&gt;
* SYSTEM    = 0x04&lt;br /&gt;
* DIRECTORY = 0x10&lt;br /&gt;
* ARCHIVE   = 0x20&lt;br /&gt;
* NORMAL = 0x80&lt;br /&gt;
&lt;br /&gt;
=== File data blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Incomplete sectors are padded with 0x00 bytes.&lt;br /&gt;
&lt;br /&gt;
=== Random blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 3926 - 4721 ====&lt;br /&gt;
&lt;br /&gt;
Seeded and then starting to emit bytes in data area.&lt;br /&gt;
Filled with the following algorithm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// State&lt;br /&gt;
uint32_t a;&lt;br /&gt;
uint32_t b;&lt;br /&gt;
uint32_t c;&lt;br /&gt;
&lt;br /&gt;
// Helper&lt;br /&gt;
static uint32_t Value(void) {&lt;br /&gt;
  uint64_t result;&lt;br /&gt;
  result = c;&lt;br /&gt;
  result += 1;&lt;br /&gt;
  result *= b;&lt;br /&gt;
  result %= 0xFFFFFFFB;&lt;br /&gt;
  c = result &amp;amp; 0xFFFFFFFF;&lt;br /&gt;
  return c ^ a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// buffer must be at even address, length must be multiple of 2&lt;br /&gt;
void Fill(uint16_t* buffer, size_t length) {&lt;br /&gt;
  while(length &amp;gt;= 2) {&lt;br /&gt;
    *buffer++ = Value() &amp;gt;&amp;gt; 8;&lt;br /&gt;
    length -= 2;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  const uint32_t b_seeds[8] = {&lt;br /&gt;
    0x52F690D5,&lt;br /&gt;
    0x534D7DDE,&lt;br /&gt;
    0x5B71A70F,&lt;br /&gt;
    0x66793320,&lt;br /&gt;
    0x9B7E5ED5,&lt;br /&gt;
    0xA465265E,&lt;br /&gt;
    0xA53F1D11,&lt;br /&gt;
    0xB154430F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  FILETIME ft;&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;ft);&lt;br /&gt;
  uint32_t seed = ft.dwLowDateTime ^ ft.dwHighDateTime;&lt;br /&gt;
  a = 0;&lt;br /&gt;
  b = b_seeds[seed &amp;amp; 7];&lt;br /&gt;
  c = seed;&lt;br /&gt;
  a = Value();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
==== Version 4831 - 5849 ====&lt;br /&gt;
&lt;br /&gt;
The algorithm was switched to RC4-256-drop-2048.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;openssl/rc4.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RC4_KEY rc4key;&lt;br /&gt;
&lt;br /&gt;
void Fill(uint8_t* buffer, size_t length) {&lt;br /&gt;
  // We need a zero buffer as OpenSSL will want to XOR the keystream with data.&lt;br /&gt;
  // The XDVDFS random data is the keystream without changes, so we let XOR OpenSSL XOR with 0x00 bytes.&lt;br /&gt;
  uint8_t zero_buffer[length];&lt;br /&gt;
  memset(zero_buffer, 0x00, length);&lt;br /&gt;
  RC4(&amp;amp;rc4key, length, zero_buffer, buffer);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Seed() {&lt;br /&gt;
  union {&lt;br /&gt;
    uint8_t raw[16];&lt;br /&gt;
    struct {&lt;br /&gt;
      struct _FILETIME SystemTimeAsFileTime; // first 8 bytes, little-endian&lt;br /&gt;
      uint64_t tsc; // later 8 bytes, little-endian&lt;br /&gt;
    };&lt;br /&gt;
  } key;&lt;br /&gt;
&lt;br /&gt;
  // Initialize seed&lt;br /&gt;
  key.tsc = rdtsc();&lt;br /&gt;
  GetSystemTimeAsFileTime(&amp;amp;key.SystemTimeAsFileTime);&lt;br /&gt;
  RC4_set_key(&amp;amp;rc4key, 16, &amp;amp;key);&lt;br /&gt;
&lt;br /&gt;
  // Drop the first 2048 bytes of the RC4 keystream&lt;br /&gt;
  uint8_t discard_buffer[2048];&lt;br /&gt;
  Fill(discard_buffer, 2048);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The RNG is seeded when the mastering tool / wizard is started.&lt;br /&gt;
The first portion of the code to use this random number generator is the code which generates layer 0 and layer 1.&lt;br /&gt;
&lt;br /&gt;
=== Security blocks ===&lt;br /&gt;
&lt;br /&gt;
==== Version 4361 &amp;lt;!-- Game: Petit Copter --&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Treated like random block.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/OpenXDK/xbiso XBISO]&lt;br /&gt;
* [https://github.com/mborgerson/extract-xiso extract-xiso]&lt;/div&gt;</summary>
		<author><name>Qubits</name></author>	</entry>

	</feed>