Deplacement pour Lire la table BPB et FAT32

Résolu/Fermé
peachesncream Messages postés 15 Date d'inscription vendredi 4 mai 2018 Statut Membre Dernière intervention 4 juillet 2020 - Modifié le 1 juil. 2020 à 14:40
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 - 2 juil. 2020 à 10:33
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;

}
A voir également:

1 réponse

[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 088
Modifié le 1 juil. 2020 à 18:39
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
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 227
2 juil. 2020 à 09:36
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
.
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 088 > ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021
2 juil. 2020 à 10:33
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 :-)
0