有关编写 AddDevice 例程的指导原则

编写 AddDevice 例程时,请考虑以下设计准则:

  • 如果筛选器驱动程序确定为其不需要服务的设备调用了其 AddDevice 例程,则筛选器驱动程序必须返回STATUS_SUCCESS,以允许为设备加载设备堆栈的其余部分。 筛选器驱动程序不会创建设备对象,也不会将其附加到设备堆栈;筛选器驱动程序仅返回成功,并允许将其余驱动程序添加到堆栈。

  • 驱动程序必须为它使用的任何内核定义对象和执行旋转锁提供存储(通常位于设备对象的设备扩展中)。 驱动程序还必须为指向从 I/O 管理器或其他系统组件获取的某些对象的指针提供存储。

    你可能决定为驱动程序的需求分配额外的系统空间内存,例如用于长期 I/O 缓冲区或旁观列表。 如果是这样, AddDevice 例程可以调用以下例程:

    分页或非分页系统空间内存的 ExAllocatePoolWithTag

    ExInitializePagedLookasideListExInitializeNPagedLookasideList 以初始化分页或非分页的 lookaside 列表

  • 如果驱动程序具有设备专用线程或等待任何内核定义的调度程序对象, 则 AddDevice 例程可能会初始化 内核调度程序对象

  • 如果驱动程序使用任何执行旋转锁或为中断旋转锁提供存储, 则 AddDevice 例程可能会初始化这些旋转锁。 有关详细信息 ,请参阅旋转锁

  • 在调用 IoCreateDevice 时加强文件打开安全性。

    指定调用 IoCreateDevice 时FILE_DEVICE_SECURE_OPEN特征。 Windows NT 4.0 SP5 及更高版本支持此特征。 它指示 I/O 管理器针对所有打开的请求的设备对象执行安全检查。 如果未在设备的类安装程序 INF 或设备的 INF 中设置FILE_DEVICE_SECURE_OPEN特征,并且驱动程序在打开时不执行自己的安全检查,则供应商应在调用 IoCreateDevice 时指定此特征。 (有关详细信息,请参阅 控制设备命名空间访问。)

    如果驱动程序在调用 IoCreateDevice 时设置了FILE_DEVICE_SECURE_OPEN特征,则 I/O 管理器会将设备对象的安全描述符应用于任何相对打开或尾随文件名打开。 例如,如果为 \Device\foo 设置了FILE_DEVICE_SECURE_OPEN,并且 \Device\foo 只能由管理员打开,则 \Device\foo\abc 也可以由管理员打开。 但是,I/O 管理器阻止普通用户打开 \Device\foo 和 \Device\foo\abc。

    如果设备的某个驱动程序设置了此特征,则 PnP 管理器会将其传播到设备的所有设备对象。

重要

本主题中讨论的 ExAllocatePool DDI 已在 Windows 10 版本 2004 中弃用,已替换为 ExAllocatePool2ExAllocatePool3。 有关详细信息,请参阅更新对 ExAllocatePool2 和 ExAllocatePool3 的已弃用 ExAllocatePool 调用