初始化虚拟微型端口

中间驱动程序在成功打开基础微型端口适配器并准备好接受请求并在其虚拟微型端口上发送后初始化其虚拟微型端口。 中间驱动程序从其 ProtocolBindAdapterEx 函数调用 NdisIMInitializeDeviceInstanceEx 一次或多次,以请求初始化一个或多个虚拟微型端口。

注意 当中间驱动程序打开基础微型端口适配器时,不需要调用 NdisIMInitializeDeviceInstanceEx 。 虚拟微型端口和开放适配器之间不必存在一对一关系。

NdisIMInitializeDeviceInstanceExDriverInstance 参数设置为要初始化的虚拟微型端口的设备名称。 中间驱动程序从 UpperBindings 注册表项获取设备名称。

对于将多个虚拟微型端口分层到单个物理 NIC 的 n 对一 MUX 中间驱动程序,每个虚拟微型端口都必须有一个设备名称。 MUX 中间驱动程序需要一个通知对象,该对象维护虚拟微型端口设备名称的列表。 列表的建议位置是 UpperBindings 注册表项。 在这种情况下, UpperBindings 注册表项是包含设备名称列表的MULTI_SZ项。 MUX 中间驱动程序为设备名称列表中指定的每个设备名称调用 NdisIMInitializeDeviceInstanceEx 一次。

调用 NdisIMInitializeDeviceInstanceEx 会导致调用中间驱动程序的 MiniportInitializeEx 函数,以执行指定虚拟微型端口的初始化,前提是 NDIS 收到启动设备的IRP_MN_START_DEVICE。 如果 NDIS 未收到此类 IRP,则 NDIS 不会调用中间驱动程序的 MiniportInitializeEx 函数。 对 MiniportInitializeEx 的调用可以在以后发生,因此不一定是在调用 NdisIMInitializeDeviceInstanceEx 的上下文中。 如果 NDIS 从未为调用 NdisIMInitializeDeviceInstanceEx 中引用的虚拟微型端口调用 MiniportInitializeEx,并且中间驱动程序不再需要虚拟微型端口,则中间驱动程序应调用 NdisIMCancelInitializeDeviceInstance 以取消虚拟微型端口的初始化。 例如,假设中间驱动程序创建了一个虚拟微型端口,以响应成功绑定到基础微型端口。 如果在 NDIS 调用 MiniportInitializeEx 之前删除该绑定,则中间驱动程序应调用 NdisIMCancelInitializeDeviceInstance 以取消微型端口的初始化。

MiniportInitializeEx 必须分配和初始化特定于虚拟微型端口的上下文区域。 有关指定上下文区域的详细信息,请参阅 初始化虚拟微型端口

中间驱动程序必须作为反序列化驱动程序运行。 有关反序列化驱动程序的详细信息,请参阅 反序列化的 NDIS 微型端口驱动程序

中间驱动程序应验证它维护的状态信息是否已正确初始化。 如果驱动程序需要与发送相关的资源(例如,MiniportSendNetBufferLists 将传输到下一层的网络数据的新NET_BUFFER_LIST结构),则此时可以分配NET_BUFFER_LIST结构池。