2 pontos por GN⁺ 2025-02-10 | Ainda não há comentários. | Compartilhar no WhatsApp

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.

Ainda não há comentários.