* refact: win, idd control Signed-off-by: fufesou <shuanglongchen@yeah.net> * refact: win device control, better addr of Signed-off-by: fufesou <shuanglongchen@yeah.net> * refact: simple refact Signed-off-by: fufesou <shuanglongchen@yeah.net> --------- Signed-off-by: fufesou <shuanglongchen@yeah.net>
		
			
				
	
	
		
			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);
 | |
| }
 |