Rustでシンプルなドライバーを書く
- Rust言語のエコシステムは日々成長しており、メモリ安全性と並行性安全性をコンパイル時に提供する唯一の主流言語である。強力で充実したビルドシステムであるcargoと、増え続けるパッケージ群であるcratesも利点である。
- Rustはシステムプログラミング言語として、C/C++と同じ領域で利用できる。Cの型をRustへ変換する際の冗長さは、適切なラッパーやマクロで緩和できる。
- この記事では、Windows Kernel Programmingの本で紹介されている「Booster」ドライバーのRust版を作成し、スレッド優先度を変更する方法を説明する。
はじめに
- ドライバーのビルドを準備するにはWindows Drivers-rsを参照し、WDKのインストールとLLVMのインストールが必要である。
- 新しいRustライブラリプロジェクトを作成してドライバーを書ける:
cargo new --lib booster
build.rsファイルを追加して、CRTを静的リンクするよう設定する必要がある。
コード作成
- カーネルでは標準ライブラリがないため、
#![no_std]を使って始める。
wdk_sysクレートは低レベルのカーネル関数との相互運用性を提供し、wdkクレートは高レベルのラッパーを提供する。
VecとStringはallocモジュールで定義されており、グローバルアロケータを提供することで利用できる。
DriverEntryはすべてのWindowsカーネルドライバーのエントリポイントであり、Rustのprintln!マクロを使ってデバッグ出力できる。
リクエスト処理
IRP_MJ_CREATE、IRP_MJ_CLOSE、IRP_MJ_WRITEリクエストを処理する必要がある。
boost_write関数は、スレッド優先度を実際に変更する部分である。
ThreadData構造体を使ってドライバーへリクエストを渡す。
ドライバーのインストールとテスト
- ドライバーファイルは
sc.exeツールを使ってインストールでき、sc startでシステムにロードできる。
- C++アプリケーションを使ってドライバーと通信し、正しい構造体を渡してテストできる。
結論
まだコメントはありません。