Viết một driver đơn giản bằng Rust
- Hệ sinh thái ngôn ngữ Rust đang phát triển mỗi ngày và là ngôn ngữ chủ đạo duy nhất cung cấp an toàn bộ nhớ và an toàn đồng thời ngay tại thời điểm biên dịch. Một ưu điểm khác là hệ thống build mạnh mẽ và phong phú (
cargo) cùng số lượng gói (crates) ngày càng tăng.
- Rust có thể được dùng như một ngôn ngữ lập trình hệ thống trong cùng lĩnh vực với C/C++. Sự dài dòng khi chuyển đổi các kiểu C sang Rust có thể được giảm bớt bằng các wrapper và macro phù hợp.
- Bài viết này giải thích cách thay đổi độ ưu tiên của luồng bằng cách viết phiên bản Rust của driver "Booster" được giới thiệu trong sách Windows Kernel Programming.
Bắt đầu
- Để chuẩn bị build driver, hãy tham khảo Windows Drivers-rs; cần cài đặt WDK và LLVM.
- Có thể tạo một dự án thư viện Rust mới để viết driver:
cargo new --lib booster
- Cần thêm tệp
build.rs để cấu hình liên kết tĩnh với CRT.
Viết mã
- Trong kernel không có thư viện chuẩn, vì vậy bắt đầu bằng
#![no_std].
- Crate
wdk_sys cung cấp khả năng tương tác với các hàm kernel mức thấp, còn crate wdk cung cấp các wrapper mức cao.
Vec và String được định nghĩa trong mô-đun alloc và có thể sử dụng nhờ trình cấp phát toàn cục.
DriverEntry là điểm vào của mọi driver kernel Windows, và có thể xuất debug bằng macro println! của Rust.
Xử lý yêu cầu
- Cần xử lý các yêu cầu
IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_WRITE.
- Hàm
boost_write là phần thực sự thay đổi độ ưu tiên của luồng.
- Sử dụng cấu trúc
ThreadData để truyền yêu cầu tới driver.
Cài đặt và kiểm thử driver
- Có thể cài đặt tệp driver bằng công cụ
sc.exe, và nạp nó vào hệ thống bằng sc start.
- Có thể kiểm thử bằng một ứng dụng C++ giao tiếp với driver và truyền đúng cấu trúc.
Kết luận
- Việc viết driver kernel bằng Rust là khả thi, và có thể kỳ vọng hỗ trợ sẽ được cải thiện nhanh chóng.
- Để tận dụng tối đa ưu điểm của Rust, điều quan trọng là tạo các wrapper an toàn để giảm sự dài dòng của mã và tránh các khối
unsafe.
- Có thể xem mã của bài viết này trên GitHub: https://github.com/zodiacon/Booster
Chưa có bình luận nào.