Minidrivers 和 HID 類別驅動程式
本文說明 minidrivers 和 HID 類別驅動程式。
如需詳細資訊,請參閱 建立 WDF HID 迷你驅動程式。
HID 類別驅動程式的操作功能
HID 類別驅動程式會執行下列作業:
提供和管理核心模式驅動程式和使用者模式應用程式用來存取輸入設備支援的 HID 集合 的上層介面。
HID 類別驅動程式會以透明方式管理和路由傳送高階驅動程式與應用程式與支援 HID 集合的基礎輸入設備之間的所有通訊。 它會管理不同輸入裝置所使用的不同數據通訊協定,以及支援相同 HID 集合上多個開啟檔案的輸入佇列。
HID 集合的上層介面包含 HID 類別驅動程式 IOCTLs、 HIDClass 支援例程,以及 HIDClass 結構。
藉由呼叫 minidriver 的標準驅動程式例程,與 HID 迷你驅動程序通訊。
針對較低層級總線或埠驅動程式所列舉的 HIDClass 輸入裝置,建立功能裝置物件 (FDO) 。
例如,HID 類別驅動程式會建立和管理 FDO 的作業,此作業代表系統提供的 USB 驅動程式堆疊所列舉的 USB HID 裝置。
提供基礎輸入設備所支援之子裝置 (HID 集合) 總線驅動程式的功能。
HID 類別驅動程式會針對輸入裝置所支援的每個 HID 集合建立實體裝置物件 (PDO) ,並管理集合的作業。
將 minidriver 系結至 HIDClass
HID minidriver 會藉由呼叫 HidRegisterMinidriver 向 HID 類別驅動程式註冊自己的作業,將其作業系結至 HID 類別驅動程式。 註冊作業:
將進入點的複本儲存 (指標) HID 迷你驅動程式的標準驅動程式例程,並儲存在 HID 類別驅動程式的裝置擴充功能中。
HID minidriver 會在驅動程式對象中設定其進入點,此驅動程式會在迷你驅動程式接收作為其 DRIVER_INITIALIZE 例程的輸入。 HID 迷你驅動程式會先設定這些進入點,再向 HID 類別驅動程序註冊。
將 minidriver 驅動程式對象的進入點重設為 HID 類別驅動程式所提供的標準驅動程式例程進入點。
HID 類別驅動程式提供下列標準驅動程式例程:
分派下列 I/O 要求的例程:
註冊程式也會為 HID mind river 裝置延伸模組配置記憶體。 雖然記憶體是由 HID 類別驅動程式所配置,但只有 HID 迷你驅動程式會使用此裝置擴充功能。
與 HID 迷你驅動程序通訊
HID 類別驅動程式會呼叫 HID minidriver 的 DRIVER_ADD_DEVICE、 DRIVER_UNLOAD和分派例程,以與 HID 迷你driver 通訊,如下所示:
呼叫 AddDevice 例程
當呼叫 HID 類別驅動程式的 AddDevice 例程來建立功能裝置物件 (FDO) 時,HID 類別驅動程式會建立 FDO 、初始化它,以及呼叫 HID minidriver AddDevice 例程。 HID minidriver AddDevice 例程會執行內部裝置特定的初始化,如果成功,則會傳回STATUS_SUCCESS。 如果 HID minidriver AddDevice 例程不成功,HID 類別驅動程式會刪除 FDO,並傳回 HID minidriver AddDevice 例程傳回的狀態。
呼叫 Unload 例程
呼叫 HID 類別驅動程式 Unload 例程時,HID 類別驅動程式會完成釋放與 FDO 相關聯的所有資源,並呼叫 HID 迷你驅動程式的 Unload 例程。
呼叫 Dispatch 例程
為了操作裝置,HID 類別驅動程式主要是針對內部裝置控制要求呼叫 HID 迷你驅動程式分派例程。
當 I/O 管理員將要求傳送至 HID 類別驅動程式時,HID 類別驅動程式會處理要求,並呼叫 HID 迷你驅動程式的對應分派例程。
HID 類別驅動程式不會將下列要求傳送至 HID 迷你驅動程式:建立、關閉或裝置控制。
HID 迷你驅動程式的作業
HID 傳輸迷你驅動程式會抽象化輸入設備所連結的硬體總線或埠作業。
HID 迷你驅動程式可以使用下列其中一個架構來建置:
- UMDF – 使用者模式驅動程序架構
- KDMF – 核心模式驅動程序架構
- WDF - Windows Driver Framework
- WDM – Windows 驅動程式模型 (舊版)
Microsoft 建議使用以架構為基礎的解決方案, (KMDF 或 UMDF) 。 如需每個驅動程式模型的詳細資訊,請流覽下列各節:
- 以 KMDF 為基礎的 HID 迷你驅動程式,請參閱建立架構型 HID Minidrivers
- UMDF 型 HID 迷你驅動程式,請參閱 建立 WDF HID Minidrivers
下一節將討論如何註冊 WDM 型 HID 迷你驅動程式,但大部分都與 KMDF 架構驅動程序有關。 所有 HID 迷你驅動程式都必須向 HID 類別驅動程式註冊,HID 類別驅動程式會藉由呼叫 minidriver 的標準驅動程式例程來與迷你驅動程式通訊。
如需 HID 迷你驅動程式在其標準驅動程式例程中必須支援之功能的詳細資訊,請參閱下列各節:
如需 HID 類別驅動程式的詳細資訊,請參閱 HID 迷你驅動程式的作業。
註冊 HID 迷你驅動程式
在 HID minidriver 在其 DRIVER_INITIALIZE 例程中完成所有其他驅動程式初始化之後,HID minidriver 會藉由呼叫 HidRegisterMinidriver 將其作業系結至 HID 類別驅動程式。
當 HID 迷你驅動程式向 HID 類別驅動程式註冊時,它會使用 HID_MINIDRIVER_REGISTRATION 結構。 結構會指定:
- HID 修訂
- HID minidriver 驅動程序物件
- HID 迷你驅動程式裝置擴充功能的大小
- 是否輪詢裝置
HID minidriver 擴充功能
HID minidriver 裝置擴充功能是裝置專屬的,而且只能由 HID 迷你驅動程式使用。 當類別驅動程式建立功能裝置物件的裝置擴充功能時,HID 類別驅動程式會配置迷你驅動程式裝置延伸模組的記憶體, (FDO) 。 HID minidriver 會在向 HID 類別驅動程式註冊迷你驅動程式時,指定其裝置擴充功能的大小。 大小是由 HID_MINIDRIVER_REGISTRATION 結構的DeviceExtensionSize成員所指定。
使用 HID_DEVICE_EXTENSION結構
HID minidriver 必須使用 HID_DEVICE_EXTENSION 結構做為功能裝置物件之 HID 類別驅動程式所建立之裝置延伸模組的配置, (FDO) 。 HID 類別驅動程式會在初始化 FDO 時設定這個結構的成員。 HID 迷你驅動程式不得變更此結構中的資訊。
HID_DEVICE_EXTENSION 結構包含下列成員:
PhysicalDeviceObject 是代表基礎輸入裝置的實體裝置對象指標 (PDO) 。
NextDeviceObject 是 FDO 下方裝置堆疊頂端的指標。
MiniDeviceExtension 是 HID minidriver 裝置擴充功能的指標。
假設輸入裝置的 FDO 指標,下列GET_MINIDRIVER_DEVICE_EXTENSION宏會傳回 HID 迷你驅動程式延伸模組的指標:
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION是 HID 迷你驅動程式所宣告裝置特定裝置延伸模組的指標。
同樣地,HID 迷你驅動程式可以取得輸入裝置 PDO 的指標,以及輸入設備 FDO 下方的裝置堆疊頂端。
當 HID 迷你驅動程式將 IRP 傳送至裝置堆疊時,它應該使用 NextDeviceObject 作為目標裝置物件。
標準迷你驅動程式例程
HID 迷你驅動程式必須提供下列標準驅動程序支援例程:
- HID minidriver DriverEntry 例程
- HID minidriver AddDevice 例程
- HID minidriver Unload 例程
HID 迷你驅動程式也必須支援 HID 迷你驅動程式所提供的分派例程中所述的分派例程。
DriverEntry 例程
HID 迷你驅動程式中的 DRIVER_INITIALIZE 例程會執行下列動作:
為連結的驅動程式組建立驅動程式物件, (HID 類別驅動程式和 HID 迷你驅動程式) 。
設定 HID minidriver 驅動程式物件中所需的驅動程序進入點。
呼叫 HidRegisterMinidriver 以向 HID 類別驅動程式註冊 HID minidriver。
會執行僅限 HID 迷你驅動程式使用的裝置特定設定。
AddDevice 例程
HID 類別驅動程式會處理建立和初始化基礎輸入裝置 (FDO) 的功能裝置物件。 HID 類別驅動程式也會從最上層介面的觀點操作 FDO,以及基礎裝置及其子裝置 (HID 集合) 。
HID 類別驅動程式 DRIVER_ADD_DEVICE 例程會呼叫 HID minidriver AddDevice 例程,讓迷你驅動程式可以執行內部裝置特定的初始化。
傳遞至 HID 迷你驅動程式 DRIVER_ADD_DEVICE 例程的參數是minidriver驅動程式物件和 FDO。 HID 類別驅動程式會將 FDO 傳遞至 minidriver AddDevice 例程,而不是基礎輸入裝置的實體裝置物件。
HID minidriver DRIVER_ADD_DEVICE 例程會從 FDO 取得 minidriver 裝置擴充功能的指標。
一般而言,HID 迷你驅動程式 DRIVER_ADD_DEVICE 例程會執行下列動作:
初始化minidriver裝置擴充功能。 裝置擴充功能僅供迷你驅動程式使用。
傳回STATUS_SUCCESS。 如果 minidriver 傳回錯誤狀態,HID 類別驅動程式會刪除 FDO,並將錯誤狀態傳回給 隨插即用 管理員。
卸除例程
HID 類別驅動程式的 Unload 例程會呼叫 HID 迷你驅動程式 DRIVER_UNLOAD 例程。 HID minidriver 會釋放 minidriver 所配置的任何內部資源。
分派例程
HID 迷你驅動程式必須提供下列分派例程:建立、關閉、內部裝置控制、系統控制、隨插即用 和電源管理。 除了內部裝置控制要求之外,大部分的分派例程都會提供最少的函式。 當 HID 類別驅動程式呼叫這些分派例程時,它會傳遞 minidriver 驅動程式物件和功能裝置物件, (FDO) 。
IRP_MJ_CREATE
符合 WDM 需求時,HID 類別驅動程式和 HID 迷你驅動程式會提供用於建立要求的分派例程。 不過,無法開啟 FDO。 HID 類別驅動程式會傳回STATUS_UNSUCCESSFUL。
HID 迷你驅動程式只需要提供存根。 永遠不會呼叫建立分派例程。
IRP_MJ_CLOSE
符合 WDM 需求時,HID 類別驅動程式和 HID 迷你驅動程式必須針對關閉要求提供分派例程。 不過,無法開啟 FDO。 HID 類別驅動程式會傳回STATUS_INVALID_PARAMETER_1。
HID 迷你驅動程式只需要提供存根。 永遠不會呼叫關閉分派例程。
IRP_MJ_DEVICE_CONTROL
HID 迷你驅動程式不需要裝置控制要求的分派例程。 HID 類別驅動程式不會將裝置控制要求傳遞至迷你驅動程式。
IRP_MJ_INTERNAL_DEVICE_CONTROL
HID minidriver 必須為內部裝置控制要求提供分派例程,以支援 HID minidriver IOCTLs 中所述的要求。
HID 類別驅動程式主要使用內部裝置控制要求來存取基礎輸入設備。
HID 迷你驅動程式會以裝置特定的方式處理這些要求。
IRP_MJ_SYSTEM_CONTROL
HID 迷你驅動程式必須提供系統控制要求的分派例程。 不過,HID 迷你驅動程式只需要將系統控制要求傳遞至裝置堆棧,如下所示:
略過目前的 IRP 堆疊位置
將要求向下傳送到 FDO 的裝置堆疊
IRP_MJ_PNP
HID 迷你驅動程式必須針對 隨插即用 要求提供分派例程。
HID 類別驅動程式會執行與 FDO 相關聯的所有 隨插即用 處理。 當 HID 類別驅動程式處理 隨插即用 要求時,它會呼叫 HID 迷你驅動程式的 隨插即用 分派例程。
HID 迷你驅動程式 隨插即用 分派例程:
處理將要求向下傳送到 FDO 的裝置堆疊,並在備份裝置堆疊時完成要求,視每種要求類型而定。
與特定要求相關聯的裝置特定處理,以更新 FDO 狀態的相關信息。
例如,minidriver 可能會更新 FDO (的 隨插即用 狀態,不論是 FDO 是啟動、停止還是正在移除) 。
IRP_MJ_POWER
HID 迷你驅動程式必須針對電源要求提供分派例程。 不過,HID 類別驅動程式會處理 FDO 的電源處理。
符合 WDM 需求時,HID minidriver 會以這種方式將電源要求向下傳送到 FDO 的裝置堆疊:
略過目前的 IRP 堆疊位置
啟動下一個電源 IRP
將電源 IRP 向下傳送到 FDO 的裝置堆疊
HID 迷你驅動程式通常會將電源要求向下傳遞至裝置堆疊,而不需額外處理。