下载之家:专注下载8年,极速安全,用心打造!

下载之家首页 |最新软件 |软件排行 |软件专题

您当前所在位置: 下载之家 >  资讯 >  PC软件资讯 >  操作系统 >  教你WriteFile写磁盘扇区87错误的解决方案

教你WriteFile写磁盘扇区87错误的解决方案

时间:2012/05/19 03:19:07来源:本站整理作者:佚名

导读:今天在写个工具,功能是将一些数据写到磁盘的绝对扇区上. 但是发现ReadFile没问题,可是WriteFile总是报87错误(参数不正确). Google上查了...

今天在写个工具,功能是将一些数据写到磁盘的绝对扇区上.

但是发现ReadFile没问题,可是WriteFile总是报87错误(参数不正确).

Google上查了一会,发现碰到问题的人不少,可惜没有正确答案....

没辙,还是啃MSDN,终于还是自己解决了~呵呵

赶紧记下来,免得忘了...

其实主要是写入的数据大小,必须是BytesOfSector大小的倍数,一般是512字节,ReadFile却无所谓...

另外,MSDN上还说,WriteFile前最好先用FSCTL_LOCK_VOLUME或者FSCTL_DISMOUNT_VOLUME将磁盘锁定或卸载,不过我试下来好像没什么影响...

代码摘录如下:

 1 UINT CDevInfo::Write(LPVOID pData, UINT nSize)
 2 {
 3     if (!pData && nSize <= 0)
 4         return 0;
 5
 6     TCHAR szDevName[30];
 7     _stprintf(szDevName, _T("\.PHYSICALDRIVE%d"), m_nDevNum); // DeviceNumber
 8
 9     HANDLE hDev = ::CreateFile(szDevName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
10     if (hDev == INVALID_HANDLE_VALUE)
11         return 0;
12
13     DWORD dwCount;
14     if (!::DeviceIoControl(hDev, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dwCount, NULL))
15         return 0;
16
17     DWORD dwWritten(0);
18     ::SetFilePointer(hDev, SECTOR_NUM * GetSectorSize(), NULL, FILE_BEGIN);
19     if (!::WriteFile(hDev, pData, nSize, &dwWritten, NULL))
20         dwWritten = 0;
21    
22     ::DeviceIoControl(hDev, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &dwCount, NULL);
23     ::CloseHandle(hDev);
24     return dwWritten;
25 }

更多0

相关阅读 Windows 10 Build 15048发布:狂灭BUG Windows 10新版默认壁纸,更简约 开始→运行→输入的命令集锦 电脑安装Win10系统有什么配置要求 Get Windows10属恶意程序 需付费清理 相隔一年 国产操作系统YunOS终于要推新版本了 PC市场持续下滑,微软降低win10笔记本系统授权费 颜值提升:Windows 10 Creators Update用户界面更新一览