在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字节数据。
转载请注明:悠然品鉴 » Windows下MFC C/C++读取磁盘扇区数据