我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);
然后,我从SD读取BTB信息,查找并不正确地关闭文件。
最后在尝试写入SD时
WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0)
我拒绝访问(错误#5)
CreateFile()上的字符串是\。\ g:因为g字母对应于我机器上的SD卡。一切正常,正如我之前所说的那样。我也尝试使用:带有FSCTL_LOCK_VOLUME的DeviceIoControl但是会出现mem错误。
希望这有助于理解和感谢任何帮助
答案 0 :(得分:2)
我认为这是由于路径字符串“buffer”;我遇到了同样的问题。 您用于获取设备访问权限的路径需要看起来像“\\。\ PhysicalDrive%d” %d是驱动器的十进制数。
来自Vista的这个字符串是CASE SENSITIVE。 检查拼写。您还需要管理员权限,就像之前在XP中一样。
对于卷,。这封信需要资本化 例如“\\ \ G:”
另请注意,将SD卡作为设备而不是卷进行访问要好得多,因为如果Windows安装它,可能会有一个带有写缓存的文件系统。
此外:我忘了提到你读/写数据的缓冲区应该是页面对齐的,读取扇区大小的倍数。 VirtualAlloc()执行此操作
答案 1 :(得分:0)
您必须在写入原始数据之前卸载卷。
来自MSDN:
如果卷没有已安装的文件系统,或者满足下列条件之一,则卷句柄上的写入将成功:
- 要写入的扇区是引导扇区。
- 要写入的扇区驻留在文件系统空间之外。
- 您已使用FSCTL_LOCK_VOLUME或FSCTL_DISMOUNT_VOLUME明确锁定或卸除了卷。
- 该卷没有实际的文件系统。 (换句话说,它安装了RAW文件系统。)
如果满足下列条件之一,则磁盘句柄上的写入将成功:
- 要写入的扇区不在卷的范围内。
- 要写入的扇区属于已装入的卷,但您已使用FSCTL_LOCK_VOLUME或FSCTL_DISMOUNT_VOLUME显式锁定或卸载了卷。
- 要写入的扇区属于除RAW之外没有安装文件系统的卷。
BOOL bResult = DeviceIoControl(hDevice, // device to be queried
FSCTL_DISMOUNT_VOLUME, // operation to perform
NULL, 0, // no input buffer
pdg, sizeof(*pdg), // output buffer
&junk, // # of bytes returned
(LPOVERLAPPED)NULL); // synchronous I/O