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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

WdfRequestCompleteWithInformation(Request,

STATUS_INVALID_DEVICE_REQUEST,(ULONG_PTR)0);驅動程序(WDFDRIVER)設備(WDFDEVICE)設備(WDFDEVICE)隊列(WDFQUEUE)隊列(WDFQUEUE)……自動對象生命期管理WDF管理對象的分配和釋放在需要靈活性的對象上下文每個WDF對象都有一個上下文空間上下文是一個由框架分配和銷毀的任意大小的結構由驅動程序用來存儲特定于對象的數據例如,具有多個設備對象的驅動程序可使用上下文數據進行區分對象上下文每個WDF對象都有一個上下文空間上下文是一個由驅動程序工作流驅動程序初始化硬件準備I/O請求處理硬件交互驅動程序清理設備可操作即插即用/電源交互驅動程序工作流驅動程序初始化硬件準備I/O請求處理硬件交互硬件準備事件獲取硬件資源、進行一些靜態配置(PrepareHardware)實現中斷(InterruptEnable)…進入通電狀態(D0Entry)硬件準備事件獲取硬件資源、實現中斷…進入通電狀態準備硬件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;}獲取硬件資源、進行一些靜態配置(PrepareHardware)實現中斷(InterruptEnable)…進入通電狀態(D0Entry)準備硬件NTSTATUSOnPrepareHardware設備通電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;}獲取硬件資源、進行一些靜態配置(PrepareHardware)實現中斷(InterruptEnable)…進入通電狀態(D0Entry)設備通電NTSTATUS獲取硬件資源、實現中斷…進入通電狀態實現中斷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;}獲取硬件資源、進行一些靜態配置(PrepareHardware)實現中斷(InterruptEnable)…進入通電狀態(D0Entry)實現中斷NTSTATUSOnInterruptEnable按需擴展EvtIoResumeEvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildrenEvtDeviceRemoveAddedResources

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

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

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

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

程序隊列選擇執行級別驅動程序執行級別和同步范圍IRQL:中斷請求級別

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

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

程序隊列選擇執行級別和同步范圍驅動程序的OnReadI/O電源管理電源管理電源管理的隊列I/O調度

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

WdfRequestMarkCancelable

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

=

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

D0Entry、D0Exit、…具有喚醒信號的設備

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

WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);

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

GitHub

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

溫馨提示

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

評論

0/150

提交評論