通過-Windows-驅(qū)動程序框架編寫驅(qū)動程序課件_第1頁
通過-Windows-驅(qū)動程序框架編寫驅(qū)動程序課件_第2頁
通過-Windows-驅(qū)動程序框架編寫驅(qū)動程序課件_第3頁
通過-Windows-驅(qū)動程序框架編寫驅(qū)動程序課件_第4頁
通過-Windows-驅(qū)動程序框架編寫驅(qū)動程序課件_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

通過Windows驅(qū)動程序框架編寫驅(qū)動程序通過Windows驅(qū)動程序框架編寫驅(qū)動程序通過Windows驅(qū)動程序框架,可輕松編寫高質(zhì)量的驅(qū)動程序。通過Windows驅(qū)動程序框架,可輕松編寫高質(zhì)量的驅(qū)動程議程使用WDF的優(yōu)點WDF核心技術(shù)概念I(lǐng)O處理硬件交互即插即用和電源交互WDF開源議程使用WDF的優(yōu)點什么是WDF,為什么使用它?什么是WDF,為什么使用它?WDF究竟是什么?使編寫驅(qū)動程序變得輕松的庫和工具概括了底層操作系統(tǒng)內(nèi)部的復(fù)雜情況實現(xiàn)了代碼少于20行的驅(qū)動程序?qū)τ诓煌O(shè)備類是可擴展的在不同的設(shè)備類上保持一致如GPIO、UART、I2C、NFC、傳感器驅(qū)動程序輕松的驅(qū)動程序調(diào)試內(nèi)置框架活動日志記錄驅(qū)動程序分析專用工具WDF究竟是什么?使編寫驅(qū)動程序變得輕松的庫和工具支持用戶模式和內(nèi)核模式內(nèi)核模式驅(qū)動程序框架(KMDF)跨大多數(shù)設(shè)備類的1000個驅(qū)動程序用戶模式驅(qū)動程序框架(UMDF)原始UMDFv1基于C++COMUMDFv2與內(nèi)核模式使用的驅(qū)動程序模型和語法相同支持USB外設(shè)、傳感器、NFC、智能卡、HID(包括觸控)…崩潰的驅(qū)動程序僅影響托管進程,而不影響整個系統(tǒng)重啟策略可以恢復(fù)已崩潰的UMDF驅(qū)動程序支持用戶模式和內(nèi)核模式內(nèi)核模式驅(qū)動程序框架(KMDF)WDF可在整個通用平臺上使用在整套Windows設(shè)備上都受支持WDF可在整個通用平臺上使用WDF核心概念WDF核心概念驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互對象是WDF的基礎(chǔ)框架中的一切都由對象表示(驅(qū)動程序、設(shè)備、隊列等)對象具有方法、事件和屬性對象通過WdfDeviceGetDriver

等方法中的句柄訪問WDFOBJECT方法屬性事件在對象上運行的WDF函數(shù)可以從中注冊回調(diào)可通過get/set方法訪問的單個值對象是WDF的基礎(chǔ)框架中的一切都由對象表示(驅(qū)動程序、設(shè)自動對象生命期管理WDF管理對象的分配和釋放維持父/子層次結(jié)構(gòu)如,當客戶端完成WDF請求時,它會自動刪除在需要靈活性的情況下:驅(qū)動程序可以選擇自行管理對象生命期

WdfRequestCompleteWithInformation(Request,

STATUS_INVALID_DEVICE_REQUEST,(ULONG_PTR)0);驅(qū)動程序(WDFDRIVER)設(shè)備(WDFDEVICE)設(shè)備(WDFDEVICE)隊列(WDFQUEUE)隊列(WDFQUEUE)……自動對象生命期管理WDF管理對象的分配和釋放在需要靈活性的對象上下文每個WDF對象都有一個上下文空間上下文是一個由框架分配和銷毀的任意大小的結(jié)構(gòu)由驅(qū)動程序用來存儲特定于對象的數(shù)據(jù)例如,具有多個設(shè)備對象的驅(qū)動程序可使用上下文數(shù)據(jù)進行區(qū)分對象上下文每個WDF對象都有一個上下文空間上下文是一個由驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互硬件準備事件獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進入通電狀態(tài)(D0Entry)硬件準備事件獲取硬件資源、實現(xiàn)中斷…進入通電狀態(tài)準備硬件NTSTATUSOnPrepareHardware(

WDFDEVICE

Device,

WDFCMRESLIST

ResourcesRaw,

WDFCMRESLIST

ResourcesTranslated){

intResourceCount=WdfCmResourceListGetCount(

ResourcesTranslated);

for(i=0;i<ResourceCount;i++){descriptor=WdfCmResourceListGetDescriptor( ResourcesTranslated,i);

switch(descriptor->Type){

case

CmResourceTypePort:[…]

case

CmResourceTypeMemory:[…]

case

CmResourceTypeInterrupt:[…]

default:break;}}return

STATUS_SUCCESS;}獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進入通電狀態(tài)(D0Entry)準備硬件NTSTATUSOnPrepareHardware設(shè)備通電NTSTATUSOnD0Entry(

IN

WDFDEVICE

Device,

IN

WDF_POWER_DEVICE_STATE

RecentPowerState

){

PADXL345AccDevicepAccDevice=nullptr

pAccDevice

=GetContext(Device);

WdfWaitLockAcquire(pAccDevice->m_WaitLock);

I2CSensorWriteRegister(

pAccDevice->m_I2CIoTarget,MY_REGISTER, MY_VALUE,sizeof(MY_VALUE));

WdfWaitLockRelease(pAccDevice->m_WaitLock);

pAccDevice->m_PoweredOn=true;

return

STATUS_SUCCESS;}獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進入通電狀態(tài)(D0Entry)設(shè)備通電NTSTATUS獲取硬件資源、實現(xiàn)中斷…進入通電狀態(tài)實現(xiàn)中斷NTSTATUS

OnInterruptEnable(

INWDFINTERRUPT

Interrupt,

INWDFDEVICE

Device){

PDEVICE_EXTENSION

devExt;

ULONG

regUlong;

PULONG

intCsr;

devExt=GetDeviceContext(

WdfInterruptGetDevice(Interrupt));

intCsr

=&devExt->Regs->Int_Csr

regUlong

=READ_REGISTER_ULONG(intCsr);

WRITE_REGISTER_ULONG(intCsr,regUlong

);

return

STATUS_SUCCESS;}獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進入通電狀態(tài)(D0Entry)實現(xiàn)中斷NTSTATUSOnInterruptEnable按需擴展EvtIoResumeEvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildrenEvtDeviceRemoveAddedResources

…獲取硬件資源、進行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進入通電狀態(tài)(D0Entry)按需擴展EvtIoResume獲取硬件資源、實現(xiàn)中斷…進入通驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互通過框架進行I/O傳遞I/O調(diào)度

程序隊列選擇執(zhí)行級別和同步范圍驅(qū)動程序的OnReadIRP電源管理WDFREQUESTWDFREQUEST通過框架進行I/O傳遞I/O調(diào)度

程序隊列選擇執(zhí)行級別隊列選擇隊列類型 有序:一次傳遞一個請求并行:請求到達時即傳遞給驅(qū)動程序手動:驅(qū)動程序按其自身速度從WDFQUEUE檢索請求I/O調(diào)度

程序隊列選擇執(zhí)行級別和同步范圍驅(qū)動程序的OnReadI/O電源管理I/O調(diào)度程序并行有序手動IRPWDFREQUESTWDFREQUESTWDFREQUEST讀取寫入IOCTL隊列選擇隊列類型 I/O調(diào)度

程序隊列選擇執(zhí)行級別驅(qū)動程序執(zhí)行級別和同步范圍IRQL:中斷請求級別

(PASSIVE_LEVEL、DISPATCH_LEVEL)執(zhí)行級別:事件回調(diào)在調(diào)用時所在的IRQL同步范圍:通過管理鎖強制使回調(diào)執(zhí)行序列化的機制I/O調(diào)度

程序隊列選擇執(zhí)行級別和同步范圍驅(qū)動程序的OnReadI/O電源管理設(shè)備范圍:同步設(shè)備隊列和文件對象的回調(diào)隊列范圍:同步隊列的回調(diào)無:無同步執(zhí)行級別和同步范圍IRQL:中斷請求級別(PASSIVE_電源管理電源管理的隊列WDF隊列可由“電源管理”僅當給設(shè)備供電時才傳遞請求幫助驅(qū)動程序避免在設(shè)備斷電時接觸硬件隊列事件EvtIoStop:在電源中斷時調(diào)用了已傳遞給驅(qū)動程序的所有請求EvtIoResume:在通電時調(diào)用了所有發(fā)送中的請求I/O調(diào)度

程序隊列選擇執(zhí)行級別和同步范圍驅(qū)動程序的OnReadI/O電源管理電源管理電源管理的隊列I/O調(diào)度

程序隊列選擇執(zhí)行級別驅(qū)動請求取消可以取消已排隊的請求必須將“發(fā)送中”的請求創(chuàng)建為可取消的請求在以下情況下,應(yīng)將請求創(chuàng)建為可取消的請求:I/O將花費大量時間完成對硬件的I/O操作是可中止的

WdfRequestMarkCancelable

(Request,OnRequestCancel);請求取消可以取消已排隊的請求WdfRequestMark驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互使用I/O目標與硬件交互驅(qū)動程序無法總是能夠完成請求需要堆棧中其他驅(qū)動程序的協(xié)助驅(qū)動程序到驅(qū)動程序I/O目標可以是堆棧中的下一個驅(qū)動程序可以是堆棧之外的外部驅(qū)動程序I/O目標作為轉(zhuǎn)換器I/O目標充當框架和目標設(shè)備對象之間的轉(zhuǎn)換器使用I/O目標與硬件交互驅(qū)動程序無法總是能夠完成請求默認I/O目標和遠程I/O目標對比默認I/O目標驅(qū)動程序堆棧中較低的下一個設(shè)備對象WDFIOTARGETioTarget

=

WdfDeviceGetIoTarget(Device);遠程I/O目標遠程目標表示一個由某個其他驅(qū)動程序創(chuàng)建的設(shè)備對象WdfIoTargetCreate(Device,WDF_OBJECT_ATTRIBUTES,&IoTarget);默認I/O目標和遠程I/O目標對比默認I/O目標將請求發(fā)送到I/O目標以同步方式或以異步方式Sync-WdfIoTargetSendReadSynchronouslyAsync-WdfIoTargetFormatRequestForRead后跟WdfRequestSend超時驅(qū)動程序可以將請求配置為在超時后取消為了避免驅(qū)動程序掛起,建議使用此方法WdfIoTargetSendIoctlSynchronously(ioTarget,NULL, IOCTL_ACPI_ASYNC_EVAL_METHOD, &inputBufDesc,&outputBufDesc, NULL,NULL);將請求發(fā)送到I/O目標以同步方式或以異步方式WdfIoT驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互即插即用和電源交互即插即用應(yīng)用場景:設(shè)備電源已拔出。驅(qū)動程序已手動禁用。電源應(yīng)用場景:系統(tǒng)掛起。設(shè)備長時間空閑。用戶按下鼠標按鈕來喚醒系統(tǒng)。即插即用和電源交互即插即用應(yīng)用場景:選擇加入行為模型驅(qū)動程序僅提供必要的事件回調(diào)硬件狀態(tài)不穩(wěn)定的設(shè)備(電源開/關(guān))

D0Entry、D0Exit、…具有喚醒信號的設(shè)備

ArmWakeFrom、DisarmWakeFrom、…合理的默認實現(xiàn)如果事件不含為其注冊的驅(qū)動程序回調(diào),則該事件由WDF處理選擇加入行為模型驅(qū)動程序僅提供必要的事件回調(diào)設(shè)備電源已拔出/禁用隊列已自動停止WDF停止電源管理的隊列和頂層驅(qū)動程序最終不會發(fā)送對不存在的設(shè)備的請求發(fā)送中的請求已得到通知框架為已傳遞的請求調(diào)用OnIoStop回調(diào)驅(qū)動程序可以正常停止I/O設(shè)備電源已拔出/禁用隊列已自動停止

WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);

WdfDeviceAssignSxWakeSettings(device,&wakeSettings);系統(tǒng)進入睡眠設(shè)備電源已中斷驅(qū)動程序可以要求WDF在系統(tǒng)睡眠時自動中斷設(shè)備電源設(shè)備可以喚醒系統(tǒng)驅(qū)動程序可以將其設(shè)備設(shè)置為在輸入時喚醒系統(tǒng)WDF_DEVICE_POWER_POLICY_WAKE驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準備I/O請求處理硬件交互WDF開源WDF開源GitHub上的WDF!在

GitHub

提供包括KMDF和UMDFv2在MIT許可證下發(fā)布GitHub上的WDF!在GitHub提供包含私有符號通過Microsoft的符號服務(wù)器發(fā)布允許通過框架源代碼進行調(diào)試可以在repowiki中找到指令包含私有符號通過Microsoft的符號服務(wù)器發(fā)布開源范圍開源范圍演示驅(qū)動程序崩潰演示驅(qū)動程序崩潰使用WDF編寫更好的驅(qū)動程序使驅(qū)動程序更簡單的摘要僅實現(xiàn)其需要自定義的事件回調(diào)的驅(qū)動程序提供功能強大的實用工具對象,管理對象生命期功能強大的調(diào)試工具自動化框架日志記錄(WPP記錄器)Wind

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論