Windows-driver-samples即插即用:设备枚举与资源分配实现
即插即用技术概述
即插即用(Plug and Play, PnP)是Windows操作系统的核心功能,允许设备在系统运行时动态连接和配置,无需重启或手动干预。Windows-driver-samples项目提供了丰富的PnP驱动实现示例,涵盖设备枚举、资源分配、电源管理等关键流程。通过学习这些示例,开发者可以快速掌握PnP驱动开发的核心技术。
PnP设备生命周期
PnP设备在系统中的生命周期包括检测、枚举、配置、使用和移除五个阶段。以下是各阶段的主要工作:
- 检测阶段:系统通过总线驱动检测新连接的设备
- 枚举阶段:收集设备信息并创建设备对象
- 配置阶段:分配硬件资源(如I/O端口、中断)
- 使用阶段:设备正常工作,处理I/O请求
- 移除阶段:安全释放资源并移除设备
设备枚举实现
设备枚举是PnP的基础,负责识别设备并创建相应的软件表示。Windows-driver-samples中的多个项目展示了不同总线类型的枚举实现。
USB设备枚举
USB设备枚举是最常见的PnP场景之一。在usb/kmdf_fx2/示例中,通过以下步骤实现枚举:
- 驱动初始化:在DriverEntry函数中设置PnP回调
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
WDF_DRIVER_CONFIG config;
WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd);
config.EvtDriverUnload = EvtDriverUnload;
return WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
}
- 设备添加处理:EvtDeviceAdd回调函数处理新设备
NTSTATUS EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit)
{
NTSTATUS status;
WDFDEVICE hDevice;
status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &hDevice);
if (!NT_SUCCESS(status)) return status;
// 创建设备上下文并初始化
PDEVICE_CONTEXT pDevContext = GetDeviceContext(hDevice);
RtlZeroMemory(pDevContext, sizeof(DEVICE_CONTEXT));
return status;
}
PCI设备枚举
PCI设备枚举在general/PLX9x5x/示例中实现,主要通过以下机制:
- PCI配置空间读取
- 设备ID和厂商ID匹配
- 资源列表构建
资源分配机制
资源分配是PnP的关键环节,负责为设备分配必要的硬件资源。Windows-driver-samples提供了多种资源分配实现方式。
资源分配流程
资源分配通常包括以下步骤:
- 资源需求声明:驱动声明所需资源类型
- 资源分配请求:系统根据可用资源进行分配
- 资源映射使用:驱动将分配的资源映射到虚拟地址空间
在general/ioctl/kmdf/示例中,资源分配实现如下:
NTSTATUS AllocateResources(PDEVICE_CONTEXT pDevContext)
{
WDF_IO_RESOURCE_REQUIREMENTS_LIST pIoResourceRequirements;
NTSTATUS status = WdfFdoQueryForResources(pDevContext->Device, &pIoResourceRequirements);
if (!NT_SUCCESS(status)) return status;
// 处理分配的资源
for (ULONG i = 0; i < pIoResourceRequirements->Count; i++) {
PIO_RESOURCE_DESCRIPTOR pDescriptor = &pIoResourceRequirements->List[i];
// 映射I/O端口或内存资源
if (pDescriptor->Type == CmResourceTypePort) {
status = WdfDeviceAssignResources(pDevContext->Device, pIoResourceRequirements);
if (!NT_SUCCESS(status)) return status;
}
}
return STATUS_SUCCESS;
}
冲突解决策略
当多个设备请求相同资源时,系统采用以下策略解决冲突:
- 优先级机制:系统设备优先于用户设备
- 动态重分配:调整已有设备资源
- 禁用低优先级设备:必要时暂时禁用非关键设备
示例项目分析
Windows-driver-samples提供了多个即插即用实现的完整示例,以下是几个典型项目:
USB即插即用示例
usb/umdf2_fx2/项目展示了USB设备的PnP完整实现,包括:
- 设备插入检测
- 驱动自动加载
- 资源动态分配
- 设备拔出处理
PCI即插即用示例
general/PLX9x5x/项目实现了PCI设备的枚举和资源分配,关键文件包括:
- general/PLX9x5x/sys/plx9x5x.c:PnP主处理逻辑
- general/PLX9x5x/sys/plx9x5x.h:数据结构定义
- general/PLX9x5x/test/plx9x5x_test.c:测试程序
PnP实现最佳实践
错误处理
在PnP事件处理中,正确的错误处理至关重要。应遵循以下原则:
- 使用NTSTATUS类型返回状态码
- 实现资源回滚机制
- 记录详细的错误日志
性能优化
为提高PnP处理性能,建议:
- 延迟资源分配直到实际需要
- 减少枚举过程中的I/O操作
- 使用异步处理长时间操作
总结
Windows-driver-samples项目提供了丰富的即插即用实现示例,涵盖了设备枚举、资源分配等关键功能。通过学习这些示例,开发者可以掌握PnP驱动开发的核心技术,包括:
- 设备生命周期管理
- 资源分配与释放
- 冲突检测与解决
- 电源管理集成
推荐开发者从usb/umdf2_fx2/和general/ioctl/kmdf/两个示例入手,逐步深入理解Windows即插即用技术的实现细节。
更多PnP开发资源:
- 官方文档:Building-Locally.md
- 驱动测试工具:tools/dv/
- 项目教程:README.md
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



