如果在绑定到I/O完成端口的文件句柄上设置了FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,则需要在其I/O同步完成时释放OVERLAPPED结构。否则,它需要保持活动状态,直到工作进程处理来自I/O完成端口的通知。这一切听起来都很好,直到你意识到这只有当你自己管理文件句柄时才有效。但是,如果其他人给了您文件句柄,您应该如何知道何时应该释放OVERLAPPED结构事后有没有办法发现?否则,这是否意味着您不能正确地对任何不能保证完成通知状态的文件句柄执行重叠I/O。。。? 最佳答案 事后有没有办法发现?是的,存在-需要使用 > >ZwQueryInformationFile在FileIoCompletionNotificationInformation中定义所以我们需要查询的代码:FILE_IO_COMPLETION_NOTIFICATION_INFORMATION ficni;ZwQueryInformationFile(hFile, &iosb, &ficni, sizeof(ficni), FileIoCompletionNotificationInformation);设置和查询的演示代码HANDLE hFile;IO_STATUS_BLOCK iosb;STATIC_OBJECT_ATTRIBUTES(oa, "\\systemroot\\notepad.exe");if (0 <= ZwOpenFile(&hFile, FILE_GENERIC_READ, &oa, &iosb, FILE_SHARE_VALID_FLAGS, 0)){ FILE_IO_COMPLETION_NOTIFICATION_INFORMATION ficni = { FILE_SKIP_COMPLETION_PORT_ON_SUCCESS }; if (0 <= ZwSetInformationFile(hFile, &iosb, &ficni, sizeof(ficni), FileIoCompletionNotificationInformation)) { ficni.Flags = 0x12345678; if ( 0 > ZwQueryInformationFile(hFile, &iosb, &ficni, sizeof(ficni), FileIoCompletionNotificationInformation) || !(ficni.Flags & FILE_SKIP_COMPLETION_PORT_ON_SUCCESS) ) { __debugbreak(); } } ZwClose(hFile);}也可以从FILE_IO_COMPLETION_NOTIFICATION_INFORMATION中复制粘贴(不要说这是“未记录的”)//// Don't queue an entry to an associated completion port if returning success// synchronously.//#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1//// Don't set the file handle event on IO completion.//#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2//// Don't set user supplied event on successful fast-path IO completion.//#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { ULONG Flags;} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;我有个问题-这是什么原因在wdm.h中声明的?关于c - 如何处理FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,IOCP和清理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41029652/ 10-11 18:43