我日常在Windows编程中大部分工作都涉及各种I/O操作(管道,控制台,文件,套接字等)。我熟知从不同类型的句柄(同步,异步等待事件完成,等待文件句柄,I/O完成端口和可警报的I/O等)读取和写入的不同方法。我们使用其中许多方法。
对于我们的一些应用程序,只有一种处理所有句柄的方法将非常有用。我的意思是,程序可能不知道它收到了什么类型的句柄,我们希望使用例如I/O完成端口的统一方式来处理它们。
因此,我首先想问:
假设我有一个句柄:
HANDLE h;
我的进程从某处通过 I/O 接收了一个句柄。有没有一种简单可靠的方法来查找它是用哪些标记创建的?其中最重要的标记是 FILE_FLAG_OVERLAPPED
。
目前我所知道的唯一方法是尝试将此句柄注册到 I/O 完成端口中(使用 CreateIoCompletionPort()
)。如果成功,则该句柄已通过 FILE_FLAG_OVERLAPPED 创建。但是,之后必须仅使用 I/O 完成端口,因为无法取消注册句柄,除非关闭 HANDLE
h
本身。
假设有一种简单的方法可以确定是否存在 FILE_FLAG_OVERLAPPED
,那么就会出现我的第二个问题:
有没有办法向已经存在的句柄添加此标记?这将使原本用于同步操作的句柄变为用于异步操作。是否有方法创建相反的效果(删除 FILE_FLAG_OVERLAPPED
以从异步操作创建同步句柄)?
在阅读 MSDN 并进行大量谷歌搜索后,我没有找到任何直接的方法。是否至少有一些技巧可以做到这一点?比如使用 CreateFile()
函数或类似的方式以相同方式重新创建句柄?是否有一些部分记录或完全未记录的东西?
我需要这个主要是为了确定进程应该如何读取/写入由第三方应用程序发送给它的句柄的方式(或更改方式)。我们无法控制第三方产品如何创建其句柄。
亲爱的 Windows 大师:救命啊!
致意
Martin