Deplacement pour Lire la table BPB et FAT32
Résolu
peachesncream
Messages postés
16
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
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 ...
à 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
-
Salut peachesncream,
Dans la mesure où tu connais le format des données binaires que tu lis et leur type, tu peux créer unestruct
qui réplique ce format et lire le bloc de données avecfread
dans une variable de ce typestruct
. Tu pourras ensuite accéder aux données contenues dans les champs de la variablestruct
.
Ou alors, par exemple, si tu n'es intéressé que par unuint16_t
dont tu connais la déplacement par rapport au début, tu fais unfseek
jusqu'à l'emplacement concerné et tu lis tonuint16_t
présent à cet endroit avecfscanf
.
Les spécificateurs de format pourscanf
etprintf
pour un typeuint16_t
sont définis dans l'entête standard<inttypes.h>
.
https://en.cppreference.com/w/c/types/integer
Dal