【问题标题】:In a Windows DLL, how can I get a handle for the file which is already opened by the current process?在 Windows DLL 中,如何获取当前进程已打开的文件的句柄?
【发布时间】:2012-06-27 15:05:15
【问题描述】:

当我的插件 DLL 加载到主机应用程序的地址空间时,我需要将一些数据写入文件。问题是,此时该文件已由具有独占写入权限的主机进程打开,而我对 CreateFile 的调用失败并显示为 ERROR_SHARING_VIOLATION

我想知道,我能否以某种方式使用 WinAPI 调用从主机进程获取文件句柄?这看起来是个糟糕的主意,但我真的需要写入该文件。有人对如何解决这个问题有什么好的想法吗?

【问题讨论】:

  • 它是宿主应用程序的用户可以关闭然后在插件完成工作后重新打开的文件吗?无论如何,主机是什么类型的应用程序?主机应用程序可能会为插件提供写入主机打开的文件的方法,具体取决于主机应用程序是什么。
  • @JAB:该应用程序是一个非常具体的图像查看器,我试图打开的文件是一个带有图像元数据的文本文件。它与图像一起出现。不幸的是,宿主应用程序不提供修改此文件的 API。
  • 即使你能得到句柄,也几乎可以保证破坏/混淆主机进程。数据不会出现在预期的位置,当前文件位置会出错。
  • @Deanna:是的,但是我使用后可以恢复手柄的状态。该应用程序是单线程的,我确信在我的代码运行时没有其他东西会访问该文件
  • “我确信在我的代码运行时没有其他人会访问该文件。”我有一种感觉,当宿主应用程序的编写者使其具有独占写入访问权限时,他们也有同样的想法,因为他们使用了独占访问权限。除非他们只是不知道自己在做什么,否则这总是可能的。

标签: winapi dll filehandle


【解决方案1】:

可以通过NtQueryInformationProcess 和/或NtQuerySystemInformation 枚举打开的句柄,但它不受官方支持(您可以通过 Google 轻松找到非 Microsoft 文档)并且可能无法在未来的 Windows 版本中使用。

【讨论】:

  • 谢谢。这个看起来很复杂,但我会试一试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多