repo นี้เป็นคอลเลกชันของลังสนิมที่ช่วยให้นักพัฒนาพัฒนาไดรเวอร์ Windows ใน Rust มันเป็นความตั้งใจที่จะสนับสนุนรูปแบบการพัฒนาไดรเวอร์ทั้ง WDM และ WDF repo นี้มีลังต่อไปนี้:
bindgen และการใช้งานซ้ำของมาโครที่ bindgen ไม่สามารถสร้างได้ด้วยตนเองwdk-sys และลังควรโดยทั่วไปไม่จำเป็นต้องขึ้นอยู่กับ wdk-macros โดยตรงหากต้องการดูตัวอย่างของ repo นี้ที่ใช้ในการสร้างไดรเวอร์ให้ดูตัวอย่างของไดรฟ์-ไดรฟ์
หมายเหตุ: โครงการนี้ยังอยู่ในช่วงเริ่มต้นของการพัฒนาและยังไม่แนะนำสำหรับการใช้งานการผลิต เราสนับสนุนการทดลองชุมชนคำแนะนำและการอภิปราย! เราจะใช้ฟอรัมการอภิปราย GitHub ของเราเป็นรูปแบบหลักของการมีส่วนร่วมกับชุมชน!
โครงการนี้สร้างขึ้นด้วยการสนับสนุนของไดรเวอร์ WDM, KMDF และ UMDF ในใจรวมถึงบริการ Win32 ซึ่งรวมถึงการสนับสนุนสำหรับ WDF ทุกรุ่นที่รวมอยู่ใน WDK 22H2 และใหม่กว่า ปัจจุบันลังที่มีอยู่ใน crates.io รองรับ KMDF v1.33 เท่านั้น แต่สามารถสร้างการผูกได้สำหรับทุกอย่างอื่นโดยการโคลนนิ่ง windows-drivers-rs และแก้ไขการกำหนดค่าที่ระบุใน build.rs ของ wdk-sys Cut.io สนับสนุนการกำหนดค่า WDK อื่น ๆ มีการวางแผนในอนาคตอันใกล้
หมายเหตุ:: เนื่องจากตัวอย่างระดับพื้นที่ทำงานและการทดสอบใช้การกำหนดค่า WDK ที่แตกต่างกันและ WDR รองรับการกำหนดค่า WDK หนึ่งครั้งต่อพื้นที่ทำงานตัวอย่างและโฟลเดอร์ทดสอบระดับพื้นที่ทำงานจะถูกแยกออกจากรายการเก็บสินค้าของรูทที่เก็บ
การสร้างผลผูกพันผ่าน bindgen ต้องการ libclang วิธีที่ง่ายที่สุดในการรับสิ่งนี้คือผ่าน winget
winget install -i LLVM.LLVM --version 17.0.6 --force ในการดำเนินงานหลังการสร้าง (เช่น inf2cat , infverif , ฯลฯ ), cargo make ที่ใช้
cargo install --locked cargo-make --no-default-features --features tls-nativeโปรแกรมการสร้างด้วย WDK ยังต้องอยู่ในสภาพแวดล้อม WDK ที่ถูกต้อง วิธีที่แนะนำในการทำเช่นนี้คือการป้อนพรอมต์นักพัฒนา EWDK
ลังในพื้นที่เก็บข้อมูลนี้มีให้บริการจาก crates.io แต่คำนึงถึงข้อ จำกัด ปัจจุบันที่ระบุไว้ในการกำหนดค่าที่รองรับ หากคุณต้องการสนับสนุนการกำหนดค่าอื่นลองโคลน repo นี้และใช้การพึ่งพาเส้นทาง
สร้างแพ็คเกจสินค้าใหม่ด้วย Lib Crate:
cargo new < driver_name > -- lib เพิ่มการพึ่งพาบนลัง windows-drivers-rs :
cd < driver_name >
cargo add -- build wdk - build
cargo add wdk wdk - sys wdk - alloc wdk - panic ตั้งค่าประเภทลังเป็น cdylib โดยเพิ่มตัวอย่างต่อไปนี้ลงใน Cargo.toml :
[ lib ]
crate-type = [ " cdylib " ]เพิ่มส่วนข้อมูลเมตา WDK และกำหนดค่า WDK สำหรับกรณีการใช้งานของคุณ นอกจากนี้ยังช่วยให้งานทำสินค้าทำหน้าที่ทราบว่าแพ็คเกจเป็นไดรเวอร์และขั้นตอนการบรรจุภัณฑ์ของไดรเวอร์ต้องเรียกใช้
ตัวอย่าง umdf:
[ package . metadata . wdk . driver-model ]
driver-type = " UMDF "
umdf-version-major = 1
target-umdf-version-minor = 33 สำหรับลังโหมดเคอร์เนล (เช่นไดรเวอร์ KMDF , ไดรเวอร์ WDM ): ตั้งกลยุทธ์ Crate Panic เพื่อ abort ใน Cargo.toml :
[ profile . dev ]
panic = " abort "
[ profile . release ]
panic = " abort " สร้าง build.rs และเพิ่มตัวอย่างต่อไปนี้:
fn main ( ) -> Result < ( ) , wdk_build :: ConfigError > {
wdk_build :: configure_wdk_binary_build ( )
} สำหรับลังโหมดเคอร์เนล (เช่นไดรเวอร์ KMDF , ไดรเวอร์ WDM ): ทำเครื่องหมายลังไดร์เวอร์ของคุณเป็น no_std ใน lib.rs :
#! [ no_std ] สำหรับลังโหมดเคอร์เนล (เช่นไดรเวอร์ KMDF , ไดรเวอร์ WDM ): เพิ่มตัวจัดการตื่นตระหนกใน lib.rs :
# [ cfg ( not ( test ) ) ]
extern crate wdk_panic ; สำหรับลังโหมดเคอร์เนล (เช่นไดรเวอร์ KMDF , ไดรเวอร์ WDM ): เพิ่มตัวเลือกทั่วโลกเสริมใน lib.rs :
# [ cfg ( not ( test ) ) ]
use wdk_alloc :: WdkAllocator ;
# [ cfg ( not ( test ) ) ]
# [ global_allocator ]
static GLOBAL_ALLOCATOR : WdkAllocator = WdkAllocator ; สิ่งนี้จำเป็นก็ต่อเมื่อคุณต้องการใช้โมดูล alloc ในไลบรารีมาตรฐานสนิม
เพิ่มคนขับใน lib.rs :
use wdk_sys :: {
PDRIVER_OBJECT ,
NTSTATUS ,
PCUNICODE_STRING ,
} ;
# [ export_name = "DriverEntry" ] // WDF expects a symbol with the name DriverEntry
pub unsafe extern "system" fn driver_entry (
driver : PDRIVER_OBJECT ,
registry_path : PCUNICODE_STRING ,
) -> NTSTATUS {
0
} หมายเหตุ: ในลังโหมดเคอร์เนลคุณสามารถใช้ driver: &mut DRIVER_OBJECT แทน driver: PDRIVER_OBJECT
เพิ่ม Makefile.toml :
extend = " target/rust-driver-makefile.toml "
[ config ]
load_script = '''
#!@rust
//! ```cargo
//! [dependencies]
//! wdk-build = "0.3.0"
//! ```
#![allow(unused_doc_comments)]
wdk_build::cargo_make::load_rust_driver_makefile()?
''' เพิ่มไฟล์ INX ที่ตรงกับชื่อ cdylib Crate ของคุณ
เปิดใช้งานการเชื่อมโยง CRT แบบคงที่ วิธีหนึ่งคือการเพิ่มสิ่งนี้ลงใน .cargo/config.toml :
[ build ]
rustflags = [ " -C " , " target-feature=+crt-static " ]สร้างไดรเวอร์:
cargo make แพ็คเกจไดรเวอร์ที่ลงนามรวมถึงไฟล์ WDRLocalTestCert.cer จะถูกสร้างขึ้นที่ target/<Cargo profile>/package หากมี target/<target architecture>/<Cargo profile>/package ระบุสถาปัตยกรรมเป้าหมายที่เฉพาะ
ตัวอย่างน้อยที่สุดของไดรเวอร์ WDM , KMDF และ UMDF สามารถพบได้ในไดเรกทอรีตัวอย่าง
cargo-make จะใช้เพื่ออำนวยความสะดวกในการสร้างโดยใช้ windows-drivers-rs รวมถึงการดำเนินการขั้นตอนการบรรจุภัณฑ์ไดรเวอร์หลังสร้าง
ในการดำเนินการเริ่มต้นการกระทำเริ่มต้น (build and package driver):
cargo make default
เมื่อดำเนินการงานเริ่มต้นเพียงแค่ cargo make ทำงานได้เช่นกันเนื่องจากงาน default มีนัยยะ
windows-drivers-rs ขยาย cargo make เพื่อส่งต่ออาร์กิวเมนต์เฉพาะไปยังคำสั่งการ cargo พื้นฐาน ในการระบุอาร์กิวเมนต์เพื่อส่งต่อพวกเขาจะต้องได้รับ หลังจากระบุชื่องาน cargo-make หน้าที่อย่างชัดเจน (เช่นการละเว้นชื่อสำหรับงาน default ไม่ได้รับการสนับสนุน)
สำหรับเป้าหมายเฉพาะ:
cargo make default --target <TARGET TRIPLE>
สำหรับการสร้างรุ่น:
cargo make default --release หรือ cargo make default --profile release
เพื่อระบุคุณสมบัติเฉพาะ:
cargo make default --features <FEATURES>
เพื่อระบุเชนที่เป็นสนิมที่เฉพาะเจาะจง:
cargo make default +<TOOLCHAIN>
เพื่อแสดงความช่วยเหลือและดูรายการทั้งหมดของ CLI args ที่รองรับเพื่อส่งต่อไปยังสินค้า:
cargo make help
WDK_BUILD_ENABLE_SIGNTOOL_VERIFY ตัวแปรสภาพแวดล้อมการทำสินค้าสามารถตั้งค่าเป็น true เพื่อเปิดใช้งานงานที่จัดการการตรวจสอบลายเซ็นของไฟล์ .sys และ .cat ที่สร้างขึ้น signtool verify ต้องมีการติดตั้งใบรับรองเช่นใน Trusted Root Certification Authorities สำหรับการตรวจสอบนี้เพื่อใช้งาน งานเหล่านี้ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นเนื่องจากพฤติกรรมเริ่มต้นของ WDR คือการลงนามด้วยใบรับรองการทดสอบที่สร้างขึ้น โดยทั่วไปใบรับรองการทดสอบเหล่านี้จะถูกติดตั้งไว้ใน Trusted Root Certification Authorities ในคอมพิวเตอร์ที่ทุ่มเทให้กับการทดสอบไดรเวอร์และไม่ใช่เครื่องพัฒนาส่วนบุคคลเนื่องจากผลกระทบด้านความปลอดภัยของการติดตั้งใบรับรองรูทของคุณเอง
หากคุณเข้าใจความหมายเหล่านี้และได้ติดตั้งใบรับรองการทดสอบคุณอาจตรวจสอบลายเซ็นดังต่อไปนี้:
cargo make --env WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true
การปล่อยไปยังลังไม่ได้ทำหลังจากการเปลี่ยนแปลงทุกครั้งที่รวมเข้ากับหลัก จะมีการเผยแพร่เมื่อชุมชนร้องขอหรือเมื่อทีม windows-drivers-rs เชื่อว่ามีค่าเพียงพอในการผลักดันการเปิดตัว
เครื่องหมายการค้าโครงการนี้อาจมีเครื่องหมายการค้าหรือโลโก้สำหรับโครงการผลิตภัณฑ์หรือบริการ การใช้เครื่องหมายการค้าหรือโลโก้ของ Microsoft ที่ได้รับอนุญาตขึ้นอยู่กับและต้องปฏิบัติตามแนวทางเครื่องหมายการค้าและแบรนด์ของ Microsoft การใช้เครื่องหมายการค้าหรือโลโก้ของ Microsoft ในรุ่นที่แก้ไขของโครงการนี้จะต้องไม่ทำให้เกิดความสับสนหรือบอกเป็นสปอนเซอร์ของ Microsoft การใช้เครื่องหมายการค้าหรือโลโก้ของบุคคลที่สามจะอยู่ภายใต้นโยบายของบุคคลที่สามเหล่านั้น