⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remove.c

📁 这也是一个老外的显示方面相关的驱动源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -