2013-02-10 2 views
2

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

+0

Звуки для меня, как вы проверяете на наличие ошибок, когда вы на самом деле не получить обратный сбой кода. Не вызывайте GetLastError(), если GetQueuedCompletionStatus() не возвратил FALSE. –

+0

@HansPassant, это код ошибки, который передается с пакетом завершения ввода-вывода в lpOverlapped-> Internal. – inetknght

+1

Yuck, не смотрите на это. –

ответ

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(), если только это не опечатка в 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_....

Это не похоже на ситуацию в этой ситуации. According to 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 
... 
+0

Спасибо за дополнительное подтверждение. Я думал, что сойду с ума (не в первый раз). Любая идея, как я буду думать о Microsoft за исправление? – inetknght

Смежные вопросы