IRP_MJ_DIRECTORY_CONTROL (FS およびフィルター ドライバー)
送信時
I/O マネージャー、他のオペレーティング システム コンポーネント、および他のカーネル モード ドライバーは、IRP_MJ_DIRECTORY_CONTROL 要求を送信します。 たとえば、ユーザー モード アプリケーションが ReadDirectoryChangesW や FindNextVolumeMountPoint などの Win32 関数を呼び出した場合やカーネル モード コンポーネントが ZwQueryDirectoryFile または ZwQueryDirectoryFileEx を呼び出した場合に送信できます。
操作: ファイル システム ドライバー
ファイル システム ドライバーは、マイナー関数コードをチェックして、どのディレクトリ制御操作が要求されているかを判断する必要があります。 有効なマイナー機能コードは次のとおりです。
コード | 説明 |
---|---|
IRP_MN_QUERY_DIRECTORY | ディレクトリクエリリクエストを示します。 クエリできる情報の種類はファイル システムに依存しますが、通常は次の値が含まれます: File BothDirectoryInformation、FileDirectoryInformation、FileFullDirectoryInformation、FileId BothDirectoryInformation、FileIdFullDirectoryInformation、FileNamesInformation、FileObjectIdInformation、FileReparsePointInformation。 |
IRP_MN_NOTIFY_CHANGE_DIRECTORY | ディレクトリへの変更の通知の要求を示します。 通常、ファイル システム ドライバーは、この要求をすぐに満たすのではなく、IRP をプライベート キューに保持します。 ディレクトリに変更が発生すると、ファイル システム ドライバーが通知を実行し、IRP をキューから取り出して完了します。 ファイル システム ドライバーは情報をFILE_NOTIFY_INFORMATION 構造体の形式で返します。 |
IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX | ディレクトリへの変更の通知の要求を示します。 通常、ファイル システム ドライバーは、この要求をすぐに満たすのではなく、IRP をプライベート キューに保持します。 ディレクトリに変更が発生すると、ファイル システム ドライバーが通知を実行し、IRP をキューから取り出して完了します。 ファイル システム ドライバーは、指定されたIrpSp->Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass に基づいて情報を返します。 |
Note
FileQuotaInformation 情報クラスは廃止されました。 IRP_MJ_QUERY_QUOTA を代わりに使用する必要があります。
ファイル システム ドライバーは、要求された操作を実行した後、IRP を完了する必要があります。
操作: レガシー ファイル システム フィルター ドライバー
フィルター ドライバーは、この IRP をスタック上の 1 つ下のドライバーに渡す必要があります。
パラメーター
ファイル システムまたはフィルター ドライバーは、指定された IRP で IoGetCurrentIrpStackLocation を呼び出して、IRP 内の独自のスタックの場所へのポインターを取得します。 次のパラメーターでは、Irp は IRP を指し、IrpSp は IO_STACK_LOCATION を指します。 ドライバーは、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用して、ディレクトリ制御要求を処理できます。
DeviceObject ターゲット デバイス オブジェクトへのポインターです。
Irp->AssociatedIrp.SystemBuffer は、最終的な完了状態と要求された操作に関する情報を受け取る IO_STATUS_BLOCK 構造体を指します。
Irp->UserBufferディレクトリの内容に関する要求された情報を受け取る、呼び出し元が指定した出力バッファーを指します。
IrpSp->FileObject は、DeviceObject に関連付けられているファイル オブジェクトを指します。
IrpSp->FileObject パラメーターには、FILE_OBJECT構造体でもある RelatedFileObject フィールドへのポインターが含まれています。 その RelatedFileObject FILE_OBJECT 構造体のフィールドは、IRP_MJ_DIRECTORY_CONTROL の処理中は無効なので、使用しないでください。
IrpSp->フラグ を、IRP_MN_QUERY_DIRECTORYには、次の値の 1 つ以上に設定できます。
フラグ | 意味 |
---|---|
SL_INDEX_SPECIFIED | IrpSp->Parameters.QueryDirectory.FileIndex によってインデックスが指定されたディレクトリ内のエントリからスキャンを開始します。 |
SL_RESTART_SCAN | ディレクトリの最初のエントリからスキャンを開始します。 このフラグが設定されていない場合は、前の IRP_MN_QUERY_DIRECTORY リクエストからスキャンを再開します。 |
SL_RETURN_SINGLE_ENTRY | 見つかった最初のエントリのみを返します。 |
SL_RETURN_ON_DISK_ENTRIES_ONLY | ディレクトリ仮想化またはジャストインタイム拡張を実行するフィルターに対して、単純にリクエストをファイル システムに渡し、現在ディスク上にあるエントリを返すように指示します。 |
IRP_MN_NOTIFY_CHANGE_DIRECTORY には次のフラグを設定できます。
フラグ | 意味 |
---|---|
SL_WATCH_TREE | 設定 真実このディレクトリのすべてのサブディレクトリも監視する必要がある場合。 ディレクトリ自体のみを監視する場合、FALSE に設定します。 |
IrpSp->主要機能 は IRP_MJ_DIRECTORY_CONTROL に設定されます。
IrpSp->MinorFunction 次のいずれかの値に設定できます。
- IRP_MN_QUERY_DIRECTORY
- IRP_MN_NOTIFY_CHANGE_DIRECTORY
- IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX
IrpSp->Parameters.QueryDirectory.FileIndex は、ディレクトリスキャンを開始するファイルのインデックスです。 SL_INDEX_SPECIFIED フラグが設定されていない場合、この値は無視されます。 このパラメーターは、Win32 関数またはカーネル モード サポート ルーチンでは指定できません。 現在、これは 32 ビット NT ベースのプラットフォーム上にのみ存在する NT 仮想 DOS マシン (NTVDM) によってのみ使用されています。 ファイル インデックスは、親ディレクトリ内のファイルの位置が固定されておらず、並べ替え順序を維持するためにいつでも変更できる NTFS などのファイル システムでは定義されていません。
IrpSp->Parameters.QueryDirectory.FileInformationClass は、次のいずれかの値に設定されます。
Value 意味 FileBothDirectoryInformation 戻す FILE_BOTH_DIR_INFORMATION 各ファイルの構造。 FileDirectoryInformation 戻す FILE_DIRECTORY_INFORMATION 各ファイルの構造。 FileFullDirectoryInformation 戻す FILE_FULL_DIR_INFORMATION" 各ファイルの構造。 FileIdBothDirectoryInformation 戻す FILE_ID_BOTH_DIR_INFORMATION 各ファイルの構造。 FileIdFullDirectoryInformation 戻す FILE_ID_FULL_DIR_INFORMATION 各ファイルの構造。 FileNamesInformation 戻す FILE_NAMES_INFORMATION 各ファイルの構造。 FileObjectIdInformation 戻す FILE_OBJECTID_INFORMATION 各ファイルの構造。 FileQuotaInformation 廃止されています。 使用 IRP_MJ_QUERY_QUOTA 代替。 FileReparsePointInformation ディレクトリの 1 つの FILE_REPARSE_POINT_INFORMATION 構造を返します。 IrpSp->Parameters.QueryDirectory.FileName は、指定されたディレクトリ内のファイルのオプションの名前です。
IrpSp->Parameters.QueryDirectory.Length は、Irp->UserBuffer が指すバッファーの長さ (バイト単位) です。
IrpSp->Parameters.NotifyDirectory.Length は、Irp->UserBuffer が指すバッファーの長さ (バイト単位) です。
IrpSp->Parameters.NotifyDirectory.CompletionFilter: 詳細については、FsRtlNotifyFullChangeDirectory に対する CompletionFilter パラメーターの説明を参照してください。
IrpSp->Parameters.NotifyDirectoryEx.Length は、Irp->UserBuffer が指すバッファーの長さ (バイト単位) です。
IrpSp->Parameters.NotifyDirectoryEx.CompletionFilter: 詳細については、FsRtlNotifyFullChangeDirectory に対する CompletionFilter パラメーターの説明を参照してください。
IrpSp->Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass は、次のいずれかの値です。
Value 意味 DirectoryNotifyInformation ディレクトリ変更のために、FILE_NOTIFY_INFORMATION 構造体を返します。 DirectoryNotifyExtendedInformation ディレクトリの変更ごとに、FILE_NOTIFY_EXTENDED_INFORMATION 構造体を返します。 DirectoryNotifyFullInformation ディレクトリの変更ごとに、FILE_NOTIFY_FULL_INFORMATION 構造体を返します。
関連項目
FILE_REPARSE_POINT_INFORMATION
FsRtlNotifyFullChangeDirectory
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示