DriverEntry 的選擇性責任
根據特定驅動程式在層次驅動程式鏈結中的位置、基礎裝置的本質,以及驅動程式的設計, DriverEntry 常式也可以負責下列事項:
呼叫 IoAllocateDriverObjectExtension 以建立和初始化驅動程式物件延伸模組,如果驅動程式需要全驅動程式資料的儲存體。 驅動程式物件延伸模組是驅動程式特定的資料結構。 例如,驅動程式可能會使用其驅動程式物件延伸模組來儲存登錄路徑或其他全域資訊。
呼叫 PsCreateSystemThread 以建立執行工作者執行緒,如果驅動程式是最高層級的驅動程式 (,例如使用這類執行緒的檔案系統驅動程式) 。 在此情況下,驅動程式也必須有類型為 WORKER_THREAD_ROUTINE 的回呼常式,該常式會採用單一輸入 PVOID 參數。
處理與這裡討論不同的類別特定初始化需求,例如裝置特定的迷你埠或迷你類別驅動程式與埠或類別驅動程式一起運作的初始化需求。 如需詳細資訊,請參閱 Windows 驅動程式套件 (WDK) 中的裝置類型特定檔。
提供系統資源的儲存體
個別裝置物件應該配置在 AddDevice 常式或 Dispatch 常式中,以處理 PnP IRP_MN_START_DEVICE 要求,而不是 在 DriverEntry中配置。
不過,驅動程式可能需要為其他全驅動程式用途配置額外的系統空間記憶體。 如果是, DriverEntry 常式可以呼叫下列常式的一 (或多個) :
IoAllocateDriverObjectExtension,以建立與驅動程式物件相關聯的內容區域
分頁或非分頁系統空間記憶體的ExAllocatePoolWithTag
MmAllocateNonCachedMemory 或 MmAllocateContiguousMemory 用於快取對齊的非分頁系統空間記憶體 (用於 I/O 緩衝區)
每個 DriverEntry 常式都會在 IRQL = PASSIVE_LEVEL 的系統執行緒內容中執行。 因此,只要驅動程式不會控制保存系統頁面檔案的裝置, 任何搭配 ExAllocatePoolWithTag 在初始化期間專用的記憶體都可以從分頁集區使用。 在DriverEntry傳回控制權之前,必須先釋放已配置的記憶體與ExFreePool。 不過,設定 Reinitialize 常式的驅動程式可以在呼叫 IoRegisterDriverReinitialization時傳遞此記憶體的指標,因此讓驅動程式的 Reinitialize 常式負責釋放記憶體配置。
宣告硬體資源
舊版、非 PnP 驅動程式從登錄宣告資源。 另一方面,PnP 驅動程式不會從 宣告裝置資源,也不會直接將資源需求寫入登錄。 相反地,這些驅動程式會回報回應特定 PnP IRP 的需求,作為 PnP 管理員列舉程式的一部分。 PnP 驅動程式會在 PnP IRP_MN_START_DEVICE 要求中接收其已配置的資源。
未直接與 PnP 管理員互動的驅動程式,例如特定迷你埠驅動程式,可能會有類別或埠驅動程式與 PnP 管理員互動的不同報告需求。 這類需求專屬於裝置類別。 如需裝置特定和類別特定詳細資料,請參閱 Windows 驅動程式套件 (WDK) 中相關裝置類別的檔。
使用登錄
DriverEntry常式可能會使用登錄來取得初始化驅動程式所需的一些資訊,或者它可能會設定登錄中的資訊,以供其他驅動程式或受保護的子系統使用。 資訊的本質取決於裝置的類型。 驅動程式可以使用ZwXxx和RtlXxx常式來存取登錄。 DriverEntry常式的RegistryPath參數指向計算的 Unicode 字串,指定驅動程式登錄機碼\Registry\Machine\System\CurrentControlSet\Services\*DriverName的路徑。常式應該儲存字串的複本,而不是指標本身,因為指標在 *DriverEntry傳回之後不再有效。