win7 writefile failed error code 5

子愚 2011-04-08 04:39:59
我在win7上写了个application.是对SD卡进行操作的!
往里面写返回的error code 是5
1.我已经调用了DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&dwOutBytes,()NULL)
2.uAC也已经拉到最低(关了)
但仍然是error code 5
请问怎么解决
...全文
1503 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sudazzj 2012-08-02
  • 打赏
  • 举报
回复
我这边怎么解决不了,楼主,你能把解决后的详细代码发出来看看么?
Lactoferrin 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 hugh512 的回复:]

引用 18 楼 lactoferrin 的回复:

引用 17 楼 lactoferrin 的回复:

引用 16 楼 cnzdgs 的回复:

在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。

锁定或卸载后就可以写

是锁定写操作落在的卷,不……
[/Quote]
要锁定的设备叫\\.\C:之类的,不是叫\\\.\PhysicalDrive
子愚 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 goddea 的回复:]

同命相连呀,我也遇到这个问题了,WriteFile fail 5。

引个链接,互相参考一下:http://topic.csdn.net/u/20110412/21/7b4949d5-a438-479b-94e4-d07c2105c7b0.html

另外,这个问题写驱动好像可以解决,但是这就比较麻烦了,不用些驱动的话还是希望可以不写。

希望楼主得到解决办法之后也能告知我一下呀。谢……
[/Quote]
我只是写个小AP,没必要这么麻烦了!不过在WINCE6.0 引入后,对系统寄存器的访问也不行。不知道win7是不是也加入了这些安全机制的检查!都需要写一些傀儡driver来访问!微软的东西真难用啊!
子愚 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lactoferrin 的回复:]

引用 17 楼 lactoferrin 的回复:

引用 16 楼 cnzdgs 的回复:

在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。

锁定或卸载后就可以写

是锁定写操作落在的卷,不是整个物理设备
[/Quote]

if(DeviceIoControl(hDevice,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL))
{
odprintf("ok");
}


执行结果有打印ok!
锁定我也试过!FSCTL_LOCK_VOLUME.这么用应该是对的吧?~!我也试过将两者结合使用,但依然没效果!
子愚 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cnzdgs 的回复:]

在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。
[/Quote]

wsprintf(PhycialDriver, TEXT("\\\\.\\PhysicalDrive%d"), PhysicalNumber);

对吗?
子愚 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lactoferrin 的回复:]

引用 21 楼 hugh512 的回复:

引用 18 楼 lactoferrin 的回复:

引用 17 楼 lactoferrin 的回复:

引用 16 楼 cnzdgs 的回复:

在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。

锁定……
[/Quote]
可以用的!谢谢!结贴给分!
Goddea 2011-04-12
  • 打赏
  • 举报
回复
同命相连呀,我也遇到这个问题了,WriteFile fail 5。

引个链接,互相参考一下:http://topic.csdn.net/u/20110412/21/7b4949d5-a438-479b-94e4-d07c2105c7b0.html

另外,这个问题写驱动好像可以解决,但是这就比较麻烦了,不用些驱动的话还是希望可以不写。

希望楼主得到解决办法之后也能告知我一下呀。谢谢了!
Lactoferrin 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lactoferrin 的回复:]

引用 16 楼 cnzdgs 的回复:

在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。

锁定或卸载后就可以写
[/Quote]
是锁定写操作落在的卷,不是整个物理设备
Lactoferrin 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cnzdgs 的回复:]

在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。
[/Quote]
锁定或卸载后就可以写
子愚 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xuddk727 的回复:]

share mode 先置0,attribute置为 FILE_ATTRIBUTE_NORMAL试下
[/Quote]
还是不行啊!
MSDN论坛上也有人遇到相同的问题!应该是有办法来解决这个问题的.HxD就可以来操作磁盘的sector!不知道怎么来做?!!!!!!!!!!!!!!!!
cnzdgs 2011-04-12
  • 打赏
  • 举报
回复
在Windows7系统中,对于已装载的逻辑磁盘中的扇区,不允许以物理方式改写,只能以逻辑盘形式打开改写,例如该扇区属于X:盘,则打开\\.\X:来改写。早期的操作系统没有这个限制。
子愚 2011-04-11
  • 打赏
  • 举报
回复

BOOL SetDriveMark(DWORD PhysicalNumber, LARGE_INTEGER TotalSector,UCHAR *buf)
{
HANDLE hDevice; // handle to the drive to be examined
DWORD junk; // discard results
TCHAR PhycialDriver[256]={0};
LARGE_INTEGER DistanceToMove, NewPos;
DWORD dwOutBytes;
wsprintf(PhycialDriver, TEXT("\\\\.\\PhysicalDrive%d"), PhysicalNumber);
hDevice = CreateFile(PhycialDriver, // drive to open
GENERIC_READ | GENERIC_WRITE, // access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes

if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return (FALSE);
}

DistanceToMove.QuadPart = (TotalSector.QuadPart-1)*512;
if(SetFilePointerEx(hDevice, DistanceToMove, &NewPos, FILE_BEGIN) == 0)
{
odprintf("FilePosition fail %d\n", GetLastError());
CloseHandle(hDevice);
return (FALSE);
}
odprintf("FilePosition new %I64d\n", NewPos);
if(DeviceIoControl(hDevice,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&dwOutBytes,(LPOVERLAPPED)NULL))
{
odprintf("ok");
}

if(WriteFile(hDevice, buf, 512, &junk, NULL) == 0)
{
odprintf("WriteFile fail %d\n", GetLastError());
CloseHandle(hDevice);
return (FALSE);
}

CloseHandle(hDevice);

return TRUE;
}

上面代码执行的结果是:
ok
WriteFile fail 5
很茫然不知所错!
许文君 2011-04-11
  • 打赏
  • 举报
回复
share mode 先置0,attribute置为 FILE_ATTRIBUTE_NORMAL试下
子愚 2011-04-11
  • 打赏
  • 举报
回复
读是可以的!悲剧@
Lactoferrin 2011-04-11
  • 打赏
  • 举报
回复
读数据行不行?
子愚 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lactoferrin 的回复:]

先锁定,再卸载试试
[/Quote]
试过了,还是不行啊!很怪异啊!
Lactoferrin 2011-04-11
  • 打赏
  • 举报
回复
先锁定,再卸载试试
Lactoferrin 2011-04-09
  • 打赏
  • 举报
回复
DeviceIoControl是否成功
cnzdgs 2011-04-08
  • 打赏
  • 举报
回复
CreateFile的参数怎么写的?第2参数用GENERIC_READ|GENERIC_WRITE。最好把这段代码都贴出来。
子愚 2011-04-08
  • 打赏
  • 举报
回复
怎么解决呢?各位?实际不要理论!谢谢各位大牛!
在MSDN上说是LOCK or DISMOUNT,我试过都不行!
加载更多回复(5)

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧