Menulis driver sederhana dengan Rust
- Ekosistem bahasa Rust terus berkembang setiap hari dan merupakan satu-satunya bahasa arus utama yang menyediakan keamanan memori dan konkurensi pada waktu kompilasi. Sistem build yang kuat dan kaya (
cargo) serta jumlah paket (crates) yang terus bertambah juga menjadi kelebihannya.
- Sebagai bahasa pemrograman sistem, Rust dapat digunakan di ranah yang sama dengan C/C++. Verbositas saat mengonversi tipe C ke Rust dapat dikurangi dengan wrapper dan macro yang sesuai.
- Artikel ini menjelaskan cara mengubah prioritas thread dengan menulis versi Rust dari driver "Booster" yang diperkenalkan dalam buku Windows Kernel Programming.
Memulai
- Untuk menyiapkan build driver, rujuk ke Windows Drivers-rs, dan diperlukan instalasi WDK serta LLVM.
- Anda dapat membuat driver dengan membuat proyek library Rust baru:
cargo new --lib booster
- Anda perlu menambahkan file
build.rs untuk mengatur agar CRT ditautkan secara statis.
Menulis kode
- Karena tidak ada standard library di kernel, mulai dengan menggunakan
#![no_std].
- Crate
wdk_sys menyediakan interoperabilitas dengan fungsi kernel tingkat rendah, dan crate wdk menyediakan wrapper tingkat tinggi.
Vec dan String didefinisikan di modul alloc, dan dapat digunakan dengan menyediakan global allocator.
DriverEntry adalah titik masuk semua driver kernel Windows, dan output debug dapat dilakukan dengan macro println! milik Rust.
Menangani permintaan
- Permintaan
IRP_MJ_CREATE, IRP_MJ_CLOSE, dan IRP_MJ_WRITE harus ditangani.
- Fungsi
boost_write adalah bagian yang benar-benar mengubah prioritas thread.
- Struktur
ThreadData digunakan untuk mengirim permintaan ke driver.
Instalasi dan pengujian driver
- File driver dapat diinstal menggunakan alat
sc.exe, dan dapat dimuat ke sistem dengan sc start.
- Pengujian dapat dilakukan dengan menggunakan aplikasi C++ untuk berkomunikasi dengan driver dan mengirimkan struktur yang benar.
Kesimpulan
- Menulis driver kernel dengan Rust memang memungkinkan, dan dukungannya diperkirakan akan meningkat dengan cepat.
- Untuk memanfaatkan kelebihan Rust semaksimal mungkin, penting untuk membuat wrapper yang aman guna mengurangi verbositas kode dan menghindari blok
unsafe.
- Kode untuk artikel ini dapat dilihat di GitHub: https://github.com/zodiacon/Booster
Belum ada komentar.