デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
【 デバドラ講座20 : ドライバオブジェクト 】
ドライバオブジェクトはドライバがロードされる際にI/Oマネージャによって作成されます。I/OマネージャはDriverEntryを呼び出す際、ドライバオブジェクトのポインタを引数として渡します。ドライバオブジェクトは構造体としてシステムの中で管理されています。
ここで、構造体の説明をします。C言語にはint, char, longなどの基本データ型があります。配列型は各要素が同じデータ型になっています。構造体は異なるデータ型を1つの集合体として表す際に使われます。例えばスポーツチームの情報について、1つの集合体として表すとします。スポーツチームの情報について、チーム名、本拠地、監督名、今シーズンの勝ち負けの数によって構成されているとします。これらのデータはすべてが同じデータ型で定義することが出来ないので、以下のように構造体として定義します。
struct sportteam{
char teamname[30];
char location[10];
char kantoku[20];
int num_win;
int num_lost; }
構造体を使用することで、異なったデータ型を1つの集合体として管理することができます。構造体の中に構造体を入れることで、より複雑なデータ構造を表すことも可能になります。
ドライバオブジェクトを含め、すべてのオブジェクトは構造体として管理されています。ドライバオブジェクトは以下のように定義されています。
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
ドライバオブジェクトの中で斜線が引かれたフィールドのみドキュメント化されており、アクセス可能です。他のフィールドにはアクセスが制限されています。ドライバオブジェトの初期化は、一部はI/Oマネージャが行い、他の一部をDriverEntryが直接行います。以下に詳細を示します。
- DeviceObject:
- WindowsNTではDriverEntryで初期化され、2000/XPではAddDeviceで初期化されます。
- HardwareDatabase:
- ドライバーロード時にI/Oマネージャによって初期化が行われ、DriverEntryに渡された時は、既に初期化済みです。
- DriverInit:
- ドライバーロード時にI/Oマネージャによって初期化が行われ、DriverEntryに渡された時は、既に初期化済みです。
- FastIoDispatch:
- ファイルシステムドライバとネットワークドライバにのみ使用します。
- DriverStartIo:
- DriverEntryで直接設定します。(スタートI/Oルーチン)
- DriverUnload:
- DriverEntryで直接設定します。(アンロードルーチン)
- MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]:
- DriverEntryで直接設定します。(ディスパッチルーチン)
参考資料
- 「NTドライバプログラミング」
- Peter G. Viscarola、W. Anthony Mason著 久保雅俊、三浦秀朗訳 サイエンスパーク株式会社 監修
- 「Windows NTデバイスドライバプログラミング」
- アート・ベーカー著 WinProgDDK ML和訳プロジェクト訳
- 「WDMデバイスドライバプログラミング完全ガイド」上、下
- Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳