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 | ファイル オブジェクトは名前付きパイプを表します。 |
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;
必要条件
要件 | 価値 |
---|---|
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h を含む) |
関連項目
IoCheckShareAccess の
IoGetDeviceObjectPointer の
IoSetShareAccess の