データ構造は、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:设备在大容量传输的时候,需要内存对齐,以保证传输速度。
有点累了,写到这里。