windows-drivers-rs - Platform yang memungkinkan pengembangan driver Windows di Rust
(github.com/microsoft)- Kumpulan crate Rust yang memungkinkan pengembangan Windows Drivers dengan Rust, dengan tujuan mendukung model pengembangan driver WDM dan WDF
- Komponen utamanya mencakup
wdk-builduntuk konfigurasi build WDK,wdk-sysuntuk binding FFI langsung ke API WDK,wdkuntuk binding API WDK yang aman dan idiomatis,wdk-panicuntuk panic handler,wdk-allocuntuk dukunganalloc, serta kumpulan makrowdk-macrosyang membantu penggunaan binding langsungwdk-sys - Dibuat dengan mempertimbangkan dukungan untuk driver WDM, KMDF, UMDF, serta Win32 Services, dan mencakup dukungan untuk semua versi WDF yang termasuk dalam WDK 22H2 atau yang lebih baru
- Crate yang dipublikasikan di
crates.iosaat ini hanya mendukung KMDF v1.33; binding untuk konfigurasi lain dapat dibuat dengan me-clonewindows-drivers-rslalu mengubah konfigurasibuild.rspadawdk-sys - Alur penggunaannya terdiri dari membuat paket Cargo
lib, menambahkan dependensiwdk-build,wdk,wdk-sys,wdk-alloc,wdk-panic, mengaturcdylib, mengonfigurasi metadata WDK, memanggilwdk_build::configure_wdk_binary_build()dibuild.rs, menambahkanDriverEntry, lalu menjalankancargo make- Crate Kernel Mode seperti driver KMDF dan WDM memerlukan strategi panic
abort,#![no_std], serta konfigurasi panic handler - Untuk menggunakan modul
allocdari pustaka standar Rust, perlu mengatur allocator globalwdk_alloc::WdkAllocator
- Crate Kernel Mode seperti driver KMDF dan WDM memerlukan strategi panic
- Persyaratan build mencakup
libclanguntukbindgen,cargo-makeuntuk pekerjaan pasca-build, serta lingkungan WDK yang valid, dengan cara yang direkomendasikan adalah masuk ke eWDK developer prompt cargo makesecara bawaan akan membangun dan memaketkan driver, dan sebagai hasilnya paket driver yang sudah ditandatangani serta fileWDRLocalTestCert.cerakan dibuat ditarget/<Cargo profile>/packageatau di bawah jalur arsitektur target- Mendukung penerusan argumen seperti
cargo make default --target <TARGET TRIPLE>,--release,--features <FEATURES>,+<TOOLCHAIN>, dan dapat mengaktifkan tugas verifikasi tanda tangan untuk file.sysdan.catyang dihasilkan dengan pengaturanWDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true - Ekstensi Cargo baru
cargo-wdksaat ini berstatus Preview dan sedang dikembangkan untuk menggantikancargo-makesebagai alat yang direkomendasikan untuk build driver Rust - Contoh minimal WDM, KMDF, dan UMDF tersedia di direktori examples, dan contoh pembuatan driver dapat dilihat di Windows-rust-driver-samples
- Masih berada pada tahap awal pengembangan dan belum direkomendasikan untuk penggunaan production
3 komentar
Komentar Hacker News
Bagi yang tidak ingat, Mark Russinovich, sebelum menggantikan posisi atasannya dan disebut-sebut sebagai kandidat CEO MSFT berikutnya, menjalankan perusahaan alat perangkat lunak dan konsultasi kernel NT yang menjadi tempat para engineer Redmond belajar pengembangan kernel NT.
Ia juga menemukan rootkit DRM milik Sony, fitur perlindungan file seperti rootkit milik Symantec, dan membongkar pembajakan ERD Commander oleh Best Buy.
Sekarang agak disayangkan bahwa pada 2014 ia menghapus akun LinkedIn-nya. Itu akun yang membuat seluruh Valley dan Mark terhubung sebagai koneksi tingkat pertama, tetapi tetap saja, menjadi relatif tidak dikenal memberi kebebasan dan kelincahan. Apa ya lagu reggae Desmond Dekker yang bilang tidak ada gunanya membual soal seberapa banyak yang sudah dilakukan dan diperoleh, serta siapa saja yang dikenal?
Cukup menarik bahwa perusahaan sebesar itu, meski punya posisi yang jauh lebih menguntungkan berupa kode sumber asli dan akses ke engineer, tetap tidak begitu mampu melakukan hal seperti ini sendiri. Pihak ketiga seperti ini—setidaknya Levin—harus banyak mengandalkan rekayasa balik.
https://newosxbook.com
Mengingat hampir setiap perusahaan di seluruh dunia yang memakai Windows menggunakan setidaknya satu alat Sysinternals, pengaruh Sysinternals mungkin bahkan lebih besar daripada Azure sendiri.
Bukankah itu juga alasan MSFT mengakuisisi Mark Russinovich dan timnya untuk merekrut mereka?
Kesan yang saya dapat dari buku pertamanya adalah bahwa ia memandang dunia dengan sangat hitam-putih.
Tweet asli: https://twitter.com/markrussinovich/status/17057307039574058...
http://farside.link/twitter.com/markrussinovich/status/17057...
Keren /s, tetapi ini tidak terasa seperti Rust:
pub struct QueueContext {
buffer: PVOID,
length: usize,
timer: wdf::Timer,
current_request: WDFREQUEST,
current_status: NTSTATUS,
spin_lock: wdf::SpinLock,
}
Saat menulis driver Rust di kernel Linux juga ada masalah serupa, begitu pula proyek lain yang berinteroperasi dengan C.
Tipe seperti NTSTATUS memiliki cukup banyak dokumentasi yang melekat padanya. Tidak seperti C atau C++, di Rust kita tidak bisa begitu saja menetapkan nilai integer ke nilai enum. Bisa saja membuat kelas wrapper lalu memaksa casting setiap kali, tetapi akibatnya setengah kode akan menjadi .into(), dan kemungkinan juga menambah overhead pada driver.
Dari kelihatannya, selain mungkin void* untuk buffer, nilai-nilai enum semacam ini hanya dibaca, bukan disetel atau diubah. Untuk NTSTATUS, blok match {} tampaknya sudah cukup. WDFREQUEST adalah handle, jadi selain menggantinya dengan handle lain bertipe sama, tidak banyak yang bisa dilakukan.
Timer dan SpinLock sudah diubah menjadi objek yang terasa Rust dengan panggilan library unsafe dibungkus di dalamnya. Selain itu, saya tidak melihat cara yang jelas untuk membuat kode ini lebih bergaya Rust tanpa beban kinerja yang signifikan.
Tahu apa yang lebih baik? Menulis driver perangkat dengan bahasa yang mengelola memori seperti C#.
Saya setuju dengan penilaian Microsoft bahwa yang terbaik adalah menjalankan lebih sedikit kode vendor di dalam kernel, bukan membuat kernel lebih mudah diakses. C# tidak cocok untuk situasi seperti “saya ingin mengakses suatu buffer, tetapi buffer itu belum di-page in, dan saya sedang berada di dalam interrupt handler”, sehingga menjalankan garbage collector di kernel tanpa bug tampaknya hampir mustahil.
Driver harus mengendalikan ketersediaan memori dengan sangat ketat, karena bisa saja mengakses memori pada saat page fault tidak mungkin terjadi, misalnya saat berada di interrupt handler. Bahasa dan runtime C# setidaknya harus menambahkan kemampuan untuk menangani hal ini secara eksplisit.
Menurut saya ini agak kurang diapresiasi, jadi saya tambahkan sedikit. Russinovich adalah orang yang membuat sangat banyak materi dan alat terkait kernel Windows. Rasanya tidak ada pengembang yang berkecimpung di pengembangan terkait kernel Windows (termasuk para pembuat rootkit) yang tidak pernah belajar dengan melihat materi atau dokumentasi buatan Russinovich.
Katanya kernel Windows sedang ditulis ulang dengan Rust, dan akhirnya SDK untuk driver juga mulai hadir. Sepertinya sebentar lagi akan ada pengumuman agar mulai membuat driver dengan Rust mulai 20XX.