Deplacement pour Lire la table BPB et FAT32 [Résolu]

Signaler
Messages postés
15
Date d'inscription
vendredi 4 mai 2018
Statut
Membre
Dernière intervention
4 juillet 2020
-
Messages postés
5436
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 novembre 2020
-
Bonjour,
à l’intérieur d'une partition je veux lire les différentes tables afin d'extraire les informations qui me permettent de calculer les différentes adresses, par exemple je dois accéder et lire le BIOS parameters Bock BPB pour récupérer le nombre de secteur dans la région réservée, le nombre de FAT. J'ai trouvé quelques difficultés, pour lire cette table je dois me positionner dans le fichier et donc j'utilise fseek mais j'ai pas su comment écrire le déplacement.
Est-ce que en faisant fopen("/dev/sda1","rb"); je ne calcule pas le deplacement à partir du MBR?
quand je fait fseek(F,512,SEEK_SET); le 512 c'est par rapport à la taille du BOOT seulement?
Et aussi comme tout est en octet donc comment est-ce que je peux lire des valeurs en octet ? voici ma partie du code, l'execution de cette partie m'affiche des resultats qui ne sont pas correctes, par exemple lorsque j'affiche buffer[16] cela me donne 222 alors que nomralement ça doit être 2
Pour le code je suis obligé d'utiliser fopen et fseek ...
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char * argv[])
{
int nb_secteurRR =0; //number of sectors in the saved region
unsigned char buffer[512];
FILE* F = NULL;
int i,s;
F = fopen("/dev/sda1", "rb");
s = fseek(F, 512*2, SEEK_SET);
i = fread(buffer, 512,1,F);
int nb_secteurRR = buffer[14]; // here i wante to get the number of sectors in the saved region in the BPB table it's on offset 14 but i need to read 2 bytes not only one its size is 2.
printf("The value of nb_secteur is %d\n",nb_secteurRR);
return 0;

}

1 réponse

Messages postés
5436
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 novembre 2020
914
Salut peachesncream,

Dans la mesure où tu connais le format des données binaires que tu lis et leur type, tu peux créer une
struct
qui réplique ce format et lire le bloc de données avec
fread
dans une variable de ce type
struct
. Tu pourras ensuite accéder aux données contenues dans les champs de la variable
struct
.

Ou alors, par exemple, si tu n'es intéressé que par un
uint16_t
dont tu connais la déplacement par rapport au début, tu fais un
fseek
jusqu'à l'emplacement concerné et tu lis ton
uint16_t
présent à cet endroit avec
fscanf
.

Les spécificateurs de format pour
scanf
et
printf
pour un type
uint16_t
sont définis dans l'entête standard
<inttypes.h>
.

https://en.cppreference.com/w/c/types/integer

Dal
Messages postés
4761
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
23 octobre 2020
1 137
et tu lis ton
uint16_t
présent à cet endroit avec
fscanf
.
Non non non non non,
fscanf
c'est pour la lecture de données depuis des fichiers texte ! Dans son cas il ne faut utiliser que
fread
.
Messages postés
5436
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
23 novembre 2020
914 >
Messages postés
4761
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
23 octobre 2020

Salut ElementW,

Bien que le standard ne le dise pas explicitement, je pense que tu as raison, vu que
fscanf
fonctionne exactement de la même façon que
scanf
avec
stdin
. D'ailleurs les exemples présents dans le standard pour
fscanf
utilisent
stdin
en premier argument.

Merci de ton intervention :-)