Author: hpoussin
Date: Tue Oct 23 12:25:53 2007
New Revision: 29817
URL: 
http://svn.reactos.org/svn/reactos?rev=29817&view=rev
Log:
Code refactoring to be able to handle installation of network protocols/services/clients
Modified:
    trunk/reactos/dll/win32/netcfgx/netcfgx.c
    trunk/reactos/dll/win32/netcfgx/netcfgx.h
Modified: trunk/reactos/dll/win32/netcfgx/netcfgx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/netcfgx.…
==============================================================================
--- trunk/reactos/dll/win32/netcfgx/netcfgx.c (original)
+++ trunk/reactos/dll/win32/netcfgx/netcfgx.c Tue Oct 23 12:25:53 2007
@@ -1,16 +1,17 @@
 /*
  * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS Configuration of networkd devices
- * FILE:            lib/netcfgx/netcfgx.c
+ * PROJECT:         ReactOS Configuration of network devices
+ * FILE:            dll/win32/netcfgx/netcfgx.c
  * PURPOSE:         Network devices installer
  *
  * PROGRAMMERS:     Hervé Poussineau (hpoussin(a)reactos.org)
  */
+#define INITGUID
+#include "netcfgx.h"
+
 #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.
@@ -169,6 +170,311 @@
        return ERROR_SUCCESS;
 }
+static DWORD
+InstallNetDevice(
+       IN HDEVINFO DeviceInfoSet,
+       IN PSP_DEVINFO_DATA DeviceInfoData,
+       LPCWSTR UuidString,
+       DWORD Characteristics,
+       LPCWSTR BusType)
+{
+       LPWSTR InstanceId = NULL;
+       LPWSTR DeviceName = NULL;
+       LPWSTR ExportName = NULL;
+       LONG rc;
+       HKEY hKey = NULL;
+       HKEY hNetworkKey = NULL;
+       HKEY hLinkageKey = NULL;
+       HKEY hConnectionKey = NULL;
+       DWORD dwShowIcon, dwLength;
+       SP_DEVINSTALL_PARAMS_W installParams;
+
+       /* Get Instance ID */
+       if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0,
&dwLength))
+       {
+               DPRINT("SetupDiGetDeviceInstanceIdW() returned TRUE. FALSE
expected\n");
+               rc = ERROR_GEN_FAILURE;
+               goto cleanup;
+       }
+       InstanceId = HeapAlloc(GetProcessHeap(), 0, dwLength * sizeof(WCHAR));
+       if (!InstanceId)
+       {
+               DPRINT("HeapAlloc() failed\n");
+               rc = ERROR_NOT_ENOUGH_MEMORY;
+               goto cleanup;
+       }
+       if (!SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, InstanceId,
dwLength, NULL))
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDeviceInstanceIdW() failed with error
0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       /* 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);
+
+       /* Create export name */
+       ExportName = HeapAlloc(GetProcessHeap(), 0, (wcslen(L"\\Device\\Tcpip_")
+ wcslen(UuidString)) * sizeof(WCHAR) + sizeof(UNICODE_NULL));
+       if (!ExportName)
+       {
+               DPRINT("HeapAlloc() failed\n");
+               rc = ERROR_NOT_ENOUGH_MEMORY;
+               goto cleanup;
+       }
+       wcscpy(ExportName, L"\\Device\\Tcpip_");
+       wcscat(ExportName, 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 = NULL;
+       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 = NULL;
+       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 = NULL;
+
+       /* Write 'Linkage' key in hardware key */
+#if _WIN32_WINNT >= 0x502
+       hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0,
DIREG_DRV, KEY_READ | KEY_WRITE);
+#else
+       hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0,
DIREG_DRV, KEY_ALL_ACCESS);
+#endif
+       if (hKey == INVALID_HANDLE_VALUE && GetLastError() ==
ERROR_FILE_NOT_FOUND)
+               hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData,
DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
+       if (hKey == INVALID_HANDLE_VALUE)
+       {
+               hKey = NULL;
+               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 = RegSetValueExW(hKey, L"Characteristics", 0, REG_DWORD, (const
BYTE*)&Characteristics, sizeof(DWORD));
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       if (BusType)
+               rc = RegSetValueExW(hKey, L"BusType", 0, REG_SZ, (const
BYTE*)BusType, (wcslen(BusType) + 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 = NULL;
+
+       /* 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_CREATE_SUB_KEY, NULL, &hKey, NULL);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       rc = RegCreateKeyExW(hKey, L"Connection", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hConnectionKey, NULL);
+       RegCloseKey(hKey);
+       hKey = NULL;
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       rc = RegSetValueExW(hConnectionKey, 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;
+       }
+       rc = RegSetValueExW(hConnectionKey, L"PnpInstanceId", 0, REG_SZ, (const
BYTE*)InstanceId, (wcslen(InstanceId) + 1) * sizeof(WCHAR));
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       dwShowIcon = 1;
+       rc = RegSetValueExW(hConnectionKey, L"ShowIcon", 0, REG_DWORD, (const
BYTE*)&dwShowIcon, sizeof(dwShowIcon));
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       /* 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)
+       {
+               DPRINT("AppendStringToMultiSZ() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       rc = AppendStringToMultiSZ(hKey, L"Export", ExportName);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("AppendStringToMultiSZ() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       rc = AppendStringToMultiSZ(hKey, L"Route", UuidString);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("AppendStringToMultiSZ() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       /* Install additionnal services */
+       rc = InstallAdditionalServices(NULL);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("InstallAdditionalServices() failed with error 0x%lx\n",
rc);
+               goto cleanup;
+       }
+
+       /* HACK: hpoussin, Dec 2005. TCP/IP driver is not able to manage devices
+        * which are installed after its startup. So, we have to reboot to take
+        * this new netcard into account.
+        */
+       /* Should we reboot? */
+       installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
+       if (!SetupDiGetDeviceInstallParamsW(
+               DeviceInfoSet,
+               DeviceInfoData,
+               &installParams))
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDeviceInstallParams() failed with error
0x%lx\n", rc);
+               goto cleanup;
+       }
+       installParams.Flags |= DI_NEEDRESTART;
+       if (!SetupDiSetDeviceInstallParamsW(
+               DeviceInfoSet,
+               DeviceInfoData,
+               &installParams))
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiSetDeviceInstallParams() failed with error
0x%lx\n", rc);
+               goto cleanup;
+       }
+       rc = ERROR_SUCCESS;
+
+cleanup:
+       HeapFree(GetProcessHeap(), 0, InstanceId);
+       HeapFree(GetProcessHeap(), 0, DeviceName);
+       HeapFree(GetProcessHeap(), 0, ExportName);
+       if (hKey != NULL)
+               RegCloseKey(hKey);
+       if (hNetworkKey != NULL)
+               RegCloseKey(hNetworkKey);
+       if (hLinkageKey != NULL)
+               RegCloseKey(hLinkageKey);
+       if (hConnectionKey != NULL)
+               RegCloseKey(hConnectionKey);
+       return rc;
+}
+
+static DWORD
+InstallNetClient(VOID)
+{
+       DPRINT1("Installation of network clients is not yet supported\n");
+       return ERROR_GEN_FAILURE;
+}
+
+static DWORD
+InstallNetService(VOID)
+{
+       DPRINT1("Installation of network services is not yet supported\n");
+       return ERROR_GEN_FAILURE;
+}
+
+static DWORD
+InstallNetTransport(VOID)
+{
+       DPRINT1("Installation of network protocols is not yet supported\n");
+       return ERROR_GEN_FAILURE;
+}
+
 DWORD WINAPI
 NetClassInstaller(
        IN DI_FUNCTION InstallFunction,
@@ -186,18 +492,10 @@
        LPWSTR BusType = NULL;
        RPC_STATUS RpcStatus;
        UUID Uuid;
-       LPWSTR InstanceId = NULL;
        LPWSTR UuidRpcString = NULL;
        LPWSTR UuidString = NULL;
-       LPWSTR DeviceName = NULL;
-       LPWSTR ExportName = NULL;
        LONG rc;
-       DWORD dwShowIcon, dwLength;
-       HKEY hKey = NULL;
-       HKEY hLinkageKey = NULL;
-       HKEY hNetworkKey = NULL;
-       HKEY hConnectionKey = NULL;
-       SP_DEVINSTALL_PARAMS_W installParams;
+       DWORD dwLength;
        if (InstallFunction != DIF_INSTALLDEVICE)
                return ERROR_DI_DO_DEFAULT;
@@ -234,27 +532,6 @@
                goto cleanup;
        }
-       /* Get Instance ID */
-       if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0,
&dwLength))
-       {
-               DPRINT("SetupDiGetDeviceInstanceIdW() returned TRUE. FALSE
expected\n");
-               rc = ERROR_GEN_FAILURE;
-               goto cleanup;
-       }
-       InstanceId = HeapAlloc(GetProcessHeap(), 0, dwLength * sizeof(WCHAR));
-       if (!InstanceId)
-       {
-               DPRINT("HeapAlloc() failed\n");
-               rc = ERROR_NOT_ENOUGH_MEMORY;
-               goto cleanup;
-       }
-       if (!SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, InstanceId,
dwLength, NULL))
-       {
-               rc = GetLastError();
-               DPRINT("SetupDiGetDeviceInstanceIdW() failed with error
0x%lx\n", rc);
-               goto cleanup;
-       }
-
        /* Get Characteristics and BusType (optional) from .inf file */
        if (!SetupFindFirstLineW(hInf, SectionName, L"Characteristics",
&InfContext))
        {
@@ -270,30 +547,31 @@
                goto cleanup;
        }
        Characteristics = (DWORD)CharacteristicsInt;
-       if (SetupFindFirstLineW(hInf, SectionName, L"BusType", &InfContext))
-       {
-               if (!SetupGetStringFieldW(&InfContext, 1, NULL, 0, &dwLength))
+       if (IsEqualIID(&DeviceInfoData->ClassGuid, &GUID_DEVCLASS_NET))
+       {
+               if (SetupFindFirstLineW(hInf, SectionName, L"BusType",
&InfContext))
                {
-                       rc = GetLastError();
-                       DPRINT("SetupGetStringFieldW() failed with error
0x%lx\n", rc);
-                       goto cleanup;
+                       if (!SetupGetStringFieldW(&InfContext, 1, NULL, 0,
&dwLength))
+                       {
+                               rc = GetLastError();
+                               DPRINT("SetupGetStringFieldW() failed with error
0x%lx\n", rc);
+                               goto cleanup;
+                       }
+                       BusType = HeapAlloc(GetProcessHeap(), 0, dwLength *
sizeof(WCHAR));
+                       if (!BusType)
+                       {
+                               DPRINT("HeapAlloc() failed\n");
+                               rc = ERROR_NOT_ENOUGH_MEMORY;
+                               goto cleanup;
+                       }
+                       if (!SetupGetStringFieldW(&InfContext, 1, BusType, dwLength,
NULL))
+                       {
+                               rc = GetLastError();
+                               DPRINT("SetupGetStringFieldW() failed with error
0x%lx\n", rc);
+                               goto cleanup;
+                       }
                }
-               BusType = HeapAlloc(GetProcessHeap(), 0, dwLength * sizeof(WCHAR));
-               if (!BusType)
-               {
-                       DPRINT("HeapAlloc() failed\n");
-                       rc = ERROR_NOT_ENOUGH_MEMORY;
-                       goto cleanup;
-               }
-               if (!SetupGetStringFieldW(&InfContext, 1, BusType, dwLength, NULL))
-               {
-                       rc = GetLastError();
-                       DPRINT("SetupGetStringFieldW() failed with error
0x%lx\n", rc);
-                       goto cleanup;
-               }
-       }
-       else
-               BusType = NULL;
+       }
        /* Create a new UUID */
        RpcStatus = UuidCreate(&Uuid);
@@ -323,235 +601,19 @@
        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);
-
-       /* Create export name */
-       ExportName = HeapAlloc(GetProcessHeap(), 0, (wcslen(L"\\Device\\Tcpip_")
+ wcslen(UuidString)) * sizeof(WCHAR) + sizeof(UNICODE_NULL));
-       if (!ExportName)
-       {
-               DPRINT("HeapAlloc() failed\n");
-               rc = ERROR_NOT_ENOUGH_MEMORY;
-               goto cleanup;
-       }
-       wcscpy(ExportName, L"\\Device\\Tcpip_");
-       wcscat(ExportName, 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 = NULL;
-       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 = NULL;
-       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 = NULL;
-
-       /* Write 'Linkage' key in hardware key */
-#if _WIN32_WINNT >= 0x502
-       hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0,
DIREG_DRV, KEY_READ | KEY_WRITE);
-#else
-       hKey = SetupDiOpenDevRegKey(DeviceInfoSet, DeviceInfoData, DICS_FLAG_GLOBAL, 0,
DIREG_DRV, KEY_ALL_ACCESS);
-#endif
-       if (hKey == INVALID_HANDLE_VALUE && GetLastError() ==
ERROR_FILE_NOT_FOUND)
-               hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet, DeviceInfoData,
DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
-       if (hKey == INVALID_HANDLE_VALUE)
-       {
-               hKey = NULL;
-               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 = RegSetValueExW(hKey, L"Characteristics", 0, REG_DWORD, (const
BYTE*)&Characteristics, sizeof(DWORD));
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-       if (BusType)
-               rc = RegSetValueExW(hKey, L"BusType", 0, REG_SZ, (const
BYTE*)BusType, (wcslen(BusType) + 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 = NULL;
-
-       /* 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_CREATE_SUB_KEY, NULL, &hKey, NULL);
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-       rc = RegCreateKeyExW(hKey, L"Connection", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hConnectionKey, NULL);
-       RegCloseKey(hKey);
-       hKey = NULL;
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("RegCreateKeyExW() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-       rc = RegSetValueExW(hConnectionKey, 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;
-       }
-       rc = RegSetValueExW(hConnectionKey, L"PnpInstanceId", 0, REG_SZ, (const
BYTE*)InstanceId, (wcslen(InstanceId) + 1) * sizeof(WCHAR));
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-       dwShowIcon = 1;
-       rc = RegSetValueExW(hConnectionKey, L"ShowIcon", 0, REG_DWORD, (const
BYTE*)&dwShowIcon, sizeof(dwShowIcon));
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("RegSetValueExW() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-
-       /* 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)
-       {
-               DPRINT("AppendStringToMultiSZ() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-       rc = AppendStringToMultiSZ(hKey, L"Export", ExportName);
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("AppendStringToMultiSZ() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-       rc = AppendStringToMultiSZ(hKey, L"Route", UuidString);
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("AppendStringToMultiSZ() failed with error 0x%lx\n", rc);
-               goto cleanup;
-       }
-
-       /* Install additionnal services */
-       /* FIXME: do it only if it is a network adapter! */
-       rc = InstallAdditionalServices(NULL);
-       if (rc != ERROR_SUCCESS)
-       {
-               DPRINT("InstallAdditionalServices() failed with error 0x%lx\n",
rc);
-               goto cleanup;
-       }
-
-       /* HACK: hpoussin, Dec 2005. TCP/IP driver is not able to manage devices
-        * which are installed after its startup. So, we have to reboot to take
-        * this new netcard into account.
-        */
-       /* Should we reboot? */
-       installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W);
-       if (!SetupDiGetDeviceInstallParamsW(
-               DeviceInfoSet,
-               DeviceInfoData,
-               &installParams))
-       {
-               rc = GetLastError();
-               DPRINT("SetupDiGetDeviceInstallParams() failed with error
0x%lx\n", rc);
-               goto cleanup;
-       }
-       installParams.Flags |= DI_NEEDRESTART;
-       if (!SetupDiSetDeviceInstallParamsW(
-               DeviceInfoSet,
-               DeviceInfoData,
-               &installParams))
-       {
-               rc = GetLastError();
-               DPRINT("SetupDiSetDeviceInstallParams() failed with error
0x%lx\n", rc);
-               goto cleanup;
-       }
-       rc = ERROR_SUCCESS;
+       if (IsEqualIID(&DeviceInfoData->ClassGuid, &GUID_DEVCLASS_NET))
+               rc = InstallNetDevice(DeviceInfoSet, DeviceInfoData, UuidString,
Characteristics, BusType);
+       else if (IsEqualIID(&DeviceInfoData->ClassGuid,
&GUID_DEVCLASS_NETCLIENT))
+               rc = InstallNetClient();
+       else if (IsEqualIID(&DeviceInfoData->ClassGuid,
&GUID_DEVCLASS_NETSERVICE))
+               rc = InstallNetService();
+       else if (IsEqualIID(&DeviceInfoData->ClassGuid,
&GUID_DEVCLASS_NETTRANS))
+               rc = InstallNetTransport();
+       else
+       {
+               DPRINT("Invalid class guid\n");
+               rc = ERROR_GEN_FAILURE;
+       }
 cleanup:
        if (hInf != INVALID_HANDLE_VALUE)
@@ -559,18 +621,7 @@
        if (UuidRpcString != NULL)
                RpcStringFreeW(&UuidRpcString);
        HeapFree(GetProcessHeap(), 0, BusType);
-       HeapFree(GetProcessHeap(), 0, InstanceId);
        HeapFree(GetProcessHeap(), 0, UuidString);
-       HeapFree(GetProcessHeap(), 0, DeviceName);
-       HeapFree(GetProcessHeap(), 0, ExportName);
-       if (hKey != NULL)
-               RegCloseKey(hKey);
-       if (hLinkageKey != NULL)
-               RegCloseKey(hLinkageKey);
-       if (hNetworkKey != NULL)
-               RegCloseKey(hNetworkKey);
-       if (hConnectionKey != NULL)
-               RegCloseKey(hConnectionKey);
        if (rc == ERROR_SUCCESS)
                rc = ERROR_DI_DO_DEFAULT;
Modified: trunk/reactos/dll/win32/netcfgx/netcfgx.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netcfgx/netcfgx.…
==============================================================================
--- trunk/reactos/dll/win32/netcfgx/netcfgx.h (original)
+++ trunk/reactos/dll/win32/netcfgx/netcfgx.h Tue Oct 23 12:25:53 2007
@@ -1,5 +1,8 @@
+#ifndef _NETCFGX_H_
+#define _NETCFGX_H_
+
 #include <windows.h>
 #include <setupapi.h>
+#include <devguid.h>
-ULONG DbgPrint(PCH Format,...);
-
+#endif /* _NETCFGX_H_ */