




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rè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è)備類是可擴(kuò)展的在不同的設(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ū)動程序僅影響托管進(jìn)程,而不影響整個系統(tǒng)重啟策略可以恢復(fù)已崩潰的UMDF驅(qū)動程序支持用戶模式和內(nèi)核模式內(nèi)核模式驅(qū)動程序框架(KMDF)WDF可在整個通用平臺上使用在整套Windows設(shè)備上都受支持WDF可在整個通用平臺上使用WDF核心概念WDF核心概念驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互對象是WDF的基礎(chǔ)框架中的一切都由對象表示(驅(qū)動程序、設(shè)備、隊列等)對象具有方法、事件和屬性對象通過WdfDeviceGetDriver
等方法中的句柄訪問WDFOBJECT方法屬性事件在對象上運(yùn)行的WDF函數(shù)可以從中注冊回調(diào)可通過get/set方法訪問的單個值對象是WDF的基礎(chǔ)框架中的一切都由對象表示(驅(qū)動程序、設(shè)自動對象生命期管理WDF管理對象的分配和釋放維持父/子層次結(jié)構(gòu)如,當(dāng)客戶端完成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ù)進(jìn)行區(qū)分對象上下文每個WDF對象都有一個上下文空間上下文是一個由驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互硬件準(zhǔn)備事件獲取硬件資源、進(jìn)行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進(jìn)入通電狀態(tài)(D0Entry)硬件準(zhǔn)備事件獲取硬件資源、實現(xiàn)中斷…進(jìn)入通電狀態(tài)準(zhǔn)備硬件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;}獲取硬件資源、進(jìn)行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進(jìn)入通電狀態(tài)(D0Entry)準(zhǔn)備硬件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;}獲取硬件資源、進(jìn)行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進(jìn)入通電狀態(tài)(D0Entry)設(shè)備通電NTSTATUS獲取硬件資源、實現(xiàn)中斷…進(jì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;}獲取硬件資源、進(jìn)行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進(jìn)入通電狀態(tài)(D0Entry)實現(xiàn)中斷NTSTATUSOnInterruptEnable按需擴(kuò)展EvtIoResumeEvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildrenEvtDeviceRemoveAddedResources
…獲取硬件資源、進(jìn)行一些靜態(tài)配置(PrepareHardware)實現(xiàn)中斷(InterruptEnable)…進(jìn)入通電狀態(tài)(D0Entry)按需擴(kuò)展EvtIoResume獲取硬件資源、實現(xiàn)中斷…進(jìn)入通驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互通過框架進(jìn)行I/O傳遞I/O調(diào)度
程序隊列選擇執(zhí)行級別和同步范圍驅(qū)動程序的OnReadIRP電源管理WDFREQUESTWDFREQUEST通過框架進(jìn)行I/O傳遞I/O調(diào)度
程序隊列選擇執(zhí)行級別隊列選擇隊列類型 有序:一次傳遞一個請求并行:請求到達(dá)時即傳遞給驅(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同步范圍:通過管理鎖強(qiáng)制使回調(diào)執(zhí)行序列化的機(jī)制I/O調(diào)度
程序隊列選擇執(zhí)行級別和同步范圍驅(qū)動程序的OnReadI/O電源管理設(shè)備范圍:同步設(shè)備隊列和文件對象的回調(diào)隊列范圍:同步隊列的回調(diào)無:無同步執(zhí)行級別和同步范圍IRQL:中斷請求級別(PASSIVE_電源管理電源管理的隊列WDF隊列可由“電源管理”僅當(dāng)給設(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將花費(fèi)大量時間完成對硬件的I/O操作是可中止的
WdfRequestMarkCancelable
(Request,OnRequestCancel);請求取消可以取消已排隊的請求WdfRequestMark驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互使用I/O目標(biāo)與硬件交互驅(qū)動程序無法總是能夠完成請求需要堆棧中其他驅(qū)動程序的協(xié)助驅(qū)動程序到驅(qū)動程序I/O目標(biāo)可以是堆棧中的下一個驅(qū)動程序可以是堆棧之外的外部驅(qū)動程序I/O目標(biāo)作為轉(zhuǎn)換器I/O目標(biāo)充當(dāng)框架和目標(biāo)設(shè)備對象之間的轉(zhuǎn)換器使用I/O目標(biāo)與硬件交互驅(qū)動程序無法總是能夠完成請求默認(rèn)I/O目標(biāo)和遠(yuǎn)程I/O目標(biāo)對比默認(rèn)I/O目標(biāo)驅(qū)動程序堆棧中較低的下一個設(shè)備對象WDFIOTARGETioTarget
=
WdfDeviceGetIoTarget(Device);遠(yuǎn)程I/O目標(biāo)遠(yuǎn)程目標(biāo)表示一個由某個其他驅(qū)動程序創(chuàng)建的設(shè)備對象WdfIoTargetCreate(Device,WDF_OBJECT_ATTRIBUTES,&IoTarget);默認(rèn)I/O目標(biāo)和遠(yuǎn)程I/O目標(biāo)對比默認(rèn)I/O目標(biāo)將請求發(fā)送到I/O目標(biāo)以同步方式或以異步方式Sync-WdfIoTargetSendReadSynchronouslyAsync-WdfIoTargetFormatRequestForRead后跟WdfRequestSend超時驅(qū)動程序可以將請求配置為在超時后取消為了避免驅(qū)動程序掛起,建議使用此方法WdfIoTargetSendIoctlSynchronously(ioTarget,NULL, IOCTL_ACPI_ASYNC_EVAL_METHOD, &inputBufDesc,&outputBufDesc, NULL,NULL);將請求發(fā)送到I/O目標(biāo)以同步方式或以異步方式WdfIoT驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互即插即用和電源交互即插即用應(yīng)用場景:設(shè)備電源已拔出。驅(qū)動程序已手動禁用。電源應(yīng)用場景:系統(tǒng)掛起。設(shè)備長時間空閑。用戶按下鼠標(biāo)按鈕來喚醒系統(tǒng)。即插即用和電源交互即插即用應(yīng)用場景:選擇加入行為模型驅(qū)動程序僅提供必要的事件回調(diào)硬件狀態(tài)不穩(wěn)定的設(shè)備(電源開/關(guān))
D0Entry、D0Exit、…具有喚醒信號的設(shè)備
ArmWakeFrom、DisarmWakeFrom、…合理的默認(rèn)實現(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)進(jìn)入睡眠設(shè)備電源已中斷驅(qū)動程序可以要求WDF在系統(tǒng)睡眠時自動中斷設(shè)備電源設(shè)備可以喚醒系統(tǒng)驅(qū)動程序可以將其設(shè)備設(shè)置為在輸入時喚醒系統(tǒng)WDF_DEVICE_POWER_POLICY_WAKE驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互驅(qū)動程序清理設(shè)備可操作即插即用/電源交互驅(qū)動程序工作流驅(qū)動程序初始化硬件準(zhǔn)備I/O請求處理硬件交互WDF開源WDF開源GitHub上的WDF!在
GitHub
提供包括KMDF和UMDFv2在MIT許可證下發(fā)布GitHub上的WDF!在GitHub提供包含私有符號通過Microsoft的符號服務(wù)器發(fā)布允許通過框架源代碼進(jìn)行調(diào)試可以在repowiki中找到指令包含私有符號通過Microsoft的符號服務(wù)器發(fā)布開源范圍開源范圍演示驅(qū)動程序崩潰演示驅(qū)動程序崩潰使用WDF編寫更好的驅(qū)動程序使驅(qū)動程序更簡單的摘要僅實現(xiàn)其需要自定義的事件回調(diào)的驅(qū)動程序提供功能強(qiáng)大的實用工具對象,管理對象生命期功能強(qiáng)大的調(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣告位租賃合同協(xié)議圍擋
- 勞務(wù)合同移交協(xié)議
- 書本代理協(xié)議合同
- 種植轉(zhuǎn)讓協(xié)議合同
- 合同變更協(xié)議期限
- 廢舊車輛買賣合同協(xié)議書
- 品牌維護(hù)合同協(xié)議
- 購銷合同撤銷協(xié)議
- 廢舊回收協(xié)議合同
- 房地產(chǎn)裝修協(xié)議合同
- 與圓有關(guān)的最值問題課件
- 中層干部任期考核民主測評表
- 全大學(xué)進(jìn)階英語綜合教程2綜合訓(xùn)練第一單元(含答案)
- 廣東省護(hù)士延續(xù)注冊健康體檢表
- 十二經(jīng)絡(luò)及腧穴課件
- 辦公室工作存在問題(總結(jié)12篇)
- 精細(xì)化工產(chǎn)品公司企業(yè)經(jīng)營戰(zhàn)略方案
- 住宅改為經(jīng)營性用房證明(參考樣本)
- GCP相關(guān)人員職責(zé)
- 08S305-小型潛水泵選用及安裝圖集
- 車輛二級維護(hù)計劃
評論
0/150
提交評論