有关 MB 微型端口驱动程序 IP 地址通知的指导原则

在 INF 文件中指定 EnableDhcp 等于零的 MB 微型端口驱动程序可以使用内核模式下的 IP 帮助程序 和相关 函数 来创建、更改和删除 IP 地址:

若要在内核模式下使用 IP 帮助程序函数,微型端口驱动程序必须包含 Netioapi.h 头文件和针对 Netio.lib 的链接。

当微型端口驱动程序指定 EnableDhcp 等于零时,需要执行以下操作来通知 MB 服务以下任何事件:

  • 设置 MB 接口的 IP 地址

  • 设置默认网关地址

  • 更新 DNS 地址

使用 IP 帮助程序 API 设置的 IP 地址和默认网关将保留网络连接或断开连接事件,或者同时保留这两者。 因此,如果新的 IP 地址或默认网关或两者的值都不同于当前设置的值,则微型端口驱动程序应首先清除以前的值,然后再在网络连接事件上设置新值。

请注意,微型端口驱动程序可以从NDIS_MINIPORT_INIT_PARAMETERS结构的 NetLuidIfIndex 成员中找到 MB 接口的 LUID索引,这些成员传递给微型端口驱动程序的 MiniportInitializeEx 函数。

重置 IP 地址和网关地址

对 TCP/IP 堆栈的某些更改(例如加载强制筛选器驱动程序)可以删除 IP 帮助程序函数设置的 IP 和网关地址。 如果更改 TCP/IP 堆栈,微型端口驱动程序必须重置 IP 和网关地址,才能删除设置。

微型端口驱动程序应使用以下过程在删除地址时收到通知,并且必须再次重置。

  1. 在驱动程序初始化期间,微型端口驱动程序应指定回调函数,以使用 NotifyIpInterfaceChange 注册 IP 接口更改通知。 每当添加、删除或更改 IP 接口时,Windows 都会调用该函数。

  2. 在适配器初始化期间,微型端口驱动程序应保存在微型端口驱动程序的本地适配器上下文中,从传递给微型端口驱动程序 MiniportInitializeEx 函数的 NDIS_MINIPORT_INIT_PARAMETERS 结构中保存 LUID 值。 该值包含标识 适配器接口的 NetLuid ,该接口用于通知回调。

  3. 在通知回调中,Windows 将以下参数传递给向 NotifyIpInterfaceChange 注册的通知函数:

    • 指向MIB_IPINTERFACE_ROW结构的指针,该结构包含微型端口适配器接口的 NetLuid
    • 通知的类型,可以是 MibAddInstance、MibDeleteInstanceMibParameterNotification

    微型端口驱动程序应在适配器处于连接状态时重置 IP 和网关地址,通知类型为 MibAddInstance,MIB_IPINTERFACE_ROW中的 NetLuid 对应于在适配器初始化期间保存的微型端口驱动程序适配器之一。

    然后,微型端口驱动程序应遵循“设置 MB 接口的 IP 地址”和“设置默认网关地址”过程来重置相应的地址。

  4. 在驱动程序卸载期间,微型端口驱动程序应使用 CancelMibChangeNotify2 IP 帮助程序函数取消注册通知回调函数。

设置 MB 接口的 IP 地址

若要设置 IPv4 地址,请使用以下过程。 可以使用类似的 IP 帮助程序功能设置 IPv6 地址。

  1. 使用 GetUnicastIpAddressTable IP 帮助程序函数查找系统中的所有 IP 地址条目。

  2. 对于 InterfaceLuid 值与 MB 接口的 InterfaceLuid 匹配的每个条目:

    1. 查找与上一连接中使用的 IP 地址匹配的 IP 地址条目。 第一次连接不会有以前的 IP 地址。
    2. 如果新的 IP 地址不同于以前的 IP 地址,请使用 DeleteUnicastIpAddressEntry IP 帮助程序函数删除以前的连接 IP 地址条目。
    3. 如果新的 IP 地址与以前的 IP 地址相同,请验证所需的条目是否已存在。
  3. 如果微型端口驱动程序在上一循环中找不到所需的 IP 地址条目,则应添加新条目。

    1. 使用 InitializeUnicastIpAddressEntry IP 帮助程序函数初始化MIB_UNICASTIPADDRESS_ROW结构并设置结构的以下成员:

      1. 根据需要设置 InterfaceLuidInterfaceIndex 成员。
      2. 设置 OnlinePrefixLength 成员。 这是子网掩码中值为 1 的位数。 例如,如果子网掩码为 255.255.255.0, 则 OnlinePrefixLength 应为 24。
      3. 设置地址成员。
      4. PrefixOrigin 成员设置为 IpPrefixOriginManual
    2. 将初始化的MIB_UNICASTADDRESS_ROW结构传递给 CreateUnicastIpAddressEntry IP 帮助程序函数以创建 IP 地址条目。

设置默认网关地址

若要设置 IPv4 网关地址,请使用以下过程。 可以使用类似的 IP 帮助程序功能设置 IPv6 网关地址。

  1. 使用 GetIpForwardTable2 IP 帮助程序函数获取系统中的所有路由条目。

  2. 对于 InterfaceLuid 值与 MB 接口的 InterfaceLuid 值匹配且 DestinationPrefix 为“0.0.0.0.0/0”的每个条目,如果 NextHop 不等于新网关地址,则调用 DeleteIpForwardEntry2 IP 帮助程序函数以删除路由。 否则,路由条目已在系统中。

  3. 如果微型端口驱动程序在上一循环中找不到所需的路由项,则应使用 InitializeIpForwardEntry IP 帮助程序函数添加新条目来初始化MIB_IPFORWARD_ROW2结构。 初始化结构的以下成员:

    InterfaceLuidInterfaceIndex

    将默认网关的 DestinationPrefix 设置为 0.0.0.0/0。 (Prefix = 0.0.0.0,PrefixLength = 0)

    将 NextHop 设置为默认网关的 IP 地址。

    其他成员在初始化期间设置为默认值。 微型端口驱动程序应对这些成员使用默认值。

  4. MIB_IPFORWARD_ROW2结构传递给 CreateIpForwardEntry2 IP 帮助程序函数,以设置新的默认网关地址。

设置 DNS 地址

  • 按 MB DNS 汇报中所述设置 NameServer 注册表项,以通知 Windows 更新的 DNS 地址。