• 用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]


      1 // InstallWDFDriver.cpp : Defines the entry point for the console application.
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "Shlwapi.h"
      6 
      7 #pragma  comment(lib,"Shlwapi.lib")
      8 #pragma comment (lib,"setupapi.lib")
      9 #pragma comment(lib, "newdev.lib")  
     10 /////////////////////////////////////////////////////////////////////////////////////
     11 
     12 BOOL IsDeviceInstallInProgress(VOID);
     13 int RemoveDriver(_TCHAR *HardwareID);
     14 VOID UninstallWDMDriver(LPCTSTR theHardware);
     15 BOOL UnicodeToAnsi(LPCWSTR Source, const WORD wLen, LPSTR Destination, const WORD sLen);
     16 BOOL AnsiToUnicode(LPCSTR Source, const WORD sLen, LPWSTR Destination, const WORD wLen);
     17 BOOL GetINFData(FILE *pFile);
     18 VOID FindComma(LPSTR szData);
     19 BOOL GetSectionData(FILE* pFile, const char* szKey, const char bIsVender);
     20 BOOL IsInstalled();
     21 BOOL InstallClassDriver(LPCTSTR theINFName);
     22 BOOL StartInstallWDMDriver(LPCTSTR theInfName) ;
     23 
     24 BOOL FindExistingDevice(IN LPTSTR HardwareId);
     25 
     26 VOID InitialGlobalVar();
     27 
     28 
     29 //////////////////////////////////////////////////////////////////////////////
     30 
     31 WORD g_wVender = 0;  
     32 WORD g_wHardware = 0;  
     33 TCHAR g_strVender[20][64] = {0};  
     34 TCHAR g_strHardware[20][64] = {0};  
     35 TCHAR g_strHID[MAX_PATH+1] = {0};  
     36 /////////////////////////////////////////////////////////////////////////////
     37 
     38 int _tmain(int argc, _TCHAR* argv[])
     39 {
     40     WCHAR Wlp_USB_PATH[] = L"C:\Windows\System32\drivers\WLP_USB_Driver.sys";
     41     WCHAR New_Inf_Path[] = L"D:\wlp driver\WDF Driver _new\win7\x64\cyusb3.inf";
     42     CHAR szInfPath[215] = {0}; 
     43     FILE *fp = NULL;
     44 
     45 
     46     printf("This Process is Driver Installtion Program...
    ");
     47 
     48     if(PathFileExists(Wlp_USB_PATH))
     49     {
     50        printf("Exists WLP_USB_Driver.sys!
    ");
     51        
     52       UninstallWDMDriver(L"USB\VID_0451&PID_AF32&REV_0000");
     53 
     54       
     55        
     56        if(DeleteFile(L"C:\Windows\System32\drivers\WLP_USB_Driver.sys"))
     57        {
     58            printf("WLP_USB_Driver.sys File has Deleted!
    ");
     59        }
     60 
     61       /* if(FindExistingDevice(L"USB\VID_0451&PID_AF32&REV_0000"))
     62        {
     63           printf("找打了!
    ");
     64 
     65           getch();
     66        }
     67        else
     68        {
     69            printf("没找到!
    ");
     70            getch();
     71        }*/
     72        
     73        printf("Get Started Install the New DLF Driver...
    ");
     74 
     75       //  RemoveDriver(L"USB\VID_0451&PID_AF32&REV_0000");
     76        while(IsDeviceInstallInProgress())
     77        {
     78          printf("Has Driver Installtion Program is Processing!
    ");
     79        }
     80 
     81        printf("Get Started analyse inf File!
    ");
     82 
     83        UnicodeToAnsi(New_Inf_Path, _tcslen(New_Inf_Path), szInfPath, 215); 
     84 
     85        if ((fopen_s(&fp, szInfPath, "r"))!=0)  
     86        {  
     87            _tprintf(_T("can not open file %s
    "), New_Inf_Path);  
     88            return 0;  
     89        }  
     90 
     91        GetINFData(fp);  
     92        fclose(fp);  
     93 
     94        // 安装WDM驱动  
     95 
     96        if (StartInstallWDMDriver(New_Inf_Path) == FALSE)  
     97        {  
     98            _tprintf(_T("Start Install WDF Driver failed
    ")); 
     99            getch();
    100            return 0;  
    101        }  
    102 
    103        //if(CopyFile(L"D:\wlp driver\WDF Driver _new\win7\x64\cyusb3.sys",L"C:\Windows\System32\drivers\cyusb3.sys",TRUE))
    104          //  printf("New DLF Driver successed!
    ");
    105        getch();
    106        
    107 
    108     }
    109     else
    110     {
    111        printf("No Exists WLP_USB_Driver.sys!
    ");
    112 
    113        printf("Get Started Install the New DLF Driver...
    ");
    114 
    115       // RemoveDriver(L"USB\VID_0451&PID_AF32&REV_0000");
    116        //while(IsDeviceInstallInProgress())
    117        //{
    118          //  printf("Has Driver Installtion Program is Processing!
    ");
    119        //}
    120 
    121       printf("Get Started analyse inf File!
    ");
    122 
    123       UnicodeToAnsi(New_Inf_Path, _tcslen(New_Inf_Path), szInfPath, 215); 
    124        
    125       if ((fopen_s(&fp, szInfPath, "r"))!=0)  
    126       {  
    127           _tprintf(_T("can not open file %s
    "), New_Inf_Path);  
    128           return 0;  
    129       }  
    130 
    131       GetINFData(fp);  
    132       fclose(fp);  
    133 
    134       // 安装WDM驱动  
    135       
    136           if (StartInstallWDMDriver(New_Inf_Path) == FALSE)  
    137           {  
    138               _tprintf(_T("Start Install WDF Driver failed
    ")); 
    139               getch();
    140               return 0;  
    141           }  
    142           
    143          // if(CopyFile(L"D:\wlp driver\WDF Driver _new\win7\x64\cyusb3.sys",L"C:\Windows\System32\drivers\cyusb3.sys",TRUE))
    144            // printf("New DLF Driver successed!
    ");
    145           getch();
    146 
    147 
    148     }
    149 
    150     return 0;
    151 }
    152 
    153 
    154 
    155 BOOL IsDeviceInstallInProgress (VOID)
    156 {
    157     return !(CM_WaitNoPendingInstallEvents(0) == WAIT_OBJECT_0);
    158 }
    159 
    160 int RemoveDriver(_TCHAR *HardwareID)
    161 {
    162     HDEVINFO DeviceInfoSet;
    163     SP_DEVINFO_DATA DeviceInfoData;
    164     DWORD i,err;
    165     //GUID devGUID ={36fc9e60-c465-11cf-8056-444553540000};
    166 
    167     DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
    168         0,
    169         0,
    170         DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system
    171 
    172     if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    173     {
    174         printf("GetClassDevs(All Present Devices)
    ");
    175         return 1;
    176     }
    177 
    178     //
    179     //  Enumerate through all Devices.
    180     //
    181     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    182     for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)
    183     {
    184         DWORD DataT;
    185         LPTSTR p,buffer = NULL;
    186         DWORD buffersize = 0;
    187 
    188         //
    189         // We won't know the size of the HardwareID buffer until we call
    190         // this function. So call it with a null to begin with, and then
    191         // use the required buffer size to Alloc the nessicary space.
    192         // Keep calling we have success or an unknown failure.
    193         //
    194         while (!SetupDiGetDeviceRegistryProperty(
    195             DeviceInfoSet,
    196             &DeviceInfoData,
    197             SPDRP_HARDWAREID,
    198             &DataT,
    199             (PBYTE)buffer,
    200             buffersize,
    201             &buffersize))
    202         {
    203             if (GetLastError() == ERROR_INVALID_DATA)
    204             {
    205                 //
    206                 // May be a Legacy Device with no HardwareID. Continue.
    207                 //
    208                 break;
    209             }
    210             else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    211             {
    212                 //
    213                 // We need to change the buffer size.
    214                 //
    215                 if (buffer)
    216                     LocalFree(buffer);
    217                 buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
    218             }
    219             else
    220             {
    221                 //
    222                 // Unknown Failure.
    223                 //
    224                 printf("GetDeviceRegistryProperty");
    225                 goto cleanup_DeviceInfo;
    226             }
    227         }
    228 
    229         if (GetLastError() == ERROR_INVALID_DATA)
    230             continue;
    231 
    232         //
    233         // Compare each entry in the buffer multi-sz list with our HardwareID.
    234 
    235 
    236         //
    237         for (p = buffer; *p && (p < &buffer[buffersize]);p+=lstrlen(p)*sizeof(TCHAR) + 2)
    238 
    239 
    240         {
    241             //_tprintf(TEXT("Compare device ID: [%s]/n"),p);
    242 
    243             if (!_tcscmp(HardwareID,p))
    244             {
    245                 //_tprintf(TEXT("Found! [%s]/n"),p);
    246 
    247                 //
    248                 // Worker function to remove device.
    249                 //
    250                 //if (SetupDiCallClassInstaller(DIF_REMOVE,
    251                 //    DeviceInfoSet,
    252                 //    &DeviceInfoData))
    253                     
    254                 if (SetupDiRemoveDevice(DeviceInfoSet, &DeviceInfoData))
    255                 
    256                 
    257                 {
    258                     printf("CallClassInstaller(REMOVE)
    ");
    259                 }
    260                 else
    261                     printf("Remove Driver Fail
    ");
    262                 break;
    263             }
    264 
    265             //printf("TTTTTTTTTTTTTTTTT is %s
    ",p);
    266             //getch();
    267         }
    268 
    269         if (buffer) LocalFree(buffer);
    270     }
    271 
    272     if ((GetLastError()!=NO_ERROR)&&(GetLastError()!=ERROR_NO_MORE_ITEMS))
    273     {
    274         printf("EnumDeviceInfo
    ");
    275     }
    276 
    277     //
    278     //  Cleanup.
    279     //
    280 cleanup_DeviceInfo:
    281     err = GetLastError();
    282     SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    283 
    284     return err;
    285 }
    286 
    287 VOID UninstallWDMDriver(LPCTSTR theHardware) 
    288 {
    289 SP_DEVINFO_DATA spDevInfoData = {0};  
    290 HDEVINFO hDevInfo = 0L;  
    291 WORD wIdx, wCount = 0;  
    292 
    293 //得到设备信息结构的句柄  
    294 hDevInfo = SetupDiGetClassDevs(0L, 0L, 0L, DIGCF_ALLCLASSES | DIGCF_PRESENT);  
    295 if (hDevInfo == INVALID_HANDLE_VALUE)  
    296 {  
    297     printf("Fail!
    "); 
    298     return;  
    299 }  
    300 
    301 wIdx = 0;  
    302 while (TRUE)  
    303 {  
    304     spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
    305     //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
    306     if (SetupDiEnumDeviceInfo(hDevInfo, wIdx, &spDevInfoData))  
    307     {  
    308         char Buffer[2048] = {0};  
    309 
    310         //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
    311         if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID,  
    312             0L, (PBYTE)Buffer, 2048, 0L))  
    313         {  
    314             if (!_tcscmp(theHardware, (LPTSTR)Buffer))  
    315             {  
    316                 //从系统中删除一个注册的设备接口  
    317                 if (!SetupDiRemoveDevice(hDevInfo, &spDevInfoData))  
    318                     printf("Remove Fail is %d!
    ",GetLastError());            
    319                 wCount++;  
    320             }  
    321         }  
    322     }  
    323     else  
    324         break;  
    325     wIdx++;  
    326 }  
    327 
    328 if (wCount != 0)  
    329 _tprintf(_T("UnInstall Successed...
    ")); 
    330 
    331 
    332 
    333 
    334 //销毁一个设备信息集合  
    335 SetupDiDestroyDeviceInfoList(hDevInfo);  
    336 //InitialGlobalVar();  
    337 return;  
    338 }
    339 
    340 BOOL UnicodeToAnsi(LPCWSTR Source, const WORD wLen, LPSTR Destination, const WORD sLen)  
    341 {  
    342     return WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, Source, wLen, Destination, 
    343         sLen, 0L, 0L);  
    344 }  
    345 
    346 BOOL AnsiToUnicode(LPCSTR Source, const WORD sLen, LPWSTR Destination, const WORD wLen)  
    347 {  
    348     return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Source, sLen, Destination, wLen);  
    349 }  
    350 
    351 
    352 BOOL GetINFData(FILE *pFile)  
    353 {  
    354     WORD wLoop;  
    355 
    356     if (!g_wVender || !g_wHardware)  
    357         InitialGlobalVar();  
    358     if (GetSectionData(pFile, "[Manufacturer]", TRUE) == FALSE)  
    359         return FALSE;  
    360 
    361     for (wLoop = 0; wLoop < g_wVender; wLoop++)  
    362     {  
    363         CHAR szVender[64] = {0};  
    364         UnicodeToAnsi(g_strVender[wLoop], _tcslen(g_strVender[wLoop]), szVender, 64);  
    365         GetSectionData(pFile, szVender, FALSE);  
    366     }  
    367     if (g_wHardware != 0)  
    368     {  
    369         if (IsInstalled() == TRUE)//如果已经安装  
    370             return FALSE;  
    371         else  
    372             return TRUE;  
    373     }  
    374     return FALSE;  
    375 }  
    376 
    377  VOID InitialGlobalVar()  
    378 {  
    379     WORD wLoop;  
    380 
    381     g_wVender = g_wHardware = 0;  
    382     for (wLoop = 0; wLoop < 20; wLoop++)  
    383     {  
    384         RtlZeroMemory(g_strVender[wLoop], sizeof(TCHAR)*64);  
    385         RtlZeroMemory(g_strHardware[wLoop], sizeof(TCHAR)*64);  
    386     }  
    387 }  
    388 
    389  VOID FindComma(LPSTR szData)  
    390  {  
    391      WORD wLen = (WORD)strlen(szData);  
    392      WORD wIdx;  
    393      WORD wLoop;   
    394      CHAR szTmp[128] = {0};  
    395 
    396      for (wIdx = 0, wLoop = 0; wLoop < wLen; wLoop++)  
    397      {  
    398          if (szData[wLoop] == ',')  
    399              szData[wLoop] = '.';  
    400          else if (szData[wLoop] == ' ')  
    401              continue;  
    402          szTmp[wIdx++] = szData[wLoop];  
    403      }  
    404      memcpy(szData, szTmp, wIdx*sizeof(char));  
    405      szData[wIdx] = 0;  
    406  }  
    407 
    408  VOID StrLTrim(LPSTR szData)  
    409  {  
    410      LPSTR ptr = szData;  
    411      //判断是否为空格  
    412      while (isspace(*ptr))  
    413          ptr++;  
    414 
    415      if (strcmp(ptr, szData))  
    416      {  
    417          WORD wLen = (WORD)(strlen(szData) - (ptr - szData));  
    418          memmove(szData, ptr, (wLen+1)*sizeof(char));  
    419      }  
    420  }  
    421 
    422  VOID StrRTrim(LPSTR szData)  
    423  {  
    424      LPSTR ptr  = szData;  
    425      LPSTR pTmp = NULL;  
    426 
    427      //debug模式下 使用isspace判断中文 需要设置编码  
    428 #if defined(WIN32) && defined(_DEBUG)  
    429      char* locale = setlocale( LC_ALL, ".OCP" );  
    430 #endif   
    431 
    432      while (*ptr != 0)  
    433      {  
    434          //判断是否为空格  
    435          if (isspace(*ptr))  
    436          {  
    437              if (!pTmp)  
    438                  pTmp = ptr;  
    439          }  
    440          else  
    441              pTmp = NULL;  
    442          ptr++;  
    443      }  
    444 
    445      if (pTmp)  
    446      {  
    447          *pTmp = 0;  
    448          memmove(szData, szData, strlen(szData) - strlen(pTmp));  
    449      }  
    450  }  
    451 
    452  //从字符串右边开始截取字符串  
    453  VOID StrRight(LPSTR szData, WORD wCount)  
    454  {  
    455      WORD wLen = (WORD)strlen(szData) - wCount;  
    456 
    457      if (wCount > 0x7FFF)//负数  
    458          wCount = 0;  
    459      if (wCount >= (WORD)strlen(szData))  
    460          return;  
    461 
    462      memmove(szData, szData + wLen, wCount * sizeof(char));  
    463      szData[wCount] = 0;  
    464  }  
    465 
    466  VOID ConvertGUIDToString(const GUID guid, LPSTR pData)  
    467  {  
    468      CHAR szData[30] = {0};  
    469      CHAR szTmp[3]   = {0};  
    470      WORD wLoop;  
    471 
    472      sprintf_s(pData, _countof(szData), "%04X-%02X-%02X-", guid.Data1, guid.Data2, guid.Data3);  
    473      for (wLoop = 0; wLoop < 8; wLoop++)  
    474      {  
    475          if (wLoop == 2)  
    476              strcat_s(szData, "-");  
    477          sprintf_s(szTmp, _countof(szTmp), "%02X", guid.Data4[wLoop]);  
    478          strcat_s(szData, szTmp);  
    479      }  
    480 
    481      memcpy(pData + strlen(pData), szData, strlen(szData));  
    482  }  
    483 
    484 BOOL IsInstalled()  
    485  {  
    486      HDEVINFO hDevInfo = 0L;  
    487      SP_DEVINFO_DATA spDevInfoData = {0L};  
    488      WORD wIdx;  
    489      BOOL bIsFound;  
    490 
    491      //得到设备信息结构的句柄  
    492      hDevInfo = SetupDiGetClassDevs(0L, 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);  
    493      if (hDevInfo == INVALID_HANDLE_VALUE)  
    494      {  
    495          printf("SetupDiGetClassDevs is %d",GetLastError());  
    496          return FALSE;  
    497      }  
    498 
    499      spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
    500      wIdx = 0;  
    501      bIsFound = 0;  
    502      while (++wIdx)  
    503      {  
    504          //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
    505          if (SetupDiEnumDeviceInfo(hDevInfo, wIdx, &spDevInfoData))  
    506          {  
    507              LPTSTR ptr;  
    508              LPBYTE pBuffer = NULL;  
    509              DWORD dwData  = 0L;  
    510              DWORD dwRetVal;  
    511              DWORD dwBufSize = 0L;  
    512 
    513              while (TRUE)  
    514              {  
    515                  //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
    516                  dwRetVal = SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID,  
    517                      &dwData, (PBYTE)pBuffer, dwBufSize, &dwBufSize);  
    518                  if (!dwRetVal)  
    519                      dwRetVal = GetLastError();  
    520                  else  
    521                      break;  
    522                  if (dwRetVal == ERROR_INVALID_DATA)  
    523                      break;  
    524                  else if (dwRetVal == ERROR_INSUFFICIENT_BUFFER)  
    525                  {  
    526                      if (pBuffer)  
    527                          LocalFree(pBuffer);  
    528                      pBuffer = (LPBYTE)LocalAlloc(LPTR, dwBufSize);  
    529                  }  
    530                  else  
    531                  {  
    532                     printf("SetupDiGetDeviceRegistryProperty is %d",dwRetVal);  
    533                      //销毁一个设备信息集合  
    534                      SetupDiDestroyDeviceInfoList(hDevInfo);  
    535                      return FALSE;  
    536                  }  
    537              }  
    538 
    539              if (dwRetVal == ERROR_INVALID_DATA)   
    540                  continue;  
    541 
    542              for (ptr = (LPTSTR)pBuffer; *ptr && (ptr < (LPTSTR)&pBuffer[dwBufSize]); ptr += _tcslen(ptr) + sizeof(TCHAR))  
    543              {  
    544                  WORD wLoop;  
    545 
    546                  for (wLoop = 0; wLoop < g_wHardware; wLoop++)  
    547                  {  
    548                      if (!_tcscmp(g_strHardware[wLoop], ptr))  
    549                      {  
    550                          bIsFound = TRUE;  
    551                          break;  
    552                      }  
    553                  }  
    554              }  
    555              if (pBuffer)  
    556                  LocalFree(pBuffer);  
    557              if (bIsFound)  
    558                  break;  
    559          }  
    560      }  
    561      //销毁一个设备信息集合  
    562      SetupDiDestroyDeviceInfoList(hDevInfo);  
    563      return bIsFound;  
    564  }  
    565 
    566  //寻找指定的节名 如果找到返回TRUE 反之返回FALSE  
    567  BOOL FindSectionName(FILE *pFile, const char *szKey)  
    568  {  
    569      char szData[256] = {0};  
    570 
    571      if (!pFile)  
    572          return FALSE;  
    573 
    574      //将文件内部的位置指针重新指向一个流(数据流/文件)的开头  
    575      rewind(pFile);  
    576      //循环读取文件内容  
    577      while (!feof(pFile))  
    578      {  
    579          //读取一行  
    580          fgets(szData, 255, pFile);  
    581          //去除前后空格  
    582          StrLTrim(szData);  
    583          StrRTrim(szData);  
    584 
    585          if (strcmp(szKey, szData) == 0)  
    586              return TRUE;          
    587      }  
    588      return FALSE;  
    589  }  
    590 
    591  //得到INF文件中节的数量  
    592  BOOL GetSectionData(FILE* pFile, const char* szKey, const char bIsVender)  
    593  {  
    594      char szData[128] = {0};  
    595 
    596      if (bIsVender)  
    597          strcpy_s(szData, szKey);  
    598      else  
    599          sprintf_s(szData, _countof(szData), "[%s]", szKey);  
    600 
    601      if (FindSectionName(pFile, szData) == FALSE)  
    602          return FALSE;  
    603 
    604      RtlZeroMemory(szData, sizeof(char)*128);  
    605      while (!feof(pFile))  
    606      {  
    607          char *str = NULL;  
    608          fgets(szData, 127, pFile);  
    609          szData[strlen(szData)-1] = 0;  
    610          StrLTrim(szData);  
    611          StrRTrim(szData);  
    612          if (!*szData)  
    613              continue;  
    614          if (szData[0] == ';')  
    615              continue;  
    616 
    617          if (strchr(szData, '['))  
    618          {  
    619              StrLTrim(szData);  
    620              if (szData[0] != ';')  
    621                  return 1;  
    622              else  
    623                  continue;  
    624          }  
    625 
    626          if (bIsVender)  
    627              str = strchr(szData, '=');  
    628          else  
    629              str = strchr(szData, ',');  
    630 
    631          if (*str)  
    632          {  
    633              char szTmp[128] = {0};  
    634              WORD pos = (WORD)(str - szData + 1);  
    635 
    636              StrRight(szData, (short)(strlen(szData)-pos));  
    637              StrLTrim(szData);  
    638              StrRTrim(szData);  
    639              FindComma(szData);  
    640              if (bIsVender)  
    641              {  
    642                  AnsiToUnicode(szData, strlen(szData), g_strVender[g_wVender++], 64);  
    643              }  
    644              else  
    645              {  
    646                  AnsiToUnicode(szData, strlen(szData), g_strHardware[g_wHardware++], 64);  
    647              }  
    648          }/* end if */  
    649      }  
    650      return TRUE;  
    651  }  
    652 
    653  //实质性的安装驱动  
    654   BOOL InstallClassDriver(LPCTSTR theINFName)  
    655  {  
    656      GUID guid = {0};  
    657      SP_DEVINFO_DATA spDevData = {0};  
    658      HDEVINFO hDevInfo = 0L;  
    659      TCHAR className[MAX_CLASS_NAME_LEN] = {0};  
    660      LPTSTR pHID = NULL;  
    661      WORD wLoop;  
    662      BOOL bRebootRequired;  
    663 
    664      //取得此驱动的GUID值  
    665      if (!SetupDiGetINFClass(theINFName, &guid, className, MAX_CLASS_NAME_LEN, 0))  
    666      {  
    667          printf( "SetupDiGetINFClass is %d
    ",GetLastError());  
    668          return FALSE;  
    669      }  
    670 
    671      //创建设备信息块列表  
    672      hDevInfo = SetupDiCreateDeviceInfoList(&guid, 0);  
    673      if (hDevInfo == INVALID_HANDLE_VALUE)  
    674      {  
    675          printf("SetupDiCreateDeviceInfoList is %d
    ",GetLastError());  
    676          return FALSE;  
    677      }  
    678 
    679      spDevData.cbSize = sizeof(SP_DEVINFO_DATA);  
    680      //创建设备信息块  
    681      if (!SetupDiCreateDeviceInfo(hDevInfo, className, &guid, 0L, 0L, DICD_GENERATE_ID, &spDevData))  
    682      {  
    683          printf("SetupDiCreateDeviceInfo is %d",GetLastError());  
    684          //销毁一个设备信息集合  
    685          SetupDiDestroyDeviceInfoList(hDevInfo);  
    686          return FALSE;  
    687      }  
    688 
    689      //for (wLoop = 0; wLoop < g_wHardware; wLoop++)  
    690      //{  
    691          if (pHID)  
    692              LocalFree(pHID);  
    693          
    694 
    695          pHID = (LPTSTR)LocalAlloc(LPTR, _tcslen(L"USB\VID_0451&PID_AF32")*2*sizeof(TCHAR));  
    696          if (!pHID)  
    697          {  
    698              printf("LocalAlloc is %d",GetLastError());  
    699              //销毁一个设备信息集合  
    700              SetupDiDestroyDeviceInfoList(hDevInfo);  
    701              return FALSE;  
    702          }  
    703 
    704          _tcscpy_s(pHID, _tcslen(L"USB\VID_0451&PID_AF32")*2, 
    705              L"USB\VID_0451&PID_AF32");  
    706          //设定硬件ID  
    707          if (!SetupDiSetDeviceRegistryProperty(hDevInfo, &spDevData, SPDRP_HARDWAREID, (PBYTE)pHID,  
    708              (DWORD)(_tcslen(L"USB\VID_0451&PID_AF32")*2*sizeof(TCHAR))))  
    709          {  
    710              printf("SetupDiSetDeviceRegistryProperty is %d",GetLastError());  
    711              //销毁一个设备信息集合  
    712              SetupDiDestroyDeviceInfoList(hDevInfo);  
    713              LocalFree(pHID);  
    714              return FALSE;  
    715          }  
    716          //调用相应的类程序来注册设备  
    717          if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, hDevInfo, &spDevData))  
    718          {  
    719              printf("SetupDiCallClassInstaller is %d", GetLastError());  
    720              //销毁一个设备信息集合  
    721              SetupDiDestroyDeviceInfoList(hDevInfo);  
    722              LocalFree(pHID);  
    723              return FALSE;  
    724          }  
    725           
    726          bRebootRequired = FALSE;  
    727          //安装更新和硬件ID相匹配的驱动程序  
    728          if (!UpdateDriverForPlugAndPlayDevices(0L, L"USB\VID_0451&PID_AF32"
    729 , theINFName,   
    730              INSTALLFLAG_FORCE, &bRebootRequired))  
    731          {  
    732              DWORD dwErrorCode = GetLastError();  
    733              //调用相应的类程序来移除设备  
    734              if (!SetupDiCallClassInstaller(DIF_REMOVE, hDevInfo, &spDevData))  
    735                  printf("SetupDiCallClassInstaller(Remove) is %d",GetLastError());  
    736              printf("UpdateDriverForPlugAndPlayDevices is %d",(WORD)dwErrorCode);  
    737              //销毁一个设备信息集合  
    738              SetupDiDestroyDeviceInfoList(hDevInfo);  
    739              LocalFree(pHID);
    740 
    741              getch();
    742              return FALSE;  
    743          }  
    744          LocalFree(pHID);  
    745          pHID = NULL;  
    746          
    747      //}  
    748      //销毁一个设备信息集合  
    749      SetupDiDestroyDeviceInfoList(hDevInfo);  
    750      _tprintf(_T("Install Successed
    "));  
    751      return TRUE;  
    752  }  
    753 
    754  // 安装WDM驱动的测试工作  
    755  BOOL StartInstallWDMDriver(LPCTSTR theInfName)  
    756  {  
    757      HDEVINFO hDevInfo = 0L;  
    758      GUID guid = {0L};  
    759      SP_DEVINSTALL_PARAMS spDevInst = {0L};  
    760      TCHAR strClass[MAX_CLASS_NAME_LEN] = {0L};  
    761 
    762      //取得此驱动的GUID值  
    763      if (!SetupDiGetINFClass(theInfName, &guid, strClass, MAX_CLASS_NAME_LEN, 0))  
    764      {  
    765          printf("SetupDiGetINFClass is %d",GetLastError());  
    766          return FALSE;  
    767      }  
    768 
    769      //得到设备信息结构的句柄  
    770      hDevInfo = SetupDiGetClassDevs(&guid, 0L, 0L, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_PROFILE);  
    771      if (!hDevInfo)  
    772      {  
    773          printf("SetupDiGetClassDevs is %d",GetLastError());  
    774          return FALSE;  
    775      }  
    776 
    777 
    778      spDevInst.cbSize = sizeof(SP_DEVINSTALL_PARAMS);  
    779      //获得指定设备的安装信息  
    780      if (!SetupDiGetDeviceInstallParams(hDevInfo, 0L, &spDevInst))  
    781      {  
    782          printf("SetupDiGetDeviceInstallParams is %d",GetLastError());  
    783          return FALSE;  
    784      }  
    785 
    786      spDevInst.Flags   = DI_ENUMSINGLEINF;  
    787      spDevInst.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS;  
    788      _tcscpy_s(spDevInst.DriverPath, _countof(spDevInst.DriverPath), theInfName);  
    789 
    790      //为设备信息集或者是一个实际的设备信息单元设置或清除类安装参数  
    791      if (!SetupDiSetDeviceInstallParams(hDevInfo, 0, &spDevInst))  
    792      {  
    793          
    794           printf("SetupDiSetDeviceInstallParams is %d",GetLastError());  
    795          return FALSE;  
    796      }  
    797 
    798      //获取这个设备的驱动程序信息列表  
    799      if (!SetupDiBuildDriverInfoList(hDevInfo, 0, SPDIT_CLASSDRIVER))  
    800      {  
    801         
    802           printf("SetupDiDeviceInstallParams is %d",GetLastError());
    803          return FALSE;  
    804      }  
    805 
    806      //销毁一个设备信息集合  
    807      SetupDiDestroyDeviceInfoList(hDevInfo);  
    808 
    809      //进入安装设备驱动函数  
    810      return InstallClassDriver(theInfName);  
    811  }  
    812 
    813  BOOL FindExistingDevice(IN LPTSTR HardwareId)
    814  {
    815      HDEVINFO DeviceInfoSet;
    816      SP_DEVINFO_DATA DeviceInfoData;
    817      DWORD i,err;
    818      BOOL Found;
    819 
    820      //
    821      // Create a Device Information Set with all present devices.
    822      //
    823      DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
    824          0,
    825          0,
    826          DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system
    827 
    828      if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    829      {
    830          return printf("GetClassDevs(All Present Devices)");
    831 
    832 
    833      }
    834 
    835      //_tprintf(TEXT("Search for Device ID: [%s]/n"),HardwareId);
    836 
    837      //
    838      //  Enumerate through all Devices.
    839      //
    840      Found = FALSE;
    841      DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    842      for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)
    843      {
    844          DWORD DataT;
    845          LPTSTR p,buffer = NULL;
    846          DWORD buffersize = 0;
    847 
    848          //
    849          // We won't know the size of the HardwareID buffer until we call
    850          // this function. So call it with a null to begin with, and then
    851          // use the required buffer size to Alloc the nessicary space.
    852          // Keep calling we have success or an unknown failure.
    853          //
    854          while (!SetupDiGetDeviceRegistryProperty(
    855              DeviceInfoSet,
    856              &DeviceInfoData,
    857              SPDRP_HARDWAREID,
    858              &DataT,
    859              (PBYTE)buffer,
    860              buffersize,
    861              &buffersize))
    862          {
    863              if (GetLastError() == ERROR_INVALID_DATA)
    864              {
    865                  //
    866                  // May be a Legacy Device with no HardwareID. Continue.
    867                  //
    868                  break;
    869              }
    870              else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    871              {
    872                  //
    873                  // We need to change the buffer size.
    874                  //
    875                  if (buffer)
    876                      LocalFree(buffer);
    877                  buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
    878              }
    879              else
    880              {
    881                  //
    882                  // Unknown Failure.
    883                  //
    884                 printf("GetDeviceRegistryProperty");
    885                  goto cleanup_DeviceInfo;
    886              }
    887          }
    888 
    889          if (GetLastError() == ERROR_INVALID_DATA)
    890              continue;
    891 
    892          //
    893          // Compare each entry in the buffer multi-sz list with our HardwareID.
    894 
    895 
    896          //
    897          for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
    898 
    899 
    900          {
    901              //_tprintf(TEXT("Compare device ID: [%s]/n"),p);
    902 
    903              if (!_tcscmp(HardwareId,p))
    904              {
    905                  //_tprintf(TEXT("Found! [%s]/n"),p);
    906                  Found = TRUE;
    907                  break;
    908              }
    909          }
    910 
    911          if (buffer) LocalFree(buffer);
    912          if (Found) break;
    913      }
    914 
    915      if (GetLastError() != NO_ERROR)
    916      {
    917          printf("EnumDeviceInfo");
    918      }
    919 
    920      //
    921      //  Cleanup.
    922      //
    923 cleanup_DeviceInfo:
    924      err = GetLastError();
    925      SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    926      SetLastError(err);
    927 
    928      return err == NO_ERROR; //???
    929  }
    View Code

    遇到的问题:mainifest文件要改为管理员权限,或者点击exe要为管理员权限才能正确安装

    硬件ID有两个,可能是不一样的用途??至今仍未搞明白,我用同一个硬件ID,卸载了之后,就不能安装了。

    UpdateDriverForPlugAndPlayDevices function

    发生

    ERROR_NO_SUCH_DEVINST错误码,意思是找不到此硬件ID的设备,是不是把硬件ID的名字空间删了?

    但是我用同一个硬件的另一个硬件ID(因为有两个:USBVID_0451&PID_AF32&REV_0000

    ,USBVID_0451&PID_AF32

    )就能安装了。

  • 相关阅读:
    GridView多表头固定+分组+总计
    ajaxpro.2.dll使用【转帖】
    表达式计算易错题
    uclibc下使用libcurl的段错误(缺少hosts文件)
    《java.util.concurrent 包源码阅读》01 源码包的结构
    Linux学习笔记【2】Install Software under RedHat enterprise 5.4
    Windows语言包的那些事
    Let outlook work background when it is minimal
    DB2 Error Message
    db2 系统表信息
  • 原文地址:https://www.cnblogs.com/foohack/p/3332708.html
Copyright © 2020-2023  润新知