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

PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007 - 17 mars 2006 à 15:07
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007 - 21 mars 2006 à 23:12
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

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

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007
17 mars 2006 à 16:59
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?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 mars 2006 à 17:24
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++
0
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007
17 mars 2006 à 18:19
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 mars 2006 à 18:34
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++
0
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007
21 mars 2006 à 23:04
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!
0
PavICF Messages postés 17 Date d'inscription dimanche 8 août 2004 Statut Membre Dernière intervention 14 avril 2007
21 mars 2006 à 23:12
Bon, finalement la lecture de la MFT marche avec "////.//C:", autant pour moi......
0
Rejoignez-nous