DEVICE_OBJECT 構造体 (wdm.h)
DEVICE_OBJECT構造体は、オペレーティング システムによってデバイス オブジェクトを表すために使用されます。 デバイス オブジェクトは、ドライバーが I/O 要求を処理する論理、仮想、または物理デバイスを表します。
構文
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement;
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize;
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
メンバー
Type
オブジェクトがデバイス オブジェクトであることを示すためにオペレーティング システムによって使用されます。 デバイス オブジェクトの場合、このメンバーの値は 3 です。 これは読み取り専用メンバーです。
Size
デバイス オブジェクトのサイズをバイト単位で指定します。 このサイズには、 DeviceExtension メンバーが指すドライバー指定のデバイス拡張機能が含まれますが、 DeviceObjectExtension メンバーが指す不透明なデバイス オブジェクト拡張機能は含まれません。 Size は読み取り専用メンバーです。
ReferenceCount
I/O マネージャーが、デバイス オブジェクトに関連付けられているデバイスの開いているハンドルの数を追跡するために使用されます。 これにより、I/O マネージャーは、ドライバーのデバイスの未処理のハンドルがある場合にドライバーのアンロードを回避できます。 これは読み取り専用メンバーです。
DriverObject
DriverEntry ルーチンと AddDevice ルーチンに入力されたドライバーの読み込まれたイメージを表すドライバー オブジェクト (DRIVER_OBJECT) へのポインター。 このメンバーは、IoCreateDevice または IoCreateDeviceSecure の呼び出しが正常に行われると、I/O マネージャーによって設定されます。 これは読み取り専用メンバーです。
NextDevice
同じドライバーによって作成された次のデバイス オブジェクト (存在する場合) へのポインター。 I/O マネージャーは、 IoCreateDevice または IoCreateDeviceSecure の呼び出しが成功するたびに、このリスト を更新します。
アンロードされている非プラグ アンド プレイ (PnP) ドライバーは、そのデバイス オブジェクトの一覧を走査 ("ウォーク") して削除する必要があります。 PnP ドライバーでは、このデバイス オブジェクトの一覧を確認する必要はありません。 代わりに、PnP ドライバーは、デバイスの削除 PnP 操作中にクリーンアップを実行します (IRP_MN_REMOVE_DEVICE)。
デバイス オブジェクトを動的に再作成するドライバーも、このメンバーを使用します。 これは、読み取り/書き込みメンバーです。
AttachedDevice
アタッチされたデバイス オブジェクトへのポインター。 アタッチされたデバイス オブジェクトがない場合、このメンバーは NULL です。 AttachedDevice メンバーによって指されるデバイス オブジェクトは、通常、フィルター ドライバーのデバイス オブジェクトです。このオブジェクトは、デバイス オブジェクトによって表されるデバイスを最初に対象とした I/O 要求をインターセプトします。 詳細については、「 IoAttachDevice」 および 「IoAttachDeviceByPointer 」トピックを参照してください。 これは不透明なメンバーです。
CurrentIrp
ドライバーに StartIo ルーチンがあり、そのエントリ ポイントがドライバー オブジェクトに設定されていて、ドライバーが現在 IRP を処理している場合は、現在の IRP へのポインター。 それ以外の場合、このメンバーは NULL です。 詳細については、「 IoStartPacket 」および 「IoStartNextPacket 」トピックを参照してください。 これは読み取り専用メンバーです。
Timer
タイマー オブジェクトへのポインター。 これにより、I/O マネージャーは 1 秒ごとにドライバー指定のタイマー ルーチンを呼び出すことができます。 詳細については、「 IoInitializeTimer」を参照してください。 これは、読み取り/書き込みメンバーです。
Flags
デバイス ドライバーは、次のシステム定義値の 1 つ以上を使用して、新しく作成されたデバイス オブジェクトでこのメンバーに対してビットごとの OR 操作を実行します。
Flags メンバーを設定する方法の詳細については、「デバイス オブジェクトの初期化」を参照してください。
値 | 意味 |
---|---|
DO_VERIFY_VOLUME (0x00000002) | リムーバブル メディア ドライバーは、転送要求の処理中にこのフラグを設定します。 このようなドライバーは、データを転送する前に、転送要求のターゲットでこのフラグをチェックする必要もあります。 詳細については、「 リムーバブル メディアのサポート 」トピックを参照してください。 |
DO_BUFFERED_IO (0x00000004) | デバイス スタックに送信される I/O 要求に対して I/O マネージャーによって使用されるバッファリングの種類を指定します。 上位レベルのドライバーまたはスタック内の次の下位ドライバーと同じ値を持つこのメンバー (最上位レベルのドライバーの場合を除く)。 |
DO_EXCLUSIVE (0x00000008) | ドライバーがビデオ、シリアル、並列、サウンド デバイスなどの排他的なデバイスを提供することを示します。 WDM ドライバーは、このフラグを設定できません。 詳細については、「 デバイス オブジェクトへの排他アクセスの指定 」トピックを参照してください。 |
DO_DIRECT_IO (0x00000010) | 「DO_BUFFERED_IO」を参照してください。 |
DO_MAP_IO_BUFFER (0x00000020) | このフラグは使用されなくなりました。 ドライバーは、このフラグを設定しないでください。 |
DO_DEVICE_INITIALIZING (0x00000080) | I/O マネージャーは、デバイス オブジェクトを作成するときにこのフラグを設定します。 デバイス関数ドライバーまたはフィルター ドライバーは、(1) デバイス オブジェクトをデバイス スタックにアタッチした後、 AddDevice ルーチンのフラグをクリアします。 (2) デバイスの電源状態を確立します。 (3) いずれかの電源フラグを持つメンバーに対してビットごとの OR 操作を実行します (必要な場合)。 プラグ アンド プレイ (PnP) マネージャーは、AddDevice ルーチンが返された後にフラグがクリアされていることを確認します。 |
DO_SHUTDOWN_REGISTERED (0x00000800) | ドライバーがシャットダウン通知用にデバイス オブジェクトを登録したことを示すために、I/O マネージャーによって使用されます。 このフラグはドライバーで使用しないでください。 |
DO_BUS_ENUMERATED_DEVICE (0x00001000) | オペレーティング システムは、各物理デバイス オブジェクト (PDO) でこのフラグを設定します。 ドライバーは、このフラグを変更しないでください。 |
DO_POWER_PAGABLE (0x00002000) | Microsoft Windows 2000 以降のバージョンの Windows と互換性のあるページング可能なドライバーは、ページング パスの一部ではなく、突入電流を必要としない場合は、このフラグを設定する必要があります。 システムは、IRQL = PASSIVE_LEVELでこのようなドライバーを呼び出します。 ドライバーは、このフラグとDO_POWER_INRUSHの両方を設定できません。 WDM、Microsoft Windows 98、および Windows Millennium Edition のすべてのドライバーは、DO_POWER_PAGABLE設定する必要があります。 |
DO_POWER_INRUSH (0x00004000) | デバイスがオンになっているときに突入電流を必要とするデバイスのドライバーは、このフラグを設定する必要があります。 ドライバーは、このフラグとDO_POWER_PAGABLEの両方を設定できません。 |
DO_DEVICE_TO_BE_RESET (0x04000000) | I/O マネージャーは、このフラグをバス ドライバーがデバイスをリセットするための信号として設定します。 他のドライバーでは、このフラグを使用しないでください。 |
DO_DAX_VOLUME (0x10000000) | ボリュームが DAX ボリュームであることを示します。 |
Characteristics
ドライバーのデバイスに関する追加情報を提供する 1 つ以上のシステム定義定数を、ビットごとの OR 操作と組み合わせて指定します。 これらの定数には、次のものが含まれます。
値 | 意味 |
---|---|
FILE_AUTOGENERATED_DEVICE_NAME | このルーチンを呼び出すときに DeviceName を指定する呼び出し元ではなく、デバイスの名前を生成するように I/O マネージャーに指示します。 I/O マネージャーは、名前が一意であることを確認します。 通常、この特性は PnP バス ドライバーによって指定され、同じバス上の子デバイスの物理デバイス オブジェクト (PDO) の名前を生成します。 |
FILE_CHARACTERISTIC_PNP_DEVICE | デバイス オブジェクトがプラグ アンド プレイ (PnP) スタックの一部であることを示します。 この特性は、バス ドライバー (またはバス フィルター ドライバー) が、IRP_MN_START_DEVICE要求をまだ受信していないデバイス オブジェクトの WMI サポートを登録する場合 に 必要です。 FILE_CHARACTERISTIC_PNP_DEVICEは、関数またはフィルター ドライバーがそのデバイス スタックに接続する 前に WMI に登録されている場合にも必要です。 |
FILE_CHARACTERISTIC_TS_DEVICE | デバイス オブジェクトがターミナル サービス デバイス スタックの一部であることを示します。 ドライバーでは、この特性を設定しないでください。 |
FILE_CHARACTERISTIC_WEBDAV_DEVICE | Web ベースの分散作成およびバージョン管理 (WebDAV) ファイル システムがデバイスにマウントされていることを示します。 ドライバーでは、この特性を設定しないでください。 |
FILE_DEVICE_IS_MOUNTED | ファイル システムがデバイスにマウントされていることを示します。 ドライバーでは、この特性を設定しないでください。 |
FILE_DEVICE_SECURE_OPEN | I/O マネージャーに、デバイス オブジェクトのセキュリティ記述子を、デバイスの相対オープンと末尾のファイル名のオープンに適用するように指示します。 詳細については、 デバイス名前空間アクセスの制御に関するトピックを 参照してください。 |
FILE_FLOPPY_DISKETTE | デバイスがフロッピー ディスク デバイスであることを示します。 |
FILE_READ_ONLY_DEVICE | デバイスを書き込むことができないことを示します。 |
FILE_REMOTE_DEVICE | デバイスがリモートであることを示します。 |
FILE_REMOVABLE_MEDIA | ストレージ デバイスがリムーバブル メディアをサポートしていることを示します。 この特性は、リムーバブル デバイスではなく、リムーバブル メディアを示していることに注意 してください。 たとえば、JAZ ドライブ デバイスのドライバーではこの特性を指定する必要がありますが、PCMCIA フラッシュ ディスクのドライバーは指定しないでください。 |
FILE_VIRTUAL_VOLUME | ボリュームが仮想であることを示します。 ドライバーでは、この特性を設定しないでください。 |
FILE_WRITE_ONCE_MEDIA | デバイスが書き込み 1 回のメディアをサポートしていることを示します。 ドライバーは、このメンバーを直接設定しません。 デバイスの特性を設定する方法の詳細については、「デバイス特性の指定」トピック を 参照してください。 |
FILE_CHARACTERISTIC_CSV | デバイスがクラスター共有ボリューム (CSV) であることを示します。 |
FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL | IO マネージャーは通常、クライアントがアプリ コンテナーである場合に開くすべてのファイルに対してスキャン アクセスに対して完全なセキュリティ チェックを実行します。 クライアント トークンにスキャン特権が既に存在する場合、このフラグを設定すると、この強制走査アクセス チェックがバイパスされます。 |
FILE_PORTABLE_DEVICE | 基になるスタックがデバイスを移植可能と見なしていることを示します。 これはストレージ スタックによって使用され、デバイスがローカル コンピューター コンテナー内になく、固定バスの種類ではないことを意味します。 |
Vpb
デバイス オブジェクトに関連付けられているボリューム パラメーター ブロック (VPB) へのポインター。 ファイル システム ドライバーの場合、VPB は、マウントされたボリュームのインスタンスを表す名前のない論理デバイス オブジェクトへの接続を提供できます。 これは不透明なメンバーです。
DeviceExtension
デバイス拡張機能へのポインター。 デバイス拡張機能の構造と内容は、ドライバーによって定義されます。 サイズはドライバーによって決定され、IoCreateDevice または IoCreateDeviceSecure へのドライバーの呼び出しで指定されます。 デバイス拡張機能の詳細については、「 デバイス拡張機能」を参照してください。 これは読み取り専用メンバーです。 ただし、メンバーが指すオブジェクトは、ドライバーによって変更できます。
DeviceType
そのルーチンのDeviceType パラメーターに指定された値を使用して、IoCreateDevice と IoCreateDeviceSecure によって設定されます。 詳細については、「 デバイスの種類の指定 」トピックを参照してください。
StackSize
このドライバーに送信される IRP 内のスタックの場所の最小数を指定します。 IoCreateDevice と IoCreateDeviceSecure は、 新しく作成されたデバイス オブジェクトでこのメンバーを 1 に設定します。したがって、最下位レベルのドライバーは、このメンバーを無視できます。 ドライバーが IoAttachDevice またはIoAttachDeviceToDeviceStack を呼び出す場合、I/O マネージャーは、上位レベルのドライバーのデバイス オブジェクトの StackSize メンバーを適切な値に自動的に設定します。 IoGetDeviceObjectPointer を使用して別のドライバーにチェーンする上位レベルのドライバーのみが、独自のデバイス オブジェクトの StackSize の値を 1 + 次の下位ドライバーのデバイス オブジェクトの StackSize 値に明示的に設定する必要があります。
Queue
I/O マネージャーによって内部的に使用され、必要に応じてデバイス オブジェクトをキューに入れます。 これは不透明なメンバーです。
Queue.ListEntry
2 重リンク リストの前方ポインターと下位ポインターを含むLIST_ENTRY構造体。
Queue.Wcb
I/O マネージャーで使用されるデバイス コンテキスト情報。
AlignmentRequirement
データ転送のデバイスのアドレスアラインメント要件を指定します。 値は、Wdm.h で定義されているFILE_XXX_ALIGNMENT 値のいずれかである必要があります。 詳細については、「 デバイス オブジェクトの初期化」、「 GetDmaAlignment」、「 ZwQueryInformationFile」 トピックを参照してください。
DeviceQueue
デバイス オブジェクトのデバイス キュー オブジェクト。 デバイス キュー オブジェクトには、デバイス オブジェクトに関連付けられているドライバーによる処理を待機している IRP が含まれています。 詳細については、「 Driver-Managed IRP Queues 」トピックを参照してください。 これは不透明なメンバーです。
Dpc
デバイス オブジェクトの遅延プロシージャ 呼び出し (DPC) オブジェクト。 詳細については、「 DPC オブジェクトの概要 」トピックを参照してください。 これは不透明なメンバーです。
ActiveThreadCount
将来利用するために予約されています。 これは不透明なメンバーです。
SecurityDescriptor
デバイス オブジェクトの作成時に、デバイス オブジェクトのセキュリティ記述子 (SECURITY_DESCRIPTOR) を指定します。 このメンバーが NULL の場合、デバイス オブジェクトは既定のセキュリティ設定を受け取ります。 これは読み取り専用のメンバーですが、 メンバーは ZwSetSecurityObject 関数を使用して変更できます。
DeviceLock
I/O マネージャーによって割り当てられる同期イベント オブジェクト。 I/O マネージャーは、マウントまたはマウント検証要求をファイル システム ドライバーにディスパッチする前に、イベント オブジェクトを取得します。 これは不透明なメンバーです。
SectorSize
デバイス オブジェクトがボリュームを表していない場合、このメンバーは 0 に設定されます。 デバイス オブジェクトがボリュームを表す場合、このメンバーはボリュームのセクター サイズをバイト単位で指定します。 I/O マネージャーは、このメンバーを使用して、中間バッファリングが無効になっているときに発行されるすべての読み取り操作、書き込み操作、およびファイル位置の設定操作が正しくアラインされていることを確認します。 ただし、デバイス オブジェクトが作成されるときに、セクターごとの既定のシステム バイト数の値が使用されます。ただし、ファイル システム ドライバー。さらにまれに、レガシ ドライバーとミニフィルター ドライバーでは、マウントが発生したときに基になるボリューム ハードウェアのジオメトリに基づいてこの値を更新できます。 他のドライバーでは、このメンバーを変更しないでください。
Spare1
システムで使用するために予約されています。 これは不透明なメンバーです。
DeviceObjectExtension
デバイスの状態に関する情報を格納するために I/O マネージャーと PnP マネージャーによって使用されるデバイス オブジェクト拡張機能へのポインター。 これは不透明なメンバーです。
Reserved
システムで使用するために予約されています。 これは不透明なメンバーです。
注釈
オペレーティング システムは、デバイス オブジェクト別のデバイスを表します。 詳細については、「 デバイス オブジェクトとデバイス スタック 」トピックを参照してください。
ドライバーは、 IoCreateDevice ルーチンと IoCreateDeviceSecure ルーチンを使用して デバイス オブジェクトを作成します。 デバイス オブジェクトを作成する方法の詳細については、「デバイス オブジェクト の作成」を参照してください。
デバイス オブジェクトは部分的に不透明です。 ドライバーは、特に記載されていない限り、デバイス オブジェクトのメンバーを直接設定しません。 ドライバーが直接変更できるメンバーの詳細については、「 デバイス オブジェクトの初期化」を参照してください。 その他のデバイス オブジェクトのプロパティについては、「 デバイス オブジェクトのプロパティ」を参照してください。
デバイス オブジェクト内の不透明なメンバーは、アクセスできないと見なす必要があります。 オブジェクト メンバーの場所に依存しているドライバーや、不透明なメンバーへのアクセスを持つドライバーは、移植可能で、時間の経過と共に他のドライバーと相互運用できない可能性があります。
システム提供のビデオ ポート ドライバーは、 ビデオ ミニポート ドライバーの代わりに作成するデバイス オブジェクトのフィールドを設定します。
システム提供の SCSI ポート ドライバーは、 SCSI ミニポート ドライバーの代わりに作成するデバイス オブジェクトのフィールドを設定します。
システム提供の NDIS ライブラリは、 NDIS ミニポート ドライバーの代わりに作成するデバイス オブジェクトのフィールドを設定します。
要件
要件 | 値 |
---|---|
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h、Fltkernel.h を含む) |