跳至內容

核心模式驅動程式架構

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 09:18 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

核心模式驅動程式架構Kernel-Mode Driver Framework,縮寫KMDF)是微軟公司推出的 Windows 驅動程式基礎(Windows Driver Foundation)之一,建構 Windows XP 佮 Windows Server 兩千空三的核心模式(Kernel-Mode)驅動程式所需要的基本功能,包括著隨插隨用(PNP)、 電源管理(Power Manager)、 I / O 在列、直接記持體存取(DMA)、 Windows Management Instrumentation(WMI)佮同步的處理等的完整支援。KMDF 的設計並袂當用來取代 WDM,伊提供「Skeletal WDM」建置來代替 WDM;目前,KMDF 並無支援匯流排篩選驅動程式(Bus Filter Driver)。

Kernel-Mode Driver Framework 目前支援下列類型的核心模式(kernel mode)驅動程式之建立矣:

  • 隨插就按呢(PNP)裝置所使用的 Function Driver。
  • 隨插就按呢(PNP)裝置所使用的 Filter Driver。
  • 隨插就按呢(PNP)裝置疊予堆(Stack)所使用的 Bus Driver。
  • Windows NT 四配零型態裝置所使用的 Control 裝置驅動程式。

KMDF 是會當重新進入程式庫(Reentrant Library)。

佮 WDM 的關係

自 Windows 兩千開始,開發驅動程式必以 WDM 為基礎的,但開發難度傷大,無法度像使用者模式應用程式開發按呢簡單。KMDF 支援驅動程式佇咧 Windows Driver Model 環境中編寫驅動程式,簡化其中的過程,猶毋過 KMDF 的設計並袂當用來取代 WDM,伊提供「Skeletal WDM」建置來代替 WDM。古早的 WDM 可支援 Windows 九十八、Windows Me、Windows 兩千和 Windows XP;至於 WDF 計劃支援 Windows XP,猶閣有更新的版本。

KMDF 用物件為基底建立於是 WDM 架構之上。無仝的功能有無仝的物件,KMDF 佇咧實作上包含矣:

  • 隨插就按呢用佮電源管理
  • I / O 在列
  • 直接記持體存取(DMA)
  • Windows Management Instrumentation(WMI)
  • 仝步

驅動程式較入點

佇咧 Windows 作業系統當咧驅動程式的起始點攏是佇咧 DriverEntry 函式,DriveryEntry 是驅動程式的進入點(entry point)。 佇咧 DriverEntry 函式的實作內底,你需要有現化(instantiate)你的 WDFDRIVER 東西,並且告知 WDF framework 欲去佗位呼叫你的系統。

` ` ` NTSTATUS DriverEntry ( IN PDRIVER _ OBJECT DriverObject , IN PUNICODE _ STRING RegistryPath ) { WDF \ _ DRIVER \ _ CONFIGconfig ; NTSTATUS status=_ S \ _ OK _ ; ` ` `

` ` ` KdPrint ( ( _ _ DRIVER _ NAME " DriverEntry Begin \ n " ) ) ; ` ` `

` ` ` WDF _ DRIVER _ CONFIG _ INIT ( & config , EvtDeviceAdd ) ; status=WdfDriverCreate ( DriverObject , RegistryPath , _ WDF \ _ NO \ _ OBJECT \ _ ATTRIBUTES _ , & config , / / Pointer to config structure _ WDF \ _ NO \ _ HANDLE _ ) ; / / or NULL , Pointer to get WDFDRIVER handle if ( T _ SUCCESS ( status ) ) { KdPrint ( ( _ _ DRIVER _ NAME " WdfDriverCreate failed with status 零 x % 八 x \ n " , status ) ) ; } ` ` `

` ` ` KdPrint ( ( _ _ DRIVER _ NAME " DriverEntry End \ n " ) ) ; ` ` `

` ` ` return status ; } ` ` `

Add Device

EvtDeviceAdd 函式,佇系統發現新硬體插入去的時陣予人咻叫。這个函式共揀起來 WDF 驅動程式架構的大部份工課,EvtDeviceAdd 事件被喚起去之餘一定會帶出一个 WDFDRIVER 東西,並且指向一个 WDFDEVICE \ _ INIT 結構。咧裝置產生(device crated)進前,就先進行初初化的動作。若是 EvtDeviceAdd 執行成功,遐爾 EvtDevicePrepareHardware 是架構下一个被執行的函式,用保證趕動程式會當存取硬體。

` ` ` WDFSTATUS DioEvtDeviceAdd ( WDFDRIVER Driver , PWDFDEVICE _ INIT DeviceInit ) { WDFSTATUS status=STATUS _ SUCCESS ; WDF _ PNPPOWER _ EVENT _ CALLBACKS pnpPowerCallbacks ; WDF _ OBJECT _ ATTRIBUTES objAttributes ; WDFDEVICE device ; PDIO _ DEVICE _ CONTEXT devContext ; WDF _ IO _ QUEUE _ CONFIG ioCallbacks ; WDF _ INTERRUPT _ CONFIG interruptConfig ; WDF _ DEVICE _ POWER _ POLICY _ IDLE _ SETTINGS idleSettings ; ` ` `

` ` ` WDF _ PNPPOWER _ EVENT _ CALLBACKS _ INIT ( & pnpPowerCallbacks ) ; pnpPowerCallbacks . EvtDevicePrepareHardware=DioEvtPrepareHardware ; pnpPowerCallbacks . EvtDeviceReleaseHardware=DioEvtReleaseHardware ; pnpPowerCallbacks . EvtDeviceD 零 Entry=DioEvtDeviceD 零 Entry ; pnpPowerCallbacks . EvtDeviceD 零 Exit=DioEvtDeviceD 零 Exit ; ` ` `

` ` ` WdfDeviceInitSetPnpPowerEventCallbacks ( DeviceInit , pnpPowerCallbacks ) ; ` ` `

` ` ` WDF _ OBJECT _ ATTRIBUTES _ INIT ( & objAttributes ) ; ` ` `

` ` ` WDF _ OBJECT _ ATTRIBUTES _ SET _ CONTEXT _ TYPE ( & objAttributes , DIO _ DEVICE _ CONTEXT ) ; ` ` `

` ` ` status=WdfDeviceInitUpdateName ( DeviceInit , L " \ \ device \ \ WDFDIO " ) ; ` ` `

` ` ` status=WdfDeviceCreate ( & DeviceInit , / / Device Init structure & objAttributes , / / Attributes for WDF Device & device ) ; / / return new WDF Device pointer , ` ` `

` ` ` devContext=DioGetContextFromDevice ( device ) ; / / Get device extension ` ` `

` ` ` devContext-> WdfDevice=device ; ` ` `

` ` ` / / Create a symbolic link for the control object status=WdfDeviceCreateSymbolicLink ( device , L " \ \ DosDevices \ \ WDFDIO " ) ; ` ` `

` ` ` WDF _ IO _ QUEUE _ CONFIG _ INIT ( & ioCallbacks , WdfIoQueueDispatchSerial , WDF _ NO _ EVENT _ CALLBACK , / / StartIo WDF _ NO _ EVENT _ CALLBACK ) ; / / CancelRoutine ` ` `

` ` ` ioCallbacks . EvtIoDeviceControl=DioEvtDeviceControlIoctl ; status=WdfDeviceCreateDefaultQueue ( device , & ioCallbacks , _ WDF \ _ NO \ _ OBJECT \ _ ATTRIBUTES _ , NULL ) ; / / pointer to default queue ` ` `

` ` ` WDF _ INTERRUPT _ CONFIG _ INIT ( & interruptConfig , / / Configure the Interrupt object FALSE , / / auto-queue DPC ? DioIsr , / / ISR DioDpc ) ; / / Defered Procedule Call ` ` `

` ` ` interruptConfig . EvtInterruptEnable=DioEvtInterruptEnable ; interruptConfig . EvtInterruptDisable=DioEvtInterruptDisable ; ` ` `

` ` ` status=WdfInterruptCreate ( device , & interruptConfig , & objAttributes , & devContext-> WdfInterrupt ) ; ` ` `

` ` ` WDF _ DEVICE _ POWER _ POLICY _ IDLE _ SETTINGS _ INIT ( & idleSettings , / / Initialize idle policyIdleCannotWakeFromS 零 ) ; ` ` `

` ` ` status=WdfDeviceUpdateS 零 IdleSettings ( device , & idleSettings ) ; ` ` `

` ` ` return status ; } ` ` `

Prepare Hardware

若是 EvtDeviceAdd 順利執行成功,遐爾 EvtDevicePrepareHardware 是架構下一个被執行的函式,用保證趕動程式會當存取硬體。

` ` ` NTSTATUS EvtDevicePrepareHardware ( IN WDFDEVICE Device , IN WDFCMRESLIST ResourceList , IN WDFCMRESLIST ResourceListTranslated ) { NTSTATUS status=STATUS _ SUCCESS ; ` ` `

` ` ` UNREFERENCED _ PARAMETER ( Device ) ; UNREFERENCED _ PARAMETER ( ResourceList ) ; UNREFERENCED _ PARAMETER ( ResourceListTranslated ) ; ` ` `

` ` ` return status ; } ` ` `

` ` ` NTSTATUS EvtDeviceD 零 Entry ( IN WDFDEVICE Device , IN WDF _ POWER _ DEVICE _ STATE PreviousState ) { NTSTATUS status=STATUS _ SUCCESS ; ` ` `

` ` ` return status ; } ` ` `

` ` ` NTSTATUS EvtDeviceD 零 Exit ( IN WDFDEVICE Device , IN WDF _ POWER _ DEVICE _ STATE TargetState ) { NTSTATUS status=STATUS _ SUCCESS ; ` ` `

` ` ` return status ; } ` ` `

IO requests

` ` ` VOID EvtDeviceIoDefault ( IN WDFQUEUE Queue , IN WDFREQUEST Request ) { WdfRequestComplete ( Request , STATUS _ NOT _ IMPLEMENTED ) ; } ` ` `

外部連結

  • Windows Driver Kit
  • Kernel-Mode Driver Framework Homepage
  • Microsoft KMDF Paper