Section courante

A propos

Section administrative du site

Structures DOS non documentées

Le DOS gère les supports d'entreposage d'exploitation (mémoire vive et entreposage de masse) et les programmes utilisant plusieurs structures de données. Les structures documentées comprennent :

En outre, il existe un certain nombre de structures sans papiers. Jusqu'à tout récemment, seules quelques personnes connaissaient l'existence de ces structures, puisque la plupart des manuels techniques concernant DOS ne les décrivaient pas. Les auteurs de plusieurs de ces manuels techniques ont estimé que ces structures n'étaient pas nécessaires pour la programmation et que leur codage changerait dans les futures versions de DOS. Le fait est que certains types de programmation dépendent de ces structures et que certaines applications ne pourraient pas être réalisées du tout sans elles.

Les utilitaires de gestion des disquettes et des disques durs utilisent intensivement les structures non documentées. Si vous examinez Norton Utilities à l'aide d'une application de débogage, vous verrez à quel point ce programme accède à ces structures. Un changement mineur dans ces structures a eu lieu entre la version 3.3 de DOS et la version 4.0, mais c'est le premier changement depuis l'introduction de la version 2.0 du DOS en 1983. Par conséquent, les chances sont presque nulles de trouver un codage modifié dans les structures non documentées des versions DOS suivants.

La connaissance de ces structures peut être une donnée pratique pour programmer certaines applications. Le bloc d'informations DOS (DIB) est la clef pour accéder aux structures DOS les plus importantes. Ce bloc contient des pointeurs vers plusieurs structures DOS ainsi que vers d'autres informations. La connaissance de son existence et de sa construction n'est utile à un programme que si son adresse en mémoire est connue. Cette adresse n'est pas dans un emplacement de mémoire fixe et ne peut être obtenue avec aucune des fonctions documentées de l'interruption 21h du DOS. Cependant, la fonction non documentée 52h peut nous aider à trouver cette adresse. La fonction d'appel 52h renvoie l'adresse du bloc d'informations DOS à la paire de registres ES:BX.

Contrairement à toutes les autres fonctions DOS récupérant des pointeurs vers une structure ou une zone de données, le contenu de la paire de registres ES:BX ne pointe pas vers le premier, mais plutôt au deuxième champ dans le DIB après l'appel de fonction.

Voici la structure du bloc d'informations DOS (DIB) :

Adresse Contenus Type
-04h Pointeur vers MCB 1 PTR
ES:BX Pointeur vers le premier bloc de paramètres d'entraînement (DPB) 1 PTR
+04h Pointeur vers le dernier tampon DOS 1 PTR
+08h Pointeur vers le pilote d'horloge ($CLOCK) 1 PTR
+0Ch Pointeur vers le pilote de la console (CON) 1 PTR
+10h Longueur de secteur maximale (basée sur tous les périphériques d'entreposage de masse connectés) 1 mot
+12h Pointeur vers le premier tampon DOS 1 PTR
+16h Pointeur vers la table des chemins 1 PTR
+1Ah Pointeur vers la table des fichiers système (SFT) 1 PTR
Longueur : 1EH (30) octets

Le premier champ de la DIB contient un pointeur vers le bloc de contrôle de mémoire (MCB) de la première zone de mémoire allouée. Le pointeur dans le deuxième champ de la DIB donne accès à une mine d'informations ne pouvant pas être obtenues autrement. Il pointe vers le premier DPB (Drive Parameter Block), une structure que DOS établit pour tous les périphériques d'entreposage de masse (disquettes, disques durs, lecteurs de bande,...).

Voici la structure du bloc de paramètres d'unité de disque (DPB) :

Adresse Contenus Type
+00h Numéro ou symbole de l'unité de disque correspondant (0 = A, 1 = B,...) 1 octet
+01h Sous-unité du pilote de périphérique pour l'unité de disque 1 octet
+02h Octets par secteur 1 mot
+04h Facteur d'entrelacement 1 octet
+05h Secteurs par unité d'allocation 1 octet
+06h Secteurs réservés (pour le secteur de démarrage) 1 mot
+08h Nombre de tables d'allocation de fichiers (FAT) 1 octet
+09h Nombre d'entrées dans le répertoire racine 1 mot
+0Bh Premier secteur occupé 1 mot
+0Dh Dernier unité d'allocation occupé 1 mot
+0Fh Secteurs par FAT 1 octet
+10h Premier secteur de données 1 mot
+12h Pointeur vers l'entête (pilote de périphérique correspondant) 1 PTR
+16h Descripteur de média 1 octet
+17h Drapeau utilisé (0FFh=périphérique pas encore utilisé) 1 octet
+18h Pointeur vers le DPB suivant (xxxx:FFFF = dernier DPB) 1 PTR
Longueur : 1CH (28) octets

Le premier champ du DPB nous indique à quel périphérique appartient le bloc. 0 correspond au unité de disque A, 1 à B, 2 à C,... Le deuxième champ indique le numéro de la sous-unité. Pour comprendre la signification de ce champ, n'oubliez pas que l'accès aux périphériques individuels s'effectue via le pilote de périphérique. Le DOS n'effectue pas d'accès direct à un unité de disque ou à un disque dur. Cela évite à DOS d'avoir à gérer les caractéristiques physiques d'un périphérique d'entreposage de masse. Au lieu de cela, le DOS appelle un pilote de périphérique à cette fin, agissant comme médiateur entre DOS et le matériel.

Bien entendu, tous les périphériques ne disposent pas d'un pilote de périphérique distinct, car un pilote de périphérique peut prendre en charge plusieurs périphériques uniques. Par exemple, le pilote de périphérique intégré au DOS gère les lecteurs de disquettes et le premier disque dur disponible. Le DOS configure un DPB pour chaque périphérique, de sorte qu'un système de disque dur aurait automatiquement 3 DPB disponibles (un DPB est toujours configuré pour l'unité de disquette B, même si un seul unité de disquette est réellement disponible). Chaque périphérique reçoit un nombre compris entre 0 et le nombre total de périphériques moins 1, pour aider chaque pilote à identifier les périphériques qu'il gère. Ce numéro est celui se trouvant dans le champ sous-unité.

Le champ suivant répertorie le nombre d'octets par secteur. Sous DOS, c'est presque toujours 512. Vient ensuite le facteur d'entrelacement, donnant le nombre de secteurs logiques déplacés par des secteurs physiques lorsque le support est formaté. Cette valeur peut être 1 pour les lecteurs de disquette, 6 pour le disque dur XT et 3 pour le disque dur AT. Pour les unités de disquettes, ce champ peut également avoir la valeur FEh si aucun accès n'a été tenté sur la disquette de l'unité de disquette. La valeur FEh signifie que le facteur d'entrelacement est actuellement inconnu.

Il existe un certain nombre d'autres domaines liés à ces deux domaines qui ont déjà été nommés en relation avec la gestion des périphériques d'entreposage de masse via DOS. Ils décrivent entre autres l'état et la taille des structures créées par DOS pour gérer les périphériques d'entreposage de masse. Un pointeur vers l'entête du pilote de périphérique se trouve dans ces champs. Le DOS utilise ce pointeur lors de l'accès au périphérique. Plus d'informations peuvent être obtenues avec ce pointeur puisque, par exemple, l'attribut du pilote est répertorié dans l'entête du pilote de périphérique.

A la suite de ce champ se trouve le descripteur de support auquel le fanion Utilisé est connecté. Tant qu'aucun accès au périphérique n'a eu lieu, ce drapeau contient la valeur 0FFh. Après le premier accès, il passe à 0 et reste inchangé jusqu'à une réinitialisation du système.

Le DPB se termine par un pointeur établissant la communication avec le prochain DPB. Étant donné que chaque DPB définit sa fin avec un tel pointeur, une sorte de chaîne est créée, à travers laquelle tous les DPB peuvent être atteints. Pour signaler la fin de la chaîne, l'adresse de déplacement de ce pointeur dans le dernier DPB contient la valeur 0FFFFh. Lorsqu'un programme a besoin d'informations dans le DOS, il existe de nombreuses façons de trouver l'adresse du DPB souhaité. Une méthode consiste à suivre la chaîne décrite ci-dessus en trouvant d'abord l'adresse de la DIB. Cela vous donne le pointeur vers le premier DPB, à partir duquel vous pouvez suivre la chaîne jusqu'à ce que vous atteigniez le DPB que vous voulez.

Il existe un meilleur moyen, qui n'est pas aussi sensible aux changements au sein de la DIB, grâce à deux fonctions DOS non documentées. Cela implique les fonctions 1Fh et 32h, faisant partie du répertoire de fonctions DOS depuis la version 2.0, bien que non documentées par Microsoft. Lorsqu'ils sont appelés, les deux renvoient un pointeur vers un DPB vers la paire de registres DS:BX. Alors que la fonction 1Fh délivre toujours un pointeur vers le DPB de l'unité de disque courant, l'adresse délivrée par la fonction 32h fait référence au périphérique dont le numéro est passé à la fonction dans le registre DL au moment de son appel. (0 représente l'unité de disque actuel, 1 l'unité de disque A, 2 l'unité de disque B,...). C'est beaucoup plus flexible que la fonction 1Fh.

L'accès aux différents DPB avec les fonctions 1Fh et 32h offre un autre avantage, car il oblige le DOS à récupérer d'autres informations telles que le facteur d'entrelacement et l'octet du descripteur de média, n'étant vérifié pour l'unité de disque qu'après le premier accès. Si vous accédez au DPB via le pointeur dans le bloc DIB, les différents champs peuvent ne pas avoir été initialisés et contenir des valeurs erronées.

Outre le pointeur vers le premier DPB, le DIB contient le pointeur vers le premier tampon DOS à l'adresse 12h. Ces tampons DOS entreposent des secteurs individuels, de sorte que les secteurs n'ont pas à être chargés à plusieurs reprises à partir du disque. Les tampons DOS peuvent être plus efficaces lorsqu'ils sont utilisés pour entreposer des secteurs de disque fréquemment nécessaires au programme en cours d'exécution. Outre le FAT, ceux-ci incluent le répertoire racine et ses sous-répertoires. Le nombre de tampons peut être défini par l'utilisateur dans le fichier CONFIG.SYS. Si ce nombre dépasse ceux nécessaires pour la FAT, le répertoire racine et les sous-répertoires, les secteurs normaux peuvent également être temporairement entreposés ici, dans l'espoir qu'ils soient appelés à être rechargés dans un proche avenir, et qu'ils puissent être extraits directement du tampon.

Afin que DOS puisse vérifier rapidement chaque tampon pour le secteur souhaité à chaque opération de lecture, les secteurs individuels sont liés entre eux.

Voici la structure du tampon DOS :

Adresse Contenus Type
+00h Pointeur vers le tampon DOS suivant 1 PTR
+04h Numéro de l'unité de disque (0 = A, 1 = B,...) 1 octet
+05h Drapeaux 1 octet
+06h Numéro de secteur 1 mot
+08h Réservé 2 octets
+0Ah Contenu du secteur tamponné 512 octets
Longueur : 210h (528) octets

Comme avec les DPB, cela se produit à l'aide d'un pointeur apparaissant au début de chaque tampon. De plus, le dernier tampon est atteint lorsque l'adresse de déplacement du pointeur contient la valeur 0FFFFh. Après le champ reliant un tampon au suivant vient le numéro de l'unité de disque d'où provient le tampon de secteur. La valeur serait 0 pour l'unité de disque A, 1 pour B, 2 pour C,... Outre le numéro de l'unité de disque, l'identification d'un secteur nécessite un numéro de secteur. Il est situé à partir de la position 06H dans le tampon DOS. Le dernier champ de l'entête du tampon entrepose un pointeur vers le DPB correspondant, de sorte que DOS puisse obtenir des informations sur le périphérique ayant chargé le tampon de secteur. Bien qu'il s'agisse du dernier champ de l'entête du tampon DOS, le secteur mis en mémoire tampon ne se termine pas immédiatement après ce champ. Il y a deux autres octets le suivant. La raison en est que le code DOS est écrit en langage machine, et lorsqu'il s'agit de travailler avec des blocs de mémoire, il est plus efficace que le tampon de secteur commence par une adresse divisible par 16.

L'entête du tampon DOS n'est pas le dernier endroit où nous parcourons le DPB. Il réapparaît dans la table des chemins, commençant à l'adresse 16h dans la DIB. Celui-ci contient le chemin actuel pour chaque unité de disque ainsi qu'un pointeur vers son DPB.

Tant que la commande LASTDRIVE est dans le fichier de configuration du système, la table contiendra des entrées pour les unités de disque A à celui spécifié par LASTDRIVE. Si cette commande est manquante, cependant, le tableau n'aura que des entrées pour chaque périphérique pris en charge par le pilote de périphérique installé. Si vous modifiez les entrées de ce tableau, vous pouvez détourner un unité de disque vers un autre. Les commandes JOIN et SUBST du DOS en profitent également en manipulant l'entrée de la table des chemins de l'unité de disque à détourner.



Dernière mise à jour : Lundi, le 23 janvier 2023