From 195f28c5dfbfee52b9be222d7aa949be55646562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Tue, 23 Oct 2007 08:25:53 +0000 Subject: [PATCH] Code refactoring to be able to handle installation of network protocols/services/clients svn path=/trunk/; revision=29817 --- reactos/dll/win32/netcfgx/netcfgx.c | 327 ++++++++++++++++------------ reactos/dll/win32/netcfgx/netcfgx.h | 7 +- 2 files changed, 194 insertions(+), 140 deletions(-) diff --git a/reactos/dll/win32/netcfgx/netcfgx.c b/reactos/dll/win32/netcfgx/netcfgx.c index 486e563d478..6486f81ebf9 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.c +++ b/reactos/dll/win32/netcfgx/netcfgx.c @@ -1,17 +1,18 @@ /* * 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@reactos.org) */ +#define INITGUID +#include "netcfgx.h" + #define NDEBUG #include -#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 @@ -169,71 +170,25 @@ InstallAdditionalServices( return ERROR_SUCCESS; } -DWORD WINAPI -NetClassInstaller( - IN DI_FUNCTION InstallFunction, +static DWORD +InstallNetDevice( IN HDEVINFO DeviceInfoSet, - IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) + IN PSP_DEVINFO_DATA DeviceInfoData, + LPCWSTR UuidString, + DWORD Characteristics, + LPCWSTR BusType) { - SP_DRVINFO_DATA_W DriverInfoData; - SP_DRVINFO_DETAIL_DATA_W DriverInfoDetail; - WCHAR SectionName[LINE_LEN]; - HINF hInf = INVALID_HANDLE_VALUE; - INFCONTEXT InfContext; - UINT ErrorLine; - INT CharacteristicsInt; - DWORD Characteristics; - 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 hLinkageKey = NULL; HKEY hConnectionKey = NULL; + DWORD dwShowIcon, dwLength; SP_DEVINSTALL_PARAMS_W installParams; - if (InstallFunction != DIF_INSTALLDEVICE) - return ERROR_DI_DO_DEFAULT; - - DPRINT("%lu %p %p\n", InstallFunction, DeviceInfoSet, DeviceInfoData); - - /* Get driver info details */ - DriverInfoData.cbSize = sizeof(SP_DRVINFO_DATA_W); - if (!SetupDiGetSelectedDriverW(DeviceInfoSet, DeviceInfoData, &DriverInfoData)) - { - rc = GetLastError(); - DPRINT("SetupDiGetSelectedDriverW() failed with error 0x%lx\n", rc); - goto cleanup; - } - DriverInfoDetail.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W); - if (!SetupDiGetDriverInfoDetailW(DeviceInfoSet, DeviceInfoData, &DriverInfoData, &DriverInfoDetail, sizeof(DriverInfoDetail), NULL) - && GetLastError() != ERROR_INSUFFICIENT_BUFFER) - { - rc = GetLastError(); - DPRINT("SetupDiGetDriverInfoDetailW() failed with error 0x%lx\n", rc); - goto cleanup; - } - hInf = SetupOpenInfFileW(DriverInfoDetail.InfFileName, NULL, INF_STYLE_WIN4, &ErrorLine); - if (hInf == INVALID_HANDLE_VALUE) - { - rc = GetLastError(); - DPRINT("SetupOpenInfFileW() failed with error 0x%lx\n", rc); - goto cleanup; - } - if (!SetupDiGetActualSectionToInstallW(hInf, DriverInfoDetail.SectionName, SectionName, LINE_LEN, NULL, NULL)) - { - rc = GetLastError(); - DPRINT("SetupDiGetActualSectionToInstallW() failed with error 0x%lx\n", rc); - goto cleanup; - } - /* Get Instance ID */ if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength)) { @@ -255,74 +210,6 @@ NetClassInstaller( goto cleanup; } - /* Get Characteristics and BusType (optional) from .inf file */ - if (!SetupFindFirstLineW(hInf, SectionName, L"Characteristics", &InfContext)) - { - rc = GetLastError(); - DPRINT("Unable to find key %S in section %S of file %S (error 0x%lx)\n", - L"Characteristics", SectionName, DriverInfoDetail.InfFileName, rc); - goto cleanup; - } - if (!SetupGetIntField(&InfContext, 1, &CharacteristicsInt)) - { - rc = GetLastError(); - DPRINT("SetupGetIntField() failed with error 0x%lx\n", rc); - goto cleanup; - } - Characteristics = (DWORD)CharacteristicsInt; - if (SetupFindFirstLineW(hInf, SectionName, L"BusType", &InfContext)) - { - 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; - } - } - else - BusType = NULL; - - /* 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) @@ -518,7 +405,6 @@ NetClassInstaller( } /* Install additionnal services */ - /* FIXME: do it only if it is a network adapter! */ rc = InstallAdditionalServices(NULL); if (rc != ERROR_SUCCESS) { @@ -553,24 +439,189 @@ NetClassInstaller( } 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, + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL) +{ + SP_DRVINFO_DATA_W DriverInfoData; + SP_DRVINFO_DETAIL_DATA_W DriverInfoDetail; + WCHAR SectionName[LINE_LEN]; + HINF hInf = INVALID_HANDLE_VALUE; + INFCONTEXT InfContext; + UINT ErrorLine; + INT CharacteristicsInt; + DWORD Characteristics; + LPWSTR BusType = NULL; + RPC_STATUS RpcStatus; + UUID Uuid; + LPWSTR UuidRpcString = NULL; + LPWSTR UuidString = NULL; + LONG rc; + DWORD dwLength; + + if (InstallFunction != DIF_INSTALLDEVICE) + return ERROR_DI_DO_DEFAULT; + + DPRINT("%lu %p %p\n", InstallFunction, DeviceInfoSet, DeviceInfoData); + + /* Get driver info details */ + DriverInfoData.cbSize = sizeof(SP_DRVINFO_DATA_W); + if (!SetupDiGetSelectedDriverW(DeviceInfoSet, DeviceInfoData, &DriverInfoData)) + { + rc = GetLastError(); + DPRINT("SetupDiGetSelectedDriverW() failed with error 0x%lx\n", rc); + goto cleanup; + } + DriverInfoDetail.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W); + if (!SetupDiGetDriverInfoDetailW(DeviceInfoSet, DeviceInfoData, &DriverInfoData, &DriverInfoDetail, sizeof(DriverInfoDetail), NULL) + && GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + rc = GetLastError(); + DPRINT("SetupDiGetDriverInfoDetailW() failed with error 0x%lx\n", rc); + goto cleanup; + } + hInf = SetupOpenInfFileW(DriverInfoDetail.InfFileName, NULL, INF_STYLE_WIN4, &ErrorLine); + if (hInf == INVALID_HANDLE_VALUE) + { + rc = GetLastError(); + DPRINT("SetupOpenInfFileW() failed with error 0x%lx\n", rc); + goto cleanup; + } + if (!SetupDiGetActualSectionToInstallW(hInf, DriverInfoDetail.SectionName, SectionName, LINE_LEN, NULL, NULL)) + { + rc = GetLastError(); + DPRINT("SetupDiGetActualSectionToInstallW() failed with error 0x%lx\n", rc); + goto cleanup; + } + + /* Get Characteristics and BusType (optional) from .inf file */ + if (!SetupFindFirstLineW(hInf, SectionName, L"Characteristics", &InfContext)) + { + rc = GetLastError(); + DPRINT("Unable to find key %S in section %S of file %S (error 0x%lx)\n", + L"Characteristics", SectionName, DriverInfoDetail.InfFileName, rc); + goto cleanup; + } + if (!SetupGetIntField(&InfContext, 1, &CharacteristicsInt)) + { + rc = GetLastError(); + DPRINT("SetupGetIntField() failed with error 0x%lx\n", rc); + goto cleanup; + } + Characteristics = (DWORD)CharacteristicsInt; + if (IsEqualIID(&DeviceInfoData->ClassGuid, &GUID_DEVCLASS_NET)) + { + if (SetupFindFirstLineW(hInf, SectionName, L"BusType", &InfContext)) + { + 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; + } + } + } + + /* 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"}"); + + 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) SetupCloseInfFile(hInf); 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; diff --git a/reactos/dll/win32/netcfgx/netcfgx.h b/reactos/dll/win32/netcfgx/netcfgx.h index 518182042ca..bd690c1b20a 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.h +++ b/reactos/dll/win32/netcfgx/netcfgx.h @@ -1,5 +1,8 @@ +#ifndef _NETCFGX_H_ +#define _NETCFGX_H_ + #include #include +#include -ULONG DbgPrint(PCH Format,...); - +#endif /* _NETCFGX_H_ */