2010-02-28 2 views
2

Windows가 최대 절전 모드를 준비하는 동안 내 노트북을 떨어 뜨 렸습니다. 결과적으로 하드 드라이브에 헤드 크래시가 발생했습니다. (다음 번에 자유 낙하 센서가있는 하드 드라이브 및/또는 노트북을 갖도록 가르쳐줍니다.) 어쨌든 SpinRite를 실행하여 데이터를 복구하려고 시도하면 디스크의 모든 예비 섹터가 모두 모든 디스크에 사용됩니다. 지금까지 복구 할 수있는 부문. SpinRite는 지금 당장 가고 있지만 더 이상 예비 섹터가 사용되지 않을 것이므로 모든 불량 섹터가 어디 있는지 말해주는 것 외에는 효과가 없을 것입니다.Windows에서 DeviceIoControl()을 사용하여 개별 섹터/클러스터를 읽는 방법?

어쨌든 하드 드라이브의 데이터를 복구하려고하는 응용 프로그램을 작성할 계획입니다. 과거의 forgress에서 defragging에 이르기까지 FSCTL_GET_RETRIEVAL_POINTERS를 사용하여 주어진 파일의 논리적 클러스터 번호를 파악할 수 있음을 알고 있습니다.

실제 클러스터의 섹터를 읽으려면 어떻게해야합니까? 디스크, 파일 및 볼륨 장치 제어 코드에 대한 MSDN의 목록을 통해 내 파고가 실제 클러스터 데이터에 도달하는 방식대로 나에게 뛰어 들지 않았습니다.

낮은 수준에서 읽기를 시도해야합니까? 대신 SetFilePointer() 및 ReadFile() 호출을 사용하여 파일에 적절한 클러스터 크기 오프셋을 가져 와서 클러스터 크기의 청크를 읽어야합니까?

내가 읽으려고하는 파일에 불량 섹터가있는 경우 NTFS가 전체 파일을 불량으로 표시하여 향후 파일에 액세스하지 못하게합니까? 그렇다면 어떻게 파일을 불량 또는 사후로 표시하지 않도록 NTFS에 지시합니까? (HD는 이제 다시 매핑 할 수있는 예비 섹터가 없습니다.)

* nix 지식을 정리하고/dev /에서 읽는 방법을 알아 내야합니까?

업데이트 : 내 질문에 대한 답변을 찾았습니다. :-) 솔루션은 파일 핸들 대신 볼륨 핸들에서 SetFilePointer() 및 ReadFile()을 수행하고 있습니다.

답변

2

나는 내 자신의 질문에 대한 답을 찾았습니다. :-) 솔루션은 파일 핸들 대신 볼륨 핸들에서 SetFilePointer() 및 ReadFile()을 수행하고 있습니다.

+0

'SetFilePointer'가 실제로 볼륨 핸들에서 작동합니까? 나는 그걸 모른다 ... – Mehrdad

+0

코드를 공유 할 수 있습니까? 내가 잘못하고있는 수학이 있습니다 .. – lalli

+0

왜 파일 핸들이 아닌 볼륨 핸들에 액세스해야합니까? –

관련 문제