在Windows下,磁盘可以看做是一个文件,其文件名为\\.\PhysicalDriveX,其中X表示磁盘的编号,例如\\.\PhysicalDrive0表示的是第0号磁盘,如果需要读取一个磁盘只需要通过对应的文件名称获取到磁盘的句柄,然后通过函数ReadFile读取即可,下面是相关的代码。
//通过给定磁盘的编号,获取到磁盘的句柄
HANDLE
GetDiskHandle(
int
iDiskNo)
{
char
szDriverBuffer[128];
memset
(szDriverBuffer,0,128);
//格式化设备文件名称
sprintf_s(szDriverBuffer,
"\\.\PhysicalDrive%d"
,iDiskNo);
HANDLE
m_hDevice = NULL;
//CreateFile获取到设备句柄
m_hDevice = CreateFileA(
szDriverBuffer,
// 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
GENERIC_READ,
// 指定读访问方式
FILE_SHARE_READ | FILE_SHARE_WRITE,
// 共享模式为读|写,0表示不能共享
NULL,
// NULL表示该句柄不能被子程序继承
OPEN_EXISTING,
// 打开已经存在的文件,文件不存在则函数调用失败
NULL,
// 指定文件属性
NULL);
if
(m_hDevice==INVALID_HANDLE_VALUE){
m_hDevice = NULL;
//无效
return
INVALID_HANDLE_VALUE;
}
//设备句柄
return
m_hDevice;
}
//通过磁盘的句柄,给定读取的位置,获取到扇区512字节数据返回
//readpos:扇区的逻辑地址
//lpOutBuffer512:用于返回读取的数据
BOOL
ReadSectorData(
HANDLE
& hDevice,
UINT64
redpos,__out
char
* lpOutBuffer512 )
{
memset
(lpOutBuffer512,0,512);
LARGE_INTEGER li;
li.QuadPart = redpos*0x200;
//0x200 = 512,求出扇区的 字节地址,通过设置读取的地址和长度进行read
SetFilePointer(hDevice,li.LowPart,&li.HighPart,FILE_BEGIN);
DWORD
DCount=0;
//计数
BOOL
bResult=ReadFile(hDevice, lpOutBuffer512,512, &DCount, NULL);
return
bResult;
}
通过上面的操作可以获取到磁盘指定扇区的512字节数据。