【问题标题】:Can I get write access to raw disk sectors under Vista and Windows 7 in user mode?我可以在用户模式下在 Vista 和 Windows 7 下获得对原始磁盘扇区的写入权限吗?
【发布时间】:2012-02-03 06:09:33
【问题描述】:

来自RawDisk website

Windows Vista 的新安全模型严格限制在用户模式下执行的应用程序。即使提升了管理权限,应用程序也无法获得对原始磁盘扇区的写入权限。

这是真的吗?

From the Microsoft doc:

对文件系统和存储堆栈的更改不适用如果卷未安装或如果卷没有文件系统。

请给

  • 确认 RawDisk 网站的 Microsoft 官方文档的链接
  • 或工作代码示例。 (我显然没有创建一个,CreateFile() 调用失败,ERROR_ACCESS_DENIED 如果设置了GENERIC_WRITE。)

到目前为止我找到的其他相关 Microsoft 文档:

【问题讨论】:

  • 尝试时会发生什么(当然是牺牲体积)?
  • @Richard 我得到ERROR_ACCESS_DENIED (0x5)。我正在使用原始 SD 卡进行测试。
  • @Richard 仅仅因为我失败了并不意味着它不可能。看不懂SL_FORCE_DIRECT_WRITE,不知道怎么用。
  • 我假设您被WriteFile 拒绝访问? CreateFile 成功了吗?
  • @avakar 如果设置了GENERIC_WRITE,则CreateFile() 调用将失败。没有文件系统,设备是原始 SD 卡。这些信息将如何改变您的答案?

标签: c++ c winapi windows-7 windows-vista


【解决方案1】:

是的。您链接到的第一篇文章提供了更长的例外列表:

  • 如果文件系统没有挂载
  • 如果文件系统已被锁定。
  • 如果写入的扇区位于文件系统空间之外(这包括引导扇区,以及显然所有扇区都在文件系统之外的“无文件系统”情况)
  • 如果写入请求已被内核模式驱动程序标记。

显然,最后一个例外与您无关。用户模式与内核模式相反。其他例外情况仍然适用。

【讨论】:

  • CreateFile()GENERIC_WRITE 失败。您确实没有有一个句柄可以调用DeviceIoControl() 并发出FSCTL_ALLOW_EXTENDED_DASD_IO。如果其他例外情况仍然适用,那么我应该如何调用CreateFile() 以免得到ERROR_ACCESS_DENIED?该过程被适当提升。请给出一个工作代码示例。
  • 好吧,反正这无关紧要。那时您还没有扇区号,因此基于扇区的限制并不重要。您确实指定了OPEN_EXISTINGFILE_SHARE_WRITE,对吗?而您打开的是卷 (\\.\X:),而不是它的文件系统 (\\.\X:\ )?
  • 是的,我就是这么做的。我不知道什么是安全属性,我只是传递 NULL。
  • “可选...CreateFile 在打开现有文件或设备时忽略lpSecurityDescriptor 成员,但继续使用bInheritHandle 成员”。 IE。 NULL 可以,因为您不需要将句柄传递给子进程。你可以为你的CreateFile问题创建一个额外的queston吗?
  • @Ali:我想是因为这对他们来说很容易。这是列表中的最后一个例外,也是对其他组件的要求最低的例外。但是,您可以通过这种方式获得最大的惊喜,因为它忽略了其他应用程序正在做的事情。不过这对司机来说并不罕见,这也解释了为什么 99% 的 BSOD 都是由司机造成的。
猜你喜欢
  • 2012-09-02
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2013-10-05
  • 2011-08-22
  • 2020-02-03
  • 2017-06-17
相关资源
最近更新 更多