c++ - GetQueuedCompletionStatusEx()、ReadDirectoryChangesW()

标签 c++ winapi iocp readdirectorychangesw

我正在使用 GetQueuedCompletionStatusEx()ReadDirectoryChangesW() 尝试接收多个文件系统层次结构更改的通知。

我注意到,当同时发生大量更改时,我会收到错误为 0x10C 的完成数据包。此错误代码不在我包含的头文件中的任何位置,也不在文档中( http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx )。经过一番挖掘,我发现它是在 ntstatus.h 中定义的 STATUS_NOTIFY_ENUM_DIR 。文档中既没有提到 STATUS_NOTIFY_ENUM_DIR,也没有提到包含 ntstatus.h 的必要性。 MSDN 表明它应该是 ERROR_NOTIFY_ENUM_DIR。所以我想知道,这是文档中的错误还是我做错了什么?

最佳答案

ERROR_NOTIFY_ENUM_DIR 在 winerror.h 中定义:

//
// MessageId: ERROR_NOTIFY_ENUM_DIR
//
// MessageText:
//
// A notify change request is being completed and the information is not being returned in the caller's buffer. The caller now needs to enumerate the files to find the changes.
//
#define ERROR_NOTIFY_ENUM_DIR            1022L

但是,1022 是 0x3FE。 0x10C 是 268,这不是 ReadDirectoryChangesW() 应该返回的错误代码。因此,如果 ReadDirectoryChangesW() 直接返回 STATUS_NOTIFY_ENUM_DIR 而不是将其转换为 ERROR_NOTIFY_ENUM_DIR,那么这很可能是 内部的错误ReadDirectoryChangesW() 本身,除非它是 winerror.h 中的拼写错误。

STATUS_NOTIFY_ENUM_DIR 由一些较低级别的系统使用,例如 NT_TRANSACT_NOTIFY_CHANGENtNotifyChangeDirectoryFile() ,指示通知数据大于输出缓冲区可以容纳的数据。这就是 ERROR_NOTIFY_ENUM_DIRReadDirectoryChangesW() 中的含义,如其自己的文档中所述。

其他函数的某些返回值(例如 WaitFor...() 系列函数和 OverlappedIO/IOCP 函数)直接映射到 STATUS_... 代码在内部,但没有这样记录,因为这是一个私有(private)的实现细节。例如,如果您查看 winbase.h,会发现有几十个常见返回代码,例如 WAIT_OBJECT_0WAIT_IO_COMPLETIONSTILL_ACTIVE 和各种 EXCEPTION_...,直接映射到 STATUS_... 值。

但在这种情况下,情况似乎并非如此。 According to MSDNSTATUS_NOTIFY_ENUM_DIR确实应该映射到ERROR_NOTIFY_ENUM_DIR,所以这似乎是一个错误:

When a kernel-mode driver is called because of an input/output (I/O) request from the Win32 subsystem, the status code returned by the kernel- mode driver will be translated to the status code's corresponding Win32 error code. The following table shows the mapping from the Windows NT status codes to Win32 error codes.

WINDOWS NT STATUS CODE                  WIN32 ERROR CODE
------------------------------------------------------------------
...
STATUS_NOTIFY_ENUM_DIR                  ERROR_NOTIFY_ENUM_DIR
...

关于c++ - GetQueuedCompletionStatusEx()、ReadDirectoryChangesW(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14801950/

相关文章:

windows - 在 Windows 中使用 IOCP 时缓存 OVERLAPPED 结构

windows - IO 完成端口是否在完成端口有要报告的内容之前或之后生成新线程?

c++ - PACKET_TX_RING 只发送第一个数据包,然后不再做任何事情

c++ - 我如何让 Anjuta 突出显示我的构建系统 (waf) 产生的错误/行?

c++ - Qt 计算器问题 - C++

c++ - 在 Windows/C++ 中强制显示分辨率

c# - 如何使用 sendmessage 和 c# 增加第三方应用程序中轨迹栏/ slider 的值(value)?

c++ - OpenCV - hybridtrackingsample.cpp 示例错误

perl - 如何从 Perl 控制 Windows GUI 应用程序?

c++ - 我可以将accept()与IOCP一起使用吗?