هذا الريبو عبارة عن مجموعة من صناديق الصدأ التي تمكن المطورين من تطوير برامج تشغيل Windows في Rust. إن النية لدعم كل من نماذج تطوير سائق WDM و WDF. يحتوي هذا الريبو على الصناديق التالية:
bindgen ، وكذلك إعادة تنفيذ يدوي من وحدات الماكرو التي تفشل Bindgen في توليدها.wdk-sys ، وعادة ما لا تحتاج الصناديق إلى الاعتماد بشكل مباشر على wdk-macrosللاطلاع على مثال على هذا الريبو المستخدم لإنشاء برامج تشغيل ، راجع عينات من السائقين على نظام Windows.
ملاحظة: لا يزال هذا المشروع في المراحل المبكرة من التطوير ولا ينصح به بعد لاستخدام الإنتاج. نحن نشجع تجريب المجتمع والاقتراحات والمناقشات! سنستخدم منتدى GitHub مناقشات Github كشكل رئيسي من المشاركة مع المجتمع!
تم بناء هذا المشروع بدعم من سائقي WDM و KMDF و UMDF في الاعتبار ، وكذلك خدمات Win32. ويشمل ذلك الدعم لجميع إصدارات WDF المدرجة في WDK 22H2 وأحدث. حاليًا ، تدعم الصناديق المتوفرة على crates.io فقط KMDF V1.33 ، ولكن يمكن إنشاء الروابط لكل شيء آخر عن طريق استنساخ windows-drivers-rs وتعديل التكوين المحدد في build.rs من wdk-sys . تم التخطيط لدعم Catse.io لتكوينات WDK الأخرى في المستقبل القريب.
ملاحظة: نظرًا لأن أمثلة مستوى مساحة العمل والاختبارات تستخدم تكوينات WDK مختلفة ، ويدعم WDR تكوين WDK واحد فقط لكل مساحة عمل ، يتم استبعاد أمثلة على مستوى مساحة العمل ومجلد الاختبارات من بيان شحن Rostory Root.
يتطلب توليد الربط عبر 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 ، ولكن تأخذ في الاعتبار القيود الحالية الموضحة في التكوينات المدعومة. إذا كنت بحاجة إلى دعم تكوين مختلف ، فحاول استنساخ هذا الريبو واستخدام تبعيات المسار
قم بإنشاء حزمة شحن جديدة مع صندوق 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 اضبط نوع الصندوق على cdylib عن طريق إضافة المقتطف التالي إلى Cargo.toml :
[ lib ]
crate-type = [ " cdylib " ]إضافة قسم بيانات التعريف WDK وتكوين WDK لحالة الاستخدام الخاصة بك. يتيح هذا أيضًا لمهام Make Cargo أن تعرف أن الحزمة عبارة عن سائق وأن خطوات تغليف السائق تحتاج إلى تشغيل.
مثال UMDF:
[ package . metadata . wdk . driver-model ]
driver-type = " UMDF "
umdf-version-major = 1
target-umdf-version-minor = 33 بالنسبة لصناديق وضع kernel (سائقي KMDF ، سائقي WDM ): قم بتعيين استراتيجية ذعر القفص 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 ( )
} بالنسبة لصناديق وضع kernel (على سبيل المثال ، برامج تشغيل KMDF ، سائقي WDM ): حدد قفص السائق الخاص بك كـ no_std في lib.rs :
#! [ no_std ] لصناديق وضع kernel (على سبيل المثال ، برامج تشغيل KMDF ، سائقي WDM ): أضف معالج الذعر في lib.rs :
# [ cfg ( not ( test ) ) ]
extern crate wdk_panic ; بالنسبة لصناديق وضع kernel (على سبيل المثال ، برامج تشغيل KMDF ، سائقي WDM ): أضف مخصصًا عالميًا اختياريًا في lib.rs :
# [ cfg ( not ( test ) ) ]
use wdk_alloc :: WdkAllocator ;
# [ cfg ( not ( test ) ) ]
# [ global_allocator ]
static GLOBAL_ALLOCATOR : WdkAllocator = WdkAllocator ; هذا مطلوب فقط إذا كنت تريد أن تكون قادرًا على استخدام وحدات alloc في مكتبة Rust Standard.
أضف سائقًا في 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
} ملاحظة: في صناديق وضع kernel ، يمكنك استخدام 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 الخاص بك.
تمكين ربط 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
عند تنفيذ المهمة الافتراضية ، فإن cargo make 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. يخضع أي استخدام للعلامات التجارية أو الشعارات من طرف ثالث لسياسات تلك الطرف الثالث.