次の方法で共有


FltGetFileNameInformation 関数 (fltkernel.h)

FltGetFileNameInformation ルーチンは、ファイルまたはディレクトリの名前情報を返します。

構文

NTSTATUS FLTAPI FltGetFileNameInformation(
  [in]  PFLT_CALLBACK_DATA         CallbackData,
  [in]  FLT_FILE_NAME_OPTIONS      NameOptions,
  [out] PFLT_FILE_NAME_INFORMATION *FileNameInformation
);

パラメーター

[in] CallbackData

I/O 操作のコールバック データ構造である FLT_CALLBACK_DATA 構造体へのポインター。 このパラメーターは必須であり、NULL することはできません。

[in] NameOptions

返される名前情報の形式とフィルター マネージャーが使用するクエリ メソッドを指定するフラグを含む FLT_FILE_NAME_OPTIONS 値。 呼び出し元には、名前形式フラグとクエリ メソッド フラグを含める必要があります。 名前プロバイダーのミニフィルター ドライバーで追加のフラグを使用して、名前クエリ オプションを指定できます。 このパラメーターは必須であり、NULL することはできません。

ファイル名形式のフラグ値を次に示します。 次のいずれかのフラグのみを指定できます。 これらの形式の説明については、FLT_FILE_NAME_INFORMATIONを参照してください。

名前書式フラグの値 意味
FLT_FILE_NAME_NORMALIZED FileNameInformation パラメーターは、ファイルの正規化された名前を含む構造体のアドレスを受け取ります。
FLT_FILE_NAME_OPENED FileNameInformation パラメーターは、ファイルを開いたときに使用された名前を含む構造体のアドレスを受け取ります。
FLT_FILE_NAME_SHORT FileNameInformation パラメーターは、ファイルの短い (8.3) 名を含む構造体のアドレスを受け取ります。 短い名前は最大 8 文字で構成され、その直後にピリオドが続き、さらに 3 文字まで続きます。 ファイルの短い名前には、ボリューム名、ディレクトリ パス、またはストリーム名は含まれません。 事前作成パスでは無効です。

ファイル名クエリ メソッドのフラグ値を次に示します。 次のいずれかのフラグのみを指定できます。

Query メソッドのフラグ値 意味
FLT_FILE_NAME_QUERY_DEFAULT 現在、ファイル名をファイル システムに照会しても安全でない場合は、FltGetFileNameInformation 何も行いません。 それ以外の場合は、FltGetFileNameInformation ファイル名情報をフィルター マネージャーの名前キャッシュに照会します。 名前がキャッシュに見つからない場合は、FltGetFileNameInformation ファイル システムに対してクエリを実行し、結果をキャッシュします。
FLT_FILE_NAME_QUERY_CACHE_ONLY FltGetFileNameInformation 、フィルター マネージャーの名前キャッシュに対してファイル名情報を照会します。 FltGetFileNameInformation は、ファイル システムに対してクエリを実行しません。
FLT_FILE_NAME_QUERY_FILESYSTEM_ONLY FltGetFileNameInformation ファイル名情報をファイル システムに照会します。 FltGetFileNameInformation フィルター マネージャーの名前キャッシュに対してクエリを実行せず、ファイル システム クエリの結果をキャッシュしません。
FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP FltGetFileNameInformation 、フィルター マネージャーの名前キャッシュに対してファイル名情報を照会します。 名前がキャッシュに見つからず、現在安全に実行できる場合は、FltGetFileNameInformation ファイル名情報をファイル システムに照会し、結果をキャッシュします。

名前プロバイダーのミニフィルターでは、次のフラグを使用して、ファイル名の操作のプロパティを指定します。

Name Provider Flag Value 意味
FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER 名前プロバイダーのミニフィルターでは、このフラグを使用して、名前クエリ要求をスタック内の下位の名前プロバイダーが満たすのではなく、名前クエリ要求をそれ自体 (名前プロバイダー ミニフィルター) にリダイレクトするように指定できます。
FLT_FILE_NAME_DO_NOT_CACHE このフラグは、このクエリから取得した名前をキャッシュしないことを示します。 名前プロバイダーのミニフィルターは、中間クエリを実行して名前を生成する場合に、このフラグを使用します。
FLT_FILE_NAME_ALLOW_QUERY_ON_REPARSE 名前プロバイダーのミニフィルターでは、このフラグを使用して、STATUS_REPARSEが返された場合でも、作成後のパスの名前に対してクエリを実行しても安全であることを指定できます。 FileObject->FileName フィールドが変更されていないことを確認するのは呼び出し元の責任です。 マウント・ポイントまたはシンボリック・リンクの再解析ポイントでは、このフラグを使用しないでください。

[out] FileNameInformation

ファイル名情報を含むシステム割り当て FLT_FILE_NAME_INFORMATION 構造体のアドレスを受け取る呼び出し元割り当て変数へのポインター。 FltGetFileNameInformation ページ プールからこの構造体を割り当てます。 このパラメーターは必須であり、NULL することはできません。

戻り値

名前情報が正常に返された場合、FltGetFileNameInformation はSTATUS_SUCCESSを返します。 それ以外の場合は、次のいずれかの適切な NTSTATUS 値を返します。

リターン コード 形容
STATUS_FLT_INVALID_NAME_REQUEST

FltGetFileNameInformation 、フィルター マネージャーの名前キャッシュからクエリを満たすことができない場合、次の状況ではファイル名の情報を取得できません。

  • ページング I/O パス内。
  • 現在のスレッドの TopLevelIrp フィールドが NULL されていない場合は、結果として生成されるファイル システムの再帰によってデッドロックまたはスタック オーバーフローが発生する可能性があるためです。 (この問題の詳細については、IoGetTopLevelIrp を参照してください)。
  • IRP_MJ_CLEANUP 操作が完了した後。つまり、クリーンアップ後、閉じる前、または閉じた後のパス (ターゲット ファイル オブジェクトに FO_CLEANUP_COMPLETE フラグが設定されています)。
  • 次のいずれかの操作の事前操作 (PFLT_PRE_OPERATION_CALLBACK) または事後操作 (PFLT_POST_OPERATION_CALLBACK) コールバック ルーチンの場合:
    • IRP_MJ_ACQUIRE_FOR_CC_FLUSH
    • IRP_MJ_ACQUIRE_FOR_MOD_WRITE
    • IRP_MJ_RELEASE_FOR_CC_FLUSH
    • IRP_MJ_RELEASE_FOR_MOD_WRITE
    • IRP_MJ_RELEASE_FOR_SECTION_SYNCHRONIZATION
  • IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATIONの事後操作コールバック ルーチン内。
  • すべての APCs が無効になっている場合。つまり、KeAreAllApcsDisabled が TRUE を返す場合です。

FltGetFileNameInformation は、事前作成パス内のファイルの短い名前を取得できません。

STATUS_FLT_INVALID_NAME_REQUESTはエラー コードです。

STATUS_INSUFFICIENT_RESOURCES
FltGetFileNameInformation プール割り当てエラーが発生しました。 これはエラー コードです。
STATUS_INVALID_PARAMETER
次のいずれかの無効なパラメーターが渡されたときに返されます。
  • FileNameInformation パラメーターを NULL することはできません。
  • CallbackData パラメーターを NULL することはできません。
STATUS_INVALID_PARAMETERはエラー コードです。
STATUS_FLT_NAME_CACHE_MISS
ファイル名の情報が名前キャッシュに見つからず、NameOptions FLT_FILE_NAME_QUERY_CACHE_ONLYが含まれています。

-又は-

NameOptions にFLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUPが含まれており、ファイル名情報をファイル システムから照会できない場合、ファイル名情報は名前キャッシュに見つかりません。

NameOptions にFLT_FILE_NAME_QUERY_FILESYSTEM_ONLYが設定された FltGetFileNameInformation する追加の呼び出し は、ファイル名の情報を返す場合があります。

STATUS_NOT_SAME_DEVICE
事前作成中に照会されるファイルは、親ディレクトリとは異なるボリューム上にあります。 このエラーは、正規化された名前クエリで返されます。ファイルは、別のボリュームに解決されたジャンクションまたはシンボリック リンクでした。
STATUS_ACCESS_DENIED
ユーザーがファイル ID でファイルを開いたが、パス全体に対する走査特権がない場合、FltGetFileNameInformation は、この戻り値で失敗します。

STATUS_ACCESS_DENIEDはエラー コードです。

-又は-

ファイルは、すべてのアクセスが拒否されたシステム ファイルです。

備考

FltGetFileNameInformation は、CallbackData によって記述された操作のターゲットであるファイルまたはディレクトリの要求された名前情報指定した形式で返します。 ファイルまたはディレクトリをファイル システムでまだ開く必要はありません。

事前作成操作の場合、CallbackData->Iopb->OperationFlags メンバーにSL_OPEN_TARGET_DIRECTORYビットごとのフラグが含まれている場合、FltGetFileNameInformation は、指定されたファイルの包含 (親) ディレクトリの名前を返します。 この名前は、作成操作が開く実際のパスです。

FltGetFileNameInformation によって返されるFLT_FILE_NAME_INFORMATION構造体の内容解析するには、FltParseFileNameInformation 呼び出します。 (ファイル名の形式の詳細については、FLT_FILE_NAME_INFORMATIONを参照してください)。

FltGetFileNameInformation 正常に呼び出された後、呼び出し元は、ポインターが不要になったときに、FileNameInformation パラメーターで返されたポインターを解放する必要があります。 呼び出し元は、fltReleaseFileNameInformation 呼び出すことによってこれを行います。

呼び出し元は、FileNameInformation パラメーターで返される構造体の内容を変更しないでください。この構造体はフィルター マネージャーによってキャッシュされるため、すべてのミニフィルター ドライバーで使用できます。

FltGetFileNameInformation 、開かれた名前を取得する作成操作の事前操作コールバック ルーチンで呼び出された場合、開いているファイルへのパスがボリューム上に存在しない場合でも、FltGetFileNameInformation 成功します。

作成操作 fltGetFileNameInformation が、正規化された名前を取得するための事前操作コールバック ルーチンで呼び出された場合、開いているファイルへのパスの最後のコンポーネントがボリューム上に存在しない場合でも、FltGetFileNameInformation は成功します。

手記

リモート ボリュームで正規化されたファイル名のクエリを実行するためのサーバー メッセージ ブロック (SMB) のサポートは、Windows 10 のバージョンによって異なります。 詳細については、MS-SMB2 プロトコルの を参照してください。

作成、ハード リンク、および名前変更の操作では、ファイル名トンネリングによって、ミニフィルター ドライバーが事前操作コールバック ルーチンで取得する正規化されたファイル名情報の最終的なコンポーネントが無効になる可能性があります。 ミニフィルター ドライバーは、FltGetFileNameInformationなどのルーチンを呼び出すことによって、事前操作コールバック (PFLT_PRE_OPERATION_CALLBACK) ルーチンで正規化されたファイル名情報を取得する場合は、その後のコールバック (PFLT_POST_OPERATION_CALLBACK) ルーチンから FltGetTunneledName を呼び 出して、ファイルの正しいファイル名情報を取得する必要があります。

Windows 8.1 以前の場合、fltGetFileNameInformation には、フィルターの事前作成コールバックから呼び出された場合にのみストリームの種類 含めることができます。 ファイルの既定のストリームとメタデータ ストリームを区別するには、事前作成操作でこの呼び出しを行う必要があります。 結果のストリームの種類は、ファイルの有効期間中も有効なままです。

Windows 8 より前のバージョンでは、フィルター マネージャーはファイル パスの各コンポーネントの名前情報を収集することで、ファイルまたはディレクトリの正規化された名前を取得しました。 これには、完全なパスをコンパイルするために、ファイル システムに対する複数のクエリが必要です。 Windows 8 以降では、ローカル ファイル システムは fileNormalizedNameInformation ファイル情報クラス をサポートしており、正規化された名前を取得するために必要なクエリは 1 つだけです。 リモート ファイル システムは、fileNormalizedNameInformation ファイル情報クラス をサポートしていない可能性があります。 この場合でも、正規化された名前をアセンブルするには、ファイル パスの各コンポーネントのクエリが必要です。 特定のネットワーク条件下では、フル ネーム クエリの完了にかなりの時間が必要になる場合があります。

正規化されたファイル名の情報の詳細については、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)

必要条件

要件 価値
ターゲット プラットフォーム 万国
ヘッダー fltkernel.h (Fltkernel.h を含む)
ライブラリ FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL (戻り値を参照)

関連項目

FLT_CALLBACK_DATA

FLT_FILE_NAME_INFORMATION

FLT_FILE_NAME_OPTIONS

FltGetDestinationFileNameInformation

FltGetFileNameInformationUnsafe

FltGetTunneledName する

FltParseFileNameInformation

FltReferenceFileNameInformation

FltReleaseFileNameInformation

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK