https://git.reactos.org/?p=reactos.git;a=commitdiff;h=80db055135221c2a54db8…
commit 80db055135221c2a54db80aee018c2badcedc100
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Oct 6 22:36:19 2019 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun Oct 6 22:36:19 2019 +0200
[SYSSETUP][NETCFGX][INF] Install the TCPIP protocol driver properly
Get rid of the special RandomProtocolGUID_TCPIP :-)
Works with the Setup CD and Live CD.
---
dll/win32/netcfgx/inetcfgcomp_iface.c | 7 +-
dll/win32/syssetup/CMakeLists.txt | 3 +-
dll/win32/syssetup/globals.h | 6 +
dll/win32/syssetup/install.c | 95 +-----
dll/win32/syssetup/netinstall.c | 528 ++++++++++++++++++++++++++++++++++
media/inf/nettcpip.inf | 22 +-
6 files changed, 561 insertions(+), 100 deletions(-)
diff --git a/dll/win32/netcfgx/inetcfgcomp_iface.c
b/dll/win32/netcfgx/inetcfgcomp_iface.c
index 9e26208ea61..c4204291edb 100644
--- a/dll/win32/netcfgx/inetcfgcomp_iface.c
+++ b/dll/win32/netcfgx/inetcfgcomp_iface.c
@@ -503,7 +503,7 @@ CreateNotificationObject(
HRESULT hr;
LONG lRet;
CLSID ClassGUID;
- //CLSID InstanceGUID;
+ CLSID InstanceGUID;
wcscpy(szName,L"SYSTEM\\CurrentControlSet\\Control\\Network\\");
@@ -521,7 +521,6 @@ CreateNotificationObject(
wcscat(szName, L"\\");
/* get the Instance GUID */
-#if 0
hr = INetCfgComponent_GetInstanceGuid(iface, &InstanceGUID);
if (FAILED(hr))
return hr;
@@ -532,10 +531,6 @@ CreateNotificationObject(
wcscat(szName, pStr);
CoTaskMemFree(pStr);
-#else
- // HACK HACK HACK HACK HACK
- wcscat(szName, L"{RandomProtocolGUID_TCPIP}");
-#endif
wcscat(szName, L"\\NDI");
diff --git a/dll/win32/syssetup/CMakeLists.txt b/dll/win32/syssetup/CMakeLists.txt
index ab1ab4db45a..e3b44d1e6b7 100644
--- a/dll/win32/syssetup/CMakeLists.txt
+++ b/dll/win32/syssetup/CMakeLists.txt
@@ -6,6 +6,7 @@ list(APPEND SOURCE
dllmain.c
install.c
logfile.c
+ netinstall.c
proppage.c
security.c
wizard.c
@@ -20,5 +21,5 @@ add_library(syssetup MODULE
add_pch(syssetup precomp.h SOURCE)
set_module_type(syssetup win32dll UNICODE)
target_link_libraries(syssetup uuid wine ${PSEH_LIB})
-add_importlibs(syssetup advapi32 gdi32 user32 samlib userenv comctl32 setupapi ole32
shell32 shlwapi msvcrt kernel32 ntdll)
+add_importlibs(syssetup advapi32 gdi32 user32 samlib userenv comctl32 setupapi rpcrt4
ole32 shell32 shlwapi msvcrt kernel32 ntdll)
add_cd_file(TARGET syssetup DESTINATION reactos/system32 FOR all)
diff --git a/dll/win32/syssetup/globals.h b/dll/win32/syssetup/globals.h
index 38c1cd37dbc..8c020acefb3 100644
--- a/dll/win32/syssetup/globals.h
+++ b/dll/win32/syssetup/globals.h
@@ -31,6 +31,12 @@ extern ADMIN_INFO AdminInfo;
BOOL RegisterTypeLibraries (HINF hinf, LPCWSTR szSection);
+/* netinstall.c */
+
+BOOL
+InstallNetworkComponent(
+ _In_ PWSTR pszComponentId);
+
/* security.c */
VOID InstallSecurity(VOID);
diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c
index fa1d52b8a18..7ce1aaa3ffa 100644
--- a/dll/win32/syssetup/install.c
+++ b/dll/win32/syssetup/install.c
@@ -734,70 +734,6 @@ Exit:
return bResult;
}
-/* Install a section of a .inf file
- * Returns TRUE if success, FALSE if failure. Error code can
- * be retrieved with GetLastError()
- */
-static
-BOOL
-InstallInfSection(
- IN HWND hWnd,
- IN LPCWSTR InfFile,
- IN LPCWSTR InfSection OPTIONAL,
- IN LPCWSTR InfService OPTIONAL)
-{
- WCHAR Buffer[MAX_PATH];
- HINF hInf = INVALID_HANDLE_VALUE;
- UINT BufferSize;
- PVOID Context = NULL;
- BOOL ret = FALSE;
-
- /* Get Windows directory */
- BufferSize = ARRAYSIZE(Buffer) - 5 - wcslen(InfFile);
- if (GetWindowsDirectoryW(Buffer, BufferSize) > BufferSize)
- {
- /* Function failed */
- SetLastError(ERROR_GEN_FAILURE);
- goto cleanup;
- }
- /* We have enough space to add some information in the buffer */
- if (Buffer[wcslen(Buffer) - 1] != '\\')
- wcscat(Buffer, L"\\");
- wcscat(Buffer, L"Inf\\");
- wcscat(Buffer, InfFile);
-
- /* Install specified section */
- hInf = SetupOpenInfFileW(Buffer, NULL, INF_STYLE_WIN4, NULL);
- if (hInf == INVALID_HANDLE_VALUE)
- goto cleanup;
-
- Context = SetupInitDefaultQueueCallback(hWnd);
- if (Context == NULL)
- goto cleanup;
-
- ret = TRUE;
- if (ret && InfSection)
- {
- ret = SetupInstallFromInfSectionW(
- hWnd, hInf,
- InfSection, SPINST_ALL,
- NULL, NULL, SP_COPY_NEWER,
- SetupDefaultQueueCallbackW, Context,
- NULL, NULL);
- }
- if (ret && InfService)
- {
- ret = SetupInstallServicesFromInfSectionW(hInf, InfService, 0);
- }
-
-cleanup:
- if (Context)
- SetupTermDefaultQueueCallback(Context);
- if (hInf != INVALID_HANDLE_VALUE)
- SetupCloseInfFile(hInf);
- return ret;
-}
-
static
DWORD
InstallLiveCD(VOID)
@@ -806,14 +742,14 @@ InstallLiveCD(VOID)
PROCESS_INFORMATION ProcessInformation;
BOOL bRes;
- /* Hack: Install TCP/IP protocol driver */
- bRes = InstallInfSection(NULL,
- L"nettcpip.inf",
- L"MS_TCPIP.PrimaryInstall",
- L"MS_TCPIP.PrimaryInstall.Services");
+ if (!CommonInstall())
+ goto error;
+
+ /* Install the TCP/IP protocol driver */
+ bRes = InstallNetworkComponent(L"MS_TCPIP");
if (!bRes && GetLastError() != ERROR_FILE_NOT_FOUND)
{
- DPRINT("InstallInfSection() failed with error 0x%lx\n",
GetLastError());
+ DPRINT("InstallNetworkComponent() failed with error 0x%lx\n",
GetLastError());
}
else
{
@@ -822,9 +758,6 @@ InstallLiveCD(VOID)
SetupStartService(L"Dhcp", FALSE);
}
- if (!CommonInstall())
- goto error;
-
/* Register components */
_SEH2_TRY
{
@@ -1327,14 +1260,14 @@ InstallReactOS(VOID)
hHotkeyThread = CreateThread(NULL, 0, HotkeyThread, NULL, 0, NULL);
- /* Hack: Install TCP/IP protocol driver */
- ret = InstallInfSection(NULL,
- L"nettcpip.inf",
- L"MS_TCPIP.PrimaryInstall",
- L"MS_TCPIP.PrimaryInstall.Services");
+ if (!CommonInstall())
+ return 0;
+
+ /* Install the TCP/IP protocol driver */
+ ret = InstallNetworkComponent(L"MS_TCPIP");
if (!ret && GetLastError() != ERROR_FILE_NOT_FOUND)
{
- DPRINT("InstallInfSection() failed with error 0x%lx\n",
GetLastError());
+ DPRINT("InstallNetworkComponent() failed with error 0x%lx\n",
GetLastError());
}
else
{
@@ -1343,10 +1276,6 @@ InstallReactOS(VOID)
SetupStartService(L"Dhcp", FALSE);
}
-
- if (!CommonInstall())
- return 0;
-
InstallWizard();
InstallSecurity();
diff --git a/dll/win32/syssetup/netinstall.c b/dll/win32/syssetup/netinstall.c
new file mode 100644
index 00000000000..b18fbc74fb5
--- /dev/null
+++ b/dll/win32/syssetup/netinstall.c
@@ -0,0 +1,528 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS system libraries
+ * PURPOSE: System setup
+ * FILE: dll/win32/syssetup/netinstall.c
+ * PROGRAMER: Eric Kohl
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include "precomp.h"
+
+#include <rpc.h>
+
+#define NDEBUG
+#include <debug.h>
+
+typedef struct _COMPONENT_INFO
+{
+ PWSTR pszInfPath;
+ PWSTR pszInfSection;
+ PWSTR pszComponentId;
+ PWSTR pszDescription;
+ PWSTR pszClassGuid;
+ DWORD dwCharacteristics;
+} COMPONENT_INFO, *PCOMPONENT_INFO;
+
+
+/* GLOBALS ******************************************************************/
+
+
+/* FUNCTIONS ****************************************************************/
+
+static
+BOOL
+InstallInfSections(
+ _In_ HWND hWnd,
+ _In_ HKEY hKey,
+ _In_ LPCWSTR InfFile,
+ _In_ LPCWSTR InfSection)
+{
+ WCHAR Buffer[MAX_PATH];
+ HINF hInf = INVALID_HANDLE_VALUE;
+ UINT BufferSize;
+ PVOID Context = NULL;
+ BOOL ret = FALSE;
+
+ DPRINT("InstallInfSections()\n");
+
+ if (InfSection == NULL)
+ return FALSE;
+
+ /* Get Windows directory */
+ BufferSize = ARRAYSIZE(Buffer) - 5 - wcslen(InfFile);
+ if (GetWindowsDirectoryW(Buffer, BufferSize) > BufferSize)
+ {
+ /* Function failed */
+ SetLastError(ERROR_GEN_FAILURE);
+ goto cleanup;
+ }
+
+ /* We have enough space to add some information in the buffer */
+ if (Buffer[wcslen(Buffer) - 1] != '\\')
+ wcscat(Buffer, L"\\");
+ wcscat(Buffer, L"Inf\\");
+ wcscat(Buffer, InfFile);
+
+ /* Install specified section */
+ hInf = SetupOpenInfFileW(Buffer, NULL, INF_STYLE_WIN4, NULL);
+ if (hInf == INVALID_HANDLE_VALUE)
+ goto cleanup;
+
+ Context = SetupInitDefaultQueueCallback(hWnd);
+ if (Context == NULL)
+ goto cleanup;
+
+ ret = SetupInstallFromInfSectionW(
+ hWnd, hInf,
+ InfSection, SPINST_ALL,
+ hKey, NULL, SP_COPY_NEWER,
+ SetupDefaultQueueCallbackW, Context,
+ NULL, NULL);
+ if (ret == FALSE)
+ {
+ DPRINT1("SetupInstallFromInfSectionW(%S) failed (Error %lx)\n",
InfSection, GetLastError());
+ goto cleanup;
+ }
+
+ wcscpy(Buffer, InfSection);
+ wcscat(Buffer, L".Services");
+
+ ret = SetupInstallServicesFromInfSectionW(hInf, Buffer, 0);
+ if (ret == FALSE)
+ {
+ DPRINT1("SetupInstallServicesFromInfSectionW(%S) failed (Error %lx)\n",
Buffer, GetLastError());
+ goto cleanup;
+ }
+
+cleanup:
+ if (Context)
+ SetupTermDefaultQueueCallback(Context);
+
+ if (hInf != INVALID_HANDLE_VALUE)
+ SetupCloseInfFile(hInf);
+
+ DPRINT("InstallInfSections() done %u\n", ret);
+
+ return ret;
+}
+
+
+static
+BOOL
+CreateInstanceKey(
+ _In_ PCOMPONENT_INFO pComponentInfo,
+ _Out_ PHKEY pInstanceKey)
+{
+ WCHAR szKeyBuffer[128];
+ LPWSTR UuidString = NULL;
+ UUID Uuid;
+ RPC_STATUS RpcStatus;
+ HKEY hInstanceKey;
+ DWORD rc;
+ BOOL ret = FALSE;
+
+ DPRINT("CreateInstanceKey()\n");
+
+ *pInstanceKey = NULL;
+
+ wcscpy(szKeyBuffer, L"SYSTEM\\CurrentControlSet\\Control\\Network\\");
+ wcscat(szKeyBuffer, pComponentInfo->pszClassGuid);
+ wcscat(szKeyBuffer, L"\\{");
+
+ /* Create a new UUID */
+ RpcStatus = UuidCreate(&Uuid);
+ if (RpcStatus != RPC_S_OK && RpcStatus != RPC_S_UUID_LOCAL_ONLY)
+ {
+ DPRINT1("UuidCreate() failed with RPC status 0x%lx\n", RpcStatus);
+ goto done;
+ }
+
+ RpcStatus = UuidToStringW(&Uuid, &UuidString);
+ if (RpcStatus != RPC_S_OK)
+ {
+ DPRINT1("UuidToStringW() failed with RPC status 0x%lx\n", RpcStatus);
+ goto done;
+ }
+
+ wcscat(szKeyBuffer, UuidString);
+ wcscat(szKeyBuffer, L"}");
+
+ RpcStringFreeW(&UuidString);
+
+ DPRINT("szKeyBuffer %S\n", szKeyBuffer);
+
+ rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+ szKeyBuffer,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_CREATE_SUB_KEY | KEY_SET_VALUE,
+ NULL,
+ &hInstanceKey,
+ NULL);
+ if (rc != ERROR_SUCCESS)
+ {
+ DPRINT1("RegCreateKeyExW() failed with error 0x%lx\n", rc);
+ goto done;
+ }
+
+ rc = RegSetValueExW(hInstanceKey,
+ L"Characteristics",
+ 0,
+ REG_DWORD,
+ (LPBYTE)&pComponentInfo->dwCharacteristics,
+ sizeof(DWORD));
+ if (rc != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueExW() failed with error 0x%lx\n", rc);
+ goto done;
+ }
+
+ rc = RegSetValueExW(hInstanceKey,
+ L"ComponentId",
+ 0,
+ REG_SZ,
+ (LPBYTE)pComponentInfo->pszComponentId,
+ (wcslen(pComponentInfo->pszComponentId) + 1) *
sizeof(WCHAR));
+ if (rc != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueExW() failed with error 0x%lx\n", rc);
+ goto done;
+ }
+
+ rc = RegSetValueExW(hInstanceKey,
+ L"Description",
+ 0,
+ REG_SZ,
+ (LPBYTE)pComponentInfo->pszDescription,
+ (wcslen(pComponentInfo->pszDescription) + 1) *
sizeof(WCHAR));
+ if (rc != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueExW() failed with error 0x%lx\n", rc);
+ goto done;
+ }
+
+ rc = RegSetValueExW(hInstanceKey,
+ L"InfPath",
+ 0,
+ REG_SZ,
+ (LPBYTE)pComponentInfo->pszInfPath,
+ (wcslen(pComponentInfo->pszInfPath) + 1) * sizeof(WCHAR));
+ if (rc != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueExW() failed with error 0x%lx\n", rc);
+ goto done;
+ }
+
+ rc = RegSetValueExW(hInstanceKey,
+ L"InfSection",
+ 0,
+ REG_SZ,
+ (LPBYTE)pComponentInfo->pszInfSection,
+ (wcslen(pComponentInfo->pszInfSection) + 1) * sizeof(WCHAR));
+ if (rc != ERROR_SUCCESS)
+ {
+ DPRINT1("RegSetValueExW() failed with error 0x%lx\n", rc);
+ goto done;
+ }
+
+ *pInstanceKey = hInstanceKey;
+ ret = TRUE;
+
+done:
+ if (ret == FALSE)
+ RegCloseKey(hInstanceKey);
+
+ DPRINT("CreateInstanceKey() done %u\n", ret);
+
+ return ret;
+}
+
+
+static
+BOOL
+CheckInfFile(
+ _In_ PWSTR pszFullInfName,
+ _In_ PWSTR pszComponentId,
+ _In_ PCOMPONENT_INFO pComponentInfo)
+{
+ WCHAR szLineBuffer[MAX_PATH];
+ HINF hInf = INVALID_HANDLE_VALUE;
+ INFCONTEXT MfgContext, DevContext, MiscContext;
+ DWORD dwLength;
+
+ hInf = SetupOpenInfFileW(pszFullInfName,
+ NULL,
+ INF_STYLE_WIN4,
+ NULL);
+ if (hInf == INVALID_HANDLE_VALUE)
+ {
+ DPRINT1("\n");
+ return FALSE;
+ }
+
+ if (!SetupFindFirstLineW(hInf,
+ L"Manufacturer",
+ NULL,
+ &MfgContext))
+ {
+ DPRINT("No Manufacurer section found!\n");
+ goto done;
+ }
+
+ for (;;)
+ {
+ if (!SetupGetStringFieldW(&MfgContext,
+ 1,
+ szLineBuffer,
+ MAX_PATH,
+ NULL))
+ break;
+
+ DPRINT("Manufacturer: %S\n", szLineBuffer);
+ if (!SetupFindFirstLineW(hInf,
+ szLineBuffer,
+ NULL,
+ &DevContext))
+ break;
+
+ for (;;)
+ {
+ if (!SetupGetStringFieldW(&DevContext,
+ 2,
+ szLineBuffer,
+ MAX_PATH,
+ NULL))
+ break;
+
+ DPRINT("Device: %S\n", szLineBuffer);
+ if (_wcsicmp(szLineBuffer, pszComponentId) == 0)
+ {
+ DPRINT("Found it!\n");
+
+ /* Get the section name*/
+ SetupGetStringFieldW(&DevContext,
+ 1,
+ NULL,
+ 0,
+ &dwLength);
+
+ pComponentInfo->pszInfSection = HeapAlloc(GetProcessHeap(),
+ 0,
+ dwLength * sizeof(WCHAR));
+ if (pComponentInfo->pszInfSection)
+ {
+ SetupGetStringFieldW(&DevContext,
+ 1,
+ pComponentInfo->pszInfSection,
+ dwLength,
+ &dwLength);
+ }
+
+ /* Get the description*/
+ SetupGetStringFieldW(&DevContext,
+ 0,
+ NULL,
+ 0,
+ &dwLength);
+
+ pComponentInfo->pszDescription = HeapAlloc(GetProcessHeap(),
+ 0,
+ dwLength * sizeof(WCHAR));
+ if (pComponentInfo->pszDescription)
+ {
+ SetupGetStringFieldW(&DevContext,
+ 0,
+ pComponentInfo->pszDescription,
+ dwLength,
+ &dwLength);
+ }
+
+ /* Get the class GUID */
+ if (SetupFindFirstLineW(hInf,
+ L"Version",
+ L"ClassGuid",
+ &MiscContext))
+ {
+ SetupGetStringFieldW(&MiscContext,
+ 1,
+ NULL,
+ 0,
+ &dwLength);
+
+ pComponentInfo->pszClassGuid = HeapAlloc(GetProcessHeap(),
+ 0,
+ dwLength * sizeof(WCHAR));
+ if (pComponentInfo->pszInfSection)
+ {
+ SetupGetStringFieldW(&MiscContext,
+ 1,
+ pComponentInfo->pszClassGuid,
+ dwLength,
+ &dwLength);
+ }
+ }
+
+ /* Get the Characteristics value */
+ if (SetupFindFirstLineW(hInf,
+ pComponentInfo->pszInfSection,
+ L"Characteristics",
+ &MiscContext))
+ {
+ SetupGetIntField(&MiscContext,
+ 1,
+ (PINT)&pComponentInfo->dwCharacteristics);
+ }
+
+ SetupCloseInfFile(hInf);
+ return TRUE;
+ }
+
+ if (!SetupFindNextLine(&DevContext, &DevContext))
+ break;
+ }
+
+ if (!SetupFindNextLine(&MfgContext, &MfgContext))
+ break;
+ }
+
+done:
+ if (hInf != INVALID_HANDLE_VALUE)
+ SetupCloseInfFile(hInf);
+
+ return FALSE;
+}
+
+
+static
+BOOL
+ScanForInfFile(
+ _In_ PWSTR pszComponentId,
+ _In_ PCOMPONENT_INFO pComponentInfo)
+{
+ WCHAR szInfPath[MAX_PATH];
+ WCHAR szFullInfName[MAX_PATH];
+ WCHAR szPathBuffer[MAX_PATH];
+ WIN32_FIND_DATAW fdw;
+ HANDLE hFindFile = INVALID_HANDLE_VALUE;
+ BOOL bFound = FALSE;
+
+ GetWindowsDirectoryW(szInfPath, MAX_PATH);
+ wcscat(szInfPath, L"\\inf");
+
+ wcscpy(szPathBuffer, szInfPath);
+ wcscat(szPathBuffer, L"\\*.inf");
+
+ hFindFile = FindFirstFileW(szPathBuffer, &fdw);
+ if (hFindFile == INVALID_HANDLE_VALUE)
+ return FALSE;
+
+ for (;;)
+ {
+ if (wcscmp(fdw.cFileName, L".") == 0 ||
+ wcscmp(fdw.cFileName, L"..") == 0)
+ continue;
+
+ DPRINT("FileName: %S\n", fdw.cFileName);
+
+ wcscpy(szFullInfName, szInfPath);
+ wcscat(szFullInfName, L"\\");
+ wcscat(szFullInfName, fdw.cFileName);
+
+ DPRINT("Full Inf Name: %S\n", szFullInfName);
+ if (CheckInfFile(szFullInfName,
+ pszComponentId,
+ pComponentInfo))
+ {
+ pComponentInfo->pszInfPath = HeapAlloc(GetProcessHeap(),
+ 0,
+ (wcslen(fdw.cFileName) + 1) *
sizeof(WCHAR));
+ if (pComponentInfo->pszInfPath)
+ wcscpy(pComponentInfo->pszInfPath, fdw.cFileName);
+
+ pComponentInfo->pszComponentId = HeapAlloc(GetProcessHeap(),
+ 0,
+ (wcslen(pszComponentId) + 1) *
sizeof(WCHAR));
+ if (pComponentInfo->pszComponentId)
+ wcscpy(pComponentInfo->pszComponentId, pszComponentId);
+
+ bFound = TRUE;
+ break;
+ }
+
+ if (!FindNextFileW(hFindFile, &fdw))
+ break;
+ }
+
+ if (hFindFile != INVALID_HANDLE_VALUE)
+ FindClose(hFindFile);
+
+ return bFound;
+}
+
+
+BOOL
+InstallNetworkComponent(
+ _In_ PWSTR pszComponentId)
+{
+ COMPONENT_INFO ComponentInfo;
+ HKEY hInstanceKey = NULL;
+ BOOL bResult = FALSE;
+
+ DPRINT("InstallNetworkComponent(%S)\n", pszComponentId);
+
+ ZeroMemory(&ComponentInfo, sizeof(COMPONENT_INFO));
+
+ if (!ScanForInfFile(pszComponentId, &ComponentInfo))
+ goto done;
+
+ DPRINT("Characteristics: 0x%lx\n", ComponentInfo.dwCharacteristics);
+ DPRINT("ComponentId: %S\n", ComponentInfo.pszComponentId);
+ DPRINT("Description: %S\n", ComponentInfo.pszDescription);
+ DPRINT("InfPath: %S\n", ComponentInfo.pszInfPath);
+ DPRINT("InfSection: %S\n", ComponentInfo.pszInfSection);
+ DPRINT("ClassGuid: %S\n", ComponentInfo.pszClassGuid);
+
+ if (!CreateInstanceKey(&ComponentInfo,
+ &hInstanceKey))
+ {
+ DPRINT1("CreateInstanceKey() failed (Error %lx)\n", GetLastError());
+ goto done;
+ }
+
+ if (!InstallInfSections(NULL,
+ hInstanceKey,
+ ComponentInfo.pszInfPath,
+ ComponentInfo.pszInfSection))
+ {
+ DPRINT1("InstallInfSections() failed (Error %lx)\n", GetLastError());
+ goto done;
+ }
+
+ bResult = TRUE;
+
+done:
+ if (hInstanceKey != NULL)
+ RegCloseKey(hInstanceKey);
+
+ if (ComponentInfo.pszInfPath)
+ HeapFree(GetProcessHeap(), 0, ComponentInfo.pszInfPath);
+
+ if (ComponentInfo.pszInfSection)
+ HeapFree(GetProcessHeap(), 0, ComponentInfo.pszInfSection);
+
+ if (ComponentInfo.pszComponentId)
+ HeapFree(GetProcessHeap(), 0, ComponentInfo.pszComponentId);
+
+ if (ComponentInfo.pszDescription)
+ HeapFree(GetProcessHeap(), 0, ComponentInfo.pszDescription);
+
+ if (ComponentInfo.pszClassGuid)
+ HeapFree(GetProcessHeap(), 0, ComponentInfo.pszClassGuid);
+
+ return bResult;
+}
+
+/* EOF */
diff --git a/media/inf/nettcpip.inf b/media/inf/nettcpip.inf
index eb21c968b17..eaf1b7cc9eb 100644
--- a/media/inf/nettcpip.inf
+++ b/media/inf/nettcpip.inf
@@ -11,22 +11,23 @@ ClassGUID = {4D36E975-E325-11CE-BFC1-08002BE10318}
Provider = %ReactOS%
DriverVer = 04/12/2006,1.00
+[Manufacturer]
+%ReactOS% = ReactOS
+
+[ReactOS]
+%MS_TCPIP.DisplayName% = MS_TCPIP.PrimaryInstall, MS_TCPIP
+
;----------------------------- TCP/IPv4 DRIVER ----------------------------
[MS_TCPIP.PrimaryInstall]
+Characteristics = 0xA0
AddReg = TCPIP_AddReg_Global.NT
[TCPIP_AddReg_Global.NT]
-; The following entries should be generated from .inf files during installation
-; TCPIPv4 Protocol
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}","Characteristics",0x00010001,0x00000080
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}","ComponentId",0x00000000,"ms_tcpip"
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}","Description",0x00000000,"Internet
Protocol Version 4 (TCP/IPv4)"
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}","InfPath",0x00000000,"BUGBUG_Create
from Inffile.inf"
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}","InfSection",0x00000000,"BUGBUG_Create
from Inffile.inf"
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}\Ndi","ClsId",0x00000000,"{A907657F-6FDF-11D0-8EFB-00C04FD912B2}"
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}\Ndi","HelpText",0x00000000,"Transmission
Control Protocol/Internet Protocol"
-HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E975-E325-11CE-BFC1-08002BE10318}\{RandomProtocolGUID_TCPIP}\Ndi","Service",0x00000000,"Tcpip"
+HKR,"Ndi","ClsId",0x00000000,"{A907657F-6FDF-11D0-8EFB-00C04FD912B2}"
+HKR,"Ndi","HelpText",0x00000000,"Transmission Control
Protocol/Internet Protocol"
+HKR,"Ndi","Service",0x00000000,"Tcpip"
+HKR,"Ndi","CoServices",0x00010000,"Tcpip","Dhcp"
; TCP/IPv4 driver
; NOTE: These settings should be added by the network setup
@@ -278,6 +279,7 @@
HKR,"Parameters","ServiceDll",0x00020000,"%SystemRoot%\system32\dhcpcsvc.dll"
[Strings]
ReactOS = "ReactOS Team"
+MS_TCPIP.DisplayName = "Internet Protocol Version 4 (TCP/IPv4)"
[Strings.0a]
ReactOS = "Equipo de ReactOS"