[NETCFGX][SYSSETUP]

- Move TCP/IP driver setup code from netcfgx to syssetup.
- Implement SetupStartService().
This installs the TCPIP driver even if no network adapter is available.
CORE-8420 #resolve

svn path=/trunk/; revision=66069
This commit is contained in:
Eric Kohl 2015-01-20 20:57:58 +00:00
parent caae20ea25
commit acf84c8854
3 changed files with 132 additions and 109 deletions

View file

@ -219,106 +219,6 @@ cleanup:
return rc;
}
/* 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 = MAX_PATH - 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;
}
/* Add default services for network cards */
static
DWORD
InstallAdditionalServices(
IN HWND hWnd)
{
BOOL ret;
UNICODE_STRING TcpipServicePath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip");
/* Install TCP/IP protocol */
ret = InstallInfSection(hWnd,
L"nettcpip.inf",
L"MS_TCPIP.PrimaryInstall",
L"MS_TCPIP.PrimaryInstall.Services");
if (!ret && GetLastError() != ERROR_FILE_NOT_FOUND)
{
DPRINT("InstallInfSection() failed with error 0x%lx\n", GetLastError());
return GetLastError();
}
else if (ret)
{
/* Start the TCP/IP driver */
ret = NtLoadDriver(&TcpipServicePath);
if (ret)
{
/* This isn't really fatal but we want to warn anyway */
DPRINT1("NtLoadDriver(TCPIP) failed with NTSTATUS 0x%lx\n", (NTSTATUS)ret);
}
}
/* You can add here more clients (SMB...) and services (DHCP server...) */
return ERROR_SUCCESS;
}
static
DWORD
@ -589,14 +489,6 @@ InstallNetDevice(
goto cleanup;
}
/* Install additionnal services */
rc = InstallAdditionalServices(NULL);
if (rc != ERROR_SUCCESS)
{
DPRINT("InstallAdditionalServices() failed with error 0x%lx\n", rc);
goto cleanup;
}
rc = ERROR_SUCCESS;
cleanup:

View file

@ -43,6 +43,9 @@
DWORD WINAPI
CMP_WaitNoPendingInstallEvents(DWORD dwTimeout);
DWORD WINAPI
SetupStartService(LPCWSTR lpServiceName, BOOL bWait);
/* GLOBALS ******************************************************************/
HINF hSysSetupInf = INVALID_HANDLE_VALUE;
@ -843,6 +846,72 @@ SetSetupType(DWORD dwSetupType)
return TRUE;
}
/* 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 = MAX_PATH - 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;
}
DWORD WINAPI
InstallReactOS(HINSTANCE hInstance)
{
@ -851,6 +920,7 @@ InstallReactOS(HINSTANCE hInstance)
TOKEN_PRIVILEGES privs;
HKEY hKey;
HINF hShortcutsInf;
BOOL ret;
InitializeSetupActionLog(FALSE);
LogItem(SYSSETUP_SEVERITY_INFORMATION, L"Installing ReactOS");
@ -894,6 +964,22 @@ InstallReactOS(HINSTANCE hInstance)
CreateDirectory(szBuffer, NULL);
}
/* Hack: Install TCP/IP protocol driver */
ret = InstallInfSection(NULL,
L"nettcpip.inf",
L"MS_TCPIP.PrimaryInstall",
L"MS_TCPIP.PrimaryInstall.Services");
if (!ret && GetLastError() != ERROR_FILE_NOT_FOUND)
{
DPRINT("InstallInfSection() failed with error 0x%lx\n", GetLastError());
}
else
{
/* Start the TCP/IP protocol driver */
SetupStartService(L"Tcpip", FALSE);
}
if (!CommonInstall())
return 0;
@ -1039,3 +1125,48 @@ SetupChangeLocale(HWND hWnd, LCID Lcid)
{
return SetupChangeLocaleEx(hWnd, Lcid, NULL, 0, 0, 0);
}
DWORD
WINAPI
SetupStartService(
LPCWSTR lpServiceName,
BOOL bWait)
{
SC_HANDLE hManager = NULL;
SC_HANDLE hService = NULL;
DWORD dwError = ERROR_SUCCESS;
hManager = OpenSCManagerW(NULL,
NULL,
SC_MANAGER_ALL_ACCESS);
if (hManager == NULL)
{
dwError = GetLastError();
goto done;
}
hService = OpenServiceW(hManager,
lpServiceName,
SERVICE_START);
if (hService == NULL)
{
dwError = GetLastError();
goto done;
}
if (!StartService(hService, 0, NULL))
{
dwError = GetLastError();
goto done;
}
done:
if (hService != NULL)
CloseServiceHandle(hService);
if (hManager != NULL)
CloseServiceHandle(hManager);
return dwError;
}

View file

@ -72,7 +72,7 @@
@ stub SetupSetRegisteredOsComponentsOrder
@ stub SetupSetSetupInfo
@ stub SetupShellSettings
@ stub SetupStartService
@ stdcall SetupStartService(wstr long)
@ stub SetupUnregisterOsComponent
@ stub StorageCoInstaller
@ stub SystemUpdateUserProfileDirectory