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

时间:2010-08-30 13:38:57

标签: 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); 

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

最后在尝试写入SD时

WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0)

我拒绝访问(错误#5)

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

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

2 个答案:

答案 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之外没有安装文件系统的卷。
  •   

Sample code

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