Как добавить постоянный IPv6-адрес в Vista / Windows7? - PullRequest
5 голосов
/ 16 ноября 2011

Я хочу добавить постоянный IPv6-адрес, используя только вызовы API или изменения реестра. В настоящее время я реализовал код, который использует CreateUnicastIpAddressEntry API для успешного добавления адреса IPv6, но этот IP-адрес уничтожается при перезагрузке адаптера или перезагрузке компьютера (как указано в документации MSDN).

С IPv4 это было легко сделать. Просто используйте AddIPAddress API в сочетании с записями реестра, чтобы получить желаемый результат.

Я попытался найти любую запись в реестре Windows, которая используется для сохранения адреса IPv6 без какого-либо успеха. Документы MSDN предлагают использовать netsh.exe для выполнения этой задачи, но тогда я совершенно уверен, что netsh.exe выполняет какой-либо вызов API или запись в реестре для выполнения этой задачи (что нигде не задокументировано Microsoft).

Как этого достичь?

1 Ответ

5 голосов
/ 17 ноября 2011

Что ж, после некоторого реверс-инжиниринга 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, имя значения будет 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.

Обратитесь к MIB_UNICASTIPADDRESS_ROW информации о структуре в msdn для получения дополнительной информации о членах структуры UNKNOWN.

При этом я также выяснил, что ANYCAST-адреса ipv6 аналогичным образом хранятся в разделе реестра:

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