2014-10-09 93 views
-2

我对C相当陌生,而且我正试图编写一个小应用程序来读取驱动器的全部原始内容。使用ReadFile读取整个PhysicalDrive内容

这是我的代码;

int main(int argc, char *argv[]) { 
    HANDLE hFile; 
    DWORD dwBytesRead; 
    char buff[512]; 

    hFile = CreateFile("\\\\.\\PhysicalDrive2", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); 

    if(hFile == INVALID_HANDLE_VALUE){ 
     printf("%d",GetLastError()); 
     return; 
    } 

    SetFilePointer(hFile, 512*0, NULL, FILE_BEGIN); 
    ReadFile(hFile, buff, 512, &dwBytesRead, NULL); 
    CloseHandle(hFile); 

    return 0; 
} 

如何将ReadFile放入循环以读取驱动器上的所有数据?我最终需要将缓冲区的内容保存到磁盘。

感谢

+0

看从'ReadFile'的返回值。 “如果函数成功,返回值为非零(TRUE),如果函数失败或异步完成,则返回值为零(FALSE)。要获得扩展的错误信息,请调用GetLastError函数。 – chux 2014-10-09 19:12:28

+0

只有在驱动器上没有安装有文件系统的卷时才能执行此操作。在现代版本的Windows上,无法通过“PhysicalDrive”设备访问由文件系统占用的块。即使有管理员权限。 – 2014-10-09 21:37:40

+1

@BenVoigt只是为了澄清,管理员阅读任何地方都没有限制。写入安装卷声明的区域在NT6上被阻止。 – 2014-10-09 22:48:22

回答

1

循环可能是这样的:

hFile = CreateFile(...); 
if (hFile == INVALID_HANDLE_VALUE) 
{ 
    // handle error 
} 

while (true) 
{ 
    unsigned char buff[32768]; // needs to be a multiple of sector size 
    DWORD dwBytesRead; 
    if (!ReadFile(hFile, buff, sizeof buff, &dwBytesRead, NULL)) 
    { 
     // handle error 
    } 
    if (dwBytesRead == 0) 
    { 
     break; // we reached the end 
    } 
    // do something with the dwBytesRead that were read 
} 

CloseHandle(hFile);