西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → WriteFile写磁盘扇区87错误的解决方案

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

相关软件相关文章发表评论 来源:西西整理时间:2012/5/18 14:49:45字体大小:A-A+

作者:西西点击:198次评论:0次标签: 磁盘

  • 类型:磁盘工具大小:62.3M语言:中文 评分:6.6
  • 标签:
立即下载

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

但是发现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 }

    系统工具箱
    (156)系统工具箱
    系统工具说明系统自身不携带而负责系统优化,管理等作用的工具。比如说磁盘清理,磁盘碎片整理程序,系统还原等选项。系统工具就是辅助用户对系统进行管理或修复的软件。系统工具箱介绍系统工具箱指的是包含一些列系统工具软件的工具箱,一般可以详细分为好几种系统相关的分类工具。如注册表,,系统属性,启动管理。系统使用心得为了防止自己的系统崩溃,减慢自己的系统运行速度,建议每天使用系统工具对自己的电脑进行优化,可以...更多>>

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    第 1 楼 湖南长沙联通 网友 客人 发表于: 2014/3/20 10:57:31
    感谢楼主,正好碰到这个问题 ,改成512的整数倍就好了

    支持( 0 ) 盖楼(回复)

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)