mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +00:00
Add stubs for SetupDiGetClassInstallParamsA/W
Support SetupDiSetClassInstallParams(DIF_ADDPROPERTYPAGE_ADVANCED) svn path=/trunk/; revision=26074
This commit is contained in:
parent
62be77605d
commit
29f298cd86
4 changed files with 139 additions and 77 deletions
|
@ -51,50 +51,29 @@ SETUP_PropertyChangeHandler(
|
||||||
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
|
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
|
||||||
IN DWORD ClassInstallParamsSize);
|
IN DWORD ClassInstallParamsSize);
|
||||||
|
|
||||||
static const UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = {
|
static BOOL
|
||||||
NULL, /* DIF_SELECTDEVICE */
|
SETUP_PropertyAddPropertyAdvancedHandler(
|
||||||
NULL, /* DIF_INSTALLDEVICE */
|
IN HDEVINFO DeviceInfoSet,
|
||||||
NULL, /* DIF_ASSIGNRESOURCES */
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
NULL, /* DIF_PROPERTIES */
|
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
|
||||||
NULL, /* DIF_REMOVE */
|
IN DWORD ClassInstallParamsSize);
|
||||||
NULL, /* DIF_FIRSTTIMESETUP */
|
|
||||||
NULL, /* DIF_FOUNDDEVICE */
|
typedef struct _INSTALL_PARAMS_DATA
|
||||||
NULL, /* DIF_SELECTCLASSDRIVERS */
|
{
|
||||||
NULL, /* DIF_VALIDATECLASSDRIVERS */
|
DI_FUNCTION Function;
|
||||||
NULL, /* DIF_INSTALLCLASSDRIVERS */
|
UPDATE_CLASS_PARAM_HANDLER UpdateHandler;
|
||||||
NULL, /* DIF_CALCDISKSPACE */
|
ULONG ParamsSize;
|
||||||
NULL, /* DIF_DESTROYPRIVATEDATA */
|
LONG FieldOffset;
|
||||||
NULL, /* DIF_VALIDATEDRIVER */
|
} INSTALL_PARAMS_DATA;
|
||||||
NULL, /* DIF_MOVEDEVICE */
|
|
||||||
NULL, /* DIF_DETECT */
|
#define ADD_PARAM_HANDLER(Function, UpdateHandler, ParamsType, ParamsField) \
|
||||||
NULL, /* DIF_INSTALLWIZARD */
|
{ Function, UpdateHandler, sizeof(ParamsType), FIELD_OFFSET(struct ClassInstallParams, ParamsField) },
|
||||||
NULL, /* DIF_DESTROYWIZARDDATA */
|
|
||||||
SETUP_PropertyChangeHandler, /* DIF_PROPERTYCHANGE */
|
static const INSTALL_PARAMS_DATA InstallParamsData[] = {
|
||||||
NULL, /* DIF_ENABLECLASS */
|
ADD_PARAM_HANDLER(DIF_PROPERTYCHANGE, SETUP_PropertyChangeHandler, SP_PROPCHANGE_PARAMS, PropChangeParams)
|
||||||
NULL, /* DIF_DETECTVERIFY */
|
ADD_PARAM_HANDLER(DIF_ADDPROPERTYPAGE_ADVANCED, SETUP_PropertyAddPropertyAdvancedHandler, SP_ADDPROPERTYPAGE_DATA, AddPropertyPageData)
|
||||||
NULL, /* DIF_INSTALLDEVICEFILES */
|
|
||||||
NULL, /* DIF_UNREMOVE */
|
|
||||||
NULL, /* DIF_SELECTBESTCOMPATDRV */
|
|
||||||
NULL, /* DIF_ALLOW_INSTALL */
|
|
||||||
NULL, /* DIF_REGISTERDEVICE */
|
|
||||||
NULL, /* DIF_NEWDEVICEWIZARD_PRESELECT */
|
|
||||||
NULL, /* DIF_NEWDEVICEWIZARD_SELECT */
|
|
||||||
NULL, /* DIF_NEWDEVICEWIZARD_PREANALYZE */
|
|
||||||
NULL, /* DIF_NEWDEVICEWIZARD_POSTANALYZE */
|
|
||||||
NULL, /* DIF_NEWDEVICEWIZARD_FINISHINSTALL */
|
|
||||||
NULL, /* DIF_UNUSED1 */
|
|
||||||
NULL, /* DIF_INSTALLINTERFACES */
|
|
||||||
NULL, /* DIF_DETECTCANCEL */
|
|
||||||
NULL, /* DIF_REGISTER_COINSTALLERS */
|
|
||||||
NULL, /* DIF_ADDPROPERTYPAGE_ADVANCED */
|
|
||||||
NULL, /* DIF_ADDPROPERTYPAGE_BASIC */
|
|
||||||
NULL, /* DIF_RESERVED1 */
|
|
||||||
NULL, /* DIF_TROUBLESHOOTER */
|
|
||||||
NULL, /* DIF_POWERMESSAGEWAKE */
|
|
||||||
NULL, /* DIF_ADDREMOTEPROPERTYPAGE_ADVANCED */
|
|
||||||
NULL, /* DIF_UPDATEDRIVER_UI */
|
|
||||||
NULL /* DIF_RESERVED2 */
|
|
||||||
};
|
};
|
||||||
|
#undef ADD_PARAM_HANDLER
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1498,6 +1477,38 @@ cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiGetClassInstallParamsA(SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
SetupDiGetClassInstallParamsA(
|
||||||
|
IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
|
OUT PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
|
||||||
|
IN DWORD ClassInstallParamsSize,
|
||||||
|
OUT PDWORD RequiredSize OPTIONAL)
|
||||||
|
{
|
||||||
|
FIXME("SetupDiGetClassInstallParamsA(%p %p %p %lu %p) Stub\n",
|
||||||
|
DeviceInfoSet, DeviceInfoData, ClassInstallParams, ClassInstallParamsSize, RequiredSize);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetupDiGetClassInstallParamsW(SETUPAPI.@)
|
||||||
|
*/
|
||||||
|
BOOL WINAPI
|
||||||
|
SetupDiGetClassInstallParamsW(
|
||||||
|
IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
|
OUT PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
|
||||||
|
IN DWORD ClassInstallParamsSize,
|
||||||
|
OUT PDWORD RequiredSize OPTIONAL)
|
||||||
|
{
|
||||||
|
FIXME("SetupDiGetClassInstallParamsW(%p %p %p %lu %p) Stub\n",
|
||||||
|
DeviceInfoSet, DeviceInfoData, ClassInstallParams, ClassInstallParamsSize, RequiredSize);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetupDiLoadClassIcon(SETUPAPI.@)
|
* SetupDiLoadClassIcon(SETUPAPI.@)
|
||||||
*/
|
*/
|
||||||
|
@ -2106,16 +2117,9 @@ SETUP_PropertyChangeHandler(
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PSP_PROPCHANGE_PARAMS *CurrentPropChangeParams;
|
PSP_PROPCHANGE_PARAMS *CurrentPropChangeParams;
|
||||||
if (!DeviceInfoData)
|
struct DeviceInfoElement *deviceInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
|
||||||
{
|
CurrentPropChangeParams = &deviceInfo->ClassInstallParams.PropChangeParams;
|
||||||
struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
|
|
||||||
CurrentPropChangeParams = &list->ClassInstallParams.PropChange;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct DeviceInfoElement *deviceInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
|
|
||||||
CurrentPropChangeParams = &deviceInfo->ClassInstallParams.PropChange;
|
|
||||||
}
|
|
||||||
if (*CurrentPropChangeParams)
|
if (*CurrentPropChangeParams)
|
||||||
{
|
{
|
||||||
MyFree(*CurrentPropChangeParams);
|
MyFree(*CurrentPropChangeParams);
|
||||||
|
@ -2123,13 +2127,64 @@ SETUP_PropertyChangeHandler(
|
||||||
}
|
}
|
||||||
if (PropChangeParams)
|
if (PropChangeParams)
|
||||||
{
|
{
|
||||||
*CurrentPropChangeParams = MyMalloc(sizeof(SP_PROPCHANGE_PARAMS));
|
*CurrentPropChangeParams = MyMalloc(ClassInstallParamsSize);
|
||||||
if (!*CurrentPropChangeParams)
|
if (!*CurrentPropChangeParams)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
memcpy(*CurrentPropChangeParams, PropChangeParams, sizeof(SP_PROPCHANGE_PARAMS));
|
memcpy(*CurrentPropChangeParams, PropChangeParams, ClassInstallParamsSize);
|
||||||
|
}
|
||||||
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
SETUP_PropertyAddPropertyAdvancedHandler(
|
||||||
|
IN HDEVINFO DeviceInfoSet,
|
||||||
|
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
|
||||||
|
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
|
||||||
|
IN DWORD ClassInstallParamsSize)
|
||||||
|
{
|
||||||
|
PSP_ADDPROPERTYPAGE_DATA AddPropertyPageData = (PSP_ADDPROPERTYPAGE_DATA)ClassInstallParams;
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
|
||||||
|
if (ClassInstallParamsSize != sizeof(SP_PROPCHANGE_PARAMS))
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
else if (AddPropertyPageData && AddPropertyPageData->Flags != 0)
|
||||||
|
SetLastError(ERROR_INVALID_FLAGS);
|
||||||
|
else if (AddPropertyPageData && AddPropertyPageData->NumDynamicPages >= MAX_INSTALLWIZARD_DYNAPAGES)
|
||||||
|
SetLastError(ERROR_INVALID_USER_BUFFER);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PSP_ADDPROPERTYPAGE_DATA *CurrentAddPropertyPageData;
|
||||||
|
if (!DeviceInfoData)
|
||||||
|
{
|
||||||
|
struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
|
||||||
|
CurrentAddPropertyPageData = &list->ClassInstallParams.AddPropertyPageData;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct DeviceInfoElement *deviceInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
|
||||||
|
CurrentAddPropertyPageData = &deviceInfo->ClassInstallParams.AddPropertyPageData;
|
||||||
|
}
|
||||||
|
if (*CurrentAddPropertyPageData)
|
||||||
|
{
|
||||||
|
MyFree(*CurrentAddPropertyPageData);
|
||||||
|
*CurrentAddPropertyPageData = NULL;
|
||||||
|
}
|
||||||
|
if (AddPropertyPageData)
|
||||||
|
{
|
||||||
|
*CurrentAddPropertyPageData = MyMalloc(ClassInstallParamsSize);
|
||||||
|
if (!*CurrentAddPropertyPageData)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
memcpy(*CurrentAddPropertyPageData, AddPropertyPageData, ClassInstallParamsSize);
|
||||||
}
|
}
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -2180,30 +2235,34 @@ SetupDiSetClassInstallParamsW(
|
||||||
|
|
||||||
if (ClassInstallParams)
|
if (ClassInstallParams)
|
||||||
{
|
{
|
||||||
|
DWORD i;
|
||||||
/* Check parameters in ClassInstallParams */
|
/* Check parameters in ClassInstallParams */
|
||||||
if (ClassInstallParams->InstallFunction < DIF_SELECTDEVICE
|
for (i = 0; i < sizeof(InstallParamsData) / sizeof(InstallParamsData[0]); i++)
|
||||||
|| ClassInstallParams->InstallFunction - DIF_SELECTDEVICE >= sizeof(UpdateClassInstallParamHandlers)/sizeof(UpdateClassInstallParamHandlers[0]))
|
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_USER_BUFFER);
|
if (InstallParamsData[i].Function == ClassInstallParams->InstallFunction)
|
||||||
goto done;
|
{
|
||||||
|
ret = InstallParamsData[i].UpdateHandler(
|
||||||
|
DeviceInfoSet,
|
||||||
|
DeviceInfoData,
|
||||||
|
ClassInstallParams,
|
||||||
|
ClassInstallParamsSize);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
InstallParams.Flags |= DI_CLASSINSTALLPARAMS;
|
||||||
|
ret = SetupDiSetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams);
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (UpdateClassInstallParamHandlers[ClassInstallParams->InstallFunction - DIF_SELECTDEVICE] == NULL)
|
ERR("InstallFunction %u has no associated update handler\n", ClassInstallParams->InstallFunction);
|
||||||
{
|
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
ERR("InstallFunction %u is valid, but has no associated update handler\n", ClassInstallParams->InstallFunction);
|
goto done;
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
ret = UpdateClassInstallParamHandlers[ClassInstallParams->InstallFunction - DIF_SELECTDEVICE](DeviceInfoSet, DeviceInfoData, ClassInstallParams, ClassInstallParamsSize);
|
|
||||||
if (!ret)
|
|
||||||
goto done;
|
|
||||||
InstallParams.Flags |= DI_CLASSINSTALLPARAMS;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
InstallParams.Flags &= ~DI_CLASSINSTALLPARAMS;
|
InstallParams.Flags &= ~DI_CLASSINSTALLPARAMS;
|
||||||
|
ret = SetupDiSetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = SetupDiSetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
@ -845,7 +845,9 @@ CreateDeviceInfoElement(
|
||||||
static BOOL
|
static BOOL
|
||||||
DestroyClassInstallParams(struct ClassInstallParams* installParams)
|
DestroyClassInstallParams(struct ClassInstallParams* installParams)
|
||||||
{
|
{
|
||||||
return HeapFree(GetProcessHeap(), 0, installParams->PropChange);
|
HeapFree(GetProcessHeap(), 0, installParams->PropChangeParams);
|
||||||
|
HeapFree(GetProcessHeap(), 0, installParams->AddPropertyPageData);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
|
@ -2982,9 +2984,9 @@ SetupDiChangeState(
|
||||||
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
|
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
|
||||||
|
|
||||||
if (!DeviceInfoData)
|
if (!DeviceInfoData)
|
||||||
PropChange = ((struct DeviceInfoSet *)DeviceInfoSet)->ClassInstallParams.PropChange;
|
PropChange = ((struct DeviceInfoSet *)DeviceInfoSet)->ClassInstallParams.PropChangeParams;
|
||||||
else
|
else
|
||||||
PropChange = ((struct DeviceInfoElement *)DeviceInfoData->Reserved)->ClassInstallParams.PropChange;
|
PropChange = ((struct DeviceInfoElement *)DeviceInfoData->Reserved)->ClassInstallParams.PropChangeParams;
|
||||||
if (!PropChange)
|
if (!PropChange)
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
|
|
@ -318,8 +318,8 @@
|
||||||
@ stdcall SetupDiGetClassImageList(ptr)
|
@ stdcall SetupDiGetClassImageList(ptr)
|
||||||
@ stdcall SetupDiGetClassImageListExA(ptr str ptr)
|
@ stdcall SetupDiGetClassImageListExA(ptr str ptr)
|
||||||
@ stdcall SetupDiGetClassImageListExW(ptr wstr ptr)
|
@ stdcall SetupDiGetClassImageListExW(ptr wstr ptr)
|
||||||
@ stub SetupDiGetClassInstallParamsA
|
@ stdcall SetupDiGetClassInstallParamsA(ptr ptr ptr long ptr)
|
||||||
@ stub SetupDiGetClassInstallParamsW
|
@ stdcall SetupDiGetClassInstallParamsW(ptr ptr ptr long ptr)
|
||||||
@ stdcall SetupDiGetDeviceInfoListClass(ptr ptr)
|
@ stdcall SetupDiGetDeviceInfoListClass(ptr ptr)
|
||||||
@ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr)
|
@ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr)
|
||||||
@ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr)
|
@ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr)
|
||||||
|
|
|
@ -108,7 +108,8 @@ struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceIn
|
||||||
|
|
||||||
struct ClassInstallParams
|
struct ClassInstallParams
|
||||||
{
|
{
|
||||||
PSP_PROPCHANGE_PARAMS PropChange;
|
PSP_PROPCHANGE_PARAMS PropChangeParams;
|
||||||
|
PSP_ADDPROPERTYPAGE_DATA AddPropertyPageData;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
|
struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
|
||||||
|
|
Loading…
Reference in a new issue