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