2 Punkte von GN⁺ 2025-02-10 | Noch keine Kommentare. | Auf WhatsApp teilen

Einen einfachen Treiber in Rust schreiben

  • Das Rust-Sprachökosystem wächst täglich und ist die einzige verbreitete Mainstream-Sprache, die Speicher- und Nebenläufigkeitssicherheit bereits zur Compile-Zeit bietet. Auch das leistungsfähige und umfangreiche Build-System (cargo) sowie die wachsende Zahl an Paketen (crates) sind Vorteile.
  • Als Systemprogrammiersprache kann Rust in Bereichen eingesetzt werden, die sonst von C/C++ abgedeckt werden. Die Umständlichkeit bei der Umwandlung von C-Typen nach Rust lässt sich mit geeigneten Wrappern und Makros abmildern.
  • Dieser Artikel erklärt anhand einer Rust-Version des im Buch Windows Kernel Programming vorgestellten Treibers "Booster", wie sich die Thread-Priorität ändern lässt.

Erste Schritte

  • Zur Vorbereitung des Treiber-Builds sollte man sich an Windows Drivers-rs orientieren; außerdem sind die Installation des WDK und von LLVM erforderlich.
  • Zum Schreiben des Treibers kann man ein neues Rust-Bibliotheksprojekt anlegen: cargo new --lib booster
  • Zusätzlich muss eine Datei build.rs hinzugefügt werden, um das CRT statisch zu linken.

Code schreiben

  • Da es im Kernel keine Standardbibliothek gibt, beginnt man mit #![no_std].
  • Das Crate wdk_sys stellt Interoperabilität mit Kernel-Funktionen auf niedriger Ebene bereit, während das Crate wdk High-Level-Wrapper bietet.
  • Vec und String sind im Modul alloc definiert und können über einen globalen Allocator verwendet werden.
  • DriverEntry ist der Einstiegspunkt aller Windows-Kernel-Treiber; Debug-Ausgaben sind mit Rusts println!-Makro möglich.

Anfragen verarbeiten

  • Die Anfragen IRP_MJ_CREATE, IRP_MJ_CLOSE und IRP_MJ_WRITE müssen verarbeitet werden.
  • Die Funktion boost_write ist der Teil, der die Thread-Priorität tatsächlich ändert.
  • Über die Struktur ThreadData werden Anfragen an den Treiber übergeben.

Treiber installieren und testen

  • Die Treiberdatei kann mit dem Tool sc.exe installiert und mit sc start in das System geladen werden.
  • Zum Testen kann eine C++-Anwendung verwendet werden, die mit dem Treiber kommuniziert und die korrekte Struktur übergibt.

Fazit

  • Es ist möglich, Kernel-Treiber in Rust zu schreiben, und es ist zu erwarten, dass sich die Unterstützung schnell verbessert.
  • Um die Vorteile von Rust bestmöglich zu nutzen, ist es wichtig, sichere Wrapper zu erstellen, damit der Code weniger umständlich wird und unsafe-Blöcke vermieden werden.
  • Den Code zu diesem Artikel gibt es auf GitHub: https://github.com/zodiacon/Booster

Noch keine Kommentare.

Noch keine Kommentare.