【问题标题】:How to differentiate between Volume and File handle in winapi?如何区分winapi中的卷和文件句柄?
【发布时间】:2013-11-29 09:37:32
【问题描述】:

在确保我打开了一个卷句柄之后,我正在遍历我的进程打开的所有句柄。在迭代期间,我使用 GetFinalPathNameByHandle() 来接收有关与特定句柄关联的对象的信息,但正如我所见,此函数仅适用于文件,并且在处理文件以外的句柄的情况下返回 ERROR_INVALID_HANDLE (0x06) 错误。我说得对吗?如果是,那么如何检查有问题的句柄是否与音量关联,以便我可以关闭它?

任何帮助都将不胜感激。

【问题讨论】:

  • 您要解决的问题是什么?如果你打开了一个音量句柄,你就已经知道它是一个音量句柄了,对吧?不需要重复,真的。依赖ERROR_INVALID_HANDLE 是一个糟糕的解决方案,因为它不仅会识别卷句柄,还会识别任何类型的无效句柄(例如窗口句柄或一起无效的句柄)。您也不能真正关闭可能无效的句柄,如果它无效,您希望关闭它做什么?
  • 此外,打开音量句柄并不是偶然发生或被忽视的事情。这是一项需要特权提升的操作。因此,如果您担心“意外”获得音量句柄,请不要担心——这不会发生。
  • 问题是我没有自己打开音量句柄。它由 QT 中的 Qfilesystemwatcher 对象打开,我从中为我的程序创建 GUI,在调用我的代码(需要锁定卷)之前,我需要关闭文件系统观察程序打开的这个句柄。
  • 为什么在锁定卷时不销毁 Qfilesystemwatcher(并且可能在驱动器上执行一些低级别的操作)?如果您尝试使用一些技巧强制关闭手柄,它无论如何都不会正常工作。所以你也可以破坏对象并让它自己清理(关闭手柄)。当您需要再次查看文件系统时。创建一个新实例。

标签: c windows file winapi volume


【解决方案1】:

你做错了。创建句柄时,请记住它。完成后,关闭它。

您不能希望能够枚举您的进程中所有打开的句柄并关闭一堆符合某些条件的句柄。您无法知道手柄是否在使用中。在您的进程中将有打开的句柄不是由您的代码打开的。关闭这样的手柄会导致各种痛苦。

【讨论】:

  • 但是“进程浏览器”类的程序是如何强制关闭其他程序的句柄的呢?这是否意味着我们不能关闭由某些第三方代码打开的进程使用的句柄,但我们可以强制关闭由其他进程打开的句柄?我很想了解这一切。
  • 强制关闭句柄肯定是不正常的。您应该照顾好您的手柄并在完成后关闭它们。
  • 我刚刚阅读了该问题的 cmets。强行关闭其他物体打开的手柄会导致疼痛。这就是我回答的第二部分中的场景。不要追求这种方法。正确地做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多