Bonjour, Habr! Dans cette série, nous continuons à nous
lier d' amitié avec le pilote
WinBtrfs et ReactOS.
Est-ce votre Windows?Commençons dans l'ordre. Après la publication
précédente , un mini-pilote pour le chargeur de démarrage FreeLoader a été implémenté, ce qui permet de lire des fichiers de la section BTRFS en mode lecture seule. Le premier problème m'attendait ici - BTRFS est un système de fichiers sensible à la casse. Ici, pour rechercher la
structure inode (cette structure contient des informations de base sur le fichier), le hachage du nom de fichier est utilisé dans le répertoire, cela vous permet de parcourir les chemins sans extraire tous les fichiers contenus dans le répertoire.
Cependant, dans le monde Windows, une telle chose comme un registre de nom de fichier ne préoccupe personne, donc les chemins vers les pilotes requis pour charger le système d'exploitation peuvent être écrits dans le registre dans absolument n'importe quel registre.
À l'heure actuelle, ce problème est résolu par de bonnes vieilles
béquilles - lorsque vous demandez à rechercher un fichier, System32 et SYSTEM32 sont remplacés par system32, le même avec le dossier des pilotes. Jusqu'à présent, je réfléchis à la manière de le faire avec compétence. Très probablement, je téléchargerai une liste complète de fichiers dans un répertoire à chaque fois et ferai une recherche insensible à la casse - le chargeur de vitesse ne sera pas particulièrement visible sur le chargeur de démarrage.

Le chargeur lit les fichiers, les béquilles sont durcies - on continue.
J'ai développé le code du chargeur de démarrage dans une machine virtuelle Bochs, car c'est la chose la plus pratique à faire. Mais elle (comme il s'est avéré) a des problèmes pour lancer ReactOS, j'ai donc dû transférer vers la VirtualBox habituelle.
Et puis une autre embuscade m'attendait - pour une raison quelconque, le secteur de démarrage n'a pas fonctionné. Il s'est avéré que la mise en œuvre de l'interruption INT 13h AH = 42h (lecture étendue à partir du disque) pose certains problèmes, car cette fonction ne peut pas lire plus de 8 secteurs à la fois.
Et enfin, le premier message d'erreur (ce n'est même pas un BSOD!)

L'exception avec STATUS_ACCESS_VIOLATION provient du sous-système WinSxS, qui est principalement emprunté à Wine. Quelques jours ont dû être consacrés à la cause de l'événement, car toutes les bibliothèques sont chargées via WinSxS, et il y en a beaucoup au démarrage. À la fin, il s'est avéré que le problème n'était pas dans WinSxS (fuch), mais dans l'appel système NtQueryDirectoryFile.
WinSxS utilise souvent cette fonction pour rechercher des manifestes par masque (en faisant des requêtes comme: "* _Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0. *. * _ * _ *. Manifest"), et un bogue lié au traitement s'est glissé dans le pilote WinBtrfs masques commençant par un astérisque. Vous pouvez voir une demande d'extraction très simple
ici .
Étonnamment, cela a suffi pour terminer l'installation et démarrer sur le bureau
Peut-être le premier démarrage au monde à partir du pilote WinBtrfs. La première implémentation de mon correctif a également comporté des erreurs, ce qui a provoqué le déplacement des graphiques quelque part et le non chargement des images.En fait, le système démarre et fonctionne même (bien que la stabilité ne soit pas la même que dans la dernière
version 0.4.9 ).
Mais les problèmes sont toujours pleins:
- Aucun support de fichier d'échange. De manière générale, sur Linux, les fichiers d'échange sur les disques btrfs ne sont pas non plus pris en charge, et le correctif est suspendu depuis plusieurs années. Mais WinBtrfs les prend en charge. Nous avons une implémentation du gestionnaire de mémoire légèrement différente de celle de Windows, ce qui nécessite un autre appel système qui n'est pas encore disponible dans WinBtrfs.
- Erreurs d'écriture et débordement de mémoire. J'ai réussi à en corriger quelques-uns, par exemple, lors de l'installation du client Git. Nous allons voir où la mémoire s'écoule.
- BSOD à l'arrêt et au redémarrage. Le patch attend déjà l'approbation
Jusqu'à la fin, GSoC a été laissé un peu, prévoit de corriger davantage les bugs et de résoudre le problème avec le fichier d'échange (mais c'est après la fin du programme).
Eh bien, ceux qui souhaitent prendre en charge le développement de cette fonctionnalité peuvent participer au test et au développement du pilote
WinBtrfs .