CONSTRUCTION D'UN CIOS EXISTANT
I) PREAMBULE
Cette article a pour objectif de vous démontrer que la construction d'un cIOS est très facile à implémenter à partir du moment où l'on dispose de son fichier wad. On n'abordera pas ici l'aspect programmation en détail de manière à se focaliser sur le principe en essayant d'imaginer une méthode empirique permettant la prise en charge de n'importe quel cIOS.
II) INTRODUCTION
Un cIOS n'est rien d'autre qu'un IOS officiel (= base du cIOS) munis de fonctionnalités supplémentaires obtenues en patchant certains modules/contenus de sa base et en lui ajoutant des modules/contenus personnalisés supplémentaires. Evidemment, une modification au niveau des modules/contenus et du slot d'un IOS implique une adapation de ses métadonnées (fichier tmd) et de son ticket au niveau de l'ID du "title".
- ID du "title" pour installer le cIOS dans un slot donné
- Version du "title" pour installer le cIOS avec une révision donnée
- Nombre de contenus vu que l'on ajoute des nouveaux modules/contenus lors de la construction du cIOS
- Contenus en ajoutant une nouvelle entrée dans la liste pour chaque module/contenu ajouté (calul de leurs métadonnées ID, index, type, taille et SHA1 hash) et en modifiant certaines métadonnées des modules/contenus existant modifiés (recalcul du SHA1 hash et fixation du type pour rendre le module/contenu modifié non partagé).
Les fichier tmd et ticket sont nommés tmd.y[yyyy] et cetk sous leur forme cryptée mais 00000001000000xx.tmd et 00000001000000xx.tik sous leur forme décryptée avec y[yyyy] correspondant à la version de l'IOS alors que xx correspond à son slot en notation hexadécimale
Dans le cadre d'un cIOS, les métadonnées susceptibles d'être modifiées sont principalement:- ID du "title" pour installer le cIOS dans un slot donné
- Version du "title" pour installer le cIOS avec une révision donnée
- Nombre de contenus vu que l'on ajoute des nouveaux modules/contenus lors de la construction du cIOS
- Contenus en ajoutant une nouvelle entrée dans la liste pour chaque module/contenu ajouté (calul de leurs métadonnées ID, index, type, taille et SHA1 hash) et en modifiant certaines métadonnées des modules/contenus existant modifiés (recalcul du SHA1 hash et fixation du type pour rendre le module/contenu modifié non partagé).
III) MAPPAGE DES CIOS
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:
????
????????
????????????
????????????????
????????????????
????????????????
????????????
????????????
????????????????
????????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????
????
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.
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.
CODE
????
????????
????????????
????????????????
????????????????
????????????????
????????????
????????????
????????????????
????????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????????
????????
????
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
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
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
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), ...
IV) LES CARTES DES CIOS, LE PATCHAGE ET l'AJOUT D'UN CONTENU/MODULE DANS D2X CIOS INSTALLER
La lecture des données XML dans d2x cIOS installer a été implémentée en utilisant la "version wii" de la librairie mxml. Dans le code source:
- la fonction getCiosMaps permet de lire les cartes des cIOS tout en vérifiant leur cohérence afin de les stocker dans une structure de données
- la fonction patchBytesData permet de patcher un contenu/module décrypté à condition que les bytes concernés présentent les valeurs attendues
- la fonction addModule permet d'ajouter un contenu/module dans un tmd en le repositionnant si nécessaire
- la fonction getCiosModule s'occupe de réferencer les modules/contenus personnalisés des cIOS pris en charge par l'installateur. Il s'agit de la fonction qui détermine les valeurs possibles des attributs module présents dans les cartes des cIOS.
- la fonction getCiosMaps permet de lire les cartes des cIOS tout en vérifiant leur cohérence afin de les stocker dans une structure de données
- la fonction patchBytesData permet de patcher un contenu/module décrypté à condition que les bytes concernés présentent les valeurs attendues
- la fonction addModule permet d'ajouter un contenu/module dans un tmd en le repositionnant si nécessaire
- la fonction getCiosModule s'occupe de réferencer les modules/contenus personnalisés des cIOS pris en charge par l'installateur. Il s'agit de la fonction qui détermine les valeurs possibles des attributs module présents dans les cartes des cIOS.
V) REMARQUES
Gardez à l'esprit qu'il ne faut pas nécessairement une Wii pour participer à un projet de développement Wii. Dans le cadre des IOS/cIOS par exemple, le développement et le test de fonctionnalités avancées les concernant peut se faire sur PC en partant, pourquoi pas, directement de leur forme décryptée
