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 内のスタックの場所の最小数を指定します。 IoCreateDeviceIoCreateDeviceSecure は、 新しく作成されたデバイス オブジェクトでこのメンバーを 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 を含む)

こちらもご覧ください