在 windows 上使用 C 语言读取硬盘驱动器上的特定扇区
Read specific sector on hard drive using C language on windows
我试过这段代码,它在我从 USB 闪存驱动器读取一个扇区时有效,但它不适用于硬盘驱动器上的任何分区,所以我想知道当你尝试读取时它是否是同一回事来自 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
,这意味着不允许其他任何人写入设备,但分区已安装 read/write,因此无法为您提供共享模式。如果您使用 FILE_SHARE_READ|FILE_SHARE_WRITE
它将起作用。 (嗯,前提是磁盘扇区大小是 512 字节,前提是进程是 运行 管理员权限。)
您还错误地检查了故障; CreateFile returns INVALID_HANDLE_VALUE
失败而不是 NULL
.
我成功测试了这段代码:
#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;
}
我试过这段代码,它在我从 USB 闪存驱动器读取一个扇区时有效,但它不适用于硬盘驱动器上的任何分区,所以我想知道当你尝试读取时它是否是同一回事来自 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
,这意味着不允许其他任何人写入设备,但分区已安装 read/write,因此无法为您提供共享模式。如果您使用 FILE_SHARE_READ|FILE_SHARE_WRITE
它将起作用。 (嗯,前提是磁盘扇区大小是 512 字节,前提是进程是 运行 管理员权限。)
您还错误地检查了故障; CreateFile returns INVALID_HANDLE_VALUE
失败而不是 NULL
.
我成功测试了这段代码:
#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;
}