GetQueuedCompletionStatusEx (), 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, Поэтому мне интересно, это ошибка в документации или, возможно, я делаю что-то не так?

2

Решение

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
...
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]