2 ポイント 投稿者 GN⁺ 2025-02-10 | まだコメントはありません。 | WhatsAppで共有

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クレートは高レベルのラッパーを提供する。
  • VecStringallocモジュールで定義されており、グローバルアロケータを提供することで利用できる。
  • DriverEntryはすべてのWindowsカーネルドライバーのエントリポイントであり、Rustのprintln!マクロを使ってデバッグ出力できる。

リクエスト処理

  • IRP_MJ_CREATEIRP_MJ_CLOSEIRP_MJ_WRITEリクエストを処理する必要がある。
  • boost_write関数は、スレッド優先度を実際に変更する部分である。
  • ThreadData構造体を使ってドライバーへリクエストを渡す。

ドライバーのインストールとテスト

  • ドライバーファイルはsc.exeツールを使ってインストールでき、sc startでシステムにロードできる。
  • C++アプリケーションを使ってドライバーと通信し、正しい構造体を渡してテストできる。

結論

  • Rustでカーネルドライバーを書くことは可能であり、サポートは今後急速に改善していくと期待される。
  • Rustの利点を最大限に活かすため、安全なラッパーを作ってコードの冗長さを減らし、unsafeブロックを避けることが重要である。
  • この記事のコードはGitHubで確認できる: https://github.com/zodiacon/Booster

まだコメントはありません。

まだコメントはありません。