2 points par GN⁺ 2025-02-10 | Aucun commentaire pour le moment. | Partager sur WhatsApp

É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.

Aucun commentaire pour le moment.