Allow DIF_PROPERTYCHANGE as valid install code in SetupDiSetClassInstallParamsW

Better stub for SetupDiChangeState

svn path=/trunk/; revision=20190
This commit is contained in:
Hervé Poussineau
2005-12-15 16:35:15 +00:00
parent da74f5a9ff
commit e35fb7388d
2 changed files with 107 additions and 5 deletions
+96 -5
View File
@@ -79,7 +79,7 @@ typedef BOOL
IN LPFNADDPROPSHEETPAGE fAddFunc,
IN LPARAM lParam);
typedef BOOL
(CALLBACK* UPDATE_CLASS_PARAM_HANDLER) (
(*UPDATE_CLASS_PARAM_HANDLER) (
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
@@ -95,6 +95,13 @@ struct CoInstallerElement
PVOID PrivateData;
};
static BOOL
PropertyChangeHandler(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
IN DWORD ClassInstallParamsSize);
static UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = {
NULL, /* DIF_SELECTDEVICE */
NULL, /* DIF_INSTALLDEVICE */
@@ -113,7 +120,7 @@ static UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = {
NULL, /* DIF_DETECT */
NULL, /* DIF_INSTALLWIZARD */
NULL, /* DIF_DESTROYWIZARDDATA */
NULL, /* DIF_PROPERTYCHANGE */
PropertyChangeHandler, /* DIF_PROPERTYCHANGE */
NULL, /* DIF_ENABLECLASS */
NULL, /* DIF_DETECTVERIFY */
NULL, /* DIF_INSTALLDEVICEFILES */
@@ -2292,6 +2299,12 @@ static BOOL DestroyDriverInfoElement(struct DriverInfoElement* driverInfo)
return TRUE;
}
static BOOL DestroyClassInstallParams(struct ClassInstallParams* installParams)
{
HeapFree(GetProcessHeap(), 0, installParams->PropChange);
return TRUE;
}
static BOOL DestroyDeviceInfoElement(struct DeviceInfoElement* deviceInfo)
{
PLIST_ENTRY ListEntry;
@@ -2309,6 +2322,7 @@ static BOOL DestroyDeviceInfoElement(struct DeviceInfoElement* deviceInfo)
ListEntry = RemoveHeadList(&deviceInfo->InterfaceListHead);
HeapFree(GetProcessHeap(), 0, ListEntry);
}
DestroyClassInstallParams(&deviceInfo->ClassInstallParams);
HeapFree(GetProcessHeap(), 0, deviceInfo);
return TRUE;
}
@@ -2328,6 +2342,7 @@ static BOOL DestroyDeviceInfoSet(struct DeviceInfoSet* list)
if (list->HKLM != HKEY_LOCAL_MACHINE)
RegCloseKey(list->HKLM);
CM_Disconnect_Machine(list->hMachine);
DestroyClassInstallParams(&list->ClassInstallParams);
HeapFree(GetProcessHeap(), 0, list);
return TRUE;
}
@@ -3358,7 +3373,7 @@ BOOL WINAPI SetupDiSetClassInstallParamsW(
}
else if (UpdateClassInstallParamHandlers[ClassInstallParams->InstallFunction - DIF_SELECTDEVICE] == NULL)
{
FIXME("InstallFunction code is valid, but no associated update handler\n");
FIXME("InstallFunction %u is valid, but has no associated update handler\n", ClassInstallParams->InstallFunction);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
goto done;
}
@@ -3380,6 +3395,63 @@ done:
return ret;
}
static BOOL PropertyChangeHandler(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL,
IN DWORD ClassInstallParamsSize)
{
PSP_PROPCHANGE_PARAMS PropChangeParams = (PSP_PROPCHANGE_PARAMS)ClassInstallParams;
BOOL ret = FALSE;
if (ClassInstallParamsSize != sizeof(SP_PROPCHANGE_PARAMS))
SetLastError(ERROR_INVALID_PARAMETER);
else if (PropChangeParams && PropChangeParams->StateChange != DICS_ENABLE
&& PropChangeParams->StateChange != DICS_DISABLE && PropChangeParams->StateChange != DICS_PROPCHANGE
&& PropChangeParams->StateChange != DICS_START && PropChangeParams->StateChange != DICS_STOP)
SetLastError(ERROR_INVALID_FLAGS);
else if (PropChangeParams && PropChangeParams->Scope != DICS_FLAG_GLOBAL
&& PropChangeParams->Scope != DICS_FLAG_CONFIGSPECIFIC)
SetLastError(ERROR_INVALID_FLAGS);
else if (PropChangeParams
&& (PropChangeParams->StateChange == DICS_START || PropChangeParams->StateChange == DICS_STOP)
&& PropChangeParams->Scope != DICS_FLAG_CONFIGSPECIFIC)
SetLastError(ERROR_INVALID_USER_BUFFER);
else
{
PSP_PROPCHANGE_PARAMS *CurrentPropChangeParams;
if (!DeviceInfoData)
{
struct DeviceInfoSet *list = (struct DeviceInfoSet *)DeviceInfoSet;
CurrentPropChangeParams = &list->ClassInstallParams.PropChange;
}
else
{
struct DeviceInfoElement *deviceInfo = (struct DeviceInfoElement *)DeviceInfoData->Reserved;
CurrentPropChangeParams = &deviceInfo->ClassInstallParams.PropChange;
}
if (*CurrentPropChangeParams)
{
MyFree(*CurrentPropChangeParams);
*CurrentPropChangeParams = NULL;
}
if (PropChangeParams)
{
*CurrentPropChangeParams = MyMalloc(sizeof(SP_PROPCHANGE_PARAMS));
if (!*CurrentPropChangeParams)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto done;
}
memcpy(*CurrentPropChangeParams, PropChangeParams, sizeof(SP_PROPCHANGE_PARAMS));
}
ret = TRUE;
}
done:
return ret;
}
static DWORD
GetFunctionPointer(
IN PWSTR InstallerName,
@@ -6280,10 +6352,29 @@ SetupDiGetDriverInfoDetailW(
BOOL WINAPI
SetupDiChangeState(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData)
IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
{
PSP_PROPCHANGE_PARAMS PropChange;
BOOL ret = FALSE;
TRACE("%p %p\n", DeviceInfoSet, DeviceInfoData);
if (!DeviceInfoData)
PropChange = ((struct DeviceInfoSet *)DeviceInfoSet)->ClassInstallParams.PropChange;
else
PropChange = ((struct DeviceInfoElement *)DeviceInfoData->Reserved)->ClassInstallParams.PropChange;
if (!PropChange)
{
SetLastError(ERROR_INVALID_PARAMETER);
goto done;
}
FIXME("Stub %p %p\n", DeviceInfoSet, DeviceInfoData);
return ERROR_CALL_NOT_IMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
done:
TRACE("Returning %d\n", ret);
return ret;
}
/***********************************************************************
+11
View File
@@ -84,6 +84,11 @@ struct DriverInfoElement /* Element of DeviceInfoSet.DriverListHead and DeviceIn
struct InfFileDetails *InfFileDetails;
};
struct ClassInstallParams
{
PSP_PROPCHANGE_PARAMS PropChange;
};
struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
{
LIST_ENTRY ListEntry;
@@ -130,6 +135,9 @@ struct DeviceInfoElement /* Element of DeviceInfoSet.ListHead */
/* List of interfaces implemented by this device */
LIST_ENTRY InterfaceListHead; /* List of struct DeviceInterface */
/* Used by SetupDiGetClassInstallParamsW/SetupDiSetClassInstallParamsW */
struct ClassInstallParams ClassInstallParams;
WCHAR Data[ANYSIZE_ARRAY];
};
@@ -148,6 +156,9 @@ struct DeviceInfoSet /* HDEVINFO */
LIST_ENTRY ListHead; /* List of struct DeviceInfoElement */
/* Used by SetupDiGetClassInstallParamsW/SetupDiSetClassInstallParamsW */
struct ClassInstallParams ClassInstallParams;
/* Contains the name of the remote computer ('\\COMPUTERNAME' for example),
* or NULL if related to local machine. Points into szData field at the
* end of the structure */