初始化中间驱动程序

NDIS 中间驱动程序在其 DriverEntry 例程的上下文中注册其 MiniportXxx 函数和 ProtocolXxx 函数。 若要注册其 MiniportXxx 函数,中间驱动程序必须使用设置的 NDIS_INTERMEDIATE_DRIVER 标志调用 NdisMRegisterMiniportDriver 函数。 此标志位于驱动程序在 MiniportDriverCharacteristics 中传递的NDIS_MINIPORT_DRIVER_CHARACTERISTICS结构中。 若要注册其 ProtocolXxx 函数,中间驱动程序必须调用 NdisRegisterProtocolDriver 函数。

如果驱动程序成功注册为 NDIS 中间驱动程序,DriverEntry 将返回STATUS_SUCCESS或其等效NDIS_STATUS_SUCCESS。 如果 DriverEntry 无法通过传播 由 NdisXxx 函数或内核模式支持例程返回的错误状态来初始化,驱动程序将不会保持加载状态。 DriverEntry 必须同步执行;也就是说,它不能返回STATUS_PENDING或其等效NDIS_STATUS_PENDING。

若要向 NDIS 注册中间驱动程序, DriverEntry 例程至少必须:

  • 调用 NdisMRegisterMiniportDriver 函数,并将 NDIS_INTERMEDIATE_DRIVER 标志设置为注册驱动程序的 MiniportXxx 函数。
  • 如果驱动程序随后将自身绑定到基础 NDIS 驱动程序,则调用 NdisRegisterProtocolDriver 函数来注册驱动程序的 ProtocolXxx 函数。
  • 调用 NdisIMAssociateMiniport 函数以通知 NDIS 驱动程序的微型端口上边缘和协议下边缘之间的关联。

如果在 NdisMRegisterMiniportDriver 成功返回后 DriverEntry 中发生错误,驱动程序必须在 DriverEntry 返回之前调用 NdisMDeregisterMiniportDriver 函数。 如果 DriverEntry 成功,驱动程序必须从其 MiniportDriverUnload 函数调用 NdisMDeregisterMiniportDriver

中间驱动程序共享协议驱动程序和微型端口驱动程序的大部分 DriverEntry 要求。

当驱动程序从其 ProtocolBindAdapterEx 函数调用 NdisIMInitializeDeviceInstanceEx 函数时,将初始化中间驱动程序的虚拟微型端口。

初始化所有基础微型端口驱动程序后,NDIS 调用 ProtocolBindAdapterEx 函数。

实际上,NDIS 中间驱动程序的 DriverEntry 函数可以在将 RegistryPath 指针传递给 NdisMRegisterMiniportDriver 后忽略它。 此类驱动程序还可以在将 DriverObject 指针传递给 NdisMRegisterMiniportDriver 后忽略它。 但是,驱动程序应将 NdisMRegisterMiniportDriver 返回的微型端口驱动程序句柄值保存在 NdisMiniportDriverHandle ,并将 NdisRegisterProtocolDriver 返回的协议句柄值保存在 NdisProtocolHandle 上,以便后续调用 NdisXxx 函数。 在调用中间驱动程序的 MiniportInitializeEx 函数来初始化中间驱动程序的虚拟微型端口之前,中间驱动程序的 ProtocolBindAdapterEx 函数将驱动程序绑定到每个基础微型端口驱动程序。 更高级别的协议驱动程序随后会自行绑定到它创建的虚拟微型端口。 此策略使 NDIS 中间驱动程序能够在创建虚拟微型端口时根据其绑定到的基础微型端口驱动程序的功能分配资源。