Mem*_*dal 5 winapi ip-address ipv6
我想使用API调用或注册表编辑添加持久IPv6地址.我目前已经实现了一个使用CreateUnicastIpAddressEntry
API成功添加IPv6地址的代码,但是当重置适配器或重新启动机器时,IP地址会被破坏(如MSDN文档中所述).
使用IPv4,很容易做到.只需使用AddIPAddress
API结合注册表项即可获得所需的结果.
我试图在Windows注册表中找到用于保存IPv6地址但没有任何成功的任何条目.MSDN文档建议用来netsh.exe
完成任务,但后来我确信netsh.exe
正在做一些API调用或注册表项来完成这项任务(微软在任何地方都没有记录).
怎么能实现这一目标?
好吧,经过对netsh.exe的一些逆向工程和详细分析后,我认为有足够的信息来创建一个持久的ipv6地址.
ipv6地址(UNICAST)存储在以下注册表项中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a01-9b1a-11d4-9123-0050047759bc}\10
Run Code Online (Sandbox Code Playgroud)
对于要添加的每个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;
Run Code Online (Sandbox Code Playgroud)
此结构的最后28个字节是未知的,必须初始化为0xFF.
有关UNKNOWN结构成员的更多信息,请参阅msdn中的MIB_UNICASTIPADDRESS_ROW结构信息.
在执行此操作时,我还发现ipv6 ANYCAST地址在注册表项中的存储方式类似:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a01-9b1a-11d4-9123-0050047759bc}\8`\
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1721 次 |
最近记录: |