驅動程式一開始就是從這一個函式開始的,應該說如果此時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與註冊表產生聯繫,驅動程式可以利用註冊表儲存一些與驅動程式有關的訊息,系統與其他的程式可以利用這些訊息,做一些與該驅動程式有關的動作與處理。
沒有留言:
張貼留言