Pb de lecture lors d'un accès physique au disque dur

Signaler
Messages postés
17
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
14 avril 2007
-
Messages postés
17
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
14 avril 2007
-
Bonjour,

Voici mon problème, assez bizare je dois dire:

Lorsque j'ouvre le disque dur avec CreateFile afin d'obtenir un handle pour la lecture, et que je lis le premier secteur du disque (MBR), le comportement de l'API windows est très différent selon le cas:

J'obtiens le handle avec la commande:

hdisk = CreateFile ( drive ,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
NULL,
NULL);

Si drive = "\\\\.\\C:", tout se passe bien, ReadFile retourne bien les 512 premiers octets du secteur

Par contre, si drive = "\\\\.\\PHYSICALDRIVE0", ReadFile commence à lire à partir du 85ème octet du secteur !

Franchement, je n'y comprends rien là, est-ce que quelqu'un a une idée sur la raison d'un tel fonctionnement, ou une solution à proposer pour le cas où drive = = "\\\\.\\PHYSICALDRIVE0" ?

Je vous remercie d'avance pour vos réponses et vous souhaite à tous une bonne journée!

7 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
La syntaxe [file://./PHYSICALDRIVExxx \\.\PHYSICALDRIVExxx] est pour avoir un handle à passer à DeviceIoControl().

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
17
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
14 avril 2007

Merci beaucoup pour ta réponse, ça explique pas mal de choses.

Mais ça me paraît tout de même bizare car dans la documentation msdn il est écrit qu'il faut tout de même utiliser CreateFile et ReadFile dans les deux cas, alors est-ce que DeviceIOControl servirait à indiquer à partir de quel offset du secteur la lecture devrait débuter, et ayant oublié d'appeler cette fonction, j'obitendrais une lecture aléatoire?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tu peux t'en servir avec CreateFile mais tu devrais utiliser DeviceIoControl en ce cas, va voir la doc de cette fonction sur MSDN pour avoir les codes de lecture. Gaffe que c'est plus délicat qu'avec ReadFile, voir exemple dans mes sources au besoin.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
17
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
14 avril 2007

Je viens d'éplucher (à nouveau) la doc de MSDN sur DeviceIOControl, et j'ai trouvé une tonne de fonctions pour la gestion des disques, comme obtenir les infos sur une partition, le MBR...... mais je ne voie toujours pas quel flag il faut utiliser pour lire directement le numéro de secteur qu'on veut. J'ai vu qu'il y avait des flags pour envoyer des données asynchrones sur un périphérique, mais est-ce que ça s'applique pour le disque dur?

J'ai aussi regardé les sources (impressionnant d'ailleurs) que tu as posté sur le site, et je n'ai pas non plus trouvé de lecture directe d'un secteur du disque avec DeviceIOControl.

Peut-être ai-je mal compris le principe, de cette API.

Voulais-tu parler d'un appel à cette fonction pour obtenir la possibilité d'utiliser le driver qui gère le disque dur, comme on le ferait dans le cas de versions ultérieures à Win2k?

Encore une question, quelle technique me conseillerais-tu d'utiliser pour que le logiciel, une fois fini, puisse être utilisé avec tous types de comptes, pas seulement avec un compte administrateur? (parce qu'il me semble qu'avec CreateFile, l'accès direct au disque dur n'est autorisé que pour un compte administrateur)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Dans tous les cas l'accès direct aux disques est à réserver au compte admin.
DeviceIoControl provoque un appel direct au driver. Les versions winbebe (avant win2K) n'ont plus à être prises en charge.
Regarde bien la doc et fais des tests, tant que tu n'envoies pas de commane d'écriture tu ne risques rien.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
17
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
14 avril 2007

Merci pour ces réponses,

Je me suis aussi pas mal renseigné sur le net à ce sujet (ce qui explique ma longue absence du sujet), et voici ce qui en résulte:

- apparament, lorsqu'on ouvre le handle avec CreateFile ("////.//PHYSICALDISK0".......), on ne peut obtenir que des informations sur la structure du disque ou ses fonctionnalités avec DeviceIOControl

- D'après mes tests, ouvrir le disque avec le paramètre "////.//C:" ne permet pas de lire certains secteurs du disque comme par exemple la MFT sur les disques en NTFS

- Pour avoir un accès complet au disque, il faut soit passer par une dll 16bits qui permet encore les appels directs aux routines du BIOS, soit écrire un driver virtuel que l'on appel pour y accéder.

dites moi si je me trompe.....

à bientôt et bonne soirée!
Messages postés
17
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
14 avril 2007

Bon, finalement la lecture de la MFT marche avec "////.//C:", autant pour moi......