mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-30 08:47:53 +08:00
85 lines
2.9 KiB
C++
85 lines
2.9 KiB
C++
|
#include "pch.h"
|
||
|
|
||
|
#include <Windows.h>
|
||
|
#include <setupapi.h>
|
||
|
#include <devguid.h>
|
||
|
#include <cfgmgr32.h>
|
||
|
|
||
|
#pragma comment(lib, "SetupAPI.lib")
|
||
|
|
||
|
|
||
|
void UninstallDriver(LPCWSTR hardwareId, BOOL &rebootRequired)
|
||
|
{
|
||
|
HDEVINFO deviceInfoSet = SetupDiGetClassDevsW(&GUID_DEVCLASS_DISPLAY, NULL, NULL, DIGCF_PRESENT);
|
||
|
if (deviceInfoSet == INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
WcaLog(LOGMSG_STANDARD, "Failed to get device information set, last error: %d", GetLastError());
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
SP_DEVINFO_LIST_DETAIL_DATA devInfoListDetail;
|
||
|
devInfoListDetail.cbSize = sizeof(SP_DEVINFO_LIST_DETAIL_DATA);
|
||
|
if (!SetupDiGetDeviceInfoListDetailW(deviceInfoSet, &devInfoListDetail))
|
||
|
{
|
||
|
SetupDiDestroyDeviceInfoList(deviceInfoSet);
|
||
|
WcaLog(LOGMSG_STANDARD, "Failed to call SetupDiGetDeviceInfoListDetail, last error: %d", GetLastError());
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
SP_DEVINFO_DATA deviceInfoData;
|
||
|
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||
|
|
||
|
DWORD dataType;
|
||
|
WCHAR deviceId[MAX_DEVICE_ID_LEN] = { 0, };
|
||
|
|
||
|
DWORD deviceIndex = 0;
|
||
|
while (SetupDiEnumDeviceInfo(deviceInfoSet, deviceIndex, &deviceInfoData))
|
||
|
{
|
||
|
if (!SetupDiGetDeviceRegistryPropertyW(deviceInfoSet, &deviceInfoData, SPDRP_HARDWAREID, &dataType, (PBYTE)deviceId, MAX_DEVICE_ID_LEN, NULL))
|
||
|
{
|
||
|
WcaLog(LOGMSG_STANDARD, "Failed to get hardware id, last error: %d", GetLastError());
|
||
|
deviceIndex++;
|
||
|
continue;
|
||
|
}
|
||
|
if (wcscmp(deviceId, hardwareId) != 0)
|
||
|
{
|
||
|
deviceIndex++;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
SP_REMOVEDEVICE_PARAMS remove_device_params;
|
||
|
remove_device_params.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
|
||
|
remove_device_params.ClassInstallHeader.InstallFunction = DIF_REMOVE;
|
||
|
remove_device_params.Scope = DI_REMOVEDEVICE_GLOBAL;
|
||
|
remove_device_params.HwProfile = 0;
|
||
|
|
||
|
if (!SetupDiSetClassInstallParamsW(deviceInfoSet, &deviceInfoData, &remove_device_params.ClassInstallHeader, sizeof(SP_REMOVEDEVICE_PARAMS)))
|
||
|
{
|
||
|
WcaLog(LOGMSG_STANDARD, "Failed to set class install params, last error: %d", GetLastError());
|
||
|
deviceIndex++;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (!SetupDiCallClassInstaller(DIF_REMOVE, deviceInfoSet, &deviceInfoData))
|
||
|
{
|
||
|
WcaLog(LOGMSG_STANDARD, "ailed to uninstall driver, last error: %d", GetLastError());
|
||
|
deviceIndex++;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
SP_DEVINSTALL_PARAMS deviceParams;
|
||
|
if (SetupDiGetDeviceInstallParamsW(deviceInfoSet, &deviceInfoData, &deviceParams))
|
||
|
{
|
||
|
if (deviceParams.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT))
|
||
|
{
|
||
|
rebootRequired = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
WcaLog(LOGMSG_STANDARD, "Driver uninstalled successfully");
|
||
|
deviceIndex++;
|
||
|
}
|
||
|
|
||
|
SetupDiDestroyDeviceInfoList(deviceInfoSet);
|
||
|
}
|