mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 15:36:04 +00:00
[NETCFGX]
- Create the DhcpEnabled value in the registry [TCPIP] - Apply the static IP address configuration data [DHCPCSVC] - Remove the static IP address code svn path=/trunk/; revision=48215
This commit is contained in:
parent
00e8981795
commit
63dfd0ccaa
3 changed files with 138 additions and 52 deletions
|
@ -102,7 +102,8 @@ HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) {
|
||||||
"SYSTEM\\CurrentControlSet\\Control\\Class\\"
|
"SYSTEM\\CurrentControlSet\\Control\\Class\\"
|
||||||
"{4D36E972-E325-11CE-BFC1-08002BE10318}";
|
"{4D36E972-E325-11CE-BFC1-08002BE10318}";
|
||||||
PCHAR TargetKeyNameStart =
|
PCHAR TargetKeyNameStart =
|
||||||
"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
|
"SYSTEM\\CurrentControlSet\\Services\\";
|
||||||
|
PCHAR TargetKeyNameEnd = "\\Parameters\\Tcpip";
|
||||||
PCHAR TargetKeyName = NULL;
|
PCHAR TargetKeyName = NULL;
|
||||||
PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" );
|
PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" );
|
||||||
PCHAR *EnumKeysTop = GetSubkeyNames( EnumKeyName, "" );
|
PCHAR *EnumKeysTop = GetSubkeyNames( EnumKeyName, "" );
|
||||||
|
@ -124,10 +125,10 @@ HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) {
|
||||||
!strcmp( RootDevice, Adapter->DhclientInfo.name ) ) {
|
!strcmp( RootDevice, Adapter->DhclientInfo.name ) ) {
|
||||||
TargetKeyName =
|
TargetKeyName =
|
||||||
(CHAR*) malloc( strlen( TargetKeyNameStart ) +
|
(CHAR*) malloc( strlen( TargetKeyNameStart ) +
|
||||||
strlen( RootDevice ) + 1);
|
strlen( RootDevice ) + strlen( TargetKeyNameEnd ) + 1);
|
||||||
if( !TargetKeyName ) goto cleanup;
|
if( !TargetKeyName ) goto cleanup;
|
||||||
sprintf( TargetKeyName, "%s%s",
|
sprintf( TargetKeyName, "%s%s%s",
|
||||||
TargetKeyNameStart, RootDevice );
|
TargetKeyNameStart, RootDevice, TargetKeyNameEnd );
|
||||||
Error = RegCreateKeyExA( HKEY_LOCAL_MACHINE, TargetKeyName, 0, NULL, 0, KEY_READ, NULL, &OutKey, NULL );
|
Error = RegCreateKeyExA( HKEY_LOCAL_MACHINE, TargetKeyName, 0, NULL, 0, KEY_READ, NULL, &OutKey, NULL );
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -145,10 +146,8 @@ cleanup:
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
|
BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
|
||||||
HKEY AdapterKey = NULL;
|
HKEY AdapterKey;
|
||||||
PCHAR IPAddress = NULL, Netmask = NULL, DefaultGateway = NULL;
|
DWORD Error = ERROR_SUCCESS, DhcpEnabled;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
DWORD Error = ERROR_SUCCESS;
|
|
||||||
|
|
||||||
Adapter->DhclientState.config = &Adapter->DhclientConfig;
|
Adapter->DhclientState.config = &Adapter->DhclientConfig;
|
||||||
strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr,
|
strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr,
|
||||||
|
@ -156,54 +155,32 @@ BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
|
||||||
|
|
||||||
AdapterKey = FindAdapterKey( Adapter );
|
AdapterKey = FindAdapterKey( Adapter );
|
||||||
if( AdapterKey )
|
if( AdapterKey )
|
||||||
IPAddress = RegReadString( AdapterKey, NULL, "IPAddress" );
|
{
|
||||||
|
Error = RegQueryValueEx(AdapterKey, "DhcpEnabled", NULL, NULL, (LPBYTE)&DhcpEnabled, NULL);
|
||||||
|
|
||||||
if( IPAddress && strcmp( IPAddress, "0.0.0.0" ) ) {
|
if (Error != ERROR_SUCCESS)
|
||||||
/* Non-automatic case */
|
DhcpEnabled = 1;
|
||||||
DH_DbgPrint
|
|
||||||
(MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (static %s)\n",
|
|
||||||
Adapter->DhclientInfo.name,
|
|
||||||
Adapter->BindStatus,
|
|
||||||
IPAddress));
|
|
||||||
|
|
||||||
Adapter->DhclientState.state = S_STATIC;
|
CloseHandle(AdapterKey);
|
||||||
|
}
|
||||||
Netmask = RegReadString( AdapterKey, NULL, "Subnetmask" );
|
else
|
||||||
|
{
|
||||||
Status = AddIPAddress( inet_addr( IPAddress ),
|
/* DHCP enabled by default */
|
||||||
inet_addr( Netmask ? Netmask : "255.255.255.0" ),
|
DhcpEnabled = 1;
|
||||||
Adapter->IfMib.dwIndex,
|
|
||||||
&Adapter->NteContext,
|
|
||||||
&Adapter->NteInstance );
|
|
||||||
|
|
||||||
DefaultGateway = RegReadString( AdapterKey, NULL, "DefaultGateway" );
|
|
||||||
|
|
||||||
if( DefaultGateway ) {
|
|
||||||
Adapter->RouterMib.dwForwardDest = 0;
|
|
||||||
Adapter->RouterMib.dwForwardMask = 0;
|
|
||||||
Adapter->RouterMib.dwForwardMetric1 = 1;
|
|
||||||
Adapter->RouterMib.dwForwardIfIndex = Adapter->IfMib.dwIndex;
|
|
||||||
Adapter->RouterMib.dwForwardNextHop = inet_addr(DefaultGateway);
|
|
||||||
Error = CreateIpForwardEntry( &Adapter->RouterMib );
|
|
||||||
if( Error )
|
|
||||||
warning("Failed to set default gateway %s: %ld\n",
|
|
||||||
DefaultGateway, Error);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( DefaultGateway ) free( DefaultGateway );
|
if( !DhcpEnabled ) {
|
||||||
if( Netmask ) free( Netmask );
|
/* Non-automatic case */
|
||||||
|
DbgPrint("DHCPCSVC: Adapter Name: [%s] (static)\n", Adapter->DhclientInfo.name);
|
||||||
|
|
||||||
|
Adapter->DhclientState.state = S_STATIC;
|
||||||
} else {
|
} else {
|
||||||
/* Automatic case */
|
/* Automatic case */
|
||||||
DH_DbgPrint
|
DbgPrint("DHCPCSVC: Adapter Name: [%s] (dynamic)\n", Adapter->DhclientInfo.name);
|
||||||
(MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (dynamic)\n",
|
|
||||||
Adapter->DhclientInfo.name,
|
|
||||||
Adapter->BindStatus));
|
|
||||||
|
|
||||||
Adapter->DhclientInfo.client->state = S_INIT;
|
Adapter->DhclientInfo.client->state = S_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( IPAddress ) free( IPAddress );
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,7 +327,6 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) {
|
||||||
|
|
||||||
ApiLock();
|
ApiLock();
|
||||||
InsertTailList( &AdapterList, &Adapter->ListEntry );
|
InsertTailList( &AdapterList, &Adapter->ListEntry );
|
||||||
DbgPrint("DHCPCSVC: Discovered new adapter [%s]\n", Adapter->DhclientInfo.name);
|
|
||||||
AdapterCount++;
|
AdapterCount++;
|
||||||
SetEvent(AdapterStateChangedEvent);
|
SetEvent(AdapterStateChangedEvent);
|
||||||
ApiUnlock();
|
ApiUnlock();
|
||||||
|
|
|
@ -336,7 +336,7 @@ InstallNetDevice(
|
||||||
HKEY hNetworkKey = NULL;
|
HKEY hNetworkKey = NULL;
|
||||||
HKEY hLinkageKey = NULL;
|
HKEY hLinkageKey = NULL;
|
||||||
HKEY hConnectionKey = NULL;
|
HKEY hConnectionKey = NULL;
|
||||||
DWORD dwShowIcon, dwLength;
|
DWORD dwShowIcon, dwLength, dwValue;
|
||||||
|
|
||||||
/* Get Instance ID */
|
/* Get Instance ID */
|
||||||
if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength))
|
if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength))
|
||||||
|
@ -422,6 +422,13 @@ InstallNetDevice(
|
||||||
DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
|
DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
dwValue = 1;
|
||||||
|
rc = RegSetValueExW(hKey, L"DhcpEnabled", 0, REG_DWORD, (const BYTE*)&dwValue, sizeof(DWORD));
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
hKey = NULL;
|
hKey = NULL;
|
||||||
|
|
||||||
|
|
|
@ -946,9 +946,17 @@ BOOLEAN BindAdapter(
|
||||||
PIP_INTERFACE IF;
|
PIP_INTERFACE IF;
|
||||||
NDIS_STATUS NdisStatus;
|
NDIS_STATUS NdisStatus;
|
||||||
LLIP_BIND_INFO BindInfo;
|
LLIP_BIND_INFO BindInfo;
|
||||||
IP_ADDRESS DefaultMask;
|
IP_ADDRESS DefaultMask, Router;
|
||||||
ULONG Lookahead = LOOKAHEAD_SIZE;
|
ULONG Lookahead = LOOKAHEAD_SIZE, Unused;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
HANDLE ParameterHandle;
|
||||||
|
PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo;
|
||||||
|
UNICODE_STRING IPAddress = RTL_CONSTANT_STRING(L"IPAddress");
|
||||||
|
UNICODE_STRING Netmask = RTL_CONSTANT_STRING(L"SubnetMask");
|
||||||
|
UNICODE_STRING Gateway = RTL_CONSTANT_STRING(L"DefaultGateway");
|
||||||
|
UNICODE_STRING RegistryDataU;
|
||||||
|
ANSI_STRING RegistryDataA;
|
||||||
|
|
||||||
TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
|
TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
|
||||||
|
|
||||||
|
@ -1001,10 +1009,105 @@ BOOLEAN BindAdapter(
|
||||||
TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n",
|
TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n",
|
||||||
&IF->Description));
|
&IF->Description));
|
||||||
|
|
||||||
|
DbgPrint("Opening %wZ\n", RegistryPath);
|
||||||
|
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes,
|
||||||
|
RegistryPath,
|
||||||
|
OBJ_CASE_INSENSITIVE,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
|
||||||
AddrInitIPv4(&DefaultMask, 0);
|
AddrInitIPv4(&DefaultMask, 0);
|
||||||
|
|
||||||
|
Status = ZwOpenKey(&ParameterHandle, KEY_READ, &ObjectAttributes);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
IF->Unicast = DefaultMask;
|
IF->Unicast = DefaultMask;
|
||||||
IF->Netmask = DefaultMask;
|
IF->Netmask = DefaultMask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KeyValueInfo = ExAllocatePool(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR));
|
||||||
|
if (!KeyValueInfo)
|
||||||
|
{
|
||||||
|
ZwClose(ParameterHandle);
|
||||||
|
IPDestroyInterface(IF);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegistryDataU.MaximumLength = 16 + sizeof(WCHAR);
|
||||||
|
RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data;
|
||||||
|
|
||||||
|
Status = ZwQueryValueKey(ParameterHandle,
|
||||||
|
&IPAddress,
|
||||||
|
KeyValuePartialInformation,
|
||||||
|
KeyValueInfo,
|
||||||
|
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||||
|
&Unused);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||||
|
|
||||||
|
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||||
|
&RegistryDataU,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
AddrInitIPv4(&IF->Unicast, inet_addr(RegistryDataA.Buffer));
|
||||||
|
|
||||||
|
RtlFreeAnsiString(&RegistryDataA);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IF->Unicast = DefaultMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = ZwQueryValueKey(ParameterHandle,
|
||||||
|
&Netmask,
|
||||||
|
KeyValuePartialInformation,
|
||||||
|
KeyValueInfo,
|
||||||
|
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||||
|
&Unused);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||||
|
|
||||||
|
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||||
|
&RegistryDataU,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
AddrInitIPv4(&IF->Netmask, inet_addr(RegistryDataA.Buffer));
|
||||||
|
|
||||||
|
RtlFreeAnsiString(&RegistryDataA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IF->Netmask = DefaultMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = ZwQueryValueKey(ParameterHandle,
|
||||||
|
&Gateway,
|
||||||
|
KeyValuePartialInformation,
|
||||||
|
KeyValueInfo,
|
||||||
|
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||||
|
&Unused);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||||
|
|
||||||
|
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||||
|
&RegistryDataU,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
|
||||||
|
|
||||||
|
RtlFreeAnsiString(&RegistryDataA);
|
||||||
|
|
||||||
|
if (!AddrIsUnspecified(&Router)) RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, IF, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZwClose(ParameterHandle);
|
||||||
|
}
|
||||||
|
|
||||||
IF->Broadcast.Type = IP_ADDRESS_V4;
|
IF->Broadcast.Type = IP_ADDRESS_V4;
|
||||||
IF->Broadcast.Address.IPv4Address =
|
IF->Broadcast.Address.IPv4Address =
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue