如何在Vista / Windows7中添加持久IPv6地址?

时间:2011-11-16 17:08:01

标签: winapi ip-address ipv6

我想仅使用API​​调用或使用注册表编辑添加持久IPv6地址。我目前已经实现了一个使用CreateUnicastIpAddressEntry API成功添加IPv6地址的代码,但在重置适配器或重新启动计算机时会破坏IP地址(如MSDN文档中所述)。

使用IPv4,很容易做到。只需使用AddIPAddress API结合注册表项即可获得所需的结果。

我试图在Windows注册表中找到用于保存IPv6地址但没有任何成功的任何条目。 MSDN文档建议使用netsh.exe来完成任务,但后来我非常确定netsh.exe正在执行一些API调用或注册表项来完成此任务(Microsoft未在任何地方记录)。< / p>

如何实现这一目标?

1 个答案:

答案 0 :(得分:5)

好吧,经过对 netsh.exe 的一些逆向工程和详细分析后,我认为有足够的信息可以创建一个持久的ipv6地址。

ipv6地址(UNICAST)存储在以下注册表项中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a01-9b1a-11d4-9123-0050047759bc}\10

对于要添加的每个ipv6地址,创建一个REG_BINARY值,使得该值的名称包含NET_LUID与ipv6地址完全连接。例如,如果ipv6地址是2001 :: 1,则该值的名称将为 0000000900000600200100000000000000000000000000000001 ,其中前16个字符是网络适配器的NET_LUID,其余为ipv6地址。

此注册表值数据由48字节长的结构组成,如下所示:

typedef struct _UNKNOWN {
  ULONG            ValidLifetime;
  ULONG            PreferredLifetime;
  NL_PREFIX_ORIGIN PrefixOrigin;
  NL_SUFFIX_ORIGIN SuffixOrigin;
  UINT8            OnLinkPrefixLength;
  BOOLEAN          SkipAsSource;
  UCHAR            Unknown[28];
} UNKNOWN;

此结构的最后28个字节未知,必须初始化为0xFF。

有关UNKNOWN结构成员的更多信息,请参阅msdn中的MIB_UNICASTIPADDRESS_ROW结构信息。

在执行此操作时,我还发现ipv6 ANYCAST地址在注册表项中的存储方式类似:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a01-9b1a-11d4-9123-0050047759bc}\8`\