2017年12月28日 星期四

[Windows driver]-驅動程式種類區分

驅動程式在架構上是分層堆疊 (layered in a stack) 而成,因此驅動程式不一定只和硬體裝置溝通,可能和其他驅動程式溝通。驅動程式依照用途不同可以分為下列幾類:
  • 功能驅動程式 (Function Driver)
    直接與硬體裝置直接溝通的驅動程式,稱為 Function Driver。
  • 篩選器驅動程式 (Filter Driver)
    輔助處理 I/O 請求的驅動程式,與其他驅動程式相互溝通,稱為 Filter Driver。
  • 軟體驅動程式 (Software Driver)
    與硬體裝置無關,是為了處理作業系統的核心資料結構,稱為 Software Driver。
  • 匯流排驅動程式 (Bus Driver)
    驅動匯流排以建立裝置樹的驅動程式,稱為 Bus Driver。

[Windows driver]-wdf驅動-第一步

DriverEntry() 有些像一般C程式的main()

驅動程式一開始就是從這一個函式開始的,應該說如果此時driver尚未被載入到記憶體的時候,則系統會將driver做第一次的載入,第一次載入的時候,DriverEntry()將被系統呼叫。DriverEntry()最主要的任務是初始化驅動程式。


driverEntry有三件重要的工作
1.      create device
2.      create symbol

3.      set major function

//-------------------------------------------------------------------------------------------------------------------
//--範例
DriverObject->DriverUnload = DriverUnload;    
DriverObject->DriverStartIo = 
DiverObject->MajorFunction[IRP_MJ_PNP] =                                   
DriverObject->MajorFunction[IRP_MJ_POWER] = 
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] =
DriverObject->MajorFunction[IRP_MJ_CREATE] = 

DriverObject->DriverExtension->AddDevice = AddDevice;

//----------------------------------------------------------------------------

範例的部分是開始作任務分配,指定哪些IRP由哪些函式來處理因為系統與驅動程式的溝通互動,總是透過這些許多的IRP(I/O Request Packet),這些IRP有不同的分類(IRP_MJ_****,並且由不同的函式負責處理,根據這些處理函式的指派,日後驅動程式便知道這些收到的IRP,應該交由誰來處理。



DriverEntry的兩個參數:

1.DiverObject :

                             系統為該驅動程式分配一個記憶體區塊,用於儲存與驅動程式有關的任何訊息,例如目前驅動程式的狀態,驅動程式與外部溝通互動的資料暫存區(buffer),在系統裡面DriverObject 就是代表著該驅動程式也就是設備被bus driver列舉的時候,所創建的PDO
如果DriverEntry函式一路都順利的執行,就傳回 return STATUS_SUCCESS,如果在中間出現了問題與錯誤,則需要另外設計錯誤的處理函數。

2. RegistryPath :
一個 Unicode 型態的字串,通常是一個註冊表的路徑:
\Registry\Machine\System\CurrentControlSet\Services\DriverName.
一般來說,驅動程式利用這一個unicodestring與註冊表產生聯繫,驅動程式可以利用註冊表儲存一些與驅動程式有關的訊息,系統與其他的程式可以利用這些訊息,做一些與該驅動程式有關的動作與處理。

2017年12月26日 星期二

[Windows driver]-驅動程式安裝來源


  • inf:以此檔案來開啟驅動程式的安裝
  • sys:硬體的驅動程式檔案,保證硬體可以work
  • cat:用於驅動程式及其檔案的數位簽署