• 微软原版系统

  • 一键重装系统

  • 纯净系统

  • 在线技术客服

魔法猪系统重装大师 一键在线制作启动 U 盘 PE 系统 用一键重装的魔法拯救失去灵魂的系统
当前位置:首页 > 教程 > 电脑教程

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

时间:2015年04月02日 15:32:38    来源:魔法猪系统重装大师官网    人气:13737

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

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

WriteFile,写,磁盘,扇区,错误,的,解决方案,今天
栏目:电脑教程 阅读:1000 2023/12/27
Win7教程 更多>>
U盘教程 更多>>
Win10教程 更多>>
魔法猪学院 更多>>

Copyright © 2015-2023 魔法猪 魔法猪系统重装大师

本站发布的系统仅为个人学习测试使用,请在下载后24小时内删除,不得用于任何商业用途,否则后果自负,请支持购买微软正版软件。

在线客服 查看微信 返回顶部