2

複数のファイルシステム階層への変更の通知を使用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。だから私は疑問に思っています、これはドキュメントのバグですか、それとも私は何か間違ったことをしていますか?

4

1 に答える 1

3

ERROR_NOTIFY_ENUM_DIRwinerror.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()直接戻ってくる場合は、代わりにwinerror.hのタイプミスでない限り、それ自体がバグである可能性があります。STATUS_NOTIFY_ENUM_DIRERROR_NOTIFY_ENUM_DIRReadDirectoryChangesW()

STATUS_NOTIFY_ENUM_DIRNT_TRANSACT_NOTIFY_CHANGEは、やなどの一部の低レベルシステムで使用されNtNotifyChangeDirectoryFile()、通知データが出力バッファが保持できるよりも大きいことを示します。それは、独自のドキュメントに記載されているように、でERROR_NOTIFY_ENUM_DIR意味します。ReadDirectoryChangesW()

WaitFor...()関数ファミリーやOverlappedIO/IOCP関数など、他の関数の戻り値の一部は、STATUS_...内部でコードに直接マップされますが、それは非公開の実装の詳細であるため、そのように文書化されていません。たとえば、winbase.hを見ると、値に直接マップされる、、、、およびさまざまななどWAIT_OBJECT_0、数十の一般的なリターンコードがあります。WAIT_IO_COMPLETIONSTILL_ACTIVEEXCEPTION_...STATUS_...

ただし、この状況ではそうではないようです。 MSDNによるとSTATUS_NOTIFY_ENUM_DIRは実際ににマップされることになってERROR_NOTIFY_ENUM_DIRいるため、これはバグのように見えます。

Win32サブシステムからの入出力(I / O)要求のためにカーネルモードドライバが呼び出されると、カーネルモードドライバによって返されるステータスコードは、ステータスコードの対応するWin32エラーコードに変換されます。次の表は、WindowsNTステータスコードからWin32エラーコードへのマッピングを示しています。

WINDOWS NT STATUS CODE                  WIN32 ERROR CODE
------------------------------------------------------------------
...
STATUS_NOTIFY_ENUM_DIR                  ERROR_NOTIFY_ENUM_DIR
...
于 2013-02-10T20:28:02.157 に答える