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

Posted

技术标签:

【中文标题】如何在 Vista/Windows7 中添加持久 IPv6 地址?【英文标题】:How to add persistent IPv6 address in Vista/Windows7? 【发布时间】:2011-12-30 15:21:18 【问题描述】:

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

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

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

如何做到这一点?

【问题讨论】:

问得很好 - 看起来你对它进行了相当多的研究。 @awoodland,伙计,对此进行了大量研究。这就是我猜 IPv6 仍然没有起色的原因。对于严肃的事情还没有适当的文档。 您是否尝试过像store=persistent这样显式设置这些参数? 我只是想看看 netsh.exe 在后台做什么,使用 Sysinternal Process Monitor,却发现它在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nsi\eb004a01- 9b1a-11d4-9123-0050047759bc\10 它是一个 REG_BINARY 条目,其中包含一些我不确定的二进制数据。将通过更多实验进行检查。 【参考方案1】:

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

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

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

对于要添加的每个 ipv6 地址,创建一个 REG_BINARY 值,以便该值的名称包含与 ipv6 地址完整连接的NET_LUID。例如,如果 ipv6 地址是 2001::1,则值的名称将是 000000090000060020010000000000000000000000000001,其中前 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`\

【讨论】:

FWIW,LUID 到 GUID 的映射似乎可以从 ...\eb004a11-9b1a-11d4-9123-0050047759bc\10 中的信息构建,其中键名是 LUID,并且 GUID 在偏移量 0x410 处编码。我(还)不确定该结构的名称,但它还包括 FriendlyName 和 MAC 地址,以及其他内容。我知道ConvertInterfaceIndexToLuid,但这对我来说不是一个真正可行的选择(从golang交叉编译)。

以上是关于如何在 Vista/Windows7 中添加持久 IPv6 地址?的主要内容,如果未能解决你的问题,请参考以下文章

Java (+- JNA) 中有没有办法在 XP+Vista+Windows 7 中可靠地设置主系统音量?

在 Vista/Windows 7 WPF FileDialog.Filter 中隐藏扩展

WH_JOURNALRECORD 的 SetWindowsHookEx 在 Vista/Windows 7 下失败

Windows 7 蓝屏代码大全 & 蓝屏全攻略

DSAPI WIN7风格

Windows 7 GUI 参考