我正在使用 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_CHANGE
和 NtNotifyChangeDirectoryFile()
,指示通知数据大于输出缓冲区可以容纳的数据。这就是 ERROR_NOTIFY_ENUM_DIR
在 ReadDirectoryChangesW()
中的含义,如其自己的文档中所述。
其他函数的某些返回值(例如 WaitFor...()
系列函数和 OverlappedIO/IOCP 函数)直接映射到 STATUS_...
代码在内部,但没有这样记录,因为这是一个私有(private)的实现细节。例如,如果您查看 winbase.h,会发现有几十个常见返回代码,例如 WAIT_OBJECT_0
、WAIT_IO_COMPLETION
、STILL_ACTIVE
和各种 EXCEPTION_...
,直接映射到 STATUS_...
值。
但在这种情况下,情况似乎并非如此。 According to MSDN ,STATUS_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/