Third parameter in INF AddService directive seems to be optional. Ignore the error if it is missing Implement SetupDiGetDeviceInfoListDetailW Modified: trunk/reactos/lib/setupapi/devinst.c Modified: trunk/reactos/lib/setupapi/parser.c Modified: trunk/reactos/lib/setupapi/stubs.c _____
Modified: trunk/reactos/lib/setupapi/devinst.c --- trunk/reactos/lib/setupapi/devinst.c 2005-11-24 08:12:20 UTC (rev 19517) +++ trunk/reactos/lib/setupapi/devinst.c 2005-11-24 09:05:38 UTC (rev 19518) @@ -3284,6 +3284,42 @@
}
/*********************************************************************** + * SetupDiGetDeviceInfoListDetailW (SETUPAPI.@) + */ +BOOL WINAPI SetupDiGetDeviceInfoListDetailW( + IN HDEVINFO DeviceInfoSet, + OUT PSP_DEVINFO_LIST_DETAIL_DATA_W DeviceInfoListDetailData) +{ + struct DeviceInfoSet *list; + BOOL ret = FALSE; + + TRACE("%p %p\n", DeviceInfoSet, DeviceInfoListDetailData); + + if (!DeviceInfoSet) + SetLastError(ERROR_INVALID_HANDLE); + else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC) + SetLastError(ERROR_INVALID_HANDLE); + else if (!DeviceInfoListDetailData) + SetLastError(ERROR_INVALID_PARAMETER); + else if (DeviceInfoListDetailData->cbSize != sizeof(SP_DEVINFO_LIST_DETAIL_DATA_W)) + SetLastError(ERROR_INVALID_USER_BUFFER); + else + { + memcpy( + &DeviceInfoListDetailData->ClassGuid, + &list->ClassGuid, + sizeof(GUID)); + DeviceInfoListDetailData->RemoteMachineHandle = list->hMachine; + DeviceInfoListDetailData->RemoteMachineName[0] = 0; /* FIXME */ + + ret = TRUE; + } + + TRACE("Returning %d\n", ret); + return ret; +} + +/********************************************************************** * * SetupDiGetDeviceInstallParamsA (SETUPAPI.@) */ BOOL WINAPI SetupDiGetDeviceInstallParamsA( @@ -5915,7 +5951,17 @@ NULL, 0, &RequiredSize); if (!Result) - goto nextfile; + { + if (GetLastError() == ERROR_INVALID_PARAMETER) + { + /* This first is probably missing. It is not + * required, so ignore the error */ + RequiredSize = 0; + Result = TRUE; + } + else + goto nextfile; + } if (RequiredSize > 0) { /* We got the needed size for the buffer */ @@ -5932,11 +5978,12 @@ &RequiredSize); if (!Result) goto nextfile; + + SetLastError(ERROR_SUCCESS); + Result = SetupInstallServicesFromInfSectionExW( + SelectedDriver->InfFileDetails->hInf, + ServiceSection, Flags, DeviceInfoSet, DeviceInfoData, ServiceName, NULL); } - SetLastError(ERROR_SUCCESS); - Result = SetupInstallServicesFromInfSectionExW( - SelectedDriver->InfFileDetails->hInf, - ServiceSection, Flags, DeviceInfoSet, DeviceInfoData, ServiceName, NULL); if (Result && (Flags & SPSVCINST_ASSOCSERVICE)) { AssociatedService = ServiceName; @@ -5989,20 +6036,20 @@
/* Write information to enum key */ TRACE("Write information to enum key\n"); - TRACE("Service : '%S'\n", AssociatedService); TRACE("Class : '%S'\n", ClassName); TRACE("ClassGUID : '%S'\n", lpFullGuidString); TRACE("DeviceDesc : '%S'\n", SelectedDriver->Info.Description); TRACE("Mfg : '%S'\n", SelectedDriver->Info.MfgName); - rc = RegSetValueEx(hKey, L"Service", 0, REG_SZ, (const BYTE *)AssociatedService, (wcslen(AssociatedService) + 1) * sizeof(WCHAR)); + TRACE("Service : '%S'\n", AssociatedService); + rc = RegSetValueEx(hKey, L"Class", 0, REG_SZ, (const BYTE *)ClassName, (wcslen(ClassName) + 1) * sizeof(WCHAR)); if (rc == ERROR_SUCCESS) - rc = RegSetValueEx(hKey, L"Class", 0, REG_SZ, (const BYTE *)ClassName, (wcslen(ClassName) + 1) * sizeof(WCHAR)); - if (rc == ERROR_SUCCESS) rc = RegSetValueEx(hKey, L"ClassGUID", 0, REG_SZ, (const BYTE *)lpFullGuidString, (wcslen(lpFullGuidString) + 1) * sizeof(WCHAR)); if (rc == ERROR_SUCCESS) rc = RegSetValueEx(hKey, L"DeviceDesc", 0, REG_SZ, (const BYTE *)SelectedDriver->Info.Description, (wcslen(SelectedDriver->Info.Description) + 1) * sizeof(WCHAR)); if (rc == ERROR_SUCCESS) rc = RegSetValueEx(hKey, L"Mfg", 0, REG_SZ, (const BYTE *)SelectedDriver->Info.MfgName, (wcslen(SelectedDriver->Info.MfgName) + 1) * sizeof(WCHAR)); + if (rc == ERROR_SUCCESS && *AssociatedService) + rc = RegSetValueEx(hKey, L"Service", 0, REG_SZ, (const BYTE *)AssociatedService, (wcslen(AssociatedService) + 1) * sizeof(WCHAR)); if (rc != ERROR_SUCCESS) { SetLastError(rc); _____
Modified: trunk/reactos/lib/setupapi/parser.c --- trunk/reactos/lib/setupapi/parser.c 2005-11-24 08:12:20 UTC (rev 19517) +++ trunk/reactos/lib/setupapi/parser.c 2005-11-24 09:05:38 UTC (rev 19518) @@ -1691,7 +1691,7 @@
unsigned int len;
SetLastError(0); - if (!field) return FALSE; + if (!field) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } len = PARSER_string_substA( file, field->text, NULL, 0 ); if (required) *required = len + 1; if (buffer) @@ -1722,7 +1722,7 @@ unsigned int len;
SetLastError(0); - if (!field) return FALSE; + if (!field) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } len = PARSER_string_substW( file, field->text, NULL, 0 ); if (required) *required = len + 1; if (buffer) _____
Modified: trunk/reactos/lib/setupapi/stubs.c --- trunk/reactos/lib/setupapi/stubs.c 2005-11-24 08:12:20 UTC (rev 19517) +++ trunk/reactos/lib/setupapi/stubs.c 2005-11-24 09:05:38 UTC (rev 19518) @@ -51,15 +51,6 @@
}
/*********************************************************************** - * SetupDiGetDeviceInfoListDetailW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetDeviceInfoListDetailW(HDEVINFO devinfo, PSP_DEVINFO_LIST_DETAIL_DATA_W devinfo_data ) -{ - FIXME("\n"); - return FALSE; -} - -/********************************************************************** * * SetupCopyOEMInfA (SETUPAPI.@) */ BOOL WINAPI SetupCopyOEMInfA(PCSTR sourceinffile, PCSTR sourcemedialoc,