GetQueuedCompletionStatusEx(),ReadDirectoryChangesW()

时间:2013-02-10 19:55:32

标签: c++ winapi iocp readdirectorychangesw

我正在使用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。所以我想知道,这是文档中的错误还是我做错了什么?

1 个答案:

答案 0 :(得分: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()本身内部的错误,除非它是错误的错误.h而不是。

某些较低级别的系统(如NT_TRANSACT_NOTIFY_CHANGENtNotifyChangeDirectoryFile())使用

STATUS_NOTIFY_ENUM_DIR来表示通知数据大于输出缓冲区可容纳的数据。这就是ERROR_NOTIFY_ENUM_DIRReadDirectoryChangesW()中的含义,正如其自己的文档中所述。

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

但在这种情况下似乎并非如此。 According to 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
...
相关问题