【发布时间】:2011-11-29 02:12:53
【问题描述】:
我正在为大学编写一个 TFTP 服务器程序,它需要独占访问它打开以供阅读的文件。因此可以配置,如果一个文件被另一个进程锁定,它会等待文件被解锁。
在 Win32 上是否有任何方法可以等待文件解锁而不先为其创建句柄?
我问的原因是,如果另一个进程使用与我的进程使用的不兼容的 dwShareMode 调用 CreateFile(),我什至无法获得用于等待锁定的文件句柄LockFileEx().
提前感谢您的帮助!
【问题讨论】:
我正在为大学编写一个 TFTP 服务器程序,它需要独占访问它打开以供阅读的文件。因此可以配置,如果一个文件被另一个进程锁定,它会等待文件被解锁。
在 Win32 上是否有任何方法可以等待文件解锁而不先为其创建句柄?
我问的原因是,如果另一个进程使用与我的进程使用的不兼容的 dwShareMode 调用 CreateFile(),我什至无法获得用于等待锁定的文件句柄LockFileEx().
提前感谢您的帮助!
【问题讨论】:
如果您查看 Stack Overflow 问题 What Win32 API can be used to find the process that has a given file open? 和 SYSTEM_HANDLE_INFORMATION structure,您会发现可用于枚举进程和每个运行进程的所有打开句柄的代码链接。此信息可用于获取打开文件的进程的HANDLE 以及文件的HANDLE。然后,您将使用DuplicateHandle() 创建文件HANDLE 的副本,但在TFTP 进程的句柄表中。重复的HANDLE 可以被 TFTP 进程与LockFileEx() 一起使用。
此解决方案依赖于内部函数NtQuerySystemInformation(),以及可用于枚举打开句柄的未记录系统信息类值。请注意,NtQuerySystemInformation() 的此功能“可能会在未来的 Windows 版本中更改或不可用”。您可能希望使用 SEH 处理程序来防止发生访问冲突。
【讨论】:
像 OH 和 Process Explorer 这样的 MS 工具可以做到这一点,绝对可以让进程打开所有句柄。从那里等待你想要的路还很长,但它是一个开始:)
如果您在 Win32 API 上没有成功,那么可以看看 NT Native API http://en.wikipedia.org/wiki/Native_API
您可以从这里http://msdn.microsoft.com/en-us/library/windows/desktop/ms724509%28v=vs.85%29.aspx 开始,看看它是否适用于 SystemProcessInformation 标志。 也可以从这里开始http://nsylvain.blogspot.com/2007/09/how-list-all-open-handles.html
原生 API 的文档记录很差,但你可以在网上找到资源(比如这里http://www.osronline.com/article.cfm?id=91)
作为免责声明,我应该补充一点,Native API 在某种程度上是“内部的”,因此在未来的版本中可能会发生变化。然而,一些函数也在 DDK 中公开暴露在内核级别,因此这些函数更改的可能性很低。
祝你好运!
【讨论】: