Écrire un pilote simple en Rust
- L’écosystème du langage Rust continue de croître chaque jour, et c’est le seul langage grand public à offrir la sûreté mémoire et la sûreté de concurrence à la compilation. Son système de build puissant et riche (
cargo) ainsi que le nombre croissant de paquets (crates) constituent aussi des atouts.
- Rust, en tant que langage de programmation système, peut être utilisé dans le même domaine que le C/C++. Le caractère verbeux de la conversion des types C vers Rust peut être atténué avec des wrappers et des macros appropriés.
- Cet article explique comment modifier la priorité des threads en écrivant une version Rust du pilote « Booster » présenté dans le livre Windows Kernel Programming.
Pour commencer
- Pour préparer la compilation du pilote, il faut se référer à Windows Drivers-rs, et installer le WDK ainsi que LLVM.
- Il est possible d’écrire le pilote en créant un nouveau projet de bibliothèque Rust :
cargo new --lib booster
- Il faut ajouter un fichier
build.rs pour configurer l’édition de liens statique avec la CRT.
Écriture du code
- Comme il n’y a pas de bibliothèque standard dans le kernel, on commence avec
#![no_std].
- Le crate
wdk_sys fournit l’interopérabilité avec les fonctions kernel de bas niveau, tandis que le crate wdk fournit des wrappers de plus haut niveau.
Vec et String sont définis dans le module alloc et peuvent être utilisés en fournissant un allocateur global.
DriverEntry est le point d’entrée de tous les pilotes kernel Windows, et il est possible d’afficher une sortie de débogage avec la macro println! de Rust.
Traitement des requêtes
- Il faut gérer les requêtes
IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_WRITE.
- La fonction
boost_write est la partie qui modifie réellement la priorité du thread.
- La structure
ThreadData est utilisée pour transmettre les requêtes au pilote.
Installation et test du pilote
- Le fichier du pilote peut être installé avec l’outil
sc.exe, puis chargé dans le système avec sc start.
- Il est possible de le tester en utilisant une application C++ pour communiquer avec le pilote et transmettre la structure correcte.
Conclusion
- Il est possible d’écrire un pilote kernel en Rust, et l’on peut s’attendre à ce que la prise en charge s’améliore rapidement.
- Pour tirer pleinement parti des avantages de Rust, il est important de créer des wrappers sûrs afin de réduire le caractère verbeux du code et d’éviter les blocs
unsafe.
- Le code de cet article est disponible sur GitHub : https://github.com/zodiacon/Booster
Aucun commentaire pour le moment.