3 poin oleh GN⁺ 2023-09-25 | 3 komentar | Bagikan ke WhatsApp
  • Kumpulan crate Rust yang memungkinkan pengembangan Windows Drivers dengan Rust, dengan tujuan mendukung model pengembangan driver WDM dan WDF
  • Komponen utamanya mencakup wdk-build untuk konfigurasi build WDK, wdk-sys untuk binding FFI langsung ke API WDK, wdk untuk binding API WDK yang aman dan idiomatis, wdk-panic untuk panic handler, wdk-alloc untuk dukungan alloc, serta kumpulan makro wdk-macros yang membantu penggunaan binding langsung wdk-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.io saat ini hanya mendukung KMDF v1.33; binding untuk konfigurasi lain dapat dibuat dengan me-clone windows-drivers-rs lalu mengubah konfigurasi build.rs pada wdk-sys
  • Alur penggunaannya terdiri dari membuat paket Cargo lib, menambahkan dependensi wdk-build, wdk, wdk-sys, wdk-alloc, wdk-panic, mengatur cdylib, mengonfigurasi metadata WDK, memanggil wdk_build::configure_wdk_binary_build() di build.rs, menambahkan DriverEntry, lalu menjalankan cargo make
    • Crate Kernel Mode seperti driver KMDF dan WDM memerlukan strategi panic abort, #![no_std], serta konfigurasi panic handler
    • Untuk menggunakan modul alloc dari pustaka standar Rust, perlu mengatur allocator global wdk_alloc::WdkAllocator
  • Persyaratan build mencakup libclang untuk bindgen, cargo-make untuk pekerjaan pasca-build, serta lingkungan WDK yang valid, dengan cara yang direkomendasikan adalah masuk ke eWDK developer prompt
  • cargo make secara bawaan akan membangun dan memaketkan driver, dan sebagai hasilnya paket driver yang sudah ditandatangani serta file WDRLocalTestCert.cer akan dibuat di target/<Cargo profile>/package atau 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 .sys dan .cat yang dihasilkan dengan pengaturan WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true
  • Ekstensi Cargo baru cargo-wdk saat ini berstatus Preview dan sedang dikembangkan untuk menggantikan cargo-make sebagai 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

 
GN⁺ 2023-09-25
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?

    • Apple tampaknya juga melakukan hal serupa. Dokumen internal Apple tidak ada apa-apanya dibanding buku Jonathan Levin, sehingga katanya Apple sering membeli buku-buku itu untuk para engineer OS-nya.
      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
    • Tidak mungkin membicarakan dia tanpa menyebut Sysinternals. Saya mengandalkan kumpulan alat itu dalam pekerjaan sehari-hari.
      Mengingat hampir setiap perusahaan di seluruh dunia yang memakai Windows menggunakan setidaknya satu alat Sysinternals, pengaruh Sysinternals mungkin bahkan lebih besar daripada Azure sendiri.
    • Alat Sysinternals seharusnya disertakan secara default di setiap instalasi Windows. Di lingkungan saya, alat-alat itu wajib ada, dan saya benar-benar merasa kehilangan saat memperbaiki atau men-debug komputer teman tanpa alat tersebut.
      Bukankah itu juga alasan MSFT mengakuisisi Mark Russinovich dan timnya untuk merekrut mereka?
    • Dia programmer yang bagus, tetapi setelah membaca bukunya, saya tidak merasa dia akan menjadi CEO yang bagus.
      Kesan yang saya dapat dari buku pertamanya adalah bahwa ia memandang dunia dengan sangat hitam-putih.
  • Tweet asli: https://twitter.com/markrussinovich/status/17057307039574058...

  • 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,
    }

    • Sebagian besar dari itu pada akhirnya menunjuk ke tipe integer FFI. Begitulah API driver Windows digunakan.
      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.
    • Sepertinya untuk menghilangkan itu, semuanya harus ditulis ulang.
  • Tahu apa yang lebih baik? Menulis driver perangkat dengan bahasa yang mengelola memori seperti C#.

    • Microsoft semakin banyak mendorong kode ke ruang pengguna. Salah satu perubahan terbaru adalah mewajibkan produsen printer menggunakan aplikasi printer UWP, bukan driver, ketika mereka ingin menambahkan fitur kustom pada printer. Aplikasi seperti ini biasanya ditulis dalam bahasa 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.
    • Saya tidak yakin itu benar-benar lebih baik. Saya tidak punya pengalaman mengembangkan driver, tetapi driver perangkat adalah komponen inti tingkat rendah dari sistem operasi yang sedang berjalan, jadi tampaknya tidak cocok dengan cara garbage collection menghentikan eksekusi sesuai jadwalnya sendiri.
    • Saya tidak ingin mouse tersendat karena driver berhenti untuk menjalankan garbage collector.
    • Microsoft sudah pernah mencobanya, tetapi gagal total. Sepertinya mereka tidak pernah menjelaskan alasannya, tetapi pada hardware awal 2000-an, saya rasa garbage collection pasti menyebabkan terlalu banyak jeda.
    • Bahkan dengan C++, menulis driver perangkat sambil mempertahankan kemampuan membuat driver kernel yang dapat di-page sangatlah sulit.
      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.
 
bungker 2023-11-30

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.

 
botplaysdice 2023-12-01

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.