【发布时间】:2013-11-29 09:37:32
【问题描述】:
在确保我打开了一个卷句柄之后,我正在遍历我的进程打开的所有句柄。在迭代期间,我使用 GetFinalPathNameByHandle() 来接收有关与特定句柄关联的对象的信息,但正如我所见,此函数仅适用于文件,并且在处理文件以外的句柄的情况下返回 ERROR_INVALID_HANDLE (0x06) 错误。我说得对吗?如果是,那么如何检查有问题的句柄是否与音量关联,以便我可以关闭它?
任何帮助都将不胜感激。
【问题讨论】:
-
您要解决的问题是什么?如果你打开了一个音量句柄,你就已经知道它是一个音量句柄了,对吧?不需要重复,真的。依赖
ERROR_INVALID_HANDLE是一个糟糕的解决方案,因为它不仅会识别卷句柄,还会识别任何类型的无效句柄(例如窗口句柄或一起无效的句柄)。您也不能真正关闭可能无效的句柄,如果它无效,您希望关闭它做什么? -
此外,打开音量句柄并不是偶然发生或被忽视的事情。这是一项需要特权提升的操作。因此,如果您担心“意外”获得音量句柄,请不要担心——这不会发生。
-
问题是我没有自己打开音量句柄。它由 QT 中的 Qfilesystemwatcher 对象打开,我从中为我的程序创建 GUI,在调用我的代码(需要锁定卷)之前,我需要关闭文件系统观察程序打开的这个句柄。
-
为什么在锁定卷时不销毁 Qfilesystemwatcher(并且可能在驱动器上执行一些低级别的操作)?如果您尝试使用一些技巧强制关闭手柄,它无论如何都不会正常工作。所以你也可以破坏对象并让它自己清理(关闭手柄)。当您需要再次查看文件系统时。创建一个新实例。
标签: c windows file winapi volume