6.3 多态
如果纯粹是为了尝鲜,在驱动中加入一个类,内部却只是一团硬板,那就完全多此一举了。所以本节笔者将带领大家在内核中实现类的多态。以CY001 USB设备驱动为例进行讲解,代码请参考本书工程UsbBaseClass和CY001UsbClass,前者以基类实现设备驱动,后者以子类实现设备驱动。
6.3.1 基类、子类
笔者对基类的要求是能够实现USB设备的最基本要素,使得设备能够在系统中显现,能够正常运行和移除。所以设备栈一定要成功建立,基本的Pnp/Power接口也必须要提供,但用户层接口可以暂不考虑。最终的结果是PnpAdd函数实现得非常完整,因为必须要将设备栈建立起来;EvtDevicePrepareHardware和EvtDeviceReleaseHardware函数也得以完整实现,这样设备能够正确运行和移除,但细节方面的设置如休眠等则以接口留出。
子类必须实现更完善的功能,如休眠、唤醒设置。下面的例子分别对应着基类和子类的实现。
- // 配置设备驱动的电源管理功能
- NTSTATUS DrvClass::InitPowerManagement()
- {
- return STATUS_SUCCESS;
- }
- 这是基类的实现,空空如也,子类则要复杂许多倍。
- // 配置设备驱动的电源管理功能
- NTSTATUS CY001Drv::InitPowerManagement()
- {
- NTSTATUS status = STATUS_SUCCESS;
- WDF_USB_DEVICE_INFORMATION usbInfo;
-
- KDBG(DPFLTR_INFO_LEVEL, "[InitPowerManagement]");
-
- // 获取设备信息
- WDF_USB_DEVICE_INFORMATION_INIT(&usbInfo);
- WdfUsbTargetDeviceRetrieveInformation(m_hUsbDevice, &usbInfo);
-
- // 设置设备的休眠和远程唤醒功能
- // …… 详见代码
-
- return status;
- }