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);
							 | 
						||
| 
								 | 
							
								}
							 |