在Windows上使用C语言读取硬盘驱动器上的特定扇区

我已经试过这个代码,当我从USB闪存驱动器读取扇区,但它不与硬盘上的任何partiton工作,所以我想知道,如果这是同样的事情,当你尝试从USB读取或从硬盘驾驶

int ReadSector(int numSector,BYTE* buf){ int retCode = 0; BYTE sector[512]; DWORD bytesRead; HANDLE device = NULL; device = CreateFile("\\\\.\\H:", // Drive to open GENERIC_READ, // Access mode FILE_SHARE_READ, // Share Mode NULL, // Security Descriptor OPEN_EXISTING, // How to create 0, // File attributes NULL); // Handle to template if(device != NULL) { SetFilePointer (device, numSector*512, NULL, FILE_BEGIN) ; if (!ReadFile(device, sector, 512, &bytesRead, NULL)) { printf("Error in reading disk\n"); } else { // Copy boot sector into buffer and set retCode memcpy(buf,sector, 512); retCode=1; } CloseHandle(device); // Close the handle } return retCode;} 

问题是共享模式。 你已经指定了FILE_SHARE_READ这意味着没有其他人被允许写入设备,但分区已经挂载了读/写,所以不可能给你那个共享模式。 如果您使用FILE_SHARE_READ|FILE_SHARE_WRITE它将工作。 (好吧,假设磁盘扇区的大小是512字节,并且提供的进程是以管理员权限运行的。)

你也在错误地检查错误; CreateFile在失败而不是NULL返回INVALID_HANDLE_VALUE

我成功测试了这个代码:

 #include <windows.h> #include <stdio.h> int main(int argc, char ** argv) { int retCode = 0; BYTE sector[512]; DWORD bytesRead; HANDLE device = NULL; int numSector = 5; device = CreateFile(L"\\\\.\\C:", // Drive to open GENERIC_READ, // Access mode FILE_SHARE_READ|FILE_SHARE_WRITE, // Share Mode NULL, // Security Descriptor OPEN_EXISTING, // How to create 0, // File attributes NULL); // Handle to template if(device == INVALID_HANDLE_VALUE) { printf("CreateFile: %u\n", GetLastError()); return 1; } SetFilePointer (device, numSector*512, NULL, FILE_BEGIN) ; if (!ReadFile(device, sector, 512, &bytesRead, NULL)) { printf("ReadFile: %u\n", GetLastError()); } else { printf("Success!\n"); } return 0; }