Sur base de ce qui a été dit précédemment, on peut donc imaginer de "mapper un cIOS" avec une structure de données XML du style:
CODE
<?xml version="1.0" encoding="utf-8"?>
<ciosmaps ciosgroupscount="1">
<ciosgroup name="D2X v3" version="21003" basescount="1">
<base ios="37" version="5662" contentscount="22" modulescount="7">
<content id="0x1f" patchscount="3">
<patch offset="0x00" size="14" originalbytes="0x66,0x69,0x72,0x6D,0x77,0x61,0x72,0x65,0x2E,0x36,0x34,0x2E,0x31,0x30" newbytes="0x77,0x61,0x6E,0x69,0x6E,0x6B,0x6F,0x6B,0x6F,0x00,0x52,0x56,0x4C,0x2E" />
<patch offset="0x0F" size="9" originalbytes="0x33,0x31,0x36,0x31,0x31,0x30,0x32,0x00,0x00" newbytes="0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39" />
<patch offset="0x30" size="15" originalbytes="0x61,0x64,0x6D,0x69,0x6E,0x40,0x46,0x57,0x50,0x55,0x42,0x4C,0x49,0x53,0x48" newbytes="0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00" />
</content>
<content id="0x10" patchscount="2">
<patch offset="0x6E5" size="1" originalbytes="0x01" newbytes="0x00" />
<patch offset="0x775" size="1" originalbytes="0x01" newbytes="0x00" />
</content>
<content id="0x18" patchscount="0" />
<content id="0x20" patchscount="0" />
<content id="0x21" patchscount="0" />
<content id="0x5" patchscount="0" />
<content id="0x12" patchscount="0" />
<content id="0x13" patchscount="0" />
<content id="0x14" patchscount="0" />
<content id="0x9" patchscount="0" />
<content id="0xa" patchscount="0" />
<content id="0x1d" patchscount="0" />
<content id="0xc" patchscount="0" />
<content id="0x15" patchscount="0" />
<content id="0x22" patchscount="1">
<patch offset="0x26E54" size="4" originalbytes="0xFF,0xFF,0x5B,0x4E" newbytes="0x13,0x6D,0x00,0x11" />
</content>
<content id="0x23" patchscount="0" module="MLOAD21" tmdmoduleid="-1" />
<content id="0x24" patchscount="0" module="FAT21003" tmdmoduleid="-1" />
<content id="0x25" patchscount="0" module="SDHC21" tmdmoduleid="-1" />
<content id="0x26" patchscount="0" module="EHCI21003" tmdmoduleid="3" />
<content id="0x27" patchscount="0" module="DIPP21" tmdmoduleid="-1" />
<content id="0x28" patchscount="0" module="ES21" tmdmoduleid="-1" />
<content id="0x29" patchscount="0" module="FFSP21003" tmdmoduleid="-1" />
</base>
</ciosgroup>
</ciosmaps>
Cette manière d'encoder les cIOS va grandement faciliter la programmation de leur installateur à tous les points de vue (ajout ou mise à jour des cIOS, conception de l'interface graphique, ...) à condition de stocker leur carte dans une structure de données appropriée. Dans notre exemple, La structure de données XML fournit la carte du cIOS d2x v3 base 37 sachant que:
- l'attribut
version de la balise
ciosgroup correspond à la révision avec laquelle le cIOS est installé
- l'attribut
modulescount de la balise
base correspond aux nombres de modules/contenus supplémentaires à ajouter au cIOS
- l'attribut
id des différentes balises
content est déterminé à partir de la table de correspondance entre les modules/contenus officiels décryptés (téléchargeables avec NUS downloader) de la base du cIOS et les modules/contenus decryptés du cIOS dans sa version existante (récupérable par exemple avec modmii ou bluedump de manière à extraire son contenu avec ShowMiiWads). Pour les modules/contenus personnalisés, l'attribut
id du premier module/contenu ajouté est (l'id le plus grand parmi les contenus/modules officiels de la base+1). Voici par exemple la table de correspondance (pouvant s'obtenir la plupart du temps par simple comparaison des tailles de fichier) du cIOS d2X v3 base 37.
CODE
IOS37 v5662 cIOS d2x v3 base 37
0000001f.app 00000000.app
00000010.app 00000001.app
00000018.app 00000002.app
00000020.app 00000003.app
00000021.app 00000004.app
00000005.app 00000005.app
00000012.app 00000006.app
00000013.app 00000007.app
00000014.app 00000008.app
00000009.app 00000009.app
0000000a.app 0000000a.app
0000001d.app 0000000b.app
0000000c.app 0000000c.app
00000015.app 0000000d.app
00000022.app 0000000e.app
Les balises content d'un cIOS donné doivent respecter un ordre bien précis. La première balise content donne les informations liées au contenu/module 00000000.app du cIOS, la deuxième celles liées au contenu/module 00000001.app du cIOS et ainsi de suite
- la présence d'un attribut
patchscount différents de 0 dans une balise
content indique le nombre de patch(s) à appliquer sur le module/contenu officiel décrypté concerné. La détection des modules/contenus officiels à modifier et les patchs à leur appliquer peuvent être obtenus avec la commande DOS suivante
CODE
fc /B <module/contenu officiel décrypté de la base du cIOS> <module/contenu du cIOS décrypté correspondant>
Dans le cas du cIOS d2x v3 base 37, les commandes à effectuer sont:
CODE
fc /B ..../0000001f.app ..../00000000.app
fc /B ..../00000010.app ..../00000001.app
fc /B ..../00000018.app ..../00000002.app
fc /B ..../00000020.app ..../00000003.app
fc /B ..../00000021.app ..../00000004.app
fc /B ..../00000005.app ..../00000005.app
fc /B ..../00000012.app ..../00000006.app
fc /B ..../00000013.app ..../00000007.app
fc /B ..../00000014.app ..../00000008.app
fc /B ..../00000009.app ..../00000009.app
fc /B ..../0000000a.app ..../0000000a.app
fc /B ..../0000001d.app ..../0000000b.app
fc /B ..../0000000c.app ..../0000000c.app
fc /B ..../00000015.app ..../0000000d.app
fc /B ..../00000022.app ..../0000000e.app
La construction des différentes balises patch devient alors relativement aisée.
- les modules/contenus à ajouter au cIOS font l'objet des dernières balises
content dans la carte du cIOS. La valeur des attributs
module dépend de l'ordre (connu et fourni par les sources de modmii par exemple) dans lequel ils sont ajoutés et de la manière avec laquelle le code source de l'installateur les prend en charge. La raison d'être de l'attribut
tmdmoduleid réside dans le fait qu'il est parfois nécessaire de repositionner (pour certaines raisons techniques) un module/contenu personnalisé dans le tmd. Dans l'exemple qui nous occupe, le module/contenu EHCI du cIOS d2x v3 est repositionné en 4ème position dans le tmd.
Pour le reste, les autres attributs sont relativement évocateurs.
La structure XML utilisée pour mapper un cIOS permet plus généralement d'encoder la carte d'un title qu'il s'agisse d'une chaîne, d'un menu système, d'un IOS (patché ou officiel), ...