Cómo escribir un controlador simple en Rust
- El ecosistema del lenguaje Rust crece día a día y es el único lenguaje convencional que ofrece seguridad de memoria y concurrencia en tiempo de compilación. También son ventajas su sistema de construcción potente y abundante (
cargo) y la creciente cantidad de paquetes (crates).
- Rust, como lenguaje de programación de sistemas, puede usarse en áreas similares a C/C++. La verbosidad al convertir tipos de C a Rust puede mitigarse con wrappers y macros adecuados.
- En este artículo se explica cómo cambiar la prioridad de hilos escribiendo una versión en Rust del controlador "Booster" presentado en el libro Windows Kernel Programming.
Primeros pasos
- Para preparar la compilación del controlador, hay que consultar Windows Drivers-rs, e instalar WDK y LLVM.
- Se puede crear un nuevo proyecto de biblioteca en Rust para escribir el controlador:
cargo new --lib booster
- Hay que agregar un archivo
build.rs para configurar el enlace estático con el CRT.
Escritura del código
- En el kernel no existe la biblioteca estándar, así que se empieza con
#![no_std].
- El crate
wdk_sys proporciona interoperabilidad con funciones de kernel de bajo nivel, y el crate wdk ofrece wrappers de alto nivel.
Vec y String están definidos en el módulo alloc y pueden usarse proporcionando un asignador global.
DriverEntry es el punto de entrada de todos los controladores del kernel de Windows, y se puede hacer salida de depuración usando la macro println! de Rust.
Manejo de solicitudes
- Hay que manejar las solicitudes
IRP_MJ_CREATE, IRP_MJ_CLOSE e IRP_MJ_WRITE.
- La función
boost_write es la parte que realmente cambia la prioridad del hilo.
- Se usa la estructura
ThreadData para pasar solicitudes al controlador.
Instalación y pruebas del controlador
- El archivo del controlador puede instalarse con la herramienta
sc.exe y cargarse en el sistema con sc start.
- Se puede probar usando una aplicación en C++ para comunicarse con el controlador y pasar la estructura correcta.
Conclusión
- Es posible escribir controladores de kernel en Rust, y se espera que el soporte mejore rápidamente.
- Para aprovechar al máximo las ventajas de Rust, es importante crear wrappers seguros para reducir la verbosidad del código y evitar bloques
unsafe.
- El código de este artículo puede consultarse en GitHub: https://github.com/zodiacon/Booster
Aún no hay comentarios.