2

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

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

4

1 回答 1

3

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_CHANGEand NtNotifyChangeDirectoryFile(),表示通知数据大于输出缓冲区可以容纳的大小。正如其自己的文档中所述,这就是ERROR_NOTIFY_ENUM_DIRin的含义。ReadDirectoryChangesW()

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

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

当由于来自 Win32 子系统的输入/输出 (I/O) 请求而调用内核模式驱动程序时,内核模式驱动程序返回的状态代码将被转换为状态代码对应的 Win32 错误代码。下表显示了从 Windows NT 状态代码到 Win32 错误代码的映射。

WINDOWS NT STATUS CODE                  WIN32 ERROR CODE
------------------------------------------------------------------
...
STATUS_NOTIFY_ENUM_DIR                  ERROR_NOTIFY_ENUM_DIR
...
于 2013-02-10T20:28:02.157 回答