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.