Dieses Repo ist eine Sammlung von Rostkisten, mit denen Entwickler Windows -Treiber in Rost entwickeln können. Es ist die Absicht, sowohl WDM- als auch WDF -Treiberentwicklungsmodelle zu unterstützen. Dieses Repo enthält die folgenden Kisten:
bindgen als auch manuelle Neuauflagen von Makros, die Bindgen nicht erzeugen.wdk-sys erneut exportiert, und Kisten sollten normalerweise nie direkt von wdk-macros abhängen müssenUm ein Beispiel für dieses Repo zu sehen, das zum Erstellen von Treibern verwendet wird, finden Sie in Windows-RUST-Treiber-Samples.
HINWEIS: Dieses Projekt befindet sich noch in frühen Entwicklungsstadien und wird noch nicht für die Produktionsnutzung empfohlen. Wir fördern das Experimentieren, Vorschläge und Diskussionen in der Gemeinschaft! Wir werden unser GitHub Diskussions -Forum als Hauptform des Engagements mit der Community verwenden!
Dieses Projekt wurde mit Unterstützung von WDM-, KMDF- und UMDF -Treibern sowie von Win32 -Diensten gebaut. Dies beinhaltet die Unterstützung für alle Versionen von WDF, die in WDK 22H2 und neuer enthalten sind. windows-drivers-rs build.rs die in crates.io verfügbaren Kisten wdk-sys CRATES.IO -Unterstützung für andere WDK -Konfigurationen ist in naher Zukunft geplant.
HINWEIS: Da Beispiele und Tests auf Arbeitsbereichsebene unterschiedliche WDK-Konfigurationen verwenden und WDR nur eine WDK-Konfiguration pro Arbeitsbereich unterstützt, werden Beispiele und Tests in Workspace-Ebene und Tests aus dem Frachtmanifest der Repository Root ausgeschlossen.
Die Bindungserzeugung über bindgen erfordert libclang . Der einfachste Weg, dies zu erwerben, ist über winget
winget install -i LLVM.LLVM --version 17.0.6 --force Um Aufgaben nach dem Bau auszuführen (dh inf2cat , infverif usw.), wird cargo make verwendet
cargo install --locked cargo-make --no-default-features --features tls-nativeDas Aufbau von Programmen mit dem WDK erfordert auch, dass sie sich in einer gültigen WDK -Umgebung befinden. Die empfohlene Möglichkeit, dies zu tun
Die Kisten in diesem Repository sind von crates.io verfügbar, berücksichtigen jedoch die aktuellen Einschränkungen, die in unterstützten Konfigurationen beschrieben werden. Wenn Sie eine andere Konfiguration unterstützen müssen, versuchen Sie, dieses Repo zu klonen und Pfadabhängigkeiten zu verwenden
Erstellen Sie ein neues Frachtpaket mit einer LIB -Kiste:
cargo new < driver_name > -- lib Fügen Sie Abhängigkeiten zu windows-drivers-rs Kisten hinzu:
cd < driver_name >
cargo add -- build wdk - build
cargo add wdk wdk - sys wdk - alloc wdk - panic Stellen Sie den Kisten -Typ auf cdylib ein, indem Sie das folgende Snippet zu Cargo.toml hinzufügen:
[ lib ]
crate-type = [ " cdylib " ]Fügen Sie einen WDK -Metadatenabschnitt hinzu und konfigurieren Sie den WDK für Ihren Anwendungsfall. Dadurch werden die Frachtaufgaben auch wissen, dass das Paket ein Treiber ist und dass die Treiberverpackungsschritte ausgeführt werden müssen.
UMDF -Beispiel:
[ package . metadata . wdk . driver-model ]
driver-type = " UMDF "
umdf-version-major = 1
target-umdf-version-minor = 33 WDM Cargo.toml -Moduskisten KMDF Ex abort
[ profile . dev ]
panic = " abort "
[ profile . release ]
panic = " abort " Erstellen Sie ein build.rs und fügen Sie den folgenden Snippet hinzu:
fn main ( ) -> Result < ( ) , wdk_build :: ConfigError > {
wdk_build :: configure_wdk_binary_build ( )
} Für Kernel -Moduskisten (Ex. KMDF -Treiber, WDM -Treiber): Markieren Sie Ihre Fahrerkiste als no_std in lib.rs :
#! [ no_std ] WDM lib.rs -Moduskisten KMDF Ex.
# [ cfg ( not ( test ) ) ]
extern crate wdk_panic ; Für Kernel -Moduskisten (Ex. KMDF -Treiber, WDM -Treiber): Fügen Sie einen optionalen globalen Allocator in lib.rs hinzu:
# [ cfg ( not ( test ) ) ]
use wdk_alloc :: WdkAllocator ;
# [ cfg ( not ( test ) ) ]
# [ global_allocator ]
static GLOBAL_ALLOCATOR : WdkAllocator = WdkAllocator ; Dies ist nur erforderlich, wenn Sie die alloc -Module in der Rust -Standardbibliothek verwenden möchten.
Fügen Sie einen TriverEntry in lib.rs hinzu:
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
} HINWEIS: In Kernmoduskisten können Sie driver: &mut DRIVER_OBJECT anstelle von driver: PDRIVER_OBJECT .
Fügen Sie eine Makefile.toml hinzu:
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()?
''' Fügen Sie eine INX -Datei hinzu, die mit dem Namen Ihrer cdylib -Kiste entspricht.
Aktivieren Sie die statische CRT -Verknüpfung. Ein Ansatz besteht darin, dies zu Ihrem .cargo/config.toml hinzuzufügen:
[ build ]
rustflags = [ " -C " , " target-feature=+crt-static " ]Bauen Sie den Fahrer:
cargo make Ein signiertes Treiberpaket, einschließlich einer WDRLocalTestCert.cer -Datei, wird unter target/<Cargo profile>/package generiert. Wenn eine bestimmte Zielarchitektur angegeben wurde, wird das Treiberpaket unter target/<target architecture>/<Cargo profile>/package generiert
Minimale Beispiele für WDM , KMDF und UMDF -Treiber finden Sie im Beispielverzeichnis.
cargo-make werden Builds mithilfe von windows-drivers-rs ermöglicht, einschließlich der Ausführung von Schritten für Verpackungen nach dem Bau von Fahrern.
Um die Standardaktion auszuführen (Build- und Pakettreiber):
cargo make default
Bei der Ausführung der Standardaufgabe machen Sie einfach auch cargo make , da die default impliziert ist.
windows-drivers-rs erweitert cargo make um bestimmte Argumente an die zugrunde liegenden cargo weiterzuleiten. Um Argumente zu leiten, müssen sie bereitgestellt werden , nachdem der Name cargo-make Tasks ausdrücklich angegeben wurde (dh die Auslassung des Namens für die default wird nicht unterstützt).
Für ein bestimmtes Ziel:
cargo make default --target <TARGET TRIPLE>
Für Veröffentlichungsergebnisse:
cargo make default --release oder cargo make default --profile release
Um bestimmte Funktionen anzugeben:
cargo make default --features <FEATURES>
Um eine bestimmte Rost -Toolchain anzugeben:
cargo make default +<TOOLCHAIN>
Um Hilfe anzuzeigen und die vollständige Liste der unterstützten CLI -Argumente anzusehen, um sich an Fracht weiterzuleiten:
cargo make help
Die Variable Umgebungsumgebungsvariable WDK_BUILD_ENABLE_SIGNTOOL_VERIFY kann auf Aufgaben true werden, die die Signaturüberprüfung der generierten .sys und .cat Dateien verarbeiten. signtool verify verlangt, dass das Zertifikat wie in den Trusted Root Certification Authorities für diese Überprüfung installiert werden soll. Diese Aufgaben sind standardmäßig nicht aktiviert, da das Standardverhalten von WDR darin besteht, ein generiertes Testzertifikat zu unterschreiben. Diese Testzertifikate werden in der Regel nur in Trusted Root Certification Authorities auf Computern eingebaut, die den Testen von Treibern gewidmet sind, und nicht in persönlichen Entwicklungsmaschinen, angesichts der Sicherheitsauswirkungen der Installation Ihrer eigenen Root -Zertifikate.
Wenn Sie diese Auswirkungen verstehen und das Testzertifikat installiert haben, können Sie die Signaturen wie folgt validieren:
cargo make --env WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true
Veröffentlichungen von Kisten. Veröffentlichungen werden erst vorgenommen, wenn sie von der Community angefordert werden oder wenn das windows-drivers-rs Team der Ansicht ist, dass ein ausreichender Wert bei der Veröffentlichung einer Veröffentlichung besteht.
Marken Dieses Projekt kann Marken oder Logos für Projekte, Produkte oder Dienstleistungen enthalten. Die autorisierte Verwendung von Microsoft -Marken oder Logos unterliegt den Marken- und Markenrichtlinien von Microsoft und muss folgen. Die Verwendung von Microsoft -Marken oder Logos in geänderten Versionen dieses Projekts darf keine Verwirrung verursachen oder Microsoft -Sponsoring implizieren. Jede Verwendung von Marken oder Logos von Drittanbietern unterliegt den Richtlinien dieses Drittanbieters.