GetQueuedCompletionStatusEx(), ReadDirectoryChangesW()

GetQueuedCompletionStatusEx(), ReadDirectoryChangesW()

本文关键字:ReadDirectoryChangesW GetQueuedCompletionStatusEx      更新时间:2023-10-16

我正在使用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_NUM_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_CHANGENtNotifyChangeDirectoryFile(),以指示通知数据大于输出缓冲器所能容纳的数据。这就是ERROR_NOTIFY_ENUM_DIRReadDirectoryChangesW()中的含义,正如它自己的文档中所述。

其他函数的一些返回值,如WaitFor...()函数族和OverlappedIO/IOCP函数,在内部直接映射到STATUS_...代码,但由于这是一个私有的实现细节,因此没有记录在案。例如,如果您在winbase.h中查找,有几十个常见的返回代码,如WAIT_OBJECT_0WAIT_IO_COMPLETIONSTILL_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
...
相关文章:
  • 没有找到相关文章