核心模式驅動程式架構
核心模式驅動程式架構(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