FltGetDestinationFileNameInformation 関数 (fltkernel.h)
FltGetDestinationFileNameInformation ルーチンは、変換先の親ディレクトリのファイル名に対してクエリを実行し、名前が変更されているファイルまたはディレクトリ、または NTFS ハード リンクが作成されているファイルまたはディレクトリの完全な宛先パス名を作成します。
構文
NTSTATUS FLTAPI FltGetDestinationFileNameInformation(
[in] PFLT_INSTANCE Instance,
[in] PFILE_OBJECT FileObject,
[in, optional] HANDLE RootDirectory,
[in] PWSTR FileName,
[in] ULONG FileNameLength,
[in] FLT_FILE_NAME_OPTIONS NameOptions,
[out] PFLT_FILE_NAME_INFORMATION *RetFileNameInformation
);
パラメーター
[in] Instance
ファイルが存在するボリュームにアタッチされているミニフィルター ドライバー インスタンスの不透明なインスタンス ポインター。
[in] FileObject
ファイルのファイル オブジェクトへのポインター。 このパラメーターは必須であり、NULL にすることはできません。
[in, optional] RootDirectory
リンク操作の場合: リンク先のファイルと同じディレクトリにリンクを作成する場合、または FileName に作成するリンクの完全なパス名が含まれている場合、このパラメーターは NULL です。 それ以外の場合は、リンクを作成するディレクトリのハンドルです。
名前変更操作の場合: ファイルが別のディレクトリに移動されていない場合、または FileName に完全なパス名が含まれている場合、このパラメーターは NULL です。 それ以外の場合は、ファイルの名前が変更された後に存在するディレクトリのハンドルです。
[in] FileName
リンク操作の場合: 新しく作成されたリンクに割り当てる名前を含むワイド文字列へのポインター。
名前変更操作の場合: ファイルの新しい名前を含むワイド文字列へのポインター。
[in] FileNameLength
FileName が指すワイド文字列の長さ (バイト単位)。
[in] NameOptions
返される名前情報の形式、フィルター マネージャーで使用するクエリ メソッド、および追加のファイル名フラグを指定するフラグを含むFLT_FILE_NAME_OPTIONS値。 このパラメーターは必須であり、NULL にすることはできません。
名前書式フラグの値を次に示します。 名前書式フラグを 1 つだけ指定できます。 (FLT_FILE_NAME_SHORTはこのパラメーターの有効なフラグ値ではないことに注意してください)。
名前書式フラグ値 | 意味 |
---|---|
FLT_FILE_NAME_NORMALIZED | FileName パラメーターは、ファイルの正規化された宛先名を受け取ります。 |
FLT_FILE_NAME_OPENED | FileName パラメーターは、ファイルを開いたときに使用された名前に基づいて、ファイルの宛先名を受け取ります。 このファイル名は正規化されません。 |
クエリ メソッドのフラグ値を次に示します。 指定できるクエリ メソッド フラグは 1 つだけです。
Query メソッド フラグ値 | 意味 |
---|---|
FLT_FILE_NAME_QUERY_DEFAULT | 現在、ファイル システムに対して宛先ファイル名のクエリを実行しても安全でない場合、 FltGetDestinationFileNameInformation では何も実行されません。 それ以外の場合、 FltGetDestinationFileNameInformation は、フィルター マネージャーの名前キャッシュに対して、宛先の親ディレクトリのファイル名情報を照会し、宛先名を追加します。 結果の名前がキャッシュに見つからない場合、 FltGetDestinationFileNameInformation はファイル システムに対してクエリを実行し、結果をキャッシュします。 |
FLT_FILE_NAME_QUERY_CACHE_ONLY | FltGetDestinationFileNameInformation は、フィルター マネージャーの名前キャッシュに対して、宛先の親ディレクトリのファイル名情報を照会し、宛先名を追加します。 ファイル システムに対するクエリは実行されません。 |
FLT_FILE_NAME_QUERY_FILESYSTEM_ONLY | FltGetDestinationFileNameInformation は、ファイル システムに対して、変換先の親ディレクトリのファイル名情報を照会し、宛先名を追加します。 フィルター マネージャーの名前キャッシュに対してクエリを実行せず、ファイル システム クエリの結果をキャッシュしません。 |
FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP | FltGetDestinationFileNameInformation は、フィルター マネージャーの名前キャッシュに対して、宛先の親ディレクトリのファイル名情報を照会し、宛先名を追加します。 キャッシュに名前が見つかっていなくても、現在安全に実行できる場合、 FltGetDestinationFileNameInformation はファイル システムに対してファイル名情報を照会し、結果をキャッシュします。 |
ファイル名フラグの値を次に示します。 これらのフラグの任意の組み合わせを指定できます。 ( fltGetDestinationFileNameInformation は作成後のコールバックでは使用されないため、FLT_FILE_NAME_ALLOW_QUERY_ON_REPARSEはこのパラメーターに関連するフラグではないことに注意してください)。
ファイル名フラグ値 | 意味 |
---|---|
FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER | FltGetDestinationFileNameInformation は、名前要求を呼び出し元のフィルター インスタンスに送信して完了します。 |
FLT_FILE_NAME_DO_NOT_CACHE | FltGetDestinationFileNameInformation は、取得したファイル名をキャッシュしません。 名前プロバイダーのミニフィルターは、中間クエリを実行して名前を生成する際に、このフラグを使用します。 |
[out] RetFileNameInformation
ファイル名情報を含むシステム割り当て FLT_FILE_NAME_INFORMATION 構造体のアドレスを受け取る呼び出し元によって割り当てられた変数へのポインター。 FltGetDestinationFileNameInformation は、この構造体をページ プールから割り当てます。 このパラメーターは必須であり、NULL にすることはできません。
戻り値
FltGetDestinationFileNameInformation は、次のいずれかのSTATUS_SUCCESSまたは適切な NTSTATUS 値を返します。
リターン コード | 説明 |
---|---|
STATUS_FLT_INVALID_NAME_REQUEST | この値は、次のいずれかの理由で返されます。(1) 現在のスレッドの TopLevelIrp フィールドが NULL でない場合、FltGetDestinationFileNameInformation はファイル名情報を取得できません。結果としてファイル システムの再帰によってデッドロックやスタック オーバーフローが発生する可能性があるためです。 (2) NameOptions パラメーターの名前書式フラグにFLT_FILE_NAME_SHORTが指定されました。 |
STATUS_INSUFFICIENT_RESOURCES | FltGetDestinationFileNameInformation でプール割り当てエラーが発生しました。 これはエラー コードです。 |
STATUS_INVALID_PARAMETER | NameOptions パラメーターに無効な値が指定されました。 これはエラー コードです。 |
STATUS_MOUNT_POINT_NOT_RESOLVED | 宛先パス名には、ファイルが存在するボリューム以外のボリュームに解決されるマウント ポイントが含まれています。 (名前変更操作またはハード リンク作成操作はボリューム内でのみ実行でき、ボリューム間では実行できないため、操作は失敗します)。これはエラー コードです。 |
注釈
ミニフィルターは通常、名前変更またはハード リンク作成操作の事前操作コールバック ルーチンで FltGetDestinationFileNameInformation を呼び出します。これは、宛先ファイル名が存在しない可能性が最も高いことを意味します。 "destination" 名は次のとおりです。
- ファイルの名前変更の場合、名前の変更が成功した場合にファイルに付ける名前。 たとえば、 name1 の 名前を name2 に変更する場合、 name2 は宛先名になります。
- ハード リンク作成操作の場合、ファイル システムに追加される名前。 たとえば、name1 という名前の既存のファイルにハード リンク名 2 を追加する場合、name2 は宛先名です。
FltGetDestinationFileNameInformation は、正規化されたファイルまたは "開かれたファイル" 形式の宛先ファイル名情報を返します。 これらの形式の詳細については、 FLT_FILE_NAME_INFORMATION 構造に関するページを参照してください。
FileObject パラメーターに渡されるファイル オブジェクト ポインターは、操作のFLT_RELATED_OBJECTS構造体の FileObject メンバーか、操作の Data-Iopb-TargetFileObject>> ポインターである必要があります。ここで、Data は操作のコールバック データ構造 (FLT_CALLBACK_DATA)。 このフィールドはファイル システム間で一様に使用されないため、ファイル オブジェクト ポインターを Data-Iopb-Parameters.SetFileInformation.FileObject>> メンバーにすることはできません。
ユーザーがファイル ID を使用してファイルを開いたが、パス全体に対する走査特権がない場合、 FltGetDestinationFileNameInformation は、ユーザーが特権を持つパスの一部のみを返します。
名前変更操作またはハード リンク作成操作は、ボリューム内でのみ実行でき、ボリューム間では実行できません。 そのため、宛先パス名に、ファイルが存在するボリューム以外のボリュームに解決されるマウント ポイントが含まれている場合、このような操作は失敗します。 名前変更操作の詳細については、 FILE_RENAME_INFORMATION 構造体に関するページを参照してください。 ハード リンク作成操作の詳細については、 FILE_LINK_INFORMATION 構造体に関するページを参照してください。
FltGetDestinationFileNameInformation の呼び出しが正常に行われると、呼び出し元は FltReleaseFileNameInformation を呼び出して不要になったときに、RetFileNameInformation パラメーターで返されるポインターを解放する必要があります。
呼び出し元は、 RetFileNameInformation パラメーターで返される構造体の内容を変更しないでください。この構造体はフィルター マネージャーによってキャッシュされ、すべてのミニフィルター ドライバーで使用できるためです。
作成、ハードリンク、および名前変更の操作では、ファイル名トンネリングによって、ミニフィルター ドライバーが事前操作コールバック ルーチンで取得する正規化されたファイル名情報の最終的なコンポーネントが無効になる可能性があります。 ミニフィルター ドライバーは、FltGetDestinationFileNameInformation などのルーチンを呼び出すことによって、事前操作コールバック (PFLT_PRE_OPERATION_CALLBACK) ルーチンで正規化されたファイル名情報を取得する場合は、その後操作コールバック ルーチンから FltGetTunneledName を呼び出して、ファイルの正しいファイル名情報を取得する必要があります。
正規化されたファイル名の情報の詳細については、「 FLT_FILE_NAME_INFORMATION」を参照してください。
ファイル名トンネリングは、この方法で作成、ハードリンク、名前変更の操作にのみ影響します。 読み取りと書き込みなど、他の I/O 操作には影響しません。
次のペアの操作により、ファイル 名 がトンネリングされる可能性があります。
- delete(name)/create(name)
- delete(name)/rename(source, name)
- rename(name, newname)/create(name)
- rename(name, newname)/rename(source, name)
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
Header | fltkernel.h (Fltkernel.h を含む) |
Library | FltMgr.lib |
[DLL] | Fltmgr.sys |
IRQL | <= APC_LEVEL |
こちらもご覧ください
FltGetFileNameInformationUnsafe