现在,我在 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 大师:请帮助!
带着敬意
马丁