mirror of
https://github.com/reactos/reactos.git
synced 2024-10-04 00:13:57 +00:00
SetupDiInstallClassExW;
- Use the provided FileQueue (if any) - Start to implement device interface installation SetupDiInstallDevice: - Set FAILEDINSTALL flag in registry if asked to svn path=/trunk/; revision=21565
This commit is contained in:
parent
1f910b512d
commit
e38c527480
|
@ -3133,8 +3133,11 @@ BOOL WINAPI SetupDiInstallClassExW(
|
||||||
TRACE("%p %s 0x%lx %p %s %p %p\n", hwndParent, debugstr_w(InfFileName), Flags,
|
TRACE("%p %s 0x%lx %p %s %p %p\n", hwndParent, debugstr_w(InfFileName), Flags,
|
||||||
FileQueue, debugstr_guid(InterfaceClassGuid), Reserved1, Reserved2);
|
FileQueue, debugstr_guid(InterfaceClassGuid), Reserved1, Reserved2);
|
||||||
|
|
||||||
if (!InfFileName && !InterfaceClassGuid)
|
if (!InfFileName)
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
{
|
||||||
|
FIXME("Case not implemented: InfFileName NULL\n");
|
||||||
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
else if (Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL))
|
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));
|
TRACE("Unknown flags: 0x%08lx\n", Flags & ~(DI_NOVCP | DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL));
|
||||||
|
@ -3148,23 +3151,24 @@ BOOL WINAPI SetupDiInstallClassExW(
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE;
|
||||||
|
SP_DEVINSTALL_PARAMS_W InstallParams;
|
||||||
WCHAR SectionName[MAX_PATH];
|
WCHAR SectionName[MAX_PATH];
|
||||||
HINF hInf = INVALID_HANDLE_VALUE;
|
HINF hInf = INVALID_HANDLE_VALUE;
|
||||||
HKEY hClassKey = INVALID_HANDLE_VALUE;
|
HKEY hRootKey = INVALID_HANDLE_VALUE;
|
||||||
PVOID callback_context = NULL;
|
PVOID callback_context = NULL;
|
||||||
|
|
||||||
if (InterfaceClassGuid)
|
hDeviceInfo = SetupDiCreateDeviceInfoList(NULL, NULL);
|
||||||
{
|
|
||||||
/* SetupDiCreateDeviceInterface??? */
|
InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
|
||||||
FIXME("Installing an interface is not implemented\n");
|
if (!SetupDiGetDeviceInstallParamsW(hDeviceInfo, NULL, &InstallParams))
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
goto cleanup;
|
||||||
}
|
InstallParams.Flags &= ~(DI_NOVCP | DI_NOBROWSE | DI_QUIETINSTALL);
|
||||||
else
|
InstallParams.Flags |= Flags & (DI_NOVCP | DI_NOBROWSE | DI_QUIETINSTALL);
|
||||||
{
|
|
||||||
if (Flags & DI_NOVCP)
|
if (Flags & DI_NOVCP)
|
||||||
FIXME("FileQueue argument ignored\n");
|
InstallParams.FileQueue = FileQueue;
|
||||||
if (Flags & (DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL))
|
if (!SetupDiSetDeviceInstallParamsW(hDeviceInfo, NULL, &InstallParams))
|
||||||
FIXME("Flags 0x%lx ignored\n", Flags & (DI_NOBROWSE | DI_FORCECOPY | DI_QUIETINSTALL));
|
goto cleanup;
|
||||||
|
|
||||||
/* Open the .inf file */
|
/* Open the .inf file */
|
||||||
hInf = SetupOpenInfFileW(
|
hInf = SetupOpenInfFileW(
|
||||||
|
@ -3175,16 +3179,41 @@ BOOL WINAPI SetupDiInstallClassExW(
|
||||||
if (hInf == INVALID_HANDLE_VALUE)
|
if (hInf == INVALID_HANDLE_VALUE)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Create or open the class registry key 'HKLM\CurrentControlSet\Class\{GUID}' */
|
|
||||||
hClassKey = CreateClassKey(hInf);
|
|
||||||
if (hClassKey == INVALID_HANDLE_VALUE)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
/* Try to append a layout file */
|
/* Try to append a layout file */
|
||||||
ret = SetupOpenAppendInfFileW(NULL, hInf, NULL);
|
ret = SetupOpenAppendInfFileW(NULL, hInf, NULL);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (InterfaceClassGuid)
|
||||||
|
{
|
||||||
|
/* Retrieve the actual section name */
|
||||||
|
ret = SetupDiGetActualSectionToInstallW(
|
||||||
|
hInf,
|
||||||
|
InterfaceInstall32,
|
||||||
|
SectionName,
|
||||||
|
MAX_PATH,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (!ret)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* Open registry key related to this interface */
|
||||||
|
/* FIXME: What happens if the key doesn't exist? */
|
||||||
|
hRootKey = SetupDiOpenClassRegKeyExW(InterfaceClassGuid, KEY_ENUMERATE_SUB_KEYS, DIOCR_INTERFACE, NULL, NULL);
|
||||||
|
if (hRootKey == INVALID_HANDLE_VALUE)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* SetupDiCreateDeviceInterface??? */
|
||||||
|
FIXME("Installing an interface is not implemented\n");
|
||||||
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Create or open the class registry key 'HKLM\CurrentControlSet\Class\{GUID}' */
|
||||||
|
hRootKey = CreateClassKey(hInf);
|
||||||
|
if (hRootKey == INVALID_HANDLE_VALUE)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
/* Retrieve the actual section name */
|
/* Retrieve the actual section name */
|
||||||
ret = SetupDiGetActualSectionToInstallW(
|
ret = SetupDiGetActualSectionToInstallW(
|
||||||
hInf,
|
hInf,
|
||||||
|
@ -3205,19 +3234,26 @@ BOOL WINAPI SetupDiInstallClassExW(
|
||||||
hInf,
|
hInf,
|
||||||
SectionName,
|
SectionName,
|
||||||
SPINST_REGISTRY | SPINST_FILES | SPINST_BITREG | SPINST_INIFILES | SPINST_INI2REG,
|
SPINST_REGISTRY | SPINST_FILES | SPINST_BITREG | SPINST_INIFILES | SPINST_INI2REG,
|
||||||
hClassKey,
|
hRootKey,
|
||||||
NULL, /* SourceRootPath */
|
NULL, /* SourceRootPath */
|
||||||
0, /* CopyFlags */
|
!(Flags & DI_NOVCP) && (Flags & DI_FORCECOPY) ? SP_COPY_FORCE_IN_USE : 0, /* CopyFlags */
|
||||||
SetupDefaultQueueCallbackW,
|
SetupDefaultQueueCallbackW,
|
||||||
callback_context,
|
callback_context,
|
||||||
NULL,
|
hDeviceInfo,
|
||||||
NULL);
|
NULL);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Install .Services section */
|
/* Install .Services section */
|
||||||
lstrcatW(SectionName, DotServices);
|
lstrcatW(SectionName, DotServices);
|
||||||
ret = SetupInstallServicesFromInfSectionW(hInf, SectionName, 0);
|
ret = SetupInstallServicesFromInfSectionExW(
|
||||||
|
hInf,
|
||||||
|
SectionName,
|
||||||
|
0,
|
||||||
|
hDeviceInfo,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -3225,10 +3261,12 @@ BOOL WINAPI SetupDiInstallClassExW(
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
if (hDeviceInfo != INVALID_HANDLE_VALUE)
|
||||||
|
SetupDiDestroyDeviceInfoList(hDeviceInfo);
|
||||||
if (hInf != INVALID_HANDLE_VALUE)
|
if (hInf != INVALID_HANDLE_VALUE)
|
||||||
SetupCloseInfFile(hInf);
|
SetupCloseInfFile(hInf);
|
||||||
if (hClassKey != INVALID_HANDLE_VALUE)
|
if (hRootKey != INVALID_HANDLE_VALUE)
|
||||||
RegCloseKey(hClassKey);
|
RegCloseKey(hRootKey);
|
||||||
SetupTermDefaultQueueCallback(callback_context);
|
SetupTermDefaultQueueCallback(callback_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4076,7 +4114,7 @@ BOOL WINAPI SetupDiGetDeviceInfoListDetailW(
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI SetupDiGetDeviceInstallParamsA(
|
BOOL WINAPI SetupDiGetDeviceInstallParamsA(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData,
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
OUT PSP_DEVINSTALL_PARAMS_A DeviceInstallParams)
|
OUT PSP_DEVINSTALL_PARAMS_A DeviceInstallParams)
|
||||||
{
|
{
|
||||||
SP_DEVINSTALL_PARAMS_W deviceInstallParamsW;
|
SP_DEVINSTALL_PARAMS_W deviceInstallParamsW;
|
||||||
|
@ -4118,7 +4156,7 @@ BOOL WINAPI SetupDiGetDeviceInstallParamsA(
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI SetupDiGetDeviceInstallParamsW(
|
BOOL WINAPI SetupDiGetDeviceInstallParamsW(
|
||||||
IN HDEVINFO DeviceInfoSet,
|
IN HDEVINFO DeviceInfoSet,
|
||||||
IN PSP_DEVINFO_DATA DeviceInfoData,
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
|
OUT PSP_DEVINSTALL_PARAMS_W DeviceInstallParams)
|
||||||
{
|
{
|
||||||
struct DeviceInfoSet *list;
|
struct DeviceInfoSet *list;
|
||||||
|
@ -4167,6 +4205,7 @@ CheckDeviceInstallParameters(
|
||||||
DI_ENUMSINGLEINF | /* 0x00010000 */
|
DI_ENUMSINGLEINF | /* 0x00010000 */
|
||||||
DI_CLASSINSTALLPARAMS | /* 0x00100000 */
|
DI_CLASSINSTALLPARAMS | /* 0x00100000 */
|
||||||
DI_NODI_DEFAULTACTION | /* 0x00200000 */
|
DI_NODI_DEFAULTACTION | /* 0x00200000 */
|
||||||
|
DI_QUIETINSTALL | /* 0x00800000 */
|
||||||
DI_NOFILECOPY | /* 0x01000000 */
|
DI_NOFILECOPY | /* 0x01000000 */
|
||||||
DI_DRIVERPAGE_ADDED; /* 0x04000000 */
|
DI_DRIVERPAGE_ADDED; /* 0x04000000 */
|
||||||
DWORD SupportedFlagsEx =
|
DWORD SupportedFlagsEx =
|
||||||
|
@ -7480,7 +7519,35 @@ SetupDiInstallDevice(
|
||||||
|
|
||||||
if (InstallParams.FlagsEx & DI_FLAGSEX_SETFAILEDINSTALL)
|
if (InstallParams.FlagsEx & DI_FLAGSEX_SETFAILEDINSTALL)
|
||||||
{
|
{
|
||||||
/* FIXME: set FAILEDINSTALL in ConfigFlags registry value */
|
/* Set FAILEDINSTALL in ConfigFlags registry value */
|
||||||
|
DWORD ConfigFlags, regType;
|
||||||
|
Result = SetupDiGetDeviceRegistryPropertyW(
|
||||||
|
DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
SPDRP_CONFIGFLAGS,
|
||||||
|
®Type,
|
||||||
|
(PBYTE)&ConfigFlags,
|
||||||
|
sizeof(ConfigFlags),
|
||||||
|
NULL);
|
||||||
|
if (!Result || regType != REG_DWORD)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
ConfigFlags |= DNF_DISABLED;
|
||||||
|
Result = SetupDiSetDeviceRegistryPropertyW(
|
||||||
|
DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
SPDRP_CONFIGFLAGS,
|
||||||
|
(PBYTE)&ConfigFlags,
|
||||||
|
sizeof(ConfigFlags));
|
||||||
|
if (!Result)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_GEN_FAILURE);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = TRUE;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue