📄 remove.c
字号:
#include <stdio.h>
#include <tchar.h> // Make all functions UNICODE safe.
#include <windows.h>
#include <setupapi.h> // for SetupDiXxx functions.
#include "Shlwapi.h"
BOOL GetHardwareStringData(
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
DWORD Property,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired);
BOOL GetOemInfFileName(
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired);
BOOL GetDeviceServiceName(
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired);
BOOL GetServiceData(
LPCTSTR szServiceName,
LPCTSTR szDataName,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired);
BOOL GetServiceDataEx(
LPCTSTR szServiceName,
LPCTSTR szDataName,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired);
BOOL GetDvcSvcNameByHwId(
HKEY RootKey,
LPCTSTR szHardwareID,
LPTSTR szData,
DWORD dwLength);
BOOL IsNumeric(LPTSTR szData);
int __cdecl _tmain(int argc, _TCHAR **argv, _TCHAR **envp)
{
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
BOOL Found, B_Ret = FALSE;
char szWindir[MAX_PATH] = {'\0'};
char szOemFile[MAX_PATH] = {'\0'};
char szSvcName[MAX_PATH] = {'\0'};
char szDriverImage[MAX_PATH] = {'\0'};
char szHardwareID[MAX_PATH] = {'\0'};
char szTargetFileName[MAX_PATH] = {'\0'};
char szEnumPath[MAX_PATH] = {'\0'};
HKEY EnumRootKey;
//
// Verify input Arguments.
//
if (argc < 2)
{
printf("usage: remove <Hardware_ID>\r\n");
return 1;
}
if (GetEnvironmentVariable(
(LPCTSTR)"windir",
szWindir,
1024) == 0) {
printf("Can't get environment variable : windir\r\n");
return 1;
}
//Build Enum path in registry database
sprintf(
szEnumPath,
"%s",
"SYSTEM\\CurrentControlSet\\Enum");
//
// Create a Device Information Set
// with all present devices
//
DeviceInfoSet = SetupDiGetClassDevs(
NULL, 0, 0,
DIGCF_ALLCLASSES |
DIGCF_PRESENT );
if (DeviceInfoSet == INVALID_HANDLE_VALUE)
{
printf("Failed to build Device \
Information Set\r\n");
return 1;
}
//
// Enumerate through all Devices.
//
DeviceInfoData.cbSize =
sizeof(SP_DEVINFO_DATA);
for (i=0;
SetupDiEnumDeviceInfo(
DeviceInfoSet,i,&DeviceInfoData);i++)
{
BOOL B_OK = FALSE;
DWORD dwSizeRequired;
LPTSTR p = NULL;
//Get Service Name
ZeroMemory(szSvcName, MAX_PATH);
B_OK = GetHardwareStringData(
DeviceInfoSet,
&DeviceInfoData,
SPDRP_SERVICE,
szSvcName,
MAX_PATH,
&dwSizeRequired);
/*
B_OK = GetDeviceServiceName(
DeviceInfoSet,
&DeviceInfoData,
szSvcName,
MAX_PATH,
&dwSizeRequired);
*/
if (B_OK == TRUE)
{
//Get HardwareID
ZeroMemory(szHardwareID, MAX_PATH);
B_OK = GetHardwareStringData(
DeviceInfoSet,
&DeviceInfoData,
SPDRP_HARDWAREID,
szHardwareID,
MAX_PATH,
&dwSizeRequired);
if (B_OK == TRUE)
{
for (p=szHardwareID;*p&&(p<&szHardwareID[dwSizeRequired]);p+=lstrlen(p)+sizeof(char))
{
printf("Compare device ID: [%s]\r\n",p);
if (strcmp(argv[1],p) == 0)
{
printf("Found! [%s]\r\n",p);
Found = TRUE;
/*
//Get Service Name by Hardware ID
RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
(LPCTSTR)szEnumPath,
0,
KEY_READ,
&EnumRootKey);
GetDvcSvcNameByHwId(
EnumRootKey,
argv[1],
szSvcName,
MAX_PATH);
*/
printf("We get the service - %s for Device\r\n", szSvcName);
//Get Service ImagePath
ZeroMemory(szDriverImage, MAX_PATH);
B_OK = GetServiceDataEx(
szSvcName,
(LPCTSTR)"ImagePath",
szDriverImage,
MAX_PATH,
&dwSizeRequired);
printf("Service Binary Image : %s\r\n", szDriverImage);
//Get InfFile Name
ZeroMemory(szOemFile, MAX_PATH);
B_OK = GetOemInfFileName(
DeviceInfoSet,
&DeviceInfoData,
szOemFile,
MAX_PATH,
&dwSizeRequired)|| B_OK;
if (B_OK == TRUE)
{
if (!SetupDiCallClassInstaller(
DIF_REMOVE,
DeviceInfoSet,
&DeviceInfoData))
{
printf("Remove Device & Driver Failed/r/n");
} else {
//Delete oemxx.inf
sprintf(szTargetFileName, "%s\\inf\\%s.inf",
szWindir, szOemFile);
printf("remove %s\r\n", szTargetFileName);
DeleteFile(szTargetFileName);
//Delete oemxx.pnf
sprintf(szTargetFileName, "%s\\inf\\%s.pnf",
szWindir, szOemFile);
printf("remove %s\r\n", szTargetFileName);
DeleteFile(szTargetFileName);
//Delete Driver Image
sprintf(szTargetFileName, "%s\\%s",
szWindir, szDriverImage);
printf("remove %s\r\n", szTargetFileName);
DeleteFile(szTargetFileName);
printf("Remove Device & Driver Completed\r\n");
B_Ret = TRUE;
}
} else {
B_Ret = FALSE;
}
break;
}
}//end for
}
}
if (Found == TRUE)
break;
}
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return B_Ret;
}
BOOL GetHardwareStringData(
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
DWORD Property,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired)
{
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
LPTSTR szHwData = NULL;
BOOL B_Ret = FALSE;
while (!SetupDiGetDeviceRegistryProperty(
DeviceInfoSet,
DeviceInfoData,
Property,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INVALID_DATA)
{
return B_Ret;
break;
}
else if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
if (buffer)
LocalFree(buffer);
buffer = LocalAlloc(
LPTR,buffersize);
} else {
printf("Get Hardware Data Error\r\n");
LocalFree(buffer);
return B_Ret;
}
}
if (dwLength >= buffersize)
{
strcpy (szDATA, buffer);
B_Ret = TRUE;
} else {
B_Ret = FALSE;
}
*dwSizeRequired = buffersize;
LocalFree(buffer);
return B_Ret;
}
BOOL GetOemInfFileName(
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
LPTSTR szDATA,
DWORD dwLength,
PDWORD dwSizeRequired)
{
BOOL B_Ret = FALSE;
HKEY SwKey;
LONG l_Val;
DWORD dwRegType = 0;
SwKey = SetupDiOpenDevRegKey(
DeviceInfoSet,
DeviceInfoData,
DICS_FLAG_GLOBAL,
0,
DIREG_DRV,
KEY_READ);
if (SwKey == INVALID_HANDLE_VALUE)
{
printf("Open Software Key Failed\r\n");
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -