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 _IOP_FILE_OBJECT_EXTENSION *FileObjectExtension;
struct _IOP_FILE_OBJECT_EXTENSION;
} 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 ルーチンで使用できるファイルごとのオブジェクト コンテキストが含まれています。
_IOP_FILE_OBJECT_EXTENSION
_IOP_FILE_OBJECT_EXTENSION構造体。
注釈
ドライバーは、 FsContext メンバーと FsContext2 メンバーを使用して、開いているファイル オブジェクトに関するドライバーによって決定された状態を維持できます。 ドライバーは、IRP のドライバーの I/O スタックの場所でファイル オブジェクトにアクセスできる場合を除き、これらのメンバーを使用できません。
ファイル オブジェクト内の残りのすべてのメンバーは、不透明または読み取り専用です。
ファイル オブジェクト内の不透明なメンバーは、アクセス不可と見なす必要があります。 オブジェクト フィールドの場所に依存しているドライバーや、不透明なメンバーへのアクセスを持つドライバーは、移植性が維持されず、時間の経過と共に他のドライバーと相互運用できない可能性があります。
ドライバーは、読み取り専用メンバーを使用して関連情報を取得できますが、読み取り専用メンバーと、ポインターの場合はメンバーが指すオブジェクトを変更することはできません。
IRP_MJ_CREATE要求の処理中に、ファイル システム ドライバーは IoSetShareAccess ルーチン (クライアントが最初にファイルを開く場合) または IoCheckShareAccess ルーチン (ファイルを共有する後続のクライアントの場合) を呼び出します。 IoSetShareAccess および IoCheckShareAccess は 、ReadAccess、 WriteAccess、および DeleteAccess の各メンバーを更新して、クライアントがファイルへの排他的アクセス権を持っている場合にクライアントに付与されるアクセス権を示します。 さらに、 IoCheckShareAccess は SharedRead、 SharedWrite、 SharedDelete の各メンバーを更新して、ファイルを共有する 2 つ以上のクライアントに同時に付与されるアクセス権を示します。 ファイル システム以外のデバイスのドライバーがクライアントのアクセス権を監視する必要がある場合、このドライバーは通常、FsContext および FsContext2 メンバーが指すコンテキスト バッファーにアクセス権情報を格納します。
特定のファイル オブジェクトが表すオブジェクトの種類 (ファイル、ディレクトリ、ボリュームなど) は、ファイル オブジェクト構造の内容を調べるだけでは決定できません。 ファイル オブジェクトが表すオブジェクトの種類を確認する方法については、「 ZwQueryInformationFile」を参照してください。
共通ログ ファイル システム (CLFS) は 、LOG_FILE_OBJECT 構造を使用してログを表します。 ClfsCreateLogFile 関数は、LOG_FILE_OBJECT構造体へのポインターを返し、クライアントは他の CLFS 関数に渡します。
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 を含む) |