C ++第三十九章 - 重要なドライバデータ構造 - Windowsの駆動開発(B)を見て

データ構造は、I / Oマネージャは、いくつかのデータ構造を定義し、これらのデータ構造が記述されたドライバをマスターする必要がありますコンピュータプログラムの中核です。ドライバーは、多くの場合、これらのデータ構造のインスタンスを作成し、維持しなければなりません。

駆動対象(DRIVER_OBJECT)

各ドライバのみ対応するオブジェクトを駆動すると、ドライバがロードされたときにオブジェクトがドライバーである、カーネルオブジェクト管理プログラムを作成しました。

DRIVER_OBJECTは、カーネルドライバの一例がロードされ、カーネルドライバがインスタンスを1つだけロードされるように、データ構造によって表される駆動します。むしろ、それはI / Oマネージャがロードされたカーネルの責任です。ドライバーは、DriverEntryで初期化する必要があります。最初のドライブオブジェクトのデータ構造を見てください。

「デバイスオブジェクト:各ドライバは、1つまたは複数のデバイス・オブジェクトを有していてもよいです。前記各デバイスオブジェクトは、次の駆動対象点へのポインタを有しています。デバイスオブジェクトによって、あなたはすべてのデバイスオブジェクトで駆動される物体を通過することができます。デバイスオブジェクトは、ドライバは、各デバイスオブジェクトを介して、アンロードし、それを削除したとき、オペレーティングシステムは、完全であるのではなく、プログラマー自身によって作成されます。

「にDriverNameは:名前が示すように、PriveNameレコードは、ドライバの名前です。ここで使用されるUNICODE文字列レコード、文字列は、一般ドライバー\ [ドライバ名]を\ています。

「HardwareDatabase:ここでUNICODE文字列と同じレコードデバイスのハードウェアキー・データベース名のレコードがあります。文字列は、レジストリの\ MACHINEの\ハードウェア\説明の\ SYSTEM \一般的です。

「DriverStartIo:STARTIOルーチンは、シリアル動作のために、アドレスの関数として記録しました。

「DriverUnload:コールバック関数のアドレスが使用されている指定したときに、ドライバのアンインストール。

「MajorFunction:MajorFunctionドメインレコードは、関数ポインタの配列、すなわちMajorFunctionアレイは、アレイの各メンバーは、各ポインタが、関数へのポインタが記録されています。この関数は、IRPディスパッチ機能に対処することです。

「FastIoDispatch:ディスパッチ関数で使用されるドライブのファイルは、MSDNを参照してください。

第二、デバイスオブジェクト(DEVICE_OBJECT)

各ドライバは、デバイスまたは複数のオブジェクトを作成し、データ構造はDEVICE_OBJECTで表されます。各デバイスオブジェクトは、このようにデバイスのチェーンを形成し、次のデバイスオブジェクトへのポインタを有するであろう。オブジェクト・ストレージ・デバイスとデバイス特性のステータス情報。

「DriverObject:専用ドライバのドライバを指します。ユニティ・ドライブオブジェクトを指しているドライバオブジェクトに属します。

「NextDevice:次のデバイスオブジェクトポイント。これは、次のデバイスオブジェクトを指す同じオブジェクトが、装置オブジェクトの数が同じドライバによって作成されたドライブ装置に属しています。リストは、各デバイスオブジェクトNextDeviceドメインに形成され、各デバイスオブジェクトを挙げることができます。

「AttachedDevice:次のデバイスオブジェクトを指します。これはAttachedDevice点はドライブより高いレベルのことであり、運転者に取り付けられたドライバのより高いレベルがある場合ことを意味します。

「CurrentIrp:現在のIRP構造にSTARTIOルーチンを使用して、このフィールドがポイント。

「フラグ:このフィールドは、32ビットの符号なし整数です。各位置は、特定の意味を持ちます。

マーク 説明
DO_BUFFERED_IO モードは、バッファ(緩衝系コピー)モードを使用してアクセスユーザデータを読み出し動作および書き込み
DO_EXCLUSIVE  デバイスハンドルを開くには、一つのスレッドだけを許可します
DO_DIRECT_IO ダイレクトモードを使用すると、操作(メモリ記述子テーブル)ユーザアクセスモードデータを読み書き
DO_DEVICE_INITIALIZING デバイスオブジェクトが初期化されています
DO_POWER_PAGABLE IRP_MJ_PNP要求はPASSIVE_LEVELで処理しなければなりません
DO_POWER_INRUSH    デバイスは、中、大電流を必要とします

「DeviceExtension:ターゲットデバイスの膨張を指します。各デバイスは、それは、プログラマが自分の定義を構造化され、オブジェクト記録デバイス拡張デバイス構造は、独自の特殊な意味で、デバイス開発拡張オブジェクトです。また、運転手に、あなたはグローバル変数、同期が容易ではないので、問題に関わるグローバル変数を利用するのは避けるべきです。ソリューションは、デバイス拡張にグローバル変数が存在します。

「DeviceTypeを:機器の種類を指定します。

デバイスタイプ 説明
FILE_DEVICE_BEEP ブザーデバイスオブジェクト
FILE_DEVICE_CD_ROM CDドライブのデバイスオブジェクト
FILE_DEVICE_CD_ROM_FILE_SYSTEM CD CD-ROMファイル・システム・デバイスオブジェクト
FILE_DEVICE_CONTROLLER コントローラデバイスオブジェクト
FILE_DEVICE_DATALINK データリンクデバイスオブジェクト
FILE_DEVICE_DFS DFSデバイスオブジェクト
FILE_DEVICE_DISK ディスクデバイスオブジェクト
FILE_DEVICE_DISK_FILE_SYSTEM ディスクのファイルシステムのデバイスオブジェクト
FILE_DEVICE_FILE_SYSTEM ファイルシステムのデバイスオブジェクト
FILE_DEVICE_INPORT_PORT 入力ポートデバイスオブジェクト
FILE_DEVICE_KEYBOARD キーボードデバイスオブジェクト
FILE_DEVICE_MAILSLOT メールスロットのデバイスオブジェクト
FILE_DEVICE_MIDI_IN MIDI入力デバイスオブジェクト
FILE_DEVICE_MIDI_OUT MIDI出力デバイスオブジェクト
FILE_DEVICE_MOUSE マウスのデバイスオブジェクト
FILE_DEVICE_MULTI_UNC_PROVIDER UNCマルチデバイス・オブジェクト
FILE_DEVICE_NAMED_PIPE 名前付きパイプデバイスオブジェクト
FILE_DEVICE_NETWORK ネットワークデバイスオブジェクト
FILE_DEVICE_NETWORK_BROWSER Webブラウザ関連のオブジェクトペン
FILE_DEVICE_NETWORK_FILE_SYSTEM ネットワークファイルシステムのデバイスオブジェクト
FILE_DEVICE_NULL ヌルデバイスオブジェクト
FILE_DEVICE_PARALLEL_PORT パラレルポートデバイスオブジェクト
FILE_DEVICE_PHYSICAL_NETCARD 物理NICデバイスオブジェクト
FILE_DEVICE_PRINTER プリンタのデバイスオブジェクト
FILE_DEVICE_SCANNER スキャナデバイスオブジェクト
FILE_DEVICE_SERIAL_MOUSE_PORT シリアルマウスデバイスオブジェクト
FILE_DEVICE_SERIAL_PORT シリアルデバイスオブジェクト
FILE_DEVICE_SCREEN 画面のデバイスオブジェクト
FILE_DEVICE_SOUND サウンドデバイスオブジェクト
FILE_DEVICE_STREAMS フローデバイスオブジェクト
FILE_DEVICE_TAPE テープデバイスオブジェクト
FILE_DEVICE_TAPE_FILE_SYSTEM 磁带文件系统设备对象
FILE_DEVICE_TEANSPORT 传输设备对象
FILE_DEVICE_UNKNOWN 未知设备对象
FILE_DEVICE_VIDEO 视频设备对象
FILE_DEVICE_VIRTUAL_DISK 虚拟磁盘设备对象
FILE_DEVICE_WAVE_OUT 声音输出设备对象
FILE_DEVICE_8042_PORT 8042端口设备对象
FILE_DEVICE_NETWORK_REDIRECTOR 网卡设备对象
FILE_DEVICE_BATTERY 电池设备对象
FILE_DEVICE_BUS_EXTENDER 总线扩展设备对象
FILE_DEVICE_MODEM 调制解调器设备对象
FILE_DEVICE_VDM VDM设备对象
FILE_DEVICE_MASS_STORAGE 大容量存储设备对象
FILE_DEVICE_SMB SMB设备对象
FILE_DEVICE_KS 内核流设备对象
FILE_DEVICE_CHANGER 充电设备对象
FILE_DEVICE_SMARTCARD 智能卡设备对象
FILE_DEVICE_ACPI ACPI设备对象
FILE_DEVICE_DVD DVD设备对象
FILE_DEVICE_WAVE_IN 声音输入设备对象

根据设备的需要,需要填写相应的设备类型。当制作虚拟设备时,应选择FILE_DEVICE_UNKNOWN类型的设备。

》StackSize:在多层驱动情况下,驱动与驱动之间会形成类似堆栈的结构。IRP会依次从最高层传递到最底层。StackSize描述的就是这个层数。

》AlignmentRequirement:设备在大容量传输的时候,需要内存对齐,以保证传输速度。

 有点累了,写到这里。

おすすめ

転載: www.cnblogs.com/smart-zihan/p/11783038.html