FILE_OBJECT 構造体 (wdm.h)

FILE_OBJECT構造体は、ファイル オブジェクトを表すためにシステムによって使用されます。 ユーザー モードで保護されたサブシステムの場合、ファイル オブジェクトは、ファイル、デバイス、ディレクトリ、またはボリュームの開いているインスタンスを表します。 デバイス ドライバーと中間ドライバーでは、通常、ファイル オブジェクトはデバイス オブジェクトを表します。 ファイル システム スタック内のドライバーでは、通常、ファイル オブジェクトはディレクトリまたはファイルを表します。

ファイル オブジェクトは部分的に不透明です。 ファイル システム ドライバーやネットワーク トランスポート ドライバーなど、特定の種類のドライバーでは、ファイル オブジェクトのフィールドの一部が使用されます。

構文

typedef struct _FILE_OBJECT {
  CSHORT                            Type;
  CSHORT                            Size;
  PDEVICE_OBJECT                    DeviceObject;
  PVPB                              Vpb;
  PVOID                             FsContext;
  PVOID                             FsContext2;
  PSECTION_OBJECT_POINTERS          SectionObjectPointer;
  PVOID                             PrivateCacheMap;
  NTSTATUS                          FinalStatus;
  struct _FILE_OBJECT               *RelatedFileObject;
  BOOLEAN                           LockOperation;
  BOOLEAN                           DeletePending;
  BOOLEAN                           ReadAccess;
  BOOLEAN                           WriteAccess;
  BOOLEAN                           DeleteAccess;
  BOOLEAN                           SharedRead;
  BOOLEAN                           SharedWrite;
  BOOLEAN                           SharedDelete;
  ULONG                             Flags;
  UNICODE_STRING                    FileName;
  LARGE_INTEGER                     CurrentByteOffset;
  __volatile ULONG                  Waiters;
  __volatile ULONG                  Busy;
  PVOID                             LastLock;
  KEVENT                            Lock;
  KEVENT                            Event;
  __volatile PIO_COMPLETION_CONTEXT CompletionContext;
  KSPIN_LOCK                        IrpListLock;
  LIST_ENTRY                        IrpList;
  __volatile PVOID                  FileObjectExtension;
} FILE_OBJECT, *PFILE_OBJECT;

メンバー

Type

オブジェクトがファイル オブジェクトであることを示すためにシステムによって使用される読み取り専用メンバー。 オブジェクトがファイル オブジェクトの場合、このメンバーの値は 5 です。

Size

ファイル オブジェクトのサイズをバイト単位で指定する読み取り専用メンバー。 このサイズには、ファイル オブジェクト拡張子が存在する場合は含まれません。

DeviceObject

ファイルを開くデバイス オブジェクトへのポインター。

Vpb

ファイル オブジェクトに関連付けられているボリューム パラメーター ブロックへのポインター。

Vpb メンバーが NULL 以外の場合、ファイルはマウントされたボリューム上に存在します。

FsContext

ドライバーがファイル オブジェクトについて保持する任意の状態へのポインター。それ以外の場合は NULL。 ファイル システム ドライバーの場合、このメンバーは、ファイル システム固有の構造体内に含まれる FSRTL_ADVANCED_FCB_HEADER ヘッダー構造を指す必要があります。そうしないと、システムが不安定になる可能性があります。 通常、このヘッダー構造はファイル制御ブロック (FCB) に埋め込まれます。 ただし、NTFS などの複数のデータ ストリームをサポートする一部のファイル システムでは、このヘッダー構造はストリーム制御ブロック (SCB) です。

WDM デバイス スタックでは、機能デバイス オブジェクト (FDO) のみが 2 つのコンテキスト ポインターを使用できます。 ファイル システム ドライバーは、同じデータ ストリームに対して複数のオープン間でこのメンバーを共有します。

FsContext2

ドライバーがファイル オブジェクトに関して保持する追加の状態へのポインター。それ以外の場合は NULL

このメンバーは、基になるファイル システムがこのメンバーを利用するため、ファイル システム スタック内のドライバーでは不透明です。

SectionObjectPointer

ファイル オブジェクトの読み取り専用セクション オブジェクトへのポインター。 このメンバーはファイル システムによってのみ設定され、キャッシュ マネージャーの操作に使用されます。

PrivateCacheMap

ファイル システムによってのみ設定され、ハンドル固有の情報を指し、キャッシュ マネージャーの操作に使用される不透明なメンバー。

FinalStatus

特定の同期ケースで、ファイル オブジェクトの I/O 要求の最終的な状態を示すために使用される読み取り専用メンバー。

RelatedFileObject

現在のファイル オブジェクトが既に開いているファイル オブジェクトを基準にして開かれていることを示すために使用される、 FILE_OBJECT 構造体へのポインター。 このメンバーが指すファイル オブジェクトは、通常はディレクトリです (つまり、現在のファイルはこのディレクトリを基準にして開かれています)。 ただし、ファイル自体を基準にして再度開くこともできます。また、同じファイルに対して既に開いているプライマリ データ ストリームを基準にして、ファイルの代替データ ストリームを開くことができます。 RelatedFileObject メンバーは、IRP_MJ_CREATE要求の処理中にのみ有効です。

LockOperation

読み取り専用メンバー。 FALSE の場合、ファイル オブジェクトに対してロック操作 (NtLockFile) は実行されていません。 TRUE の場合、ファイル オブジェクトに対して少なくとも 1 つのロック操作が実行されています。 TRUE に設定すると、このメンバーは常に TRUE のままです (たとえば、ファイル オブジェクトのファイル ロックを解放しても、このメンバーは FALSE にリセットされません)。

DeletePending

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルの削除操作が存在します。 FALSE の場合、現在、ファイル オブジェクトに対する保留中の削除操作はありません。

ReadAccess

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルが読み取りアクセス用に開かれています。 FALSE の場合、ファイルは読み取りアクセス権なしで開かれています。 この情報は、ファイルの共有アクセスを確認または設定するときに使用されます。

WriteAccess

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルは書き込みアクセス用に開かれています。 FALSE の場合、ファイルは書き込みアクセス権なしで開かれています。 この情報は、ファイルの共有アクセスを確認または設定するときに使用されます。

DeleteAccess

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルは、削除アクセス用に開かれています。 FALSE の場合、ファイルは削除アクセスなしで開かれています。 この情報は、ファイルの共有アクセスを確認または設定するときに使用されます。

SharedRead

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルは、読み取り共有アクセス用に開かれています。 FALSE の場合、ファイルは読み取り共有アクセス権なしで開かれています。 この情報は、ファイルの共有アクセスを確認または設定するときに使用されます。

SharedWrite

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルは、書き込み共有アクセス用に開かれています。 FALSE の場合、ファイルは書き込み共有アクセス権なしで開かれています。 この情報は、ファイルの共有アクセスを確認または設定するときに使用されます。

SharedDelete

読み取り専用メンバー。 TRUE の場合、ファイル オブジェクトに関連付けられているファイルは、共有アクセスを削除するために開かれています。 FALSE の場合、ファイルは共有アクセスを削除せずに開かれています。 この情報は、ファイルの共有アクセスを確認または設定するときに使用されます。

Flags

次のプライベート フラグ値の 1 つ以上 (ビットごとの包含 OR の組み合わせ) を保持するためにシステムによって使用される読み取り専用メンバー。

フラグ 説明
FO_FILE_OPEN 非推奨になりました。
FO_SYNCHRONOUS_IO 同期 I/O 用にファイル オブジェクトが開かれます。
FO_ALERTABLE_IO このファイル オブジェクトに対する要求の結果として、I/O マネージャー内の待機は警告可能です。
FO_NO_INTERMEDIATE_BUFFERING ファイル オブジェクトに関連付けられているファイルを、ドライバーの内部バッファーにキャッシュまたはバッファーすることはできません。
FO_WRITE_THROUGH ファイルにデータを書き込むシステム サービス、ファイル システム ドライバー、ドライバーは、要求された書き込み操作が完了したと見なされる前に、ファイルにデータを転送する必要があります。
FO_SEQUENTIAL_ONLY ファイル オブジェクトに関連付けられているファイルは、順次 I/O 操作でのみ開かれました。
FO_CACHE_SUPPORTED ファイル オブジェクトに関連付けられているファイルはキャッシュ可能です。 このフラグは、ファイル システム ドライバーによってのみ設定され、 FsContext メンバーが有効な FSRTL_ADVANCED_FCB_HEADER 構造体を指している場合にのみ設定する必要があります。
FO_NAMED_PIPE file オブジェクトは名前付きパイプを表します。
FO_STREAM_FILE ファイル オブジェクトは、ファイル ストリームを表します。
FO_MAILSLOT ファイル オブジェクトは mailslot を表します。
FO_GENERATE_AUDIT_ON_CLOSE 非推奨になりました。
FO_QUEUE_IRP_TO_THREAD IRP はこのファイル オブジェクトにキューに登録されません。
FO_DIRECT_DEVICE_OPEN このファイル オブジェクトの対象となるデバイスが直接開かれました。
FO_FILE_MODIFIED ファイル オブジェクトに関連付けられているファイルが変更されました。
FO_FILE_SIZE_CHANGED ファイル オブジェクトに関連付けられているファイルのサイズが変更されました。
FO_CLEANUP_COMPLETE ファイル システムは、このファイル オブジェクトのクリーンアップを完了しました。
FO_TEMPORARY_FILE ファイル オブジェクトに関連付けられているファイルは、一時ファイルです。
FO_DELETE_ON_CLOSE ファイル オブジェクトに関連付けられているファイルは、閉じるとファイル システムによって削除されます。
FO_OPENED_CASE_SENSITIVE ファイル オブジェクトに関連付けられているファイルのファイル名の大文字と小文字が区別されます。
FO_HANDLE_CREATED ファイル オブジェクトのファイル ハンドルが作成されました。
FO_FILE_FAST_IO_READ このファイル オブジェクトに対して高速 I/O 読み取りが実行されました。
FO_RANDOM_ACCESS ファイル オブジェクトに関連付けられているファイルがランダム にアクセスするために開かれました。
FO_FILE_OPEN_CANCELLED 完了する前に、このファイル オブジェクトの作成要求が取り消されました。
FO_VOLUME_OPEN ファイル オブジェクトは、ボリュームオープン要求を表します。
FO_REMOTE_ORIGIN リモート コンピューターで発生したファイル オブジェクトに関連付けられているファイルの作成要求。
FO_SKIP_COMPLETION_PORT ポートに関連付けられているファイル オブジェクトの場合、IRP がエラー以外の状態の戻り値と同期的に完了したときに、システムが完了ポートへのキューをスキップする必要があるかどうかを判断します。
FO_SKIP_SET_EVENT IRP の完了時にファイル オブジェクトのイベントの設定をスキップします。
FO_SKIP_SET_FAST_IO 高速 I/O パスが成功したときにシステム サービスに提供されるイベントの設定をスキップします。

FileName

Buffer メンバーが、ボリュームで開かれたファイルの名前を保持する読み取り専用 Unicode 文字列を指すUNICODE_STRING構造体。 ボリュームを開いている場合、UNICODE_STRING 構造体の Length メンバーは 0 になります。 この文字列のファイル名は、 IRP_MJ_CREATE 要求の初期処理中にのみ有効であることに注意してください。 ファイル システムが IRP_MJ_CREATE 要求の処理を開始した後、このファイル名は有効と見なさないでください。 UNICODE_STRING構造体の Buffer メンバーが指す文字列のストレージは、ページ システム メモリに割り当てられます。 ファイル名の取得の詳細については、「 FltGetFileNameInformation」を参照してください。

CurrentByteOffset

ファイル オブジェクトに関連付けられているファイル オフセットをバイト単位で指定する読み取り専用メンバー。

Waiters

同期アクセス用に開かれたファイル オブジェクトの未処理の待機者の数をカウントするためにシステムによって使用される読み取り専用メンバー。

Busy

同期アクセス用に開かれたファイル オブジェクトが現在ビジーかどうかを示すためにシステムによって使用される読み取り専用メンバー。

LastLock

ファイル オブジェクトに適用された最後のロックへの不透明なポインター。

Lock

ファイル オブジェクト イベント ロックを保持するためにシステムによって使用される不透明なメンバー。 イベント ロックは、ファイル オブジェクトへの同期アクセスを制御するために使用されます。 同期アクセス用に開かれたファイル オブジェクトにのみ適用されます。

Event

ファイル オブジェクトのイベント オブジェクトを保持するためにシステムによって使用される不透明なメンバー。 イベント オブジェクトは、ユーザー イベントが指定されなかった場合、または同期 API が呼び出された場合に、ファイル オブジェクトに対する I/O 要求の完了を通知するために使用されます。

CompletionContext

ファイル オブジェクトに関連付けられている完了ポート情報 (ポート ポインターとキー) への不透明なポインター (存在する場合)。

IrpListLock

ファイル オブジェクトの IRP リストへのアクセスを同期するために使用されるスピン ロックとして機能するKSPIN_LOCK構造体への不透明なポインター。

IrpList

ファイル オブジェクトに関連付けられている IRP リストの先頭への不透明なポインター。

FileObjectExtension

ファイル オブジェクトのファイル オブジェクト拡張子 (FOBX) 構造体への不透明なポインター。 FOBX 構造体には、内部的に使用されるさまざまな不透明なコンテキストと、FsRtlXxx ルーチンで使用できるファイルごとのオブジェクト コンテキストが含まれています。

注釈

ドライバーは、 FsContext メンバーと FsContext2 メンバーを使用して、開いているファイル オブジェクトに関するドライバーによって決定された状態を維持できます。 ドライバーは、IRP のドライバーの I/O スタックの場所でファイル オブジェクトにアクセスできる場合を除き、これらのメンバーを使用できません。

ファイル オブジェクト内の残りのメンバーはすべて、不透明または読み取り専用です。

  • ファイル オブジェクト内の不透明なメンバーは、アクセス不可と見なす必要があります。 オブジェクト フィールドの場所に依存しているドライバーや、不透明なメンバーへのアクセスを持つドライバーは、移植可能で、時間の経過と共に他のドライバーと相互運用できない可能性があります。

  • ドライバーは読み取り専用メンバーを使用して関連情報を取得できますが、読み取り専用メンバーと、ポインターの場合はメンバーが指すオブジェクトを変更することはできません。

IRP_MJ_CREATE要求の処理中に、ファイル システム ドライバーは IoSetShareAccess ルーチン (クライアントが最初にファイルを開く場合) または IoCheckShareAccess ルーチン (ファイルを共有する後続のクライアントの場合) を呼び出します。 IoSetShareAccessIoCheckShareAccess、ReadAccessWriteAccessDeleteAccess の各メンバーを更新して、クライアントがファイルへの排他的アクセス権を持っている場合にクライアントに付与されるアクセス権を示します。 さらに、 IoCheckShareAccessSharedReadSharedWriteSharedDelete の各メンバーを更新して、ファイルを共有する 2 つ以上のクライアントに同時に付与されるアクセス権を示します。 ファイル システム以外のデバイスのドライバーがクライアントのアクセス権を監視する必要がある場合、このドライバーは通常、FsContext および FsContext2 メンバーが指すコンテキスト バッファーにアクセス権情報を格納します。

特定のファイル オブジェクトが表すオブジェクトの種類 (ファイル、ディレクトリ、ボリュームなど) は、ファイル オブジェクト構造の内容を調べることだけでは決定できません。 ファイル オブジェクトが表すオブジェクトの種類を確認する方法については、「 ZwQueryInformationFile」を参照してください。

共通ログ ファイル システム (CLFS) は 、LOG_FILE_OBJECT 構造を使用してログを表します。 ClfsCreateLogFile 関数は、クライアントが他の CLFS 関数に渡すLOG_FILE_OBJECT構造体へのポインターを返します。

CLFS クライアントは、LOG_FILE_OBJECT構造体のメンバー 直接アクセスしません。

typedef FILE_OBJECT LOG_FILE_OBJECT, *PLOG_FILE_OBJECT, **PPLOG_FILE_OBJECT;

要件

要件
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h を含む)

こちらもご覧ください

DEVICE_OBJECT

FOBX

FSRTL_ADVANCED_FCB_HEADER

IRP_MJ_CREATE

IoCheckShareAccess

IoGetDeviceObjectPointer

IoSetShareAccess

ObDereferenceObject

ZwQueryInformationFile