X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fdll%2Fwin32%2Fnewdev%2Fnewdev.c;h=fe88320a6244c7c8464423c7e68a4dc53960e474;hp=16891769fb9f1705a076b71781e13a06be725325;hb=79aa1013c6ce81de8227a01bf30aef045e178375;hpb=e71f0bb317f5ff3374842fdda70b334f49bcc2d6;ds=sidebyside diff --git a/reactos/dll/win32/newdev/newdev.c b/reactos/dll/win32/newdev/newdev.c index 16891769fb9..fe88320a624 100644 --- a/reactos/dll/win32/newdev/newdev.c +++ b/reactos/dll/win32/newdev/newdev.c @@ -804,6 +804,118 @@ cleanup: return retval; } + +BOOL +WINAPI +InstallDevInst( + IN HWND hWndParent, + IN LPCWSTR InstanceId, + IN BOOL bUpdate, + OUT LPDWORD lpReboot) +{ + PDEVINSTDATA DevInstData = NULL; + BOOL ret; + BOOL retval = FALSE; + + TRACE("InstllDevInst(%p, %s, %d, %p)\n", hWndParent, debugstr_w(InstanceId), bUpdate, lpReboot); + + DevInstData = HeapAlloc(GetProcessHeap(), 0, sizeof(DEVINSTDATA)); + if (!DevInstData) + { + TRACE("HeapAlloc() failed\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + goto cleanup; + } + + /* Clear devinst data */ + ZeroMemory(DevInstData, sizeof(DEVINSTDATA)); + DevInstData->devInfoData.cbSize = 0; /* Tell if the devInfoData is valid */ + DevInstData->bUpdate = bUpdate; + + /* Fill devinst data */ + DevInstData->hDevInfo = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); + if (DevInstData->hDevInfo == INVALID_HANDLE_VALUE) + { + TRACE("SetupDiCreateDeviceInfoListExW() failed with error 0x%x\n", GetLastError()); + goto cleanup; + } + + DevInstData->devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + ret = SetupDiOpenDeviceInfoW( + DevInstData->hDevInfo, + InstanceId, + NULL, + 0, /* Open flags */ + &DevInstData->devInfoData); + if (!ret) + { + TRACE("SetupDiOpenDeviceInfoW() failed with error 0x%x (InstanceId %s)\n", + GetLastError(), debugstr_w(InstanceId)); + DevInstData->devInfoData.cbSize = 0; + goto cleanup; + } + + SetLastError(ERROR_GEN_FAILURE); + ret = SetupDiGetDeviceRegistryProperty( + DevInstData->hDevInfo, + &DevInstData->devInfoData, + SPDRP_DEVICEDESC, + &DevInstData->regDataType, + NULL, 0, + &DevInstData->requiredSize); + + if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER && DevInstData->regDataType == REG_SZ) + { + DevInstData->buffer = HeapAlloc(GetProcessHeap(), 0, DevInstData->requiredSize); + if (!DevInstData->buffer) + { + TRACE("HeapAlloc() failed\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + } + else + { + ret = SetupDiGetDeviceRegistryPropertyW( + DevInstData->hDevInfo, + &DevInstData->devInfoData, + SPDRP_DEVICEDESC, + &DevInstData->regDataType, + DevInstData->buffer, DevInstData->requiredSize, + &DevInstData->requiredSize); + } + } + + if (!ret) + { + TRACE("SetupDiGetDeviceRegistryProperty() failed with error 0x%x (InstanceId %s)\n", + GetLastError(), debugstr_w(InstanceId)); + goto cleanup; + } + + /* Prepare the wizard, and display it */ + TRACE("Need to show install wizard\n"); + retval = DisplayWizard(DevInstData, hWndParent, IDD_WELCOMEPAGE); + +cleanup: + if (DevInstData) + { + if (DevInstData->devInfoData.cbSize != 0) + { + if (!SetupDiDestroyDriverInfoList(DevInstData->hDevInfo, &DevInstData->devInfoData, SPDIT_COMPATDRIVER)) + TRACE("SetupDiDestroyDriverInfoList() failed with error 0x%lx\n", GetLastError()); + } + if (DevInstData->hDevInfo != INVALID_HANDLE_VALUE) + { + if (!SetupDiDestroyDeviceInfoList(DevInstData->hDevInfo)) + TRACE("SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n", GetLastError()); + } + HeapFree(GetProcessHeap(), 0, DevInstData->buffer); + HeapFree(GetProcessHeap(), 0, DevInstData); + } + + return retval; +} + + /* * @implemented */