青画面を恐れるのをやめて、Windowsドライバーの書き始めよう
一昔前は、ドライバーの作成は黒魔術のようなものとされていました。暗い部屋でバス仕様書に囲まれながら、次のWinDbg起動がシステムハングで終わらないことを祈っていたものです。今日では参入障壁は低くなりましたが、「Ring 0」への恐怖は依然として残っています。オペレーティングシステムが実際に「ハードウェア」と通信する仕組みに興味がある場合や、トラフィックフィルタリングやデータ保護用のソフトウェアを作成する必要がある場合、MicrosoftのWindows-driver-samplesリポジトリが出発点です。
これは単なるコード集ではなく、MicrosoftのエンジニアがWindows 11向けに更新を続けている公式ナレッジベースです。カーネルモードのシンプルな「Hello World」から、Bluetooth、NFC、グラフィックスサブシステムの実装まで、何百もの例が含まれています。
なぜ普通の開発者に必要なのか
ほとんどの開発者は高級言語で書き、舞台裏で何が起きているか考えることはありません。しかし、ユーザー空間(ユーザーモード)では解決できないタスクがあります。例えば、アンチウイルス、ディスクアクティビティ監視システム、特定のUSBデバイスを作成する場合、ドライバレベルまで降りる必要があります。
カーネルでの適切なメモリ割り当てや割り込み処理の方法を推測する代わりに、OSの作成者自身がどのように行っているのかを確認するのが良いでしょう。このリポジトリには、车輪の再発明やシステムクラッシュ(BSOD)のリスクを避けられる、すぐに使えるテンプレートが含まれています。
このリポジトリの中身
このリポジトリは非常に大規模です。ハードウェアインタラクションのほぼすべての側面をカバーする約18万ファイルがあります。Microsoftはサンプルをカテゴリに分類しているため、最低限のナビゲーションは可能です。
Universal Windows Drivers
現在、Microsoftは「1つのドライバーで全デバイス」というコンセプトを推進しています。このモデルで書かれたコードは、デスクトップ、タブレット、組み込みシステムで動作します。承認済みAPIのみを使用した例が豊富にあり、将来のWindows 11アップデートとの互換性が保証されます。
WDFフレームワーク:KMDFとUMDF
古いWDM(Windows Driver Model)を知っている方は、手動のIRPパケット管理がどれほど悪夢だったか分かるでしょう。現代のドライバー開発はWDF(Windows Driver Frameworks)に基づいています。
- KMDF(Kernel-Mode Driver Framework)は、メモリと割り込みを直接操作するために必要です。
- UMDF(User-Mode Driver Framework)を使用すると、通常のユーザープロセスで実行されるドライバーを作成できます。このようなドライバーがクラッシュしてもシステムは生き残ります。リポジトリには両方の優れた例があります。
特定技術の実例
ここにはあらゆるものの実装があります:光センサーや加速度センサーから、複雑なネットワークフィルタやオーディオエンジンまで。USBやBluetoothの実例は特に便利です。これらのプロトコルは簡単ではないからです。
実践的な使い方
始めるには、リポジトリをダウンロードして「Build」を押すだけでは足りません。Visual Studio 2022とWDK(Windows Driver Kit)のインストールが必要です。Microsoftはドライバー開発ツールをIDEに直接統合しているため、ビルドプロセスは通常のC++コンソールアプリケーションのコンパイルとほぼ変わりません。
以下は、最小限のKMDFベースのドライバーの例です。リポジトリでは、すべてが始まるエントリポイントであるの詳細な実装が見つかります:
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
NTSTATUS status;
// Инициализация структуры конфигурации
WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd);
// Создание объекта драйвера
status = WdfDriverCreate(DriverObject,
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,
&config,
WDF_NO_HANDLE);
return status;
}
興味深いことに、このリポジトリにはGitHub Actionsを使用したドライバーの自動ビルドの手順も含まれています。低レベルプロジェクトのCI/CDを設定したい場合に便利です。
注意点
重要なポイント:これらの例からコードをコピーして本番環境にそのまま出荷することはできません。Microsoftは「From Sample Code to Production Driver」のドキュメントでこれを特に強調しています。以下のことを行う必要があります:
- デバイス用の新しいGUIDを生成する。
- エラー処理を注意深く確認する(例では簡略化されていることが多い)。
- デジタル署名を構成する。そうしなければ、Windowsは単にバイナリのロードを拒否します。
ちなみに、始めたばかりであれば、まずUMDFドライバーフォルダを見ることをお勧めします。もっと安全です。ポインタエラー1つでコンピュータが再起動する恐れもなく、通常のアプリケーションのようにコードをデバッグできます。
誰に向いているか
第一に、システムプログラマーと組み込みシステムに取り組む方です。しかし、アプリケーションソフトウェアの仕事をしていても、ファイルシステムやネットワークドライバーの構造を理解하면、見識が大きく広がります。特定のI/O操作がなぜそのように動作するのか分かるようになります。
リポジトリは生きており、定期的にコミットが行われ、スター数(約8千)は「ハードウェア」からの抽象化が進む中でも、ドライバー開発が 여전히関連性があることを示しています。Cによるシステムプログラミングの質の高い例が不足していたなら、それが見つかりました。
関連プロジェクト