跳至內容
主選單
主選單
移至側邊欄
隱藏
導覽
首頁
近期變更
隨機頁面
MediaWiki說明
Taiwan Tongues 台語維基
搜尋
搜尋
外觀
建立帳號
登入
個人工具
建立帳號
登入
檢視 核心模式驅動程式架構 的原始碼
頁面
討論
臺灣正體
閱讀
檢視原始碼
檢視歷史
工具
工具
移至側邊欄
隱藏
操作
閱讀
檢視原始碼
檢視歷史
一般
連結至此的頁面
相關變更
特殊頁面
頁面資訊
外觀
移至側邊欄
隱藏
←
核心模式驅動程式架構
由於以下原因,您無權編輯此頁面:
您請求的操作只有這些群組的使用者能使用:
使用者
、taigi-reviewer、apibot
您可以檢視並複製此頁面的原始碼。
'''核心模式驅動程式架構'''('''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 \ _ CONFIG'''config ; 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 [[分類: 待校正]]
返回到「
核心模式驅動程式架構
」。