Install "ClassInstall32.Services" section in SetupDiInstallClassExW Modified: trunk/reactos/lib/setupapi/devinst.c _____
Modified: trunk/reactos/lib/setupapi/devinst.c --- trunk/reactos/lib/setupapi/devinst.c 2005-12-19 10:15:06 UTC (rev 20267) +++ trunk/reactos/lib/setupapi/devinst.c 2005-12-19 10:43:08 UTC (rev 20268) @@ -29,6 +29,7 @@
static const WCHAR Class[] = {'C','l','a','s','s',0}; static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0}; static const WCHAR DeviceInstance[] = {'D','e','v','i','c','e','I','n','s','t','a','n','c','e',0}; +static const WCHAR DotServices[] = {'.','S','e','r','v','i','c','e','s',0}; static const WCHAR InterfaceInstall32[] = {'I','n','t','e','r','f','a','c','e','I','n','s','t','a','l','l','3','2' ,0}; static const WCHAR NtExtension[] = {'.','N','T',0}; static const WCHAR NtPlatformExtension[] = {'.','N','T','x','8','6',0}; @@ -3039,6 +3040,122 @@ }
+static BOOL +InstallServicesSection( + IN HINF hInf, + IN PCWSTR SectionName, + IN HDEVINFO DeviceInfoSet OPTIONAL, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + OUT PCWSTR* pAssociatedService OPTIONAL, + OUT PBOOL pRebootRequired OPTIONAL) +{ + INFCONTEXT ContextService; + DWORD RequiredSize; + INT Flags; + BOOL ret = FALSE; + + ret = SetupFindFirstLineW(hInf, SectionName, NULL, &ContextService); + while (ret) + { + LPWSTR ServiceName = NULL; + LPWSTR ServiceSection = NULL; + + ret = SetupGetStringFieldW( + &ContextService, + 1, /* Field index */ + NULL, 0, + &RequiredSize); + if (!ret) + goto nextservice; + if (RequiredSize > 0) + { + /* We got the needed size for the buffer */ + ServiceName = HeapAlloc(GetProcessHeap(), 0, RequiredSize * sizeof(WCHAR)); + if (!ServiceName) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + goto nextservice; + } + ret = SetupGetStringFieldW( + &ContextService, + 1, /* Field index */ + ServiceName, RequiredSize, + &RequiredSize); + if (!ret) + goto nextservice; + } + ret = SetupGetIntField( + &ContextService, + 2, /* Field index */ + &Flags); + if (!ret) + { + /* The field may be empty. Ignore the error */ + Flags = 0; + } + ret = SetupGetStringFieldW( + &ContextService, + 3, /* Field index */ + NULL, 0, + &RequiredSize); + if (!ret) + { + if (GetLastError() == ERROR_INVALID_PARAMETER) + { + /* This first is probably missing. It is not + * required, so ignore the error */ + RequiredSize = 0; + ret = TRUE; + } + else + goto nextservice; + } + if (RequiredSize > 0) + { + /* We got the needed size for the buffer */ + ServiceSection = HeapAlloc(GetProcessHeap(), 0, RequiredSize * sizeof(WCHAR)); + if (!ServiceSection) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + goto nextservice; + } + ret = SetupGetStringFieldW( + &ContextService, + 3, /* Field index */ + ServiceSection, RequiredSize, + &RequiredSize); + if (!ret) + goto nextservice; + + SetLastError(ERROR_SUCCESS); + ret = SetupInstallServicesFromInfSectionExW( + hInf, + ServiceSection, Flags, DeviceInfoSet, DeviceInfoData, ServiceName, NULL); + } + if (ret && (Flags & SPSVCINST_ASSOCSERVICE)) + { + if (pAssociatedService) + { + *pAssociatedService = ServiceName; + ServiceName = NULL; + } + if (pRebootRequired && GetLastError() == ERROR_SUCCESS_REBOOT_REQUIRED) + *pRebootRequired = TRUE; + } +nextservice: + HeapFree(GetProcessHeap(), 0, ServiceName); + HeapFree(GetProcessHeap(), 0, ServiceSection); + if (!ret) + goto done; + ret = SetupFindNextLine(&ContextService, &ContextService); + } + + ret = TRUE; + +done: + return ret; +} +
/*********************************************************************** * SetupDiInstallClassExW (SETUPAPI.@) */ @@ -3058,8 +3175,6 @@
if (!InfFileName && !InterfaceClassGuid) SetLastError(ERROR_INVALID_PARAMETER); - else if (InfFileName && InterfaceClassGuid) - SetLastError(ERROR_INVALID_PARAMETER); else if (Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL)) { TRACE("Unknown flags: 0x%08lx\n", Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL)); @@ -3080,17 +3195,9 @@
if (InterfaceClassGuid) { - /* Retrieve the actual section name */ - ret = SetupDiGetActualSectionToInstallW(hInf, - InterfaceInstall32, - SectionName, - MAX_PATH, - NULL, - NULL); - if (!ret) - goto cleanup; - + /* SetupDiCreateDeviceInterface??? */ FIXME("Installing an interface is not implemented\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); } else { @@ -3123,7 +3230,7 @@ hInf, ClassInstall32, SectionName, - MAX_PATH, + MAX_PATH - wcslen(DotServices), NULL, NULL); if (!ret) @@ -3148,7 +3255,11 @@ if (!ret) goto cleanup;
- /* FIXME: Install .Services section */ + /* Install .Services section */ + lstrcatW(SectionName, DotServices); + ret = InstallServicesSection(hInf, SectionName, NULL, NULL, NULL, NULL); + if (!ret) + goto cleanup;
ret = TRUE; } @@ -6965,8 +7076,6 @@ WCHAR Buffer[32]; DWORD SectionNameLength = 0; BOOL Result = FALSE; - INFCONTEXT ContextService; - INT Flags; ULONG DoAction; DWORD RequiredSize; LPCWSTR AssociatedService = NULL; @@ -7025,7 +7134,7 @@ SelectedDriver->InfFileDetails->hInf, SelectedDriver->Details.SectionName, SectionName, MAX_PATH, &SectionNameLength, NULL); - if (!Result || SectionNameLength > MAX_PATH - 9) + if (!Result || SectionNameLength > MAX_PATH - wcslen(DotServices)) goto cleanup; pSectionName = &SectionName[wcslen(SectionName)];
@@ -7133,100 +7242,17 @@ /* FIXME: Process .LogConfigOverride section */
/* Install .Services section */ - wcscpy(pSectionName, L".Services"); - Result = SetupFindFirstLineW(SelectedDriver->InfFileDetails->hInf, SectionName, NULL, &ContextService); - while (Result) - { - LPWSTR ServiceName = NULL; - LPWSTR ServiceSection = NULL; + wcscpy(pSectionName, DotServices); + Result = InstallServicesSection( + SelectedDriver->InfFileDetails->hInf, + SectionName, + DeviceInfoSet, + DeviceInfoData, + &AssociatedService, + &RebootRequired); + if (!Result) + goto cleanup;
- Result = SetupGetStringFieldW( - &ContextService, - 1, /* Field index */ - NULL, 0, - &RequiredSize); - if (!Result) - goto nextservice; - if (RequiredSize > 0) - { - /* We got the needed size for the buffer */ - ServiceName = HeapAlloc(GetProcessHeap(), 0, RequiredSize * sizeof(WCHAR)); - if (!ServiceName) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - goto nextservice; - } - Result = SetupGetStringFieldW( - &ContextService, - 1, /* Field index */ - ServiceName, RequiredSize, - &RequiredSize); - if (!Result) - goto nextservice; - } - Result = SetupGetIntField( - &ContextService, - 2, /* Field index */ - &Flags); - if (!Result) - { - /* The field may be empty. Ignore the error */ - Flags = 0; - } - Result = SetupGetStringFieldW( - &ContextService, - 3, /* Field index */ - NULL, 0, - &RequiredSize); - if (!Result) - { - if (GetLastError() == ERROR_INVALID_PARAMETER) - { - /* This first is probably missing. It is not - * required, so ignore the error */ - RequiredSize = 0; - Result = TRUE; - } - else - goto nextservice; - } - if (RequiredSize > 0) - { - /* We got the needed size for the buffer */ - ServiceSection = HeapAlloc(GetProcessHeap(), 0, RequiredSize * sizeof(WCHAR)); - if (!ServiceSection) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - goto nextservice; - } - Result = SetupGetStringFieldW( - &ContextService, - 3, /* Field index */ - ServiceSection, RequiredSize, - &RequiredSize); - if (!Result) - goto nextservice; - - SetLastError(ERROR_SUCCESS); - Result = SetupInstallServicesFromInfSectionExW( - SelectedDriver->InfFileDetails->hInf, - ServiceSection, Flags, DeviceInfoSet, DeviceInfoData, ServiceName, NULL); - } - if (Result && (Flags & SPSVCINST_ASSOCSERVICE)) - { - AssociatedService = ServiceName; - ServiceName = NULL; - if (GetLastError() == ERROR_SUCCESS_REBOOT_REQUIRED) - RebootRequired = TRUE; - } -nextservice: - HeapFree(GetProcessHeap(), 0, ServiceName); - HeapFree(GetProcessHeap(), 0, ServiceSection); - if (!Result) - goto cleanup; - Result = SetupFindNextLine(&ContextService, &ContextService); - } - /* Copy .inf file to Inf\ directory (if needed) */ Result = InfIsFromOEMLocation(SelectedDriver->InfFileDetails->FullInfFileName, &NeedtoCopyFile); if (!Result)