Add stubs for SetupDiGetClassInstallParamsA/W

Support SetupDiSetClassInstallParams(DIF_ADDPROPERTYPAGE_ADVANCED)

svn path=/trunk/; revision=26074
This commit is contained in:
Hervé Poussineau 2007-03-14 12:29:18 +00:00
parent 62be77605d
commit 29f298cd86
4 changed files with 139 additions and 77 deletions

View file

@ -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:

View file

@ -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);

View file

@ -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)

View file

@ -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 */