Escrevendo um driver simples em Rust
- O ecossistema da linguagem Rust cresce todos os dias e é a única linguagem mainstream que oferece segurança de memória e de concorrência em tempo de compilação. Um sistema de build poderoso e rico (
cargo) e o número crescente de pacotes (crates) também são vantagens.
- Rust, como linguagem de programação de sistemas, pode ser usada nas mesmas áreas que C/C++. A verbosidade ao converter tipos de C para Rust pode ser amenizada com wrappers e macros adequados.
- Neste artigo, é explicado como alterar a prioridade de threads escrevendo uma versão em Rust do driver "Booster", apresentado no livro Windows Kernel Programming.
Primeiros passos
- Para preparar o build do driver, consulte o Windows Drivers-rs, e é necessário instalar o WDK e o LLVM.
- É possível criar um novo projeto de biblioteca Rust para escrever o driver:
cargo new --lib booster
- É necessário adicionar o arquivo
build.rs para configurar o link estático do CRT.
Escrevendo o código
- No kernel não há biblioteca padrão, então começa-se com
#![no_std].
- O crate
wdk_sys fornece interoperabilidade com funções de kernel de baixo nível, e o crate wdk fornece wrappers de nível mais alto.
Vec e String são definidos no módulo alloc e podem ser usados fornecendo um alocador global.
DriverEntry é o ponto de entrada de todos os drivers de kernel do Windows, e é possível emitir saída de depuração usando o macro println! do Rust.
Tratamento de requisições
- É necessário tratar as requisições
IRP_MJ_CREATE, IRP_MJ_CLOSE e IRP_MJ_WRITE.
- A função
boost_write é a parte que realmente altera a prioridade da thread.
- A estrutura
ThreadData é usada para passar requisições ao driver.
Instalação e testes do driver
- O arquivo do driver pode ser instalado com a ferramenta
sc.exe e carregado no sistema com sc start.
- É possível testar usando uma aplicação em C++ para se comunicar com o driver e passar a estrutura correta.
Conclusão
- É possível escrever drivers de kernel em Rust, e espera-se que o suporte melhore rapidamente.
- Para aproveitar ao máximo as vantagens do Rust, é importante criar wrappers seguros para reduzir a verbosidade do código e evitar blocos
unsafe.
- O código deste artigo pode ser visto no GitHub: https://github.com/zodiacon/Booster
Ainda não há comentários.