Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add persistent IPv6 address in Vista/Windows7?

I want to add a persistent IPv6 address using just API calls or with Registry edits. I have currently implemented a code which uses CreateUnicastIpAddressEntry API to add the IPv6 address successfully, but the IP address is destroyed when the adapter is reset or machine rebooted (as mentioned in MSDN docs).

With IPv4, it was easy to do. Just use AddIPAddress API combined with registry entries to get the desired result.

I have tried to find any entry in the Windows Registry which is being used to save the IPv6 address without any success. The MSDN docs suggests to use netsh.exe to do the task, but then I am quite sure netsh.exe is doing some API call or Registry entry to achieve this task (which is not documented by Microsoft anywhere).

How can this be achieved?

like image 604
MemoryVandal Avatar asked Nov 16 '11 17:11

MemoryVandal


People also ask

How do I set a static IPv6 address in Windows?

Right-click on the Local Area Connection of the network adapter and choose “I want to set IPv6.” Click on Properties. Pick TCP/IPv6 and click on Properties. Click “Use the following IPv6 address” and in the IPv6 address field, type the IP address you want to use.

Does Windows 7 support IPv6?

An IPv6 readiness update is available for Windows 7 and for Windows Server 2008 R2.

How do I manually set IPv6 address?

In Settings go to Network & Internet and click the Properties button for the interface you wish to configure. Click the Edit button under IP settings, change the configuration type to Manual, enable IPv6, and populate your settings.


1 Answers

Well, after some reverse engineering of netsh.exe and detailed analysis I think there is sufficient info to create a persistent ipv6 address.

The ipv6 address (UNICAST) is stored in following registry key:

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

For every ipv6 address to be added, create a REG_BINARY value such that the name of the value contains NET_LUID concatenated with the ipv6 address in full. Like for example, if the ipv6 address is 2001::1, the name of the value will be 000000090000060020010000000000000000000000000001, where the first 16 characters is the NET_LUID of the network adapter and the rest the ipv6 address in full.

This registry value data is made of a 48 byte long structure given below:

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

The last 28 bytes of this structure is unknown and must be initialized to 0xFF.

Refer to MIB_UNICASTIPADDRESS_ROW structure info in msdn for more info on the UNKNOWN structure members.

While doing this, I also figured out that ipv6 ANYCAST addresses are stored similarly in registry key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a01-9b1a-11d4-9123-0050047759bc}\8`\
like image 112
MemoryVandal Avatar answered Sep 23 '22 17:09

MemoryVandal