创建设备对象

整体驱动程序必须为处理 I/O 请求的每个物理、逻辑或虚拟设备创建设备对象。 不为设备创建设备对象的驱动程序不会收到设备的任何 IRP。

在某些技术领域,与类驱动程序或端口驱动程序关联的微型驱动程序不必创建自己的设备对象。 相反,类或端口驱动程序会创建设备对象,并接收设备的所有 IRP。 然后,类或端口驱动程序使用特定于驱动程序的方法将 I/O 请求传递给微型驱动程序。 请参阅特定技术领域的文档,以确定 Microsoft 是否提供代表驱动程序创建设备对象的类或端口驱动程序。

驱动程序调用 IoCreateDeviceIoCreateDeviceSecure 来创建其设备对象。 有关要使用的例程的详细信息,请参阅以下部分。

为 WDM 函数和筛选器驱动程序创建设备对象

为 WDM 总线驱动程序创建设备对象

为非 WDM 驱动程序创建设备对象

驱动程序创建设备对象时,它会向 IoCreateDevice 或 IoCreateDeviceSecure 提供以下信息:

  • 设备设备 扩展的大小。 设备扩展是系统分配的存储区域,驱动程序可用于特定于设备的存储。 有关详细信息,请参阅 设备扩展

  • 一个系统定义的常量,指示由设备对象表示的 DeviceType 。 有关详细信息,请参阅 指定设备类型

  • 一个或多个系统定义的 ORed 常量,用于指示设备的设备特征。 有关详细信息,请参阅 指定设备特征

  • 一个名为 Exclusive 的布尔值,指定是否应使用 DO_EXCLUSIVE 设置设备对象的 Flags 中的位,指示驱动程序为独占设备(如视频、串行、并行或声音设备)提供服务。 WDM 驱动程序必须将 Exclusive 设置为 FALSE。 有关详细信息,请参阅 指定对设备对象的独占访问

  • 指向驱动程序的驱动程序对象的指针。 WDM 函数或筛选器驱动程序接收指向其驱动程序对象的指针,作为其 AddDevice 例程的参数。 所有驱动程序在其 DriverEntry 例程中接收指向其驱动程序对象的指针。 系统使用此指针将驱动程序与其设备对象相关联。

  • 指向以 null 结尾的 Unicode 字符串的可选指针 (DeviceName) 命名设备。 除总线驱动程序以外的 WDM 驱动程序不提供设备名称;这样做会绕过 PnP 管理器的安全功能。 有关详细信息,请参阅 命名设备对象

如果调用 IoCreateDeviceIoCreateDeviceSecure 成功,则 I/O 管理器为设备对象本身以及与设备对象关联的所有其他数据结构(包括设备扩展)提供存储,它用零初始化。

为 WDM 函数和筛选器驱动程序创建设备对象

WDM 驱动程序(总线驱动程序)调用 IoCreateDevice 来创建其设备对象。 大多数 WDM 驱动程序从其 AddDevice 例程中创建其设备对象。 某些驱动程序(例如必须响应驱动器布局 IOCTL 的磁盘驱动程序)从调度例程调用 IoCreateDevice

除非 Windows 驱动程序工具包中特定于设备类型的部分 (WDK) 文档状态,否则驱动程序应在其 AddDevice 例程中创建其设备对象。 有关详细信息,请参阅 编写 AddDevice 例程

为 WDM 总线驱动程序创建设备对象

如果关系类型为 BusRelations,则 WDM 总线驱动程序在枚举新设备以响应IRP_MN_QUERY_DEVICE_RELATIONS请求时创建 PDO。

以下规则确定总线驱动程序是调用 IoCreateDevice 还是 IoCreateDeviceSecure 来创建设备对象:

  • 如果设备可以在 原始模式下使用,则必须调用 IoCreateDeviceSecure

  • 如果设备不支持原始模式,则总线驱动程序可以使用 IoCreateDeviceIoCreateDeviceSecure。 当总线上设备的默认系统安全性足够时,可以使用 IoCreateDevice;IoCreateDeviceSecure 可用于指定更严格的安全描述符。 有关详细信息,请参阅 控制设备访问

为非 WDM 驱动程序创建设备对象

非 WDM 驱动程序使用 IoCreateDevice 创建未命名的设备对象,使用 IoCreateDeviceSecure 创建命名设备对象。 请注意,非 WDM 驱动程序的未命名设备对象无法从用户模式访问,因此驱动程序通常必须至少创建一个命名对象。