X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=dll%2Fwin32%2Fnewdev%2Fnewdev.c;h=960f75212d3bc57ee597f5d08d00a861cbe83f7a;hp=72f5bccaac80b7f1cfa6b557d9ce323016a4259b;hb=731ef01361938138d7566a18955a7fbb77485f52;hpb=66000022832126b73fcc375138769070bea818ac diff --git a/dll/win32/newdev/newdev.c b/dll/win32/newdev/newdev.c index 72f5bccaac8..960f75212d3 100644 --- a/dll/win32/newdev/newdev.c +++ b/dll/win32/newdev/newdev.c @@ -804,14 +804,144 @@ cleanup: return retval; } + +BOOL +WINAPI +InstallDevInstEx( + IN HWND hWndParent, + IN LPCWSTR InstanceId, + IN BOOL bUpdate, + OUT LPDWORD lpReboot, + IN DWORD Unknown) +{ + PDEVINSTDATA DevInstData = NULL; + BOOL ret; + BOOL retval = FALSE; + + TRACE("InstllDevInstEx(%p, %s, %d, %p, %lx)\n", + hWndParent, debugstr_w(InstanceId), bUpdate, lpReboot, Unknown); + + 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 + */ +BOOL +WINAPI +InstallDevInst( + IN HWND hWndParent, + IN LPCWSTR InstanceId, + IN BOOL bUpdate, + OUT LPDWORD lpReboot) +{ + return InstallDevInstEx(hWndParent, InstanceId, bUpdate, lpReboot, 0); +} + + /* * @implemented */ BOOL WINAPI ClientSideInstallW( IN HWND hWndOwner, - IN DWORD dwUnknownFlags, - IN LPWSTR lpNamedPipeName) + IN HINSTANCE hInstance, + IN LPWSTR lpNamedPipeName, + IN INT Show) { BOOL ReturnValue = FALSE; BOOL ShowWizard; @@ -820,6 +950,7 @@ ClientSideInstallW( HANDLE hPipe = INVALID_HANDLE_VALUE; PWSTR DeviceInstance = NULL; PWSTR InstallEventName = NULL; + HANDLE hInstallEvent; /* Open the pipe */ hPipe = CreateFileW(lpNamedPipeName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -870,6 +1001,21 @@ ClientSideInstallW( } ReturnValue = DevInstallW(NULL, NULL, DeviceInstance, ShowWizard ? SW_SHOWNOACTIVATE : SW_HIDE); + if(!ReturnValue) + { + ERR("DevInstallW failed with error %lu\n", GetLastError()); + goto cleanup; + } + + hInstallEvent = CreateEventW(NULL, TRUE, FALSE, InstallEventName); + if(!hInstallEvent) + { + TRACE("CreateEventW('%ls') failed with error %lu\n", InstallEventName, GetLastError()); + goto cleanup; + } + + SetEvent(hInstallEvent); + CloseHandle(hInstallEvent); cleanup: if(hPipe != INVALID_HANDLE_VALUE)