

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、請點擊以下鏈接下載WinHEC的演講材料Download WinHEC presentations here:http://channel9.msdn.com/Events/WinHEC/2015,通過 Windows 驅動程序框架編寫驅動程序,Tony Lin軟件工程師,通過 Windows 驅動程序框架,可輕松編寫高質量的驅動程序。,議程,使用 WDF 的優(yōu)點WDF 核心技術概念IO 處理硬件交互即插即用和電源交互
2、WDF 開源,什么是 WDF,為什么使用它?,,WDF 究竟是什么?,使編寫驅動程序變得輕松的庫和工具概括了底層操作系統(tǒng)內(nèi)部的復雜情況實現(xiàn)了代碼少于 20 行的驅動程序對于不同設備類是可擴展的在不同的設備類上保持一致如 GPIO、UART、I2C、NFC、傳感器驅動程序輕松的驅動程序調試內(nèi)置框架活動日志記錄驅動程序分析專用工具,支持用戶模式和內(nèi)核模式,內(nèi)核模式驅動程序框架 (KMDF)跨大多數(shù)設備類的 1000 個
3、驅動程序用戶模式驅動程序框架 (UMDF)原始 UMDF v1 基于 C++ COMUMDF v2 與內(nèi)核模式使用的驅動程序模型和語法相同支持 USB 外設、傳感器、NFC、智能卡、HID(包括觸控)… 崩潰的驅動程序僅影響托管進程,而不影響整個系統(tǒng)重啟策略可以恢復已崩潰的 UMDF 驅動程序,WDF 可在整個通用平臺上使用,在整套 Windows 設備上都受支持,,,,,,,WDF 核心概念,,驅動程序工作流,驅動程序初始
4、化,硬件準備,I/O 請求處理,硬件交互,,驅動程序清理,設備可操作,即插即用/電源交互,,,,驅動程序工作流,驅動程序初始化,硬件準備,I/O 請求處理,硬件交互,,驅動程序清理,設備可操作,即插即用/電源交互,,,,框架中的一切都由對象表示(驅動程序、設備、隊列等)對象具有方法、事件和屬性對象通過 WdfDeviceGetDriver 等方法中的句柄訪問,在對象上運行的 WDF 函數(shù)可以從中注冊回調可通過 get/set 方
5、法訪問的單個值,對象是 WDF 的基礎,自動對象生命期管理,,WDF 管理對象的分配和釋放維持父/子層次結構如,當客戶端完成 WDF 請求時,它會自動刪除,在需要靈活性的情況下:驅動程序可以選擇自行管理對象生命期,WdfRequestCompleteWithInformation( Request, STATUS_INVALID_DEVICE_REQUEST, (ULONG_PTR) 0 );,驅動程序(WDFDRIV
6、ER),設備(WDFDEVICE),設備(WDFDEVICE),隊列(WDFQUEUE),隊列(WDFQUEUE),…,…,對象上下文,每個 WDF 對象都有一個上下文空間,上下文是一個由框架分配和銷毀的任意大小的結構由驅動程序用來存儲特定于對象的數(shù)據(jù)例如,具有多個設備對象的驅動程序可使用上下文數(shù)據(jù)進行區(qū)分,驅動程序工作流,驅動程序初始化,硬件準備,I/O 請求處理,硬件交互,,驅動程序清理,設備可操作,即插即用/電源交
7、互,,,,硬件準備事件,獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware),實現(xiàn)中斷(InterruptEnable),…,進入通電狀態(tài)(D0Entry),,,準備硬件,NTSTATUS OnPrepareHardware( WDFDEVICE Device, WDFCMRESLIST ResourcesRaw, WDFCMRESLIST ResourcesTranslat
8、ed ) { int ResourceCount = WdfCmResourceListGetCount( ResourcesTranslated ); for (i=0; i Type) { case CmResourceTypePort: […] case CmResourceTypeMemory: […] case CmReso
9、urceTypeInterrupt: […] default: break; } } return STATUS_SUCCESS;},獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware),實現(xiàn)中斷(InterruptEnable),…,進入通電狀態(tài)(D0Entry),,,,,設備通電,NTSTATUSOnD0Entry( IN WDFDEVICE
10、 Device, IN WDF_POWER_DEVICE_STATE RecentPowerState ){ PADXL345AccDevice pAccDevice = nullptr pAccDevice = GetContext(Device); WdfWaitLockAcquire(pAccDevice->m_WaitLock); I2CSens
11、orWriteRegister(pAccDevice->m_I2CIoTarget, MY_REGISTER, MY_VALUE, sizeof(MY_VALUE) ); WdfWaitLockRelease(pAccDevice->m_WaitLock); pAccDevice->m_PoweredOn = true; return STATUS_SUCCESS;},,獲取
12、硬件資源、進行一些靜態(tài)配置(PrepareHardware),實現(xiàn)中斷(InterruptEnable),…,進入通電狀態(tài)(D0Entry),,,,實現(xiàn)中斷,NTSTATUS OnInterruptEnable( IN WDFINTERRUPT Interrupt, IN WDFDEVICE Device){ PDEVICE_EXTENSION devExt; ULONG regUlo
13、ng; PULONG intCsr; devExt = GetDeviceContext(WdfInterruptGetDevice(Interrupt) ); intCsr = &devExt->Regs->Int_Csr regUlong = READ_REGISTER_ULONG( intCsr ); WRITE_REGISTER_ULONG( intCs
14、r, regUlong ); return STATUS_SUCCESS;},,獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware),實現(xiàn)中斷(InterruptEnable),…,進入通電狀態(tài)(D0Entry),,,,按需擴展,獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware),實現(xiàn)中斷(InterruptEnable),…,進入通電狀態(tài)(D0Entry),EvtIoResume
15、EvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildrenEvtDeviceRemoveAddedResources…,,,,驅動程序工作流,驅動程序初始化,硬件準備,I/O 請求處理,硬件交互,,驅動程序清理,設備可操作,即插即用/電源交互,,,,通過框架進行 I/O 傳遞,I/O 調
16、度程序,隊列選擇,執(zhí)行級別和同步范圍,驅動程序的 OnRead,IRP,,電源管理,WDFREQUEST,WDFREQUEST,隊列選擇,隊列類型有序:一次傳遞一個請求并行:請求到達時即傳遞給驅動程序手動:驅動程序按其自身速度從 WDFQUEUE 檢索請求,I/O 調度程序,并行,有序,手動,IRP,,,,WDFREQUEST,WDFREQUEST,WDFREQUEST,,讀取,寫入,IOCTL,執(zhí)行級別和同步范圍,IRQL
17、:中斷請求級別 (PASSIVE_LEVEL、DISPATCH_LEVEL)執(zhí)行級別:事件回調在調用時所在的 IRQL同步范圍:通過管理鎖強制使回調執(zhí)行序列化的機制,設備范圍:同步設備隊列和文件對象的回調 隊列范圍:同步隊列的回調無:無同步,電源管理,電源管理的隊列WDF 隊列可由“電源管理”僅當給設備供電時才傳遞請求幫助驅動程序避免在設備斷電時接觸硬件隊列事件EvtIoStop:在電源中斷時調用了已傳遞給驅動程
18、序的所有請求EvtIoResume:在通電時調用了所有發(fā)送中的請求,請求取消,可以取消已排隊的請求必須將“發(fā)送中”的請求創(chuàng)建為可取消的請求 在以下情況下,應將請求創(chuàng)建為可取消的請求:I/O 將花費大量時間完成對硬件的 I/O 操作是可中止的,,WdfRequestMarkCancelable ( Request, OnRequestCancel );,驅動程序工作流,驅動程序初始化,硬件準備,I/O 請求處理,硬件交互,,驅
19、動程序清理,設備可操作,即插即用/電源交互,,,,使用 I/O 目標與硬件交互,驅動程序無法總是能夠完成請求需要堆棧中其他驅動程序的協(xié)助驅動程序到驅動程序I/O 目標可以是堆棧中的下一個驅動程序可以是堆棧之外的外部驅動程序I/O 目標作為轉換器I/O 目標充當框架和目標設備對象之間的轉換器,,,默認 I/O 目標和遠程 I/O 目標對比,默認 I/O 目標驅動程序堆棧中較低的下一個設備對象WDFIOTARGET ioT
20、arget = WdfDeviceGetIoTarget(Device);遠程 I/O 目標遠程目標表示一個由某個其他驅動程序創(chuàng)建的設備對象WdfIoTargetCreate(Device, WDF_OBJECT_ATTRIBUTES, &IoTarget);,,將請求發(fā)送到 I/O 目標,以同步方式或以異步方式Sync - WdfIoTargetSendReadSynchronouslyAsync - WdfI
21、oTargetFormatRequestForRead 后跟 WdfRequestSend 超時驅動程序可以將請求配置為在超時后取消為了避免驅動程序掛起,建議使用此方法,WdfIoTargetSendIoctlSynchronously( ioTarget, NULL,IOCTL_ACPI_ASYNC_EVAL_METHOD,&inputBufDesc, &outputBufDesc,NULL, NU
22、LL);,驅動程序工作流,驅動程序初始化,硬件準備,I/O 請求處理,硬件交互,,驅動程序清理,設備可操作,即插即用/電源交互,,,,即插即用和電源交互,即插即用應用場景:設備電源已拔出。驅動程序已手動禁用。電源應用場景:系統(tǒng)掛起。設備長時間空閑。用戶按下鼠標按鈕來喚醒系統(tǒng)。,選擇加入行為模型,驅動程序僅提供必要的事件回調硬件狀態(tài)不穩(wěn)定的設備(電源開/關)D0Entry、D0Exit、…具有喚醒信號的設備Arm
23、WakeFrom、DisarmWakeFrom、…合理的默認實現(xiàn)如果事件不含為其注冊的驅動程序回調,則該事件由 WDF 處理,設備電源已拔出/禁用,隊列已自動停止WDF 停止電源管理的隊列和頂層驅動程序最終不會發(fā)送對不存在的設備的請求發(fā)送中的請求已得到通知框架為已傳遞的請求調用 OnIoStop 回調 驅動程序可以正常停止 I/O,WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&a
24、mp;wakeSettings); WdfDeviceAssignSxWakeSettings( device, &wakeSettings );,系統(tǒng)進入睡眠,設備電源已中斷驅動程序可以要求 WDF 在系統(tǒng)睡眠時自動中斷設備電源設備可以喚醒系統(tǒng) 驅動程序可以將其設備設置為在輸入時喚醒系統(tǒng),驅動程序工作流,驅動程序初始化,硬件準備,I/O 請求處理,硬件交互,,驅動程序清理,設備可操作,即插即用/電源交互,,,,WD
25、F 開源,,GitHub 上的 WDF!,在 GitHub 提供包括 KMDF 和 UMDF v2在 MIT 許可證下發(fā)布,包含私有符號,通過 Microsoft 的符號服務器發(fā)布允許通過框架源代碼進行調試可以在 repo wiki 中找到指令,開源范圍,演示,驅動程序崩潰,使用 WDF 編寫更好的驅動程序,使驅動程序更簡單的摘要僅實現(xiàn)其需要自定義的事件回調的驅動程序提供功能強大的實用工具對象,管理對象生命期
26、功能強大的調試工具自動化框架日志記錄(WPP 記錄器)Windows 調試器 (WinDbg) 的自定義擴展 Windows 性能分析器 (WPA) 的新增加載項,延伸閱讀和文檔,WDF 書籍/MSDN 文檔以 Windows 驅動程序為基礎開發(fā)驅動程序,由 Orwick 和 Smith 編寫 內(nèi)核模式驅動程序框架設計指南用戶模式驅動程序框架設計指南 選擇驅動程序模型 驅動程序示例一個基本的“Toaster”示例
27、(UMDF2)回顯驅動程序示例,顯示隊列和 IOCTL (KMDF)USB FX2 函數(shù)驅動程序 (UMDF2),請對本會議進行評價 您的反饋對我們至關重要!,請通過以下鏈接訪問評價表:,,(c) 微軟公司。版權所有。本文件按“現(xiàn)狀”提供。本文件中呈現(xiàn)的信息和視圖(包括URL和其他對互聯(lián)網(wǎng)網(wǎng)站的引述)可能在未經(jīng)通知的情況下變更。您承擔對其進行使用的風險。本文件不向您提供對于任何微軟產(chǎn)品之中的任何知識產(chǎn)權的任何法律權利。您可以復制并
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備驅動程序
- Windows98下設備驅動程序的編寫.pdf
- windows2000驅動程序的設計
- linux字符設備驅動程序編寫基本流程
- 步進電機驅動程序
- lcd(t)驅動程序
- linux設備驅動程序
- windows2000驅動程序設計指南前言
- 硬盤驅動程序功能簡介
- dell_驅動程序和
- Windows 2000 WDM驅動程序開發(fā)技術的研究.pdf
- Windows 2000環(huán)境下無線網(wǎng)卡驅動程序及網(wǎng)絡隧道驅動程序實現(xiàn)的研究.pdf
- linux驅動程序實驗報告
- 可移植的Android驅動程序框架研究.pdf
- 驅動程序與應用程序的接口
- 內(nèi)核模式驅動程序設計
- 內(nèi)核模式驅動程序設計
- linux驅動程序實驗報告
- Windows環(huán)境下設備驅動程序的研究與開發(fā).pdf
- windows無法連接到打印機無法找到打印機驅動程序包要求的核心驅動程序包
評論
0/150
提交評論