原文出處:http://www.cnblogs.com/jacklu/p/4646601.html
本科畢業設計是這方面的工作,所以想開幾篇博客來介紹使用WDF開發PCI/PCIe接口卡的驅動程序方法。
在上一篇簡要介紹了WDF和開發環境搭建后,本篇將講述幾個WDF中的概念,對開發者了解WDF非常有幫助,屬於“內功部分”;
本篇文章結構將沒那么清晰,當句句都是作者通過看書、看論文、看MSDN提煉出來的,希望對讀者能夠有所幫助。
如果你覺得這篇博客對你的項目有用,請引用以下論文:
Meng Shengwei, Lu Jianjie. Design of a PCIe Interface Card Control Software Based on WDF. Fifth International Conference on Instrumentation and Measurement, Computer, Communication and Control. IEEE, 2016:767-770.
1、WinDBG是唯一的內核驅動調試利器,但是開發PCIe的WDF驅動可以采用“黑盒”方式,所以windbg不是必須的;
2、WDF比WDM好,別再用WDM了;
3、驅動程序編譯成的二進制文件是sys類型,和EXE一樣都是Portable Executable File Format;DLL也是PE格式
4、微軟提供的內核接口只有C/C++
5、驅動程序開發時,需要為每一個函數指定其是分頁內存還是非分頁內存;
6、PAGE標識是指此函數能在驅動運行時被交換到磁盤上;如果不指定,編譯器默認為非分頁內存;一般情況下,我們不許要考慮這些問題。但有些特殊的情況,代碼是不允許被交換到硬盤上的,否則導致操作系統藍屏或者自動重啟;
7、驅動開發一定要關注warnning!!!除非你對這個warnning帶來的影響非常了解;
8、派遣函數又可稱為回掉函數,提供給操作系統調用。這些派遣函數是我們的主要工作重點;
9、創建設備時要判斷設備是否創建成功,比進行必要的失敗處理。驅動程序中這樣的處理對於驅動程序的健壯性起着不容忽視的作用;
10、驅動程序的設備名稱對應用程序來說是透明的,只能應用於內核,這也是為什么要創建設備符號鏈接、GUID的原因;
為了不給讀者帶來疲勞,再從1開始計數吧~
1、用戶模式應用程序的虛擬地址空間除了為專用空間以外,還會受到限制。在用戶模式下運行的處理器無法訪問為該操作系統保留的虛擬地址。限制用戶模式應用程序的虛擬地址空間可防止應用程序更改並且可能損壞關鍵的操作系統數據;
2、在內核模式下運行的所有代碼都共享單個虛擬地址空間。這表示內核模式驅動程序未從其他驅動程序和操作系統自身獨立開來。如果內核模式驅動程序意外寫入錯誤的虛擬地址,則屬於操作系統或其他驅動程序的數據可能會受到損壞。如果內核模式驅動程序損壞,則整個操作系統會損壞;
3、最正式的設備堆棧的定義:設備堆棧為(設備對象、驅動程序)對的有序列表,設備堆棧中創建的第一個設備對象位於底部,創建並附加到設備堆棧的最后一個設備對象位於頂部;
4、安裝設備驅動時,安裝程序使用信息(INF)文件中的信息來確定哪個驅動程序為函數驅動程序、哪個驅動程序為篩選器。這樣安裝后,PnP管理器就能通過注冊表來確定設備的函數驅動程序和篩選器驅動程序了;
5、發送到設備的請求大部分都打包在I/O數據請求包中(IRP),IRP結構體:http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff550694%28v=vs.85%29.aspx;
6、IRP包含驅動程序處理I/O請求所需的全部信息;
7、驅動程序拆分為兩個部分:一部分處理通用處理,另一部分處理特殊設備的處理,通用部分由Microsoft編寫;特定部分由Microsoft或者硬件提供商編寫;
8、通用部分稱為“框架”,特定部分稱為KMDF驅動程序;
9、”框架“可以處理I/O請求隊列、線程同步以及很大一部分的電源管理任務;因此當某人將IRP發送到對時,IRP會轉至框架。如果框架可以處理IRP,則不會涉及到KMDF驅動程序;如果框架處理不了就通過調用KMDF驅動程序來實現事件處理程序來獲取幫助;
10、WDK中的頭文件包含的條件語句指定編程元素僅在某些版本的Windows操作系統中才可用
好吧,還沒有寫完~
1、創建驅動程序時,可以指定Windows 7為基本的目標操作系統,在這種情況下,驅動程序會在Win7或更高的Windows上運行;
2、KMDF為驅動程序提供基於對象的接口,對象接口包括:
對象方法(驅動程序在對某個對象執行操作或者獲取設置對象屬性時可調用的函數)
對象事件回調函數(驅動程序提供的函數)
對象屬性(屬性是驅動程序可獲取和設置的的存儲在對象中的值)
對象句柄(基於框架的驅動程序)
3、每個基於框架的驅動程序都包括:一個DriverEntry例程,可在加載驅動程序時調用,一組事件回調函數,框架將在發生特定於對象的事件時調用這些函數;
4、基於 Windows 的驅動程序分為三種類型:總線驅動程序、功能驅動程序和篩選器驅動程序;
5、I/O 管理器通過創建 I/O 請求數據包 (IRP),將應用程序的 I/O 請求發送到驅動程序。IRP 可包含執行 I/O 操作(如讀/寫操作)的請求或執行 I/O 控制 (IOCTL) 操作(如返回狀態)的請求。此外,PnP 管理器還會創建表示驅動程序必須執行的 PnP 和電源管理操作的 IRP,並將這些 IRP 發送到驅動程序;
6、I/O 管理器通常在用戶應用程序請求讀取或寫入操作時創建讀取或寫入 IRP;
7、回調函數一定要返回STATUS_SUCCESS (如果操作成功)否則,回調函數將返回錯誤信息(定義在Ntstatus.h);
8、KMDF修訂歷史記錄:http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff544309(v=vs.85).aspx
9、驅動程序項目是生成驅動程序二進制文件(如 .sys 文件)以及可能驅動程序的 INF 文件的 Microsoft Visual Studio 項目。驅動程序包是用於安裝驅動程序的文件集合。驅動程序包中包含一個 INF 文件,以及由該 INF 引用的文件和二進制文件。如果使用驅動程序模板創建驅動程序解決方案,該模板應自動創建一個包含兩個項目的解決方案。一個用於驅動程序,另一個用於驅動程序包;
10、內核模式下的驅動程序在從用戶地址中讀取或寫入這些地址時必須非常小心!
1)用戶應用程序發起設備讀取請求,程序提供緩沖區的起始地址以接受數據;
2)內核驅動程序啟動讀取操作並將控制權返回到其調用程序;
廣告時間~本人博士賺外快,如需要完整的驅動程序源代碼請聯系合作email: 346457821@qq.com