"SYSTEM\\CurrentControlSet\\Control\\Class\\"
"{4D36E972-E325-11CE-BFC1-08002BE10318}";
PCHAR TargetKeyNameStart =
- "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
+ "SYSTEM\\CurrentControlSet\\Services\\";
+ PCHAR TargetKeyNameEnd = "\\Parameters\\Tcpip";
PCHAR TargetKeyName = NULL;
PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" );
PCHAR *EnumKeysTop = GetSubkeyNames( EnumKeyName, "" );
!strcmp( RootDevice, Adapter->DhclientInfo.name ) ) {
TargetKeyName =
(CHAR*) malloc( strlen( TargetKeyNameStart ) +
- strlen( RootDevice ) + 1);
+ strlen( RootDevice ) + strlen( TargetKeyNameEnd ) + 1);
if( !TargetKeyName ) goto cleanup;
- sprintf( TargetKeyName, "%s%s",
- TargetKeyNameStart, RootDevice );
+ sprintf( TargetKeyName, "%s%s%s",
+ TargetKeyNameStart, RootDevice, TargetKeyNameEnd );
Error = RegCreateKeyExA( HKEY_LOCAL_MACHINE, TargetKeyName, 0, NULL, 0, KEY_READ, NULL, &OutKey, NULL );
break;
} else {
}
BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) {
- HKEY AdapterKey = NULL;
- PCHAR IPAddress = NULL, Netmask = NULL, DefaultGateway = NULL;
- NTSTATUS Status = STATUS_SUCCESS;
- DWORD Error = ERROR_SUCCESS;
+ HKEY AdapterKey;
+ DWORD Error = ERROR_SUCCESS, DhcpEnabled;
Adapter->DhclientState.config = &Adapter->DhclientConfig;
strncpy(Adapter->DhclientInfo.name, (char*)Adapter->IfMib.bDescr,
AdapterKey = FindAdapterKey( Adapter );
if( AdapterKey )
- IPAddress = RegReadString( AdapterKey, NULL, "IPAddress" );
+ {
+ Error = RegQueryValueEx(AdapterKey, "DhcpEnabled", NULL, NULL, (LPBYTE)&DhcpEnabled, NULL);
- if( IPAddress && strcmp( IPAddress, "0.0.0.0" ) ) {
- /* Non-automatic case */
- DH_DbgPrint
- (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (static %s)\n",
- Adapter->DhclientInfo.name,
- Adapter->BindStatus,
- IPAddress));
+ if (Error != ERROR_SUCCESS)
+ DhcpEnabled = 1;
- Adapter->DhclientState.state = S_STATIC;
+ CloseHandle(AdapterKey);
+ }
+ else
+ {
+ /* DHCP enabled by default */
+ DhcpEnabled = 1;
+ }
- Netmask = RegReadString( AdapterKey, NULL, "Subnetmask" );
-
- Status = AddIPAddress( inet_addr( IPAddress ),
- inet_addr( Netmask ? Netmask : "255.255.255.0" ),
- 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( !DhcpEnabled ) {
+ /* Non-automatic case */
+ DbgPrint("DHCPCSVC: Adapter Name: [%s] (static)\n", Adapter->DhclientInfo.name);
- if( DefaultGateway ) free( DefaultGateway );
- if( Netmask ) free( Netmask );
+ Adapter->DhclientState.state = S_STATIC;
} else {
/* Automatic case */
- DH_DbgPrint
- (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (dynamic)\n",
- Adapter->DhclientInfo.name,
- Adapter->BindStatus));
+ DbgPrint("DHCPCSVC: Adapter Name: [%s] (dynamic)\n", Adapter->DhclientInfo.name);
Adapter->DhclientInfo.client->state = S_INIT;
}
- if( IPAddress ) free( IPAddress );
-
return TRUE;
}
PDHCP_ADAPTER Adapter = NULL;
HANDLE AdapterStateChangedEvent = (HANDLE)Context;
struct interface_info *ifi = NULL;
- int i;
+ int i, AdapterCount = 0;
/* FIXME: Kill this thread when the service is stopped */
}
if( Error != NO_ERROR )
- break;
+ {
+ /* HACK: We are waiting until TCP/IP starts */
+ Sleep(2000);
+ continue;
+ }
DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries));
ApiLock();
InsertTailList( &AdapterList, &Adapter->ListEntry );
- DbgPrint("DHCPCSVC: Discovered new adapter [%s]\n", Adapter->DhclientInfo.name);
+ AdapterCount++;
SetEvent(AdapterStateChangedEvent);
ApiUnlock();
} else { free( Adapter ); Adapter = 0; }
DH_DbgPrint(MID_TRACE,("Adapter %d was rejected\n",
Table->table[i].dwIndex));
}
- } while ((Error = NotifyAddrChange(NULL, NULL)) == NO_ERROR);
+ Error = NotifyAddrChange(NULL, NULL);
+#if 0
+ if (Error != NO_ERROR)
+ break;
+#else
+ if (AdapterCount)
+ break;
+ else
+ Sleep(3000);
+#endif
+ } while (TRUE);
DbgPrint("DHCPCSVC: Adapter discovery thread is terminating! (Error: %d)\n", Error);
}
HANDLE StartAdapterDiscovery(VOID) {
- HANDLE ThreadHandle, EventHandle;
+ HANDLE /* ThreadHandle, */ EventHandle;
EventHandle = CreateEvent(NULL,
FALSE,
FALSE,
NULL);
+#if 0
ThreadHandle = CreateThread(NULL,
0,
AdapterDiscoveryThread,
return NULL;
CloseHandle(ThreadHandle);
+#else
+ AdapterDiscoveryThread((LPVOID)EventHandle);
+#endif
return EventHandle;
}