在Vista/7下,WriteFile错误#5"拒绝访问"

and*_*ndy 7 c++ winapi fat32

我google了很多,我找不到这个问题的任何答案......

我有一个C++控制台应用程序,它读取1GB SD卡,修复不正确关闭的文件并相应地写入FAT表.SD卡最初由定制设备中的固件写入.它工作正常到Xp并停止在Win Vista/7中工作.我尝试提升权限:在管理员帐户类型中,我使用"以管理员身份运行"方法启动了一个cmd窗口,但没有运气.我还尝试使用清单,要求获得最高可用权限,但没有运气.

我在一些帖子中读到"Windows Vista根本不允许您从用户模式进程访问磁盘.有没有人知道绕过这种行为的方法?

我正在解决方法,但我想知道这是不可能的

编辑:

这是我在这里发表的第一篇文章,所以我对链接问题并不十分了解......但我根本没有任何垃圾邮件......只是在社区网站上询问:)

代码看起来像

hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); 
Run Code Online (Sandbox Code Playgroud)

然后,我从SD读取BTB信息,查找并不正确地关闭文件.

最后在尝试写入SD时

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0)
Run Code Online (Sandbox Code Playgroud)

我拒绝访问(错误#5)

CreateFile()上的字符串是\.\ g:因为g字母对应于我机器上的SD卡.一切正常,正如我之前所说的那样.我也尝试使用:带有FSCTL_LOCK_VOLUME的DeviceIoControl但是会出现mem故障错误.

希望这有助于理解和感谢任何帮助

Dom*_*ber 1

我认为这是由于路径字符串“buffer”造成的;我遇到了同样的问题。您用于获取设备访问的路径需要类似于“\\.\PhysicalDrive%d”%d 是驱动器的十进制数。

从 Vista 开始,此字符串区分大小写。检查拼写。您还需要管理员权限,就像以前在 XP 中一样。

对于卷,。该字母需要大写,例如“\\.\G:”

另请注意,将 SD 卡作为设备而不是卷进行访问要好得多,因为如果 Windows 挂载它,则可能会挂载一个带有写入缓存的文件系统。

此外:我忘了提到,您读取/写入数据的缓冲区应该是页面对齐的,并且读取的数据是扇区大小的倍数。VirtualAlloc() 执行此操作