我正在使用GetQueuedCompletionStatusEx()
和ReadDirectoryChangesW()
尝试接收对多个文件系统层次结构更改的通知。
我注意到当一次有很多更改时,我会收到错误为0x10C的完成数据包。该错误代码不在我包含的头文件中的任何位置,也没有出现在文档(http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx)中。稍作挖掘后,我发现它是在STATUS_NOTIFY_ENUM_DIR
中定义的ntstatus.h
。文档中未提及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
,因此这似乎是一个错误: