Introduction

Avant d'entrer dans le vif du sujet, je vais préciser le contexte. ReactOS est projet de système d'exploitation encore peu connu à ce jour (en France, surtout), qui vise à fournir une compatibilité avec les applications et les pilotes, bref les binaires win32 de Windows, dans sa branche équipée du noyau NT (une compatibilité NT5.2 est l'objectif pour l'instant). Autant dire que le travail est difficile. Mais pas impossible non plus, grâce à l'importante quantité de documents qui traîne sur le fonctionnement de Windows. Et moi, que viens-je faire là-dedans ? C'est le sujet de ce billet :).

Traductions et ReactOS 0.3.1

Alors, j'ai commencé à m'intéresser au projet ReactOS en Septembre 2006 lorsqu'un utilisateur du forum de PhotoFiltre me l'a présenté. A l'époque, je ne pouvais faire grand chose, je programmais, certes, mais dans un langage de programmation peu connu et peu usité, le PureBasic. Mes connaissances en C, par exemple, étaient trop limitées. Néanmoins, j'ai rapidement trouvé de quoi m'occuper et m'investir dans cet OS ; il s'avérait que sa traduction française était très partielle et superficielle, et ce parce que seule une personne s'en occupait encore, et elle était, de plus, peu présente ! J'ai donc commencé à leur soumettre des patchs de traduction française via BugZilla, tout en traduisant, en parallèle, le site Internet. C'est ainsi que mon nom est apparu pour la première fois associé à ReactOS en Mars 2007, lorsqu'est sorti la version 0.3.1.

Des traductions à l'implémentation noyau simple

Puis, les développeurs se sont attaqués à la version 0.3.2, tandis que je tentais de parfaire mes connaissances en C afin de pouvoir travailler sur le système en lui-même, et pas que sur les traductions. J'ai donc pu voir mon premier patch avec modification du code source de ReactOS dans la révision SVN 26175, d'après le bug 2096, après que Hervé Poussineau m'ait aidé à le corriger. C'était un tout petit patch qui ne corrigeait que des warnings à la compilation, mais cela avait suffit à me motiver pour m'investir plus dans le développement de ReactOS, et non seulement dans la traduction. Puis enfin, est venu le "vrai" patch. Ce n'était plus une correction de warning, mais une correction de bug, dans cmd.exe. Il s'avérait que mkdir rencontrait un disfonctionnement dû à l'utilisation de chaînes de caractères en Unicode avec des fonctions ASCII. Toujours grâce à l'aide Hervé Poussineau (vraiment aimable à lui, et ce n'était que le début !), cela a produit le bug 2216 et la révision 26545. Et cela a continué de la sorte, avec notamment la réécriture partielle du "keyboard layout" français (révision 26298, cela a permit de pouvoir utiliser les accents sous ReactOS), et la localisation de la seconde phase de l'installation (révision 26582, en collaboration avec Sylvain Petreolle, un autre français ;)), jusqu'au jour où j'ai eu besoin d'une DLL sous ReactOS, à cause du PhotoFiltre Plugins Pack (pour tenter de le faire fonctionner). La DLL incriminée : Dbghelp.dll. Cette dernière, pour pourvoir être lancée avait besoin de la fonction strtoull, qui n'était malheureusement pas implémentée sous ReactOS. J'ai donc tenté une implémentation, en réutilisant le code d'Alex Ionescu afin de ne pas partir de rien. Le résultat fût convaincant, et produisit le bug 2314 et par la suite la révision 27344 (et la révision 27347, puisque le développeur ayant envoyé le patch, Magnus Olsen, avait oublié un fichier ! Ce sont des choses qui arrivent ;)). Mais la chose fût réellement fixée par Christoph von Wittich, qui réalisa l'export, chose que j'avais oublié dans l'euphorie, et qui permit à Dbghelp.dll de fonctionner sous ReactOS. C'était mon premier pour le noyau (au sens large) de ReactOS... Pendant ce temps, on apprenait que la version 0.3.2 de ReactOS allait être annulée, parce qu'il serait impossible de tenir le délai imposé de sortie de 2 mois. Qu'importe alors, rendez-vous dans deux mois pour la version 0.3.3 ! J'ai donc joyeusement continué mon travail, en améliorant la commande help de l'invite de commandes, cmd.exe (oui, c'était mon terrain de jeu favoris à l'époque). Et ce, pour la version 0.3.3 de ReactOS ! Version qui marqua donc un grand tournant pour moi, puisque je n'y étais plus "simplement" traducteur.

Dernier patch pour le tronc, mais pas des moindres

Une fois la version 0.3.3 sortie, je me suis attaqué, avec l'aide d'Hervé Poussineau (toujours lui, et ce n'est pas fini ;)), à un vilain bug, le bug 2569 dans BugZilla, dans msgina.dll, DLL entre autres responsable du lancement du gestionnaire de tâches lors de l'appui sur les combinaisons magiques Ctrl+Alt+Suppr, et Ctrl+Maj+Esc, et c'était justement là que ça coinçait. J'avais soumis un premier patch, qui constituait un "hackfix", plutôt qu'un "fix", le premier étant une façon de contourner, de masquer le problème (fortement déconseillé), et le deuxième une correction du problème. Hervé et moi-même avons réussi à trouver où coinçait la chose : dans la fonction WlxStartApplication. Mais comme toujours, il y a un monde entre trouver et corriger. Nous avons donc laissé la chose en plan, jusqu'à ce qu'un jour je me replonge dans le problème. C'était un soucis de token doublement utilisé pour le lancement. Je jetais un oeil à MSDN et trouvais la solution la plus simple : si le token est déjà utilisé, alors autant le dupliquer ! Et ce fût chose faite, ainsi, après vérification du patch, Hervé corrigeait le bug dans la révision 29845.

Bienvenue dans l'équipe de ReactOS !

On était donc là, à la rentrée scolaire 2007. "Malheureusement", suite à des changements scolaires importants, je ne suis plus disponible que le week-end (c'est pour ça que tout fonctionne au ralenti, sauf pendant les vacances ;)). Donc, pour pouvoir continuer de travailler sur ReactOS, je m'étais fixé deux objectifs : trouver une application sur laquelle je puisse travailler tout seul (pour éviter d'avoir à comprendre le travaille de la semaine dessus avant de pourvoir coder), et sur laquelle je puisse me faire les dents (je vous rappelle que j'étais arrivé dans le projet avec uniquement des bases en C). Je trouvais mon bonheur avec l'application de configuration du RosBE (ReactOS Build Environment). Je quittais, certes, un peu le développement direct de ReactOS, en développant sur un outil annexe, mais le jeu en valait la peine. Je rendais une belle application pour la version 1.0 du RosBE. Ce fût une période assez particulière ; je rentrais le week-end, et me lançais directement sur le développement, puis j'envoyais mes patchs à Daniel Reimer (gestionnaire du RosBE), qui les testait et les envoyait sur le serveur SVN. C'est alors qu'un jour de Novembre, le 4 pour être précis, un développeur de ReactOS, Peter Ward (travaillant aussi sur le RosBE) voyant mon travail, me demandant pourquoi je ne faisais pas la demande pour entrer dans l'équipe de ReactOS. Il s'avère que l'idée ne m'étais pas étrangère, j'en avais déjà parlé 2 semaines auparavant avec le coordinateur de ReactOS, Aleksey Bragin, qui m'avait dit qu'il s'était fait une opinion à mon sujet, et m'accepterait dans l'équipe dès que je le demanderai... Chose que je n'avais pas faite, à cause de mes occupations extérieures, et je voulais le temps d'y réflechir. C'est donc deux semaines plus tard, avec la motivation de Peter Ward, que je retournais parler à Aleksey Bragin, mais ce coup-ci pour lui demander mon intégration dans l'équipe de ReactOS. Ce fût chose faite, et rapidement, tellement que le soir, j'envoyais mon premier patch, la révision 30129, un grand moment !

Et ensuite ?

Terminant peu de temps après mon travail sur le RosBE, je me trouvais un peu désoeuvré. Il y avait bien les traductions, mais je n'avais tout de même pas eu le status de développeur juste pour effectuer des traductions. Hervé (ça fait longtemps, hein ?) me trouva un premier petit travail : corriger toutes les traductions françaises. Celles-ci présentaient quelques défauts de ponctuation. Cela me permit dans le même temps de les corriger, et de traduire d'autres éléments. Mais ce fût vite fini... Lors de ma correction, j'avais trouvé un petit patch à effectuer, je le fis donc, mais pas mieux. Je me mis donc en quête d'une ère de développement. Et je trouvais ! Le Downloader, application indispensable (ou pas...) de ReactOS qui permet de télécharger des applications et de les installer facilement. Cela ressemblait à mon travail sur le RosBE, donc je n'étais pas dépaysé. Je travaillais donc un peu dessus et implémentais deux trois nouvelles choses, jusqu'à ce que je me lasse. Le noyau de ReactOS me manquait (aucune dépendance, je vous rassure !). Néanmoins, je me voyais vraiment très mal développer sur le noyau de ReactOS. Je choisis "donc" de travailler sur une zone qui me plait particulièrement, qui est classé dans le noyau dans le changelog, tout simplement parce que c'est exécuté dans le Kernel Mode : les systèmes de fichiers. Et pas tous d'ailleurs, deux précisément : NTFS et ext2. NTFS étant partiellement disponible sous ReactOS via un pilote "stub" (qui contient des fonctions qui seront appellées normalement, mais qui ne contiennent aucun code), je décidais de m'attaquer à lui en premier. Mon premier patch fût alors une réécriture des entêtes NTFS, afin de débrousailler et d'y voir plus clair avec le BOOT_SECTOR des partitions NTFS (révision 31483) . Ce premier patch fût suivi de peu (enfin à une semaine près, comme toujours ;)) d'un autre patch (révision 31538) pour réorganiser les entêtes, toujours afin ce coup-ci de tenter d'améliorer l'algorithme de montage des partitions, actuellement un peu trop permissif. Cela n'aboutit à rien ; devant le nombre croissant de BSODs (Blue Screen Of Death, les écrans bleus, quoi !), je décidais de mettre en pause. Et au final, afin de repartir sur de bonnes bases, je décidais de réécrire complétement l'entrée du pilote afin d'avoir quelque chose de correct (moins sujet aux erreurs de chargement). Hervé Poussineau (je sentais qu'il vous avait manqué !) me donna quelques conseils pour cette partie, pour les prototypes de fonctions, et les appels aux fonctions de déboggage, tandis que je réécrivais le fichier ntfs.c. Cela donna la révision 31747. Maintenant, le driver NTFS a une fonction DriverEntry plus fonctionnelle, et basée sur le modèle de Rajeev Nagar. Et ce n'est que le début...

Et maintenant ? Vive le noyau !

Maintenant ? Nous voilà au présent, ReactOS 0.3.4, et je me penche sur ce que je fais, et même au futur, sur ce que je compte faire. Actuellement, le travail sur le pilote NTFS m'occupe toujours autant. Parallèmement, la branche CC du noyau de ReactOS est en cours de réécriture, ce qui me permettre, une fois celle-ci terminée, de faire interagir le pilote avec le gestionnaire de cache, afin d'obtenir un fonctionnement similaire au pilote de Windows. En même temps, toujours dans le registre des systèmes de fichiers, je tente de voir pour récupérer (avec l'autorisation de son auteur !) un pilote ext2 fonctionnant sous Windows pour le porter sous ReactOS, et le faire fonctionner de telle sorte que ReactOS puisse être installé sur une partition en ext2 (un des objectifs pour je ne sais quelle version...). Mes premiers essais ne furent pas un succès... Mais j'ai d'autres projets aussi, comme implémenter la possiblité de démarrer de la "dernière bonne configuration connue", chose qui doit être possible maintenant, la réécriture de la branche CM étant finie. Et j'aurai peut-être aussi quelques idées pour la partie IO du noyau (mais ça, c'est vraiment peu sûr). Voilà, voilà, j'ai de quoi m'occuper dans le futur !

Conclusion

C'est, enfin ou déjà (ça dépend du point de vue, of course !) la fin de ce billet, qui vous présente mon parcours dans ce système d'exploitation complètement nouveau et complétement commun à la fois (première tentative pour avoir un Windows-Like, et en même temps, ça reste du Windows... par définition !). Ce parcous ne présente rien d'extraordinaire comparé à de nombreux développeurs de ReactOS (à côté des quels je fais développeur du dimanche... Est-ce faux, en même temps ?!), mais en même temps, il constitue le pilier pour comprendre mon précédent travail et surtout mon futur travail.
J'espère que cela vous aidera à mieux comprendre ce système d'exploitation encore bien jeune, et à ne pas le juger aussi durement que ce que j'ai vu dans certains commentaires à la sortie de ReactOS 0.3.4. Grosso modo, à ceux-là, on ne vous demande pas d'adhérer à notre opinion, ni à nos désirs, on vous demande juste de nous respecter, ainsi que notre travail, qui représente un investissement certain.

Sur ce, rendez-vous pour la version 0.3.5, peut-être avec de l'ext2, qui sait !