WriteFile写磁盘扇区是87错误的原因

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

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

 

转载于:https://www.cnblogs.com/sephil/archive/2011/03/18/1988350.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值