Add netcfgx.dll This .dll contains the class installer for the network cards Modified: trunk/reactos/lib/directory.xml Added: trunk/reactos/lib/netcfgx/ Added: trunk/reactos/lib/netcfgx/netcfgx.c Added: trunk/reactos/lib/netcfgx/netcfgx.def Added: trunk/reactos/lib/netcfgx/netcfgx.h Added: trunk/reactos/lib/netcfgx/netcfgx.xml _____
Modified: trunk/reactos/lib/directory.xml --- trunk/reactos/lib/directory.xml 2005-10-14 18:35:05 UTC (rev 18451) +++ trunk/reactos/lib/directory.xml 2005-10-14 18:37:10 UTC (rev 18452) @@ -167,6 +167,9 @@
<directory name="netapi32"> <xi:include href="netapi32/netapi32.xml" /> </directory> +<directory name="netcfgx"> + <xi:include href="netcfgx/netcfgx.xml" /> +</directory> <directory name="newdev"> <xi:include href="newdev/newdev.xml" /> </directory> Property changes on: trunk/reactos/lib/netcfgx ___________________________________________________________________ Name: svn:ignore + GNUmakefile *.bak _____
Added: trunk/reactos/lib/netcfgx/netcfgx.c --- trunk/reactos/lib/netcfgx/netcfgx.c 2005-10-14 18:35:05 UTC (rev 18451) +++ trunk/reactos/lib/netcfgx/netcfgx.c 2005-10-14 18:37:10 UTC (rev 18452) @@ -0,0 +1,298 @@
+/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Configuration of networkd devices + * FILE: lib/netcfgx/netcfgx.c + * PURPOSE: Network devices installer + * + * PROGRAMMERS: HervÚ Poussineau (hpoussin@reactos.org) + */ + +//#define NDEBUG +#include <debug.h> + +#include "netcfgx.h" + +/* Append a REG_SZ to an existing REG_MULTI_SZ string in the registry. + * If the value doesn't exist, create it. + * Returns ERROR_SUCCESS if success. Othewise, returns an error code + */ +static LONG +AppendStringToMultiSZ( + IN HKEY hKey, + IN PCWSTR ValueName, + IN PCWSTR ValueToAppend) + +{ + PWSTR Buffer = NULL; + DWORD dwRegType; + DWORD dwRequired, dwLength; + DWORD dwTmp; + LONG rc; + + rc = RegQueryValueExW( + hKey, + ValueName, + NULL, + &dwRegType, + NULL, + &dwRequired); + if (rc != ERROR_FILE_NOT_FOUND) + { + if (rc != ERROR_SUCCESS) + goto cleanup; + if (dwRegType != REG_MULTI_SZ) + { + rc = ERROR_GEN_FAILURE; + goto cleanup; + } + + dwTmp = dwLength = dwRequired + wcslen(ValueToAppend) * sizeof(WCHAR) + sizeof(UNICODE_NULL); + Buffer = HeapAlloc(GetProcessHeap(), 0, dwLength); + if (!Buffer) + { + rc = ERROR_NOT_ENOUGH_MEMORY; + goto cleanup; + } + rc = RegQueryValueExW( + hKey, + ValueName, + NULL, + NULL, + (BYTE*)Buffer, + &dwTmp); + if (rc != ERROR_SUCCESS) + goto cleanup; + } + else + { + dwRequired = sizeof(WCHAR); + dwLength = wcslen(ValueToAppend) * sizeof(WCHAR) + 2 * sizeof(UNICODE_NULL); + Buffer = HeapAlloc(GetProcessHeap(), 0, dwLength); + if (!Buffer) + { + rc = ERROR_NOT_ENOUGH_MEMORY; + goto cleanup; + } + } + + /* Append the value */ + wcscpy(&Buffer[dwRequired / sizeof(WCHAR) - 1], ValueToAppend); + /* Terminate the REG_MULTI_SZ string */ + Buffer[dwLength / sizeof(WCHAR) - 1] = UNICODE_NULL; + + rc = RegSetValueExW( + hKey, + ValueName, + 0, + REG_MULTI_SZ, + (const BYTE*)Buffer, + dwLength); + +cleanup: + HeapFree(GetProcessHeap(), 0, Buffer); + return rc; +} + +DWORD WINAPI +NetClassInstaller( + IN DI_FUNCTION InstallFunction, + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) +{ + RPC_STATUS RpcStatus; + UUID Uuid; + LPWSTR UuidRpcString = NULL; + LPWSTR UuidString = NULL; + LPWSTR DeviceName = NULL; + LONG rc; + HKEY hKey = INVALID_HANDLE_VALUE; + HKEY hLinkageKey = INVALID_HANDLE_VALUE; + HKEY hNetworkKey = INVALID_HANDLE_VALUE; + HKEY hConnectionKey = INVALID_HANDLE_VALUE; + + if (InstallFunction != DIF_INSTALLDEVICE) + return ERROR_DI_DO_DEFAULT; + + /* Create a new UUID */ + RpcStatus = UuidCreate(&Uuid); + if (RpcStatus != RPC_S_OK && RpcStatus != RPC_S_UUID_LOCAL_ONLY) + { + DPRINT("UuidCreate() failed with RPC status 0x%lx\n", RpcStatus); + rc = ERROR_GEN_FAILURE; + goto cleanup; + } + RpcStatus = UuidToStringW(&Uuid, &UuidRpcString); + if (RpcStatus != RPC_S_OK) + { + DPRINT("UuidToStringW() failed with RPC status 0x%lx\n", RpcStatus); + rc = ERROR_GEN_FAILURE; + goto cleanup; + } + + /* Add curly braces around Uuid */ + UuidString = HeapAlloc(GetProcessHeap(), 0, (2 + wcslen(UuidRpcString)) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!UuidString) + { + DPRINT("HeapAlloc() failed\n"); + rc = ERROR_NOT_ENOUGH_MEMORY; + goto cleanup; + } + wcscpy(UuidString, L"{"); + wcscat(UuidString, UuidRpcString); + wcscat(UuidString, L"}"); + + /* Create device name */ + DeviceName = HeapAlloc(GetProcessHeap(), 0, (wcslen(L"\Device\") + wcslen(UuidString)) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!DeviceName) + { + DPRINT("HeapAlloc() failed\n"); + rc = ERROR_NOT_ENOUGH_MEMORY; + goto cleanup; + } + wcscpy(DeviceName, L"\Device\"); + wcscat(DeviceName, UuidString); + + /* Write Tcpip parameters in new service Key */ + rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\CurrentControlSet\Services", 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegCreateKeyExW(hKey, UuidString, 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hNetworkKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + RegCloseKey(hKey); + hKey = INVALID_HANDLE_VALUE; + rc = RegCreateKeyExW(hNetworkKey, L"Parameters\Tcpip", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + RegCloseKey(hNetworkKey); + hNetworkKey = INVALID_HANDLE_VALUE; + rc = RegSetValueExW(hKey, L"DefaultGateway", 0, REG_SZ, (const BYTE*)L"0.0.0.0", (wcslen(L"0.0.0.0") + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hKey, L"IPAddress", 0, REG_SZ, (const BYTE*)L"0.0.0.0", (wcslen(L"0.0.0.0") + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hKey, L"SubnetMask", 0, REG_SZ, (const BYTE*)L"0.0.0.0", (wcslen(L"0.0.0.0") + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + RegCloseKey(hKey); + hKey = INVALID_HANDLE_VALUE; + + /* Write 'Linkage' key in hardware key */ + hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL); + if (hKey == INVALID_HANDLE_VALUE) + { + rc = GetLastError(); + DPRINT("SetupDiCreateDevRegKeyW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hKey, L"NetCfgInstanceId", 0, REG_SZ, (const BYTE*)UuidString, (wcslen(UuidString) + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegCreateKeyExW(hKey, L"Linkage", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hLinkageKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hLinkageKey, L"Export", 0, REG_SZ, (const BYTE*)DeviceName, (wcslen(DeviceName) + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hLinkageKey, L"RootDevice", 0, REG_SZ, (const BYTE*)UuidString, (wcslen(UuidString) + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hLinkageKey, L"UpperBind", 0, REG_SZ, (const BYTE*)L"Tcpip", (wcslen(L"Tcpip") + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + RegCloseKey(hKey); + hKey = INVALID_HANDLE_VALUE; + + /* Write connection information in network subkey */ + rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1- 08002BE10318}", 0, NULL, REG_OPTION_NON_VOLATILE, 0, NULL, &hNetworkKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegCreateKeyExW(hNetworkKey, UuidString, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = RegSetValueExW(hKey, L"Name", 0, REG_SZ, (const BYTE*)L"Network connection", (wcslen(L"Network connection") + 1) * sizeof(WCHAR)); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + RegCloseKey(hKey); + hKey = INVALID_HANDLE_VALUE; + + /* Write linkage information in Tcpip service */ + rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\CurrentControlSet\Services\Tcpip\Linkage", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &hKey, NULL); + if (rc != ERROR_SUCCESS) + { + DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc); + goto cleanup; + } + rc = AppendStringToMultiSZ(hKey, L"Bind", DeviceName); + if (rc != ERROR_SUCCESS) + goto cleanup; + rc = AppendStringToMultiSZ(hKey, L"Export", DeviceName); + if (rc != ERROR_SUCCESS) + goto cleanup; + rc = AppendStringToMultiSZ(hKey, L"Route", UuidString); + if (rc != ERROR_SUCCESS) + goto cleanup; + + rc = ERROR_DI_DO_DEFAULT; + +cleanup: + if (UuidRpcString != NULL) + RpcStringFreeW(&UuidRpcString); + if (UuidString != NULL) + HeapFree(GetProcessHeap(), 0, UuidString); + if (DeviceName != NULL) + HeapFree(GetProcessHeap(), 0, DeviceName); + if (hKey != INVALID_HANDLE_VALUE) + RegCloseKey(hKey); + if (hLinkageKey != INVALID_HANDLE_VALUE) + RegCloseKey(hLinkageKey); + if (hNetworkKey != INVALID_HANDLE_VALUE) + RegCloseKey(hNetworkKey); + if (hConnectionKey != INVALID_HANDLE_VALUE) + RegCloseKey(hConnectionKey); + + return rc == ERROR_SUCCESS ? ERROR_DI_DO_DEFAULT : rc; +} Property changes on: trunk/reactos/lib/netcfgx/netcfgx.c ___________________________________________________________________ Name: svn:keywords + author date revision Name: svn:eol-style + native _____
Added: trunk/reactos/lib/netcfgx/netcfgx.def --- trunk/reactos/lib/netcfgx/netcfgx.def 2005-10-14 18:35:05 UTC (rev 18451) +++ trunk/reactos/lib/netcfgx/netcfgx.def 2005-10-14 18:37:10 UTC (rev 18452) @@ -0,0 +1,6 @@
+LIBRARY netcfgx.dll + +EXPORTS +NetClassInstaller@12 + +;EOF \ No newline at end of file Property changes on: trunk/reactos/lib/netcfgx/netcfgx.def ___________________________________________________________________ Name: svn:eol-style + native _____
Added: trunk/reactos/lib/netcfgx/netcfgx.h --- trunk/reactos/lib/netcfgx/netcfgx.h 2005-10-14 18:35:05 UTC (rev 18451) +++ trunk/reactos/lib/netcfgx/netcfgx.h 2005-10-14 18:37:10 UTC (rev 18452) @@ -0,0 +1,5 @@
+#include <windows.h> +#include <setupapi.h> + +ULONG DbgPrint(PCH Format,...); + Property changes on: trunk/reactos/lib/netcfgx/netcfgx.h ___________________________________________________________________ Name: svn:keywords + author date revision Name: svn:eol-style + native _____
Added: trunk/reactos/lib/netcfgx/netcfgx.xml --- trunk/reactos/lib/netcfgx/netcfgx.xml 2005-10-14 18:35:05 UTC (rev 18451) +++ trunk/reactos/lib/netcfgx/netcfgx.xml 2005-10-14 18:37:10 UTC (rev 18452) @@ -0,0 +1,8 @@
+<module name="netcfgx" type="win32dll" installbase="system32" installname="netcfgx.dll"> + <importlibrary definition="netcfgx.def" /> + <define name="__REACTOS__" /> + <file>netcfgx.c</file> + <library>ntdll</library> + <library>rpcrt4</library> + <library>setupapi</library> +</module> Property changes on: trunk/reactos/lib/netcfgx/netcfgx.xml ___________________________________________________________________ Name: svn:keywords + author date revision Name: svn:eol-style + native