2010-02-28 15 views
2

J'ai laissé tomber mon ordinateur portable pendant que Windows se préparait à l'hibernation et, par conséquent, j'ai eu un accident de la tête sur le disque dur. (Enseigne-moi à obtenir un disque dur et/ou un ordinateur portable avec un capteur de chute libre la prochaine fois.) Quoi qu'il en soit, exécuter SpinRite pour essayer de récupérer les données a entraîné tous les secteurs de rechange sur le disque pour tous être utilisés pour tous secteurs récupérables jusqu'à présent. SpinRite est toujours en cours, mais comme il n'y aura plus de secteurs de rechange à utiliser, je pense que ce sera un exercice stérile, sauf pour me dire où se trouvent tous les mauvais secteurs.Comment lire des secteurs/clusters individuels en utilisant DeviceIoControl() dans Windows?

De toute façon, je prévois d'écrire une application pour essayer de récupérer des données à partir du disque dur. De mon passé dans la défragmentation, je sais que je peux utiliser FSCTL_GET_RETRIEVAL_POINTERS pour comprendre les numéros de grappe logique pour un fichier donné.

Comment puis-je essayer de lire les secteurs de ce cluster? Mon exploration de la liste de MSDN pour les codes de contrôle de disque, de fichier et de volume n'a rien trouvé qui me saute aux yeux quand je vois les données du cluster. Est-ce que je ne devrais même pas me donner la peine d'essayer de lire à ce bas niveau? Dois-je plutôt faire les appels SetFilePointer() et ReadFile() pour obtenir les décalages de taille de cluster appropriés dans le fichier et lire les morceaux de la taille d'un cluster?

Si le fichier que j'essaie de lire a un mauvais secteur, NTFS marquera-t-il tout le fichier comme étant mauvais et m'empêchera-t-il d'accéder au fichier dans le futur? Si oui, comment puis-je dire à NTFS de ne pas marquer le fichier comme mauvais ou mort? (Rappelez-vous que le HD est maintenant hors des secteurs de rechange à remapper.)

Dois-je dépoussiérer mes connaissances * nix et comprendre comment lire depuis/dev /?

Mise à jour: J'ai trouvé la réponse à ma propre question. :-) La solution fait SetFilePointer() et ReadFile() sur le handle de volume plutôt que sur le handle de fichier.

Répondre

2

J'ai trouvé la réponse à ma propre question. :-) La solution fait SetFilePointer() et ReadFile() sur le handle de volume plutôt que sur le handle de fichier.

+0

Est-ce que 'SetFilePointer' fonctionne vraiment sur le gestionnaire de volume? Je ne savais pas que ... – Mehrdad

+0

pouvez-vous partager le code? il y a quelques maths que je fais mal .. – lalli

+0

Pourquoi avez-vous dû accéder à la poignée de volume et pas aux poignées de fichier? –