я использую 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_...
внутренние коды, но не документированы как таковые, потому что это частная реализация. Например, если вы посмотрите в winbase.h, есть пара десятков общих кодов возврата, например WAIT_OBJECT_0
, WAIT_IO_COMPLETION
, STILL_ACTIVE
и различные EXCEPTION_...
та карта непосредственно к STATUS_...
ценности.
Похоже, что это не так в этой ситуации. По данным MSDN, STATUS_NOTIFY_ENUM_DIR
действительно должен отображаться на ERROR_NOTIFY_ENUM_DIR
так что это может показаться ошибкой:
Когда драйвер режима ядра вызывается из-за запроса ввода / вывода (I / O) от подсистемы Win32, код состояния, возвращаемый драйвером режима ядра, будет преобразован в соответствующий код ошибки Win32 кода состояния. В следующей таблице показано сопоставление кодов состояния Windows NT с кодами ошибок Win32.
WINDOWS NT STATUS CODE WIN32 ERROR CODE ------------------------------------------------------------------ ... STATUS_NOTIFY_ENUM_DIR ERROR_NOTIFY_ENUM_DIR ...
Других решений пока нет …