IRP_MJ_CREATE (FS および FS フィルター)
送信時
I/O マネージャーは、次の場合に IRP_MJ_CREATE リクエストを送信します。
- 新しいファイルまたはディレクトリが作成されています。
- 既存のファイル、デバイス、ディレクトリ、またはボリュームが開かれています。
通常、この IRP は、CreateFile などの Microsoft Win32 関数を呼び出したユーザー モード アプリケーションに代わって、または IoCreateFile、IoCreateFileSpecifyDeviceObjectHint、ZwCreateFile、ZwOpenFile などの関数を呼び出したカーネル モード コンポーネントに代わって送信されます。
作成リクエストが正常に完了すると、アプリケーションまたはカーネル モード コンポーネントはファイル オブジェクトへのハンドルを受け取ります。
操作: ファイル システム ドライバー
ターゲット デバイス オブジェクトがファイル システムの制御デバイス オブジェクトである場合、ファイル システム ドライバーのディスパッチ ルーチンは、Irp->IoStatus.Status と Irp->IoStatus.Information を適切な値に設定し、その後、IRP を完了し、適切な NTSTATUS 値を返す必要があります。
それ以外の場合、ファイル システム ドライバーは作成リクエストを処理する必要があります。
操作: レガシー ファイル システム フィルター ドライバー
ターゲット デバイス オブジェクトが、フィルター ドライバーのコントロール デバイス オブジェクトである場合、フィルター ドライバーのディスパッチ ルーチンは、Irp->IoStatus.Status と Irp->IoStatus.Information を適切な値に設定し、その後、IRP を完了し、適切な NTSTATUS 値を返す必要があります。
それ以外の場合、フィルター ドライバーは必要な処理を実行する必要があります。 次に、フィルターの性質に応じて、IRP を完了するか、スタック上の次に下位のドライバーに IRP を渡す必要があります。
一般に、フィルター ドライバーは、IRP_MJ_CREATE に応答して STATUS_PENDING を返してはいけません。 ただし、下位レベルのドライバーが戻った場合は、STATUS_PENDING、フィルター ドライバーは、このステータス値をドライバー チェーンの上に渡す必要があります。
ファイル システム フィルター ドライバーの作成者は、IoCreateStreamFileObject によって IRP_MJ_CLEANUP 要求がボリュームのファイル システム ドライバー スタックに送信されることに注意する必要があります。 ファイル システムは、しばしば、IRP_MJ_CREATE 以外の操作の副作用としてストリーム ファイル オブジェクトを作成するため、ストリーム ファイル オブジェクトの作成をフィルター ドライバーが確実に検出することは困難です。 したがって、フィルター ドライバーは、以前に表示されていないファイル オブジェクトに対して IRP_MJ_CLEANUP および IRP_MJ_CLOSE 要求を受信することを想定する必要があります。 IoCreateStreamFileObjectLite については、IRP_MJ_CLEANUP 要求が送信されません。
レガシ フィルター ドライバーが作成後のコールバックで作成要求を再発行する場合は、再解析ポイント (補助バッファー) に関連付けられているバッファーを解放して、NULL に設定する必要があります。 レガシ フィルター ドライバーが、このバッファーを解放せずに NULL に設定しない場合は、ドライバーがメモリをリークします。 ミニフィルター ドライバーはフィルター マネージャーがこれを行うため、これを行う必要はありません。
パラメーター
ファイル システムまたはレガシ フィルター ドライバーは、指定された IRP を使用して IoGetCurrentIrpStackLocation を呼び出して、IRP 内の固有のスタックの場所のポインターを取得します。 次のパラメーターでは、Irp は IRP を指し、IrpSp は IO_STACK_LOCATION を指します。 ドライバーは、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用して、作成要求を処理できます。
DeviceObject ターゲット デバイス オブジェクトへのポインターです。
Irp->AssociatedIrp.SystemBuffer は、ファイル オブジェクトが拡張属性を持つファイルを表す場合、FILE_FULL_EA_INFORMATION 構造のバッファーを指します。 それ以外の場合、このメンバーは NULL に設定されます。
Irp->フラグ は、このリクエストの次のフラグに設定されます。
- IRP_CREATE_OPERATION
- IRP_DEFER_IO_COMPLETION
- IRP_SYNCHRONOUS_API
Irp->RequestorMode は、操作を要求したプロセスの実行モード (KernelMode または UserMode) を示します。 SL_FORCE_ACCESS_CHECK フラグが設定されている場合、Irp->RequestorMode が KernelMode であっても、アクセス チェックを実行する必要があります。
Irp->Ioステータス は、最終的な完了ステータスと要求された操作に関する情報を受け取る IO_STATUS_BLOCK構造体を指します。 ファイル システムは、この構造体の Information メンバーを次のいずれかの値に設定します。
- FILE_CREATED
- ファイルが存在しません
- ファイルが存在しています
- ファイル_開始済み
- ファイル_上書き
- FILE_SUPERSEDED
Irp->Overlay.AllocationSize は、ファイルの初期割り当てサイズ (バイト単位) です。 ファイルが作成、上書き、または置き換えられない限り、ゼロ以外の値は効果がありません。
IrpSp->FileObject 作成または開かれるファイルを表すために I/O マネージャーが作成するファイル オブジェクトを指します。 ファイルシステムは、IRP_MJ_CREATE 要求を処理するときに、このファイル オブジェクト内の FsContext フィールドと、場合によっては FsContext2 フィールドを、ファイルシステム固有の値に設定します。 したがって、FsContext フィールドと FsContext2 フィールドの値は、ファイル システムが作成リクエストを処理するまで有効であるとは見なされません。 詳細については、「ファイル ストリーム、ストリーム コンテキスト、ストリームごとのコンテキスト」を参照してください。
FltCancelFileOpen と IoCancelFileOpen は、ファイル オブジェクトのFlagsフィールドに FO_FILE_OPEN_CANCELLED フラグを設定します。 このフラグを設定すると、IRP_MJ_CREATE 要求が取り消され、このファイル・オブジェクトに対して IRP_MJ_CLOSE 要求が発行されます。 作成要求が取り消されると、再発行することはできません。
IrpSp->FileObject パラメーターには、FILE_OBJECT構造体でもある RelatedFileObject フィールドへのポインターが含まれています。 FILE_OBJECT 構造体の RelatedFileObjectフィールドは、指定されたファイルが、すでに開いているファイル オブジェクトに対して相対的に開かれていることを示すために使用されます。 これは通常、相対ファイルがディレクトリであることを示しますが、ストリームベースのファイルは、ファイルの既存のストリームを基準にして開かれる可能性があります。 FILE_OBJECT 構造体の RelatedFileObject フィールドは、IRP_MJ_CREATE の処理中にのみ有効です。
IrpSp->フラグ は、次の 1 つ以上の値に設定できます。
フラグ 意味 SL_FORCE_ACCESS_CHECK 0x01 このフラグが設定されている場合は、IRP->RequestorMode の値が KernelMode の場合でも、アクセス チェックを実行する必要があります。 SL_OPEN_PAGING_FILE 0x02 このフラグが設定されている場合、ファイルはページング ファイルです。 SL_OPEN_TARGET_DIRECTORY 0x04 このフラグが設定されている場合は、ファイルの親ディレクトリを開く必要があります。 SL_STOP_ON_SYMLINK 0x08 このフラグが設定されている場合、I/O マネージャーによるジャンクションとシンボリック リンクの自動トラバースが抑制され、ジャンクションとシンボリック リンクを開いたときに STATUS_REPARSE が返されます。 SL_IGNORE_READONLY_ATTRIBUTE 0x40 このフラグが設定されている場合、FILE_DELETE_ON_CLOSE オプションを使用して読み取り専用ファイルを作成できます。 このオプションを指定すると、ハンドルが閉じられたときにファイルが削除されます。 SL_CASE_SENSITIVE 0x80 設定した場合、ファイル名の比較では大文字と小文字が区別される必要があります。 IrpSp->主要機能 は IRP_MJ_CREATE に設定されます。
IrpSp->Parameters.Create.EaLength は、Irp->AssociatedIrp.SystemBuffer のバッファーのサイズ (バイト単位) です。 Irp*->AssociatedIrp.SystemBuffer の値が NULL の場合、このメンバーは 0 である必要があります。
IrpSp->Parameters.Create.FileAttributes ファイルを作成または開くときに適用される属性フラグのビットマスクです。 明示的に指定された属性は、ファイルが作成されるか、置き換えられるか、場合によっては上書きされる場合にのみ適用されます。 デフォルトでは、この値は FILE_ATTRIBUTE_NORMAL で、他のフラグまたは互換性のあるフラグの OR の組み合わせでオーバーライドできます。 このメンバーは、IoCreateFileSpecifyDeviceObjectHint の FileAttributes パラメーターに対応します。
IrpSp->Parameters.Create.Options は、ファイルを作成または開くときに適用されるオプションと、ファイルがすでに存在する場合に実行されるアクションを指定するフラグのビットマスクです。
このパラメーターの上位 8 ビットは、Disposition パラメーターから IoCreateFileSpecifyDeviceObjectHint に対応します。
このメンバーの下位 24 ビットは、IoCreateFileSpecifyDeviceObjectHint の CreateOptions パラメーターに対応します。 ファイル スキャンを実行するファイル システム フィルターおよびミニフィルター ドライバー (ウイルス対策プログラムなど) は、FILE_COMPLETE_IF_OPLOCKED フラグに特に注意する必要があります。 このフラグが設定されている場合、フィルターは IRP_MJ_CREATE 操作をブロックしたり遅延させたりしてはなりません。
FILE_COMPLETE_IF_OPLOCKED フラグが作成前 (ディスパッチ作成) パスに設定されている場合、フィルターは次のタイプの操作を開始してはなりません。oplock が中断される可能性があるためです。
- IRP_MJ_CLEANUP
- IRP_MJ_CREATE
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_READ
- IRP_MJ_SET_INFORMATION
- IRP_MJ_WRITE
フィルターまたはミニフィルターが FILE_COMPLETE_IF_OPLOCKED フラグを受け入れることができない場合は、STATUS_SHARING_VIOLATION を指定して IRP_MJ_CREATE リクエストを完了する必要があります。
完了 (作成後) パスに FILE_COMPLETE_IF_OPLOCKED フラグが設定されている場合、フィルターは、ファイル システムが Irp->IoStatus.Status をSTATUS_OPLOCK_BREAK_IN_PROGRESS状態値に設定しているかどうかを確認する必要があります。 このステータス値が設定されていない場合、フィルターはファイルに対して上記の操作のいずれかを安全に開始できます。 このステータス値が設定されている場合、oplock はまだ解除されていないため、フィルターは oplock の解除を引き起こす可能性のある操作を開始してはなりません。 したがって、フィルタは、次の条件のいずれかが当てはまるまで、ファイルに対する上記の操作をすべて延期する必要があります。
- oplock の所有者は、FSCTL_OPLOCK_BREAK_ACKNOWLEDGE リクエストをファイル システムに送信します。
- フィルターまたはミニフィルター以外のシステム コンポーネントは、oplock ブレークが完了するまで待機する必要がある I/O 要求をファイル システムに送信します (IRP_MJ_READ または IRP_MJ_WRITE など)。 フィルターまたはミニフィルターは、この新しい操作のディスパッチ (または操作前コールバック) ルーチンから上記の操作のいずれかを開始できます。これは、ディスパッチまたは操作前コールバック ルーチンが oplock ブレークが完了するまで待機状態になるためです。
*IrpSp->Parameters.Create.SecurityContext->アクセス状態 を指す ACCESS_STATE オブジェクトのサブジェクト コンテキスト、許可されたアクセス タイプ、および残りの必要なアクセス タイプを含む構造。
IrpSp->Parameters.Create.SecurityContext->必要なアクセス は、ACCESS_MASKファイルに要求されるアクセス権を指定する構造。 詳細については、IoCreateFileSpecifyDeviceObjectHint への DesiredAccess パラメーターの説明を参照してください。
IrpSp->Parameters.Create.ShareAccess は、ファイルに対して要求された共有アクセス権のビットマスクです。 このパラメーターが 0 の場合、排他アクセスが要求されています。 詳細については、IoCreateFileSpecifyDeviceObjectHint に対する ShareAccess パラメータの説明を参照してください。
関連項目
IoCreateFileSpecifyDeviceObjectHint