7

我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 卡。一切正常,正如我之前所说,它可以在 XP 上运行。我也尝试过使用:DeviceIoControl with FSCTL_LOCK_VOLUME,但这会导致内存故障错误。

希望这有助于理解并感谢您的帮助

4

2 回答 2

2

我认为这是由于路径字符串“缓冲区”;我遇到了同样的问题。您用于获取设备访问权限的路径需要看起来像这样 "\\.\PhysicalDrive%d" %d 是驱动器的十进制数。

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

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

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

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

于 2010-08-30T20:33:20.773 回答
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
于 2012-01-26T18:23:09.123 回答