이 저장소는 개발자가 Rust에서 Windows 드라이버를 개발할 수있는 Rust Crates 모음입니다. WDM 및 WDF 드라이버 개발 모델을 모두 지원하려는 의도입니다. 이 repo에는 다음 상자가 포함되어 있습니다.
bindgen 으로부터의자가 생성 된 FFI 바인딩 및 Bindgen이 생성하지 못하는 매크로의 수동 재 구현이 포함됩니다.wdk-sys 를 통해 재수출되며 상자는 일반적으로 wdk-macros 에 직접 의존 할 필요가 없어야합니다.드라이버를 만드는 데 사용되는이 저장소의 예를 보려면 Windows-Rust-Driver-Samples를 참조하십시오.
참고 :이 프로젝트는 아직 개발 초기 단계에 있으며 아직 생산 사용에 권장되지 않습니다. 우리는 지역 사회 실험, 제안 및 토론을 장려합니다! 우리는 Github 토론 포럼 포럼을 커뮤니티와의 참여의 주요 형태로 사용할 것입니다!
이 프로젝트는 WIN32 서비스뿐만 아니라 WDM, KMDF 및 UMDF 드라이버를 염두에두고 구축되었습니다. 여기에는 WDK 22H2 및 NEWER에 포함 된 모든 버전의 WDF에 대한 지원이 포함됩니다. 현재 crates.io 에서는 KMDF v1.33 만 지원하지만 windows-drivers-rs 복제하고 wdk-sys 의 build.rs 에 지정된 구성을 수정하여 바인딩을 생성 할 수 있습니다. Crates.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-nativeWDK와 함께 프로그램을 구축하려면 유효한 WDK 환경에 있어야합니다. 이를위한 권장 방법은 EWDK 개발자 프롬프트를 입력하는 것입니다.
이 저장소의 상자는 crates.io 에서 제공되지만 지원되는 구성에 요약 된 현재 제한 사항을 고려하십시오. 다른 구성을 지원 해야하는 경우이 저장소를 복제하고 경로 종속성을 사용해보십시오.
lib 상자가있는 새화물 패키지 만들기 :
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 Cargo.toml 에 다음 스 니펫을 추가하여 상자 유형을 cdylib 로 설정하십시오.
[ 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 드라이버) : Cargo.toml 에서 abort 하도록 상자 공황 전략을 설정하십시오.
[ profile . dev ]
panic = " abort "
[ profile . release ]
panic = " abort " build.rs 만들고 다음 스 니펫을 추가하십시오.
fn main ( ) -> Result < ( ) , wdk_build :: ConfigError > {
wdk_build :: configure_wdk_binary_build ( )
} 커널 모드 상자의 경우 (예 : KMDF 드라이버, WDM 드라이버) : lib.rs 에서 운전자 상자를 no_std 로 표시하십시오.
#! [ 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 ; Rust 표준 라이브러리에서 alloc 모듈을 사용할 수 있으려면 필요합니다.
lib.rs 에 Driverentry를 추가하십시오.
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()?
''' cdylib 크레이트의 이름과 일치하는 INX 파일을 추가하십시오.
정적 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 사용하여 빌드를 용이하게하는 데 사용됩니다.
기본 조치 (빌드 및 패키지 드라이버)를 실행하려면 :
cargo make default
기본 작업을 실행할 때는 default 작업이 암시되기 때문에 cargo make 도 작동합니다.
windows-drivers-rs 특정 인수를 기본 cargo 명령으로 전달하도록 cargo make 확장합니다. 전달로 인수를 지정하려면 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 CARGO-MAKE 환경 변수를 true 하여 생성 된 .sys 및 .cat 파일의 서명 검증을 처리하는 작업을 활성화 할 수 있습니다. signtool verify 이 기능에 대한 검증을 위해 Trusted Root Certification Authorities 에서와 같이 인증서를 설치해야합니다. WDR 의 기본 동작은 생성 된 테스트 인증서와 서명하는 것이므로 이러한 작업은 기본적으로 활성화되지 않습니다. 이 테스트 인증서는 일반적으로 자신의 루트 인증서를 설치하는 보안에 따라 개인 개발 기계가 아닌 테스트 드라이버 전용 컴퓨터의 Trusted Root Certification Authorities 에만 설치됩니다.
이러한 의미를 이해하고 테스트 인증서를 설치 한 경우 다음과 같이 서명을 확인할 수 있습니다.
cargo make --env WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true
상자에 대한 릴리스 .io는 모든 변경이 메인에 병합 된 후에 이루어지지 않습니다. 릴리스는 커뮤니티가 요청한 경우 또는 windows-drivers-rs 팀이 릴리스를 추진하는 데 충분한 가치가 있다고 생각할 때만 이루어집니다.
상표이 프로젝트에는 프로젝트, 제품 또는 서비스에 대한 상표 또는 로고가 포함될 수 있습니다. Microsoft 상표 또는 로고의 승인 된 사용에는 Microsoft의 상표 및 브랜드 지침이 적용되며 따라야합니다. 이 프로젝트의 수정 된 버전에서 Microsoft 상표 또는 로고를 사용한다고해서 혼란을 일으키거나 Microsoft 후원을 암시해서는 안됩니다. 타사 상표 또는 로고를 사용하면 타사 정책이 적용됩니다.