Windows-driver-samples即插即用:设备枚举与资源分配实现

Windows-driver-samples即插即用:设备枚举与资源分配实现

【免费下载链接】Windows-driver-samples Windows-driver-samples: 是微软提供的 Windows 驱动程序示例仓库,包括多种设备的驱动程序代码。适合开发者学习和编写 Windows 驱动程序。 【免费下载链接】Windows-driver-samples 项目地址: https://gitcode.com/gh_mirrors/wi/Windows-driver-samples

即插即用技术概述

即插即用(Plug and Play, PnP)是Windows操作系统的核心功能,允许设备在系统运行时动态连接和配置,无需重启或手动干预。Windows-driver-samples项目提供了丰富的PnP驱动实现示例,涵盖设备枚举、资源分配、电源管理等关键流程。通过学习这些示例,开发者可以快速掌握PnP驱动开发的核心技术。

PnP设备生命周期

PnP设备在系统中的生命周期包括检测、枚举、配置、使用和移除五个阶段。以下是各阶段的主要工作:

  1. 检测阶段:系统通过总线驱动检测新连接的设备
  2. 枚举阶段:收集设备信息并创建设备对象
  3. 配置阶段:分配硬件资源(如I/O端口、中断)
  4. 使用阶段:设备正常工作,处理I/O请求
  5. 移除阶段:安全释放资源并移除设备

设备枚举实现

设备枚举是PnP的基础,负责识别设备并创建相应的软件表示。Windows-driver-samples中的多个项目展示了不同总线类型的枚举实现。

USB设备枚举

USB设备枚举是最常见的PnP场景之一。在usb/kmdf_fx2/示例中,通过以下步骤实现枚举:

  1. 驱动初始化:在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);
}
  1. 设备添加处理: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提供了多种资源分配实现方式。

资源分配流程

资源分配通常包括以下步骤:

  1. 资源需求声明:驱动声明所需资源类型
  2. 资源分配请求:系统根据可用资源进行分配
  3. 资源映射使用:驱动将分配的资源映射到虚拟地址空间

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;
}

冲突解决策略

当多个设备请求相同资源时,系统采用以下策略解决冲突:

  1. 优先级机制:系统设备优先于用户设备
  2. 动态重分配:调整已有设备资源
  3. 禁用低优先级设备:必要时暂时禁用非关键设备

示例项目分析

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开发资源:

【免费下载链接】Windows-driver-samples Windows-driver-samples: 是微软提供的 Windows 驱动程序示例仓库,包括多种设备的驱动程序代码。适合开发者学习和编写 Windows 驱动程序。 【免费下载链接】Windows-driver-samples 项目地址: https://gitcode.com/gh_mirrors/wi/Windows-driver-samples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值