From: Hervé Poussineau Date: Thu, 15 Dec 2005 13:48:26 +0000 (+0000) Subject: Implement SetupDiSetClassInstallParamsW X-Git-Tag: backups/expat-rbuild@40467~920 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=c342b41f06f33bd903ee4706c9b95c30b60900bb Implement SetupDiSetClassInstallParamsW Handle DIF_PROPERTYCHANGE in SetupDiCallClassInstaller Add stub for SetupDiChangeState Rename a label (nextfile -> nextservice) Remove a useless test in DelayedMove svn path=/trunk/; revision=20188 --- diff --git a/reactos/lib/setupapi/devinst.c b/reactos/lib/setupapi/devinst.c index 6bbfabacb9c..9c8a211b90a 100644 --- a/reactos/lib/setupapi/devinst.c +++ b/reactos/lib/setupapi/devinst.c @@ -29,6 +29,7 @@ static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0}; static const WCHAR Class[] = {'C','l','a','s','s',0}; static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0}; static const WCHAR DeviceInstance[] = {'D','e','v','i','c','e','I','n','s','t','a','n','c','e',0}; +static const WCHAR InterfaceInstall32[] = {'I','n','t','e','r','f','a','c','e','I','n','s','t','a','l','l','3','2',0}; static const WCHAR NoDisplayClass[] = {'N','o','D','i','s','p','l','a','y','C','l','a','s','s',0}; static const WCHAR NoInstallClass[] = {'N','o','I','s','t','a','l','l','C','l','a','s','s',0}; static const WCHAR NoUseClass[] = {'N','o','U','s','e','C','l','a','s','s',0}; @@ -77,6 +78,12 @@ typedef BOOL IN PSP_PROPSHEETPAGE_REQUEST PropPageRequest, IN LPFNADDPROPSHEETPAGE fAddFunc, IN LPARAM lParam); +typedef BOOL +(CALLBACK* UPDATE_CLASS_PARAM_HANDLER) ( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, + IN DWORD ClassInstallParamsSize); struct CoInstallerElement { @@ -88,6 +95,51 @@ struct CoInstallerElement PVOID PrivateData; }; +static UPDATE_CLASS_PARAM_HANDLER UpdateClassInstallParamHandlers[] = { + NULL, /* DIF_SELECTDEVICE */ + NULL, /* DIF_INSTALLDEVICE */ + NULL, /* DIF_ASSIGNRESOURCES */ + NULL, /* DIF_PROPERTIES */ + NULL, /* DIF_REMOVE */ + NULL, /* DIF_FIRSTTIMESETUP */ + NULL, /* DIF_FOUNDDEVICE */ + NULL, /* DIF_SELECTCLASSDRIVERS */ + NULL, /* DIF_VALIDATECLASSDRIVERS */ + NULL, /* DIF_INSTALLCLASSDRIVERS */ + NULL, /* DIF_CALCDISKSPACE */ + NULL, /* DIF_DESTROYPRIVATEDATA */ + NULL, /* DIF_VALIDATEDRIVER */ + NULL, /* DIF_MOVEDEVICE */ + NULL, /* DIF_DETECT */ + NULL, /* DIF_INSTALLWIZARD */ + NULL, /* DIF_DESTROYWIZARDDATA */ + NULL, /* DIF_PROPERTYCHANGE */ + NULL, /* DIF_ENABLECLASS */ + NULL, /* DIF_DETECTVERIFY */ + 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 */ +}; + /*********************************************************************** * SetupDiBuildClassInfoList (SETUPAPI.@) */ @@ -2752,7 +2804,7 @@ BOOL WINAPI SetupDiSetDeviceRegistryPropertyW( SetLastError(ERROR_INVALID_HANDLE); else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC) SetLastError(ERROR_INVALID_HANDLE); - else if (DeviceInfoData) + else if (!DeviceInfoData) SetLastError(ERROR_INVALID_HANDLE); else if (DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)) SetLastError(ERROR_INVALID_USER_BUFFER); @@ -3042,7 +3094,7 @@ BOOL WINAPI SetupDiInstallClassW( INVALID_HANDLE_VALUE, NULL); - /* FIXME: More code! */ + /* FIXME: Process InterfaceInstall32 section */ if (bFileQueueCreated) SetupCloseFileQueue(FileQueue); @@ -3260,14 +3312,72 @@ BOOL WINAPI SetupDiSetClassInstallParamsA( * SetupDiSetClassInstallParamsW (SETUPAPI.@) */ BOOL WINAPI SetupDiSetClassInstallParamsW( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - PSP_CLASSINSTALL_HEADER ClassInstallParams, - DWORD ClassInstallParamsSize) + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL, + IN PSP_CLASSINSTALL_HEADER ClassInstallParams OPTIONAL, + IN DWORD ClassInstallParamsSize) { - FIXME("%p %p %x %lu\n",DeviceInfoSet, DeviceInfoData, - ClassInstallParams->InstallFunction, ClassInstallParamsSize); - return FALSE; + struct DeviceInfoSet *list; + BOOL ret = FALSE; + + TRACE("%p %p %p %lu\n", DeviceInfoSet, DeviceInfoData, + ClassInstallParams, ClassInstallParamsSize); + + if (!DeviceInfoSet) + SetLastError(ERROR_INVALID_PARAMETER); + else if (DeviceInfoSet == (HDEVINFO)INVALID_HANDLE_VALUE) + SetLastError(ERROR_INVALID_HANDLE); + else if ((list = (struct DeviceInfoSet *)DeviceInfoSet)->magic != SETUP_DEV_INFO_SET_MAGIC) + SetLastError(ERROR_INVALID_HANDLE); + else if (DeviceInfoData && DeviceInfoData->cbSize != sizeof(SP_DEVINFO_DATA)) + SetLastError(ERROR_INVALID_USER_BUFFER); + else if (ClassInstallParams && ClassInstallParams->cbSize != sizeof(SP_CLASSINSTALL_HEADER)) + SetLastError(ERROR_INVALID_USER_BUFFER); + else if (ClassInstallParams && ClassInstallParamsSize < sizeof(SP_CLASSINSTALL_HEADER)) + SetLastError(ERROR_INVALID_PARAMETER); + else if (!ClassInstallParams && ClassInstallParamsSize != 0) + SetLastError(ERROR_INVALID_PARAMETER); + else + { + SP_DEVINSTALL_PARAMS_W InstallParams; + BOOL Result; + + InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS); + Result = SetupDiGetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams); + if (!Result) + goto done; + + if (ClassInstallParams) + { + /* Check parameters in ClassInstallParams */ + if (ClassInstallParams->InstallFunction < DIF_SELECTDEVICE + || ClassInstallParams->InstallFunction - DIF_SELECTDEVICE >= sizeof(UpdateClassInstallParamHandlers)/sizeof(UpdateClassInstallParamHandlers[0])) + { + SetLastError(ERROR_INVALID_USER_BUFFER); + goto done; + } + else if (UpdateClassInstallParamHandlers[ClassInstallParams->InstallFunction - DIF_SELECTDEVICE] == NULL) + { + FIXME("InstallFunction code is valid, but no associated update handler\n"); + 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 + { + InstallParams.Flags &= ~DI_CLASSINSTALLPARAMS; + } + + ret = SetupDiSetDeviceInstallParamsW(DeviceInfoSet, DeviceInfoData, &InstallParams); + } + +done: + TRACE("Returning %d\n", ret); + return ret; } static DWORD @@ -3404,6 +3514,10 @@ BOOL WINAPI SetupDiCallClassInstaller( case DIF_NEWDEVICEWIZARD_PREANALYZE: CanHandle = CLASS_COINSTALLER | CLASS_INSTALLER; break; + case DIF_PROPERTYCHANGE: + CanHandle = CLASS_COINSTALLER | DEVICE_COINSTALLER | CLASS_INSTALLER; + DefaultHandler = SetupDiChangeState; + break; case DIF_REGISTER_COINSTALLERS: CanHandle = CLASS_COINSTALLER | CLASS_INSTALLER; DefaultHandler = SetupDiRegisterCoDeviceInstallers; @@ -6160,6 +6274,18 @@ SetupDiGetDriverInfoDetailW( return ret; } +/*********************************************************************** + * SetupDiChangeState (SETUPAPI.@) + */ +BOOL WINAPI +SetupDiChangeState( + IN HDEVINFO DeviceInfoSet, + IN PSP_DEVINFO_DATA DeviceInfoData) +{ + FIXME("Stub %p %p\n", DeviceInfoSet, DeviceInfoData); + return ERROR_CALL_NOT_IMPLEMENTED; +} + /*********************************************************************** * SetupDiSelectBestCompatDrv (SETUPAPI.@) */ @@ -6611,7 +6737,7 @@ SetupDiInstallDevice( NULL, 0, &RequiredSize); if (!Result) - goto nextfile; + goto nextservice; if (RequiredSize > 0) { /* We got the needed size for the buffer */ @@ -6619,7 +6745,7 @@ SetupDiInstallDevice( if (!ServiceName) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); - goto nextfile; + goto nextservice; } Result = SetupGetStringFieldW( &ContextService, @@ -6627,7 +6753,7 @@ SetupDiInstallDevice( ServiceName, RequiredSize, &RequiredSize); if (!Result) - goto nextfile; + goto nextservice; } Result = SetupGetIntField( &ContextService, @@ -6653,7 +6779,7 @@ SetupDiInstallDevice( Result = TRUE; } else - goto nextfile; + goto nextservice; } if (RequiredSize > 0) { @@ -6662,7 +6788,7 @@ SetupDiInstallDevice( if (!ServiceSection) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); - goto nextfile; + goto nextservice; } Result = SetupGetStringFieldW( &ContextService, @@ -6670,7 +6796,7 @@ SetupDiInstallDevice( ServiceSection, RequiredSize, &RequiredSize); if (!Result) - goto nextfile; + goto nextservice; SetLastError(ERROR_SUCCESS); Result = SetupInstallServicesFromInfSectionExW( @@ -6684,7 +6810,7 @@ SetupDiInstallDevice( if (GetLastError() == ERROR_SUCCESS_REBOOT_REQUIRED) RebootRequired = TRUE; } -nextfile: +nextservice: HeapFree(GetProcessHeap(), 0, ServiceName); HeapFree(GetProcessHeap(), 0, ServiceSection); if (!Result) diff --git a/reactos/lib/setupapi/misc.c b/reactos/lib/setupapi/misc.c index 2d303004774..76cbac68d2f 100644 --- a/reactos/lib/setupapi/misc.c +++ b/reactos/lib/setupapi/misc.c @@ -467,12 +467,6 @@ BOOL WINAPI EnablePrivilege(LPCWSTR lpPrivilegeName, BOOL bEnable) */ BOOL WINAPI DelayedMove(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) { - if (OsVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT) - { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; - } - return MoveFileExW(lpExistingFileName, lpNewFileName, MOVEFILE_REPLACE_EXISTING | MOVEFILE_DELAY_UNTIL_REBOOT); } diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec index 105a02e5ab8..e7b3d58ecdb 100644 --- a/reactos/lib/setupapi/setupapi.spec +++ b/reactos/lib/setupapi/setupapi.spec @@ -272,7 +272,7 @@ @ stdcall SetupDiBuildDriverInfoList(long ptr long) @ stdcall SetupDiCallClassInstaller(long ptr ptr) @ stub SetupDiCancelDriverInfoSearch -@ stub SetupDiChangeState +@ stdcall SetupDiChangeState(ptr ptr) @ stdcall SetupDiClassGuidsFromNameA(str ptr long ptr) @ stdcall SetupDiClassGuidsFromNameExA(str ptr long ptr str ptr) @ stdcall SetupDiClassGuidsFromNameExW(wstr ptr long ptr wstr ptr)