zoukankan      html  css  js  c++  java
  • windows设备驱动安装接口(自己仿写)

      1 /*****************************************
      2 Author:foo_hack
      3 
      4 This is File named:Setup.h
      5 
      6 The Funtion Implement in Setup.cpp
      7 
      8 
      9 
     10 ******************************************/
     11 
     12 
     13 #include "stdafx.h"
     14 
     15 void UDBG(TCHAR *msg, ...);
     16 
     17 void FreeAllInfFiles();
     18 int FindAllInfFiles(WCHAR* csDir);
     19 void InstallDriver();
     20 int UpdateDriver();
     21 void FindAllDevices(const WCHAR* asHID);
     22 void FreeDevices();
     23 void RemoveDevices();
     24 BOOL Reboot();
     25 BOOL ConfigRight(WCHAR* szPath);
     26 
     27 VOID SearchRegistryHardID(PWCHAR pHardIDBuffer);
     28 
     29 ////////////////////////////////////////////////////////////////////
     30 
     31 BOOL IsDeviceInstallInProgress(VOID);
     32 int RemoveDriver(_TCHAR *HardwareID);
     33 VOID UninstallWDMDriver(LPCTSTR theHardware);
     34 BOOL UnicodeToAnsi(LPCWSTR Source, const WORD wLen, LPSTR Destination, const WORD sLen);
     35 BOOL AnsiToUnicode(LPCSTR Source, const WORD sLen, LPWSTR Destination, const WORD wLen);
     36 //BOOL GetINFData(FILE *pFile);
     37 VOID FindComma(LPSTR szData);
     38 //BOOL GetSectionData(FILE* pFile, const char* szKey, const char bIsVender);
     39 //BOOL IsInstalled();
     40 BOOL InstallClassDriver(LPCTSTR theINFName);
     41 BOOL StartInstallWDMDriver(LPCTSTR theInfName) ;
     42 
     43 BOOL FindExistingDevice(IN LPTSTR HardwareId);
     44 
     45 VOID InitialGlobalVar();
     46 
     47 
     48 ////////////////////////////////////////////////////////////////////
     49 
     50  //extern WORD g_wVender;  
     51  //extern WORD g_wHardware;  
     52  //extern TCHAR g_strVender[20][64];  
     53  //extern TCHAR g_strHardware[20][64];  
     54  //extern TCHAR g_strHID[MAX_PATH+1];  
     55 
     56 
     57 
     58 ///////////////////////////////////////////////////////////////////
     59 
     60 typedef struct
     61 {
     62     WCHAR asHID[MAX_PATH];
     63     int  nInfNum;        // g_asInfList下标号
     64 
     65     int  nNumCone;
     66     int  nNumNotCone;
     67     bool bNeedUpdate;
     68 
     69     bool bWillBeUpdate;
     70     bool bSuccess;
     71     //int  nFail;
     72 } HID_INFO, *PHID_INFO;
     73 
     74 typedef struct
     75 {
     76     WCHAR asInfName[MAX_PATH];    // 文件名
     77     WCHAR asFullPath[MAX_PATH];    // 全路径
     78     WCHAR asDesPath[MAX_PATH];
     79     WCHAR *asDesName;
     80     WCHAR asVersion[MAX_PATH];
     81     WCHAR asClassName[MAX_PATH];
     82     WCHAR asProvider[MAX_PATH];
     83     WCHAR asDSign[MAX_PATH];
     84     bool bWillBeInstall;
     85     int  nResultInstall;
     86 }INF_INFO, *PINF_INFO;
     87 
     88 #define MAX_SYMBOL_LINK 250
     89 
     90 typedef struct Hid_Ddvices{
     91     WCHAR asHID[MAX_PATH];
     92 
     93     WCHAR* asDeviceInstanceID[MAX_SYMBOL_LINK];
     94     bool bLink[MAX_SYMBOL_LINK];
     95     bool bSuccess[MAX_SYMBOL_LINK];
     96     bool bWillBeDelete[MAX_SYMBOL_LINK];
     97 
     98     int nMaxCount;
     99     int nCount;
    100 
    101     bool bNeedReboot;
    102 
    103     Hid_Ddvices()
    104     {
    105         nCount = nMaxCount = 0;
    106         bNeedReboot = false;
    107 
    108         ZeroMemory(asHID, sizeof(asHID)+ sizeof(asDeviceInstanceID) + 
    109             sizeof(bLink) + sizeof(bSuccess) + sizeof(bWillBeDelete));
    110     }
    111 }HID_DEVICES, *PHID_DEVICES;
    112 
    113 #define MAX_INF_COUNT 40
    114 #define MAX_HID_COUNT 250
    115 
    116 extern PINF_INFO g_InfList[MAX_INF_COUNT];
    117 extern int g_nInfCount;    // INF文
    118 
    119 extern PHID_INFO g_HIDInfo[MAX_HID_COUNT];
    120 extern int g_nHIDCount ;    // HID个数    
    121 
    122 extern HID_DEVICES g_HIDDevices;
    Setup.h
       1 #include "stdafx.h"
       2 #include <newdev.h>
       3 #include <setupapi.h>
       4 #include <cfgmgr32.h>
       5 #include <regstr.h>
       6 #include <strsafe.h>
       7 #include <string.h>
       8 
       9 
      10 #include <Aclapi.h>
      11 #include "setup.h"
      12 
      13 #pragma comment(lib,"Advapi32")
      14 
      15 
      16 #pragma comment(lib, "newdev.lib")
      17 #pragma comment(lib, "setupapi.lib")
      18 
      19 void GetHIDList(int nInfIndex);
      20 
      21 DWORD DeleteTree(HKEY RootKey, const WCHAR *pSubKey);
      22 
      23 // 不带变参
      24 void ULOG(TCHAR *msg)
      25 {
      26     OutputDebugString(_T("UsbKitApp:"));
      27     OutputDebugString(msg);
      28     OutputDebugString(_T("
    "));
      29 }
      30 
      31 #ifdef DEBUG
      32 // 带变参的Log函数
      33 void UDBG(TCHAR *msg, ...)
      34 {
      35     TCHAR strMsg[1024];
      36 
      37     va_list argp;
      38     va_start(argp, msg);
      39     _vstprintf_s(strMsg, 1024, msg, argp);
      40     va_end(argp);
      41     OutputDebugString(_T("UsbKitApp:"));
      42     OutputDebugString(strMsg);
      43     OutputDebugString(_T("
    "));
      44 }
      45 #else
      46 void UDBG(TCHAR* msg, ...)
      47 {
      48 
      49 }
      50 #endif
      51 
      52 PINF_INFO g_InfList[MAX_INF_COUNT];
      53 int g_nInfMaxCount = 0;
      54 int g_nInfCount = 0;    // INF文件数
      55 
      56 PHID_INFO g_HIDInfo[MAX_HID_COUNT];
      57 int g_nHIDMaxCount = 0;
      58 int g_nHIDCount = 0;    // HID个数    
      59 
      60 HID_DEVICES g_HIDDevices;
      61 
      62 void FreeDevices()
      63 {
      64     for(int i = 0; i < g_HIDDevices.nMaxCount; i++)
      65     {
      66         delete g_HIDDevices.asDeviceInstanceID[i];
      67     }
      68 
      69     ZeroMemory(&g_HIDDevices, sizeof(g_HIDDevices));
      70 }
      71 
      72 void FreeAllInfFiles()
      73 {
      74     for(int i = 0; i < g_nHIDMaxCount; i++)
      75         delete g_HIDInfo[i];
      76 
      77     g_nHIDMaxCount = g_nHIDCount = 0;
      78 
      79     for(int i = 0; i < g_nInfMaxCount; i++)
      80         delete g_InfList[i];
      81 
      82     g_nInfMaxCount = g_nInfCount = 0;
      83 }
      84 
      85 //在特定路径下寻找所有的inf文件
      86 int FindAllInfFiles(WCHAR* csDir = NULL)
      87 {
      88     WIN32_FIND_DATA FindFileData;
      89     WCHAR dir[MAX_PATH];
      90     WCHAR path[MAX_PATH];
      91     HANDLE hFind = INVALID_HANDLE_VALUE;
      92 
      93     if(csDir == NULL)
      94     {
      95         // 在当前路径中搜索所有inf文件
      96         GetCurrentDirectory(MAX_PATH, dir);
      97         //StringCchCopy(path, MAX_PATH, dir);//此函数不支持win XP SP1
      98         wcscpy(path,dir);
      99     }
     100     else
     101     {
     102         if(!GetFullPathName(csDir, MAX_PATH, dir, NULL))
     103             GetCurrentDirectory(MAX_PATH, dir);
     104 
     105         //StringCchCopy(path, MAX_PATH, dir);
     106 
     107         wcscpy(path,dir);
     108     }
     109 
     110     //StringCchCat(path, MAX_PATH, L"\*.inf");//此函数不支持win XP SP1
     111     wcscat(path,L"\*.inf");
     112 
     113     wprintf(path);
     114     printf("
    ");
     115 
     116     __try{
     117 
     118         g_nInfCount = 0;
     119         g_nHIDCount = 0;
     120 
     121         // 遍历
     122         hFind = FindFirstFile(path, &FindFileData);
     123 
     124         if (hFind == INVALID_HANDLE_VALUE) 
     125         {
     126             printf("没有发现inf文件
    ");
     127             __leave;
     128         } 
     129 
     130         do{
     131             if(g_nInfCount >= g_nInfMaxCount)
     132             {
     133                 g_InfList[g_nInfCount] = new INF_INFO;
     134                 g_nInfMaxCount = g_nInfCount + 1;
     135             }
     136 
     137             ZeroMemory(g_InfList[g_nInfCount], sizeof(INF_INFO));
     138 
     139             //StringCchCopy(path, MAX_PATH, dir);
     140             wcscpy(path,dir);
     141             //StringCchCat(path, MAX_PATH, L"\");
     142             wcscat(path,L"\");
     143             //StringCchCat(path, MAX_PATH, FindFileData.cFileName);
     144             wcscat(path,FindFileData.cFileName);
     145             //StringCchCopy(g_InfList[g_nInfCount]->asInfName, MAX_PATH, FindFileData.cFileName);
     146             wcscpy(g_InfList[g_nInfCount]->asInfName,FindFileData.cFileName);
     147             //StringCchCopy(g_InfList[g_nInfCount]->asFullPath, MAX_PATH, path);
     148             wcscpy(g_InfList[g_nInfCount]->asFullPath,path);
     149             // 查找每个inf文件中的所有HID
     150             wprintf(L"找到文件:%s
    ", FindFileData.cFileName);
     151 
     152             GetHIDList(g_nInfCount);
     153             g_nInfCount ++;
     154 
     155         }while (FindNextFile(hFind, &FindFileData) != 0 && g_nInfMaxCount < MAX_INF_COUNT) ;
     156 
     157     }
     158     __finally{
     159         if(hFind != INVALID_HANDLE_VALUE)
     160         {
     161             FindClose(hFind);
     162         }
     163     }
     164 
     165     return g_nHIDCount;
     166 }
     167 
     168 //查找特定inf文件中的所有HID(硬件ID)
     169 void GetHIDList(int nInfIndex)
     170 {
     171     INFCONTEXT infcont;    
     172     INFCONTEXT infcont_dev;
     173 
     174     HINF hInf = INVALID_HANDLE_VALUE;
     175     DWORD config_flags, problem, status;
     176     BOOL reboot;
     177     WCHAR inf_path[MAX_PATH];
     178 
     179     WCHAR direct[MAX_PATH];
     180     WCHAR manu[MAX_PATH];
     181     WCHAR manu_os[MAX_PATH];
     182     WCHAR hid[MAX_PATH];
     183     WCHAR tmp_id[MAX_PATH];
     184 
     185     WCHAR os[8][32];
     186 
     187     __try
     188     {
     189         // 取INF路径
     190         wprintf(g_InfList[nInfIndex]->asFullPath);
     191         if(!GetFullPathName(g_InfList[nInfIndex]->asFullPath, MAX_PATH, inf_path, NULL))
     192         {
     193             printf(".inf文件 %s 未找到
    ", g_InfList[nInfIndex]->asInfName);
     194             __leave;
     195         }
     196 
     197         wprintf(L"INF 文件路径:%s
    ", inf_path);
     198 
     199         // 打开INF文件
     200         hInf = SetupOpenInfFile(inf_path, NULL, INF_STYLE_WIN4, NULL);
     201 
     202         if(hInf == INVALID_HANDLE_VALUE)
     203         {
     204             wprintf(L"打开文件失败:%s", inf_path);
     205             __leave;
     206         }
     207 
     208         if(!SetupFindFirstLine(hInf, L"version", NULL, &infcont))
     209         {
     210             printf("找不到[Version]域,不是合法的Inf文件
    ");
     211             __leave;
     212         }
     213 
     214         //
     215         // 获取Version信息
     216         //
     217 
     218         do 
     219         {
     220             if(!SetupGetStringField(&infcont, 0, direct, sizeof(direct), NULL))
     221                 continue;
     222 
     223             _wcslwr(direct);//把字符串转为小写
     224             if(0 == wcscmp(direct, L"class"))
     225             {
     226                 if(SetupGetStringField(&infcont, 1, direct, sizeof(direct), NULL))
     227                 {
     228                     //StringCchCopy(g_InfList[nInfIndex]->asClassName, MAX_PATH, direct);
     229                     wcscpy(g_InfList[nInfIndex]->asClassName,direct);
     230                 }
     231             }
     232             else if(0 == wcscmp(direct, L"driverver"))
     233             {
     234                 if(SetupGetStringField(&infcont, 1, direct, sizeof(direct), NULL))
     235                 {
     236                     //StringCchCopy(g_InfList[nInfIndex]->asVersion, MAX_PATH, direct);
     237                     wcscpy(g_InfList[nInfIndex]->asVersion,direct);
     238 
     239                     if(SetupGetStringField(&infcont, 2, direct, sizeof(direct), NULL))
     240                     {
     241                         //StringCchCat(g_InfList[nInfIndex]->asVersion, MAX_PATH, L", ");
     242                         wcscat(g_InfList[nInfIndex]->asVersion,L", ");
     243                         //StringCchCat(g_InfList[nInfIndex]->asVersion, MAX_PATH, direct);
     244                         wcscat(g_InfList[nInfIndex]->asVersion,direct);
     245                     }
     246                 }
     247             }
     248             else if(0 == wcscmp(direct, L"provider"))
     249             {
     250                 if(SetupGetStringField(&infcont, 1, direct, sizeof(direct), NULL))
     251                 {
     252                     //StringCchCopy(g_InfList[nInfIndex]->asProvider, MAX_PATH, direct);
     253                     wcscpy(g_InfList[nInfIndex]->asProvider,direct);
     254                 }
     255             }
     256             else if(wcsstr(direct, L"catalogfile"))//返回第一个子字符创的指针
     257             {
     258                 if(SetupGetStringField(&infcont, 1, direct, sizeof(direct), NULL))
     259                 {
     260                     //StringCchCopy(g_InfList[nInfIndex]->asDSign, MAX_PATH, direct);
     261                     wcscpy(g_InfList[nInfIndex]->asDSign,direct);
     262                 }
     263             }
     264         } while (SetupFindNextLine(&infcont, &infcont));
     265 
     266         printf("INF 信息:
    ");
     267         wprintf(L"%s
    ", g_InfList[nInfIndex]->asClassName);
     268         wprintf(L"%s
    ", g_InfList[nInfIndex]->asProvider);
     269         wprintf(L"%s
    ", g_InfList[nInfIndex]->asDSign);
     270         wprintf(L"%s
    ", g_InfList[nInfIndex]->asVersion);
     271 
     272         if(g_nHIDMaxCount >= MAX_HID_COUNT)
     273             __leave;
     274 
     275         //
     276         // 搜索设备描述符
     277         //
     278 
     279         if(!SetupFindFirstLine(hInf, L"Manufacturer", NULL, &infcont))
     280         {
     281             printf("没有可用设备描述符
    ");
     282             __leave;
     283         }
     284 
     285         SYSTEM_INFO siSysInfo;
     286         GetSystemInfo(&siSysInfo);      
     287 
     288         do{
     289             int i = 0;
     290             int j = 0;
     291 
     292             // 一行行搜索
     293             if(!SetupGetStringField(&infcont, 1, manu, sizeof(manu), NULL))
     294             {
     295                 continue;
     296             }
     297 
     298             wprintf(manu);
     299 
     300             printf("
    ");
     301 
     302             for(; i < 4; i++)
     303             {
     304                 if(!SetupGetStringField(&infcont, i+2, os[i], sizeof(os[0]), NULL))
     305                     break;
     306                 else
     307                     printf("OS: %s
    ", os[i]);
     308 
     309                 _wcslwr(os[i]);
     310             }
     311 
     312             // 寻找最佳的平台匹配
     313             if(siSysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) // X64
     314             {
     315                 for(; j < i; j++)
     316                 {
     317                     if(wcscmp(os[j], L"ntamd64"))
     318                     {
     319                         //StringCchCopy(manu_os, sizeof(manu_os), manu);
     320                         wcscpy(manu_os,manu);
     321                         //StringCchCat(manu_os, sizeof(manu_os), L".");
     322                         wcscat(manu_os,L".");
     323                         //StringCchCat(manu_os, sizeof(manu_os), os[j]);
     324                         wcscat(manu_os,os[i]);
     325 
     326                         // 如果找到[XXX.ntamd64],就用它;否则去掉os后缀
     327                         if(SetupFindFirstLine(hInf, manu_os, NULL, &infcont_dev))
     328                             //StringCchCopy(manu, sizeof(manu), manu_os);
     329                             wcscpy(manu,manu_os);
     330 
     331                         break;
     332                     }
     333                 }
     334             }
     335             else if(siSysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
     336             {
     337                 for(; j < i; j++)
     338                 {
     339                     if(0 == wcsstr(os[j], L"ntia64"))
     340                     {
     341                         //StringCchCopy(manu_os, sizeof(manu_os), manu);
     342                         wcscpy(manu_os,manu);
     343                         //StringCchCat(manu_os, sizeof(manu_os), L".");
     344                         wcscat(manu_os,L".");
     345                         //StringCchCat(manu_os, sizeof(manu_os), os[j]);
     346                         wcscat(manu_os,os[j]);
     347 
     348                         // 如果找到[XXX.ntamd64],就用它;否则去掉os后缀
     349                         if(SetupFindFirstLine(hInf, manu_os, NULL, &infcont_dev))
     350                             //StringCchCopy(manu, sizeof(manu), manu_os);
     351                             wcscpy(manu,manu_os);
     352 
     353                         break;
     354                     }
     355                 }
     356             }
     357             else if(siSysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
     358             {
     359                 for(; j < i; j++)
     360                 {
     361                     if(0 == wcsstr(os[j], L"ntx86"))
     362                     {
     363                         //StringCchCopy(manu_os, sizeof(manu_os), manu);
     364                         wcscpy(manu_os,manu);
     365                         //StringCchCat(manu_os, sizeof(manu_os), L".");
     366                         wcscat(manu_os,L".");
     367                         //StringCchCat(manu_os, sizeof(manu_os), os[j]);
     368                         wcscat(manu_os,os[j]);
     369                         wprintf(manu_os);
     370                         printf("
    ");
     371                         // 如果找到[XXX.ntamd64],就用它;否则去掉os后缀
     372                         if(SetupFindFirstLine(hInf, manu_os, NULL, &infcont_dev))
     373                             //StringCchCopy(manu, sizeof(manu), manu_os);
     374                             wcscpy(manu,manu_os);
     375 
     376                         break;
     377                     }
     378                 }
     379             }
     380 
     381             // 最后,如果最符合的版本没有找到,就看看.nt有没有
     382             if(NULL == wcsstr(manu, L".ntx86") && 
     383                 NULL == wcsstr(manu, L".ntia64") && 
     384                 NULL == wcsstr(manu, L".ntamd64"))
     385             {
     386                 for(j = 0; j < i; j++)
     387                 {
     388                     if(0 == wcsstr(os[j], L".nt"))
     389                     {
     390                         //StringCchCopy(manu_os, sizeof(manu_os), manu);
     391                         wcscpy(manu_os,manu);
     392                         //StringCchCat(manu_os, sizeof(manu_os), L".");
     393                         wcscat(manu_os,L".");
     394                         //StringCchCat(manu_os, sizeof(manu_os), os[j]);
     395                         wcscat(manu_os,os[j]);
     396 
     397                         // 如果找到[XXX.ntamd64],就用它;否则去掉os后缀
     398                         if(SetupFindFirstLine(hInf, manu_os, NULL, &infcont_dev))
     399                             //StringCchCopy(manu, sizeof(manu), manu_os);
     400                             wcscpy(manu,manu_os);
     401 
     402                         break;
     403                     }
     404                 }
     405             }
     406 
     407             wprintf(L"设备域名:%s
    ", manu);
     408             if(!SetupFindFirstLine(hInf, manu, NULL, &infcont_dev))
     409             {
     410                 printf("找不到设备模块
    ");
     411                 continue;
     412             }
     413 
     414             do{
     415                 if(!SetupGetStringField(&infcont_dev, 2, hid, sizeof(hid), NULL))
     416                     continue;
     417 
     418                 // 保存HID记录
     419                 //
     420 
     421                 _wcslwr(hid);
     422                 wprintf(L"HID: %s
    ", hid);
     423 
     424                 if(g_nHIDMaxCount <= g_nHIDCount)
     425                 {
     426                     g_HIDInfo[g_nHIDCount] = new HID_INFO;
     427                     g_nHIDMaxCount = g_nHIDCount + 1;
     428                 }
     429 
     430                 ZeroMemory(g_HIDInfo[g_nHIDCount], sizeof(HID_INFO));
     431                 //StringCchCopy(g_HIDInfo[g_nHIDCount]->asHID, MAX_PATH, hid);
     432                 wcscpy(g_HIDInfo[g_nHIDCount]->asHID,hid);
     433                 g_HIDInfo[g_nHIDCount]->nInfNum = nInfIndex;
     434                 g_nHIDCount++;
     435 
     436             }while(SetupFindNextLine(&infcont_dev, &infcont_dev) && g_nHIDMaxCount < MAX_HID_COUNT);
     437 
     438             // 获取下一个设备ID
     439         }while(SetupFindNextLine(&infcont, &infcont) && g_nHIDMaxCount < MAX_HID_COUNT);
     440     }
     441     __finally
     442     {
     443         if(hInf != INVALID_HANDLE_VALUE)
     444             SetupCloseInfFile(hInf);
     445     }
     446 }
     447 
     448 BOOL Reboot()
     449 {
     450     HANDLE Token = NULL;
     451     TOKEN_PRIVILEGES NewPrivileges;
     452     LUID Luid;
     453 
     454     __try
     455     {
     456         // 使能ShutDown特权
     457         if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&Token))
     458             __leave;
     459 
     460         if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&Luid))
     461             __leave;
     462 
     463         NewPrivileges.PrivilegeCount = 1;
     464         NewPrivileges.Privileges[0].Luid = Luid;
     465         NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
     466 
     467         AdjustTokenPrivileges(Token, FALSE, &NewPrivileges, 0, NULL, NULL);
     468     }
     469     __finally
     470     {
     471         if(Token) CloseHandle(Token);
     472     }
     473 
     474     //尝试重启
     475     return InitiateSystemShutdownEx(NULL, NULL, 0, FALSE, TRUE, REASON_PLANNED_FLAG | REASON_HWINSTALL);
     476 }
     477 
     478 // 删除设备对应的驱动程序,调用SetupDiCallClassInstaller函数,并执行DIF_REMOVE动作
     479 // 参数Devs和DevInfo用来唯一标识目标设备
     480 bool RemoveDevice(__in HDEVINFO Devs, __in PSP_DEVINFO_DATA DevInfo)
     481 {
     482     UDBG(_T("[RemoveDriverForSpecifiedDevice]"));
     483 
     484     SP_REMOVEDEVICE_PARAMS rmdParams;
     485     SP_DEVINSTALL_PARAMS devParams;
     486 
     487     rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
     488     rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE;
     489     rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL;
     490     rmdParams.HwProfile = 0;
     491 
     492     if(SetupDiSetClassInstallParams(Devs, DevInfo, &rmdParams.ClassInstallHeader, sizeof(rmdParams)) &&
     493         SetupDiCallClassInstaller(DIF_REMOVE, Devs, DevInfo)) 
     494     {
     495         wprintf(_T("卸载驱动成功
    "));
     496 
     497         // 检查是否需要重启机器
     498         devParams.cbSize = sizeof(devParams);
     499         if(SetupDiGetDeviceInstallParams(Devs, DevInfo, &devParams) && 
     500             (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))) 
     501         {
     502             g_HIDDevices.bNeedReboot = true;
     503         }
     504 
     505         return true;
     506     }
     507 
     508     return false;
     509 }
     510 
     511 void RemoveDevices()
     512 {
     513     HDEVINFO dev_info;
     514     SP_DEVINFO_DATA dev_info_data;
     515     int nDevIndex;
     516     WCHAR id[MAX_PATH];
     517 
     518     g_HIDDevices.bNeedReboot = false;
     519 
     520     // 寻找所有设备,设置Flag值为DIGCF_ALLCLASSES。
     521     dev_info = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
     522 
     523     // class名无效
     524     if(dev_info == INVALID_HANDLE_VALUE)
     525     {
     526         printf("无效的HDEVINFO句柄
    ");
     527         return;
     528     }
     529 
     530     nDevIndex = 0;
     531 
     532     // 枚举设备
     533     dev_info_data.cbSize = sizeof(dev_info_data);
     534     while(SetupDiEnumDeviceInfo(dev_info, nDevIndex, &dev_info_data))
     535     {
     536         if(CR_SUCCESS != CM_Get_Device_ID(dev_info_data.DevInst, id, MAX_PATH, 0))
     537             continue;
     538 
     539         _wcslwr(id);
     540 
     541         for(int i = 0; i < g_HIDDevices.nCount; i++)
     542         {
     543             if(g_HIDDevices.bWillBeDelete[i] && 
     544                 0 == wcscmp(id, g_HIDDevices.asDeviceInstanceID[i]))
     545             {
     546                 wprintf(id);
     547                 printf("
    ");
     548                 g_HIDDevices.bSuccess[i] = RemoveDevice(dev_info, &dev_info_data);
     549             }
     550         }
     551 
     552         nDevIndex++;
     553     }
     554 
     555     SetupDiDestroyDeviceInfoList(dev_info);
     556 }
     557 
     558 //该函数主要就是根据硬件ID查找在本地机器上有没有这样一个设备,
     559 把查找到的ID放到全局变量中,还检测设备有没有连接系统
     560 void FindAllDevices(const WCHAR* asHID)
     561 {
     562     HDEVINFO dev_info;
     563     SP_DEVINFO_DATA dev_info_data;
     564 
     565     int nDevIndex;
     566     WCHAR id[MAX_PATH];
     567     WCHAR *p;
     568     ULONG problem;
     569     ULONG status;
     570 
     571     WCHAR* ashid = _wcsdup(asHID);
     572     _wcslwr(ashid);//转换ashid中的大写字母
     573 
     574     printf("FindAllDevices
    ");
     575 
     576     g_HIDDevices.nCount = 0;
     577 
     578     // 寻找所有设备,设置Flag值为DIGCF_ALLCLASSES。
     579     dev_info = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
     580 
     581     // class名无效
     582     if(dev_info == INVALID_HANDLE_VALUE)
     583     {
     584         printf("无效的HDEVINFO句柄
    ");
     585         free(ashid);
     586         return;
     587     }
     588 
     589     nDevIndex = 0;
     590 
     591     // 枚举设备,从0开始枚举设备
     592     dev_info_data.cbSize = sizeof(dev_info_data);
     593     while(SetupDiEnumDeviceInfo(dev_info, nDevIndex, &dev_info_data))
     594     {
     595         if(CR_SUCCESS != CM_Get_Device_ID(dev_info_data.DevInst, id, MAX_PATH, 0))
     596             continue;
     597 
     598         (id);
     599         if(wcsstr(id, ashid))
     600         {
     601             if(g_HIDDevices.nCount >= g_HIDDevices.nMaxCount)
     602             {
     603                 g_HIDDevices.asDeviceInstanceID[g_HIDDevices.nMaxCount] = new WCHAR[MAX_PATH];
     604                 g_HIDDevices.nMaxCount++;
     605             }
     606 
     607             // Device实例ID。把id拷贝到parameter 1中
     608             //StringCchCopy(g_HIDDevices.asDeviceInstanceID[g_HIDDevices.nCount], MAX_PATH, id);
     609             wcscpy(g_HIDDevices.asDeviceInstanceID[g_HIDDevices.nCount],id);
     610             // 连接状态
     611             g_HIDDevices.bLink[g_HIDDevices.nCount] = false;
     612             if(CM_Get_DevNode_Status(&status,
     613                 &problem,
     614                 dev_info_data.DevInst,
     615                 0) != CR_NO_SUCH_DEVINST)
     616             {
     617                 g_HIDDevices.bLink[g_HIDDevices.nCount] = true;
     618             }
     619 
     620             g_HIDDevices.nCount++;
     621         }
     622 
     623         nDevIndex++;
     624     }
     625 
     626     SetupDiDestroyDeviceInfoList(dev_info);
     627     free(ashid);
     628 }
     629 
     630 void InstallDriver()
     631 {
     632     HDEVINFO dev_info;
     633     SP_DEVINFO_DATA dev_info_data;
     634     int nDevIndex;
     635     WCHAR id[MAX_PATH];
     636     WCHAR tmp_id[MAX_PATH];
     637     WCHAR *p;
     638     ULONG problem;
     639     ULONG status;
     640     int nInfIndex;
     641 
     642     for(nInfIndex = 0; nInfIndex < g_nInfCount; nInfIndex++)
     643     {
     644         if(false == g_InfList[nInfIndex]->bWillBeInstall)
     645             continue;
     646 
     647         // 拷贝INF文件(预安装到Driver Store中)
     648         wprintf(L"Parameter 1 is %s
    ",g_InfList[nInfIndex] ->asFullPath);
     649         //getch();
     650         //wprintf(L"Parameter 1 is %s
    ",g_InfList[nInfIndex] ->asDesPath);
     651         if(FALSE ==    SetupCopyOEMInf(g_InfList[nInfIndex]->asFullPath, NULL, SPOST_PATH,0, 
     652                 0, 0, 
     653                 NULL,    NULL))
     654         {
     655             printf("SetCopyOEMInf1 Error Code is %d
    ",GetLastError());
     656             
     657             if(GetLastError() == ERROR_FILE_EXISTS)
     658             {
     659                 g_InfList[nInfIndex]->nResultInstall = 1;
     660                 wprintf(L"located in inf dir's name:%s
    ",g_InfList[nInfIndex]->asDesPath);
     661                 
     662                 PWCHAR pSubStr1,pSubWork1;
     663                 WCHAR OemFileName3[128];
     664                 
     665                 if(NULL != (pSubStr1 = wcsstr((wchar_t*)g_InfList[nInfIndex]->asDesPath,L"oem")))
     666                 {
     667                     pSubWork1 = pSubStr1;
     668 
     669                     while((*pSubWork1) != 'f')
     670                     {
     671                         pSubWork1++;
     672                     }
     673 
     674                     pSubWork1++;
     675 
     676                     *pSubWork1 = '';
     677 
     678                     
     679 
     680                     wcscpy(OemFileName3,pSubStr1);
     681 
     682                     wprintf(L"OemFileName3 is %s
    ",OemFileName3);
     683 
     684                     //getch();
     685                 }
     686                 
     687                 if(SetupUninstallOEMInf(OemFileName3, SUOI_FORCEDELETE, NULL))
     688                 {
     689                     printf("new Driver Package Has Deleted succced! on windows XP
    ");
     690                     
     691                     if(FALSE ==    SetupCopyOEMInf(g_InfList[nInfIndex]->asFullPath, NULL, SPOST_PATH, SP_COPY_NOOVERWRITE, 
     692                         g_InfList[nInfIndex]->asDesPath, MAX_PATH, 
     693                         NULL, &g_InfList[nInfIndex]->asDesName))
     694                     {
     695                         printf("SetCopyOEMInf2 Error Code is %d
    ",GetLastError());
     696                     }
     697                     else
     698                         printf("SetupCopyOEMInf2 succeed!
    ");
     699 
     700                     //getch();
     701 
     702                 }
     703 
     704             }
     705             else
     706                 g_InfList[nInfIndex]->nResultInstall = -1;
     707         }else
     708         {
     709             
     710             printf("Install Succeed!
    ");
     711             
     712             //getch();
     713             g_InfList[nInfIndex]->nResultInstall = 0;
     714         }
     715         
     716         BOOL bResult = FALSE;
     717         HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
     718         SP_DEVINFO_DATA DeviceInfoData;
     719         GUID ClassGUID;
     720         TCHAR ClassName[MAX_CLASS_NAME_LEN];
     721         TCHAR hwIdList[LINE_LEN+4];
     722         DWORD Status;
     723 
     724         if (!SetupDiGetINFClass (g_InfList[nInfIndex]->asFullPath, &ClassGUID, ClassName, sizeof(ClassName)/sizeof(TCHAR), 0) ) 
     725         {
     726             printf("SetupDiGetINFClass fail,Error Code is %d
    ",GetLastError());
     727         }
     728         
     729         DeviceInfoSet = SetupDiGetClassDevs(&ClassGUID,ClassName,NULL,DIGCF_PRESENT);
     730 
     731         if(DeviceInfoSet == INVALID_HANDLE_VALUE)
     732         {
     733            printf("SetupDiGetClassDevs fail,Error Code is %d
    ",GetLastError());
     734         }
     735         
     736         /*DWORD wIdx = 0;
     737         
     738         while (TRUE)  
     739         {  
     740             DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
     741             //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
     742             if (SetupDiEnumDeviceInfo(DeviceInfoSet, wIdx, &DeviceInfoData))  
     743             {  
     744 
     745 
     746                 printf("SetupDiEnumDeviceInfo Success!
    ");
     747 
     748                 char Buffer[2048] = {0};  
     749 
     750                 //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
     751                 if (SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID,  
     752                     0L, (PBYTE)Buffer, 2048, 0L))  
     753                 {  
     754                     printf("SetupDiGetDeviceRegistryProperty Success!
    ");
     755 
     756                     wprintf(L"Buffer is %s
    ",Buffer);
     757 
     758                     if (!lstrcmpi(L"USB\VID_0451&PID_AF32&REV_0000", (LPTSTR)Buffer))  
     759                     {  
     760                         printf("theHardware is matched!
    ");
     761                         
     762                         DWORD ConfigFlag;
     763                         
     764                         if(SetupDiGetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,SPDRP_CONFIGFLAGS,
     765                             0L,(PBYTE)&ConfigFlag,sizeof(ConfigFlag),0L))
     766                         {
     767                             
     768                             
     769                             ConfigFlag |=  CONFIGFLAG_REINSTALL;
     770 
     771                             SetupDiSetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,SPDRP_CONFIGFLAGS,
     772                                 (PBYTE)&ConfigFlag,sizeof(ConfigFlag));
     773 
     774                             
     775                         }
     776                         
     777 
     778                         if(!UpdateDriverForPlugAndPlayDevices(NULL,L"USB\VID_0451&PID_AF32&REV_0000",
     779                             g_InfList[nInfIndex] ->asFullPath,INSTALLFLAG_FORCE,NULL))
     780                         {
     781                             printf("SetupDiGetINFClass fail,Error Code is %x
    ",GetLastError());
     782                         }
     783                         
     784                         break;
     785                     }  
     786 
     787 
     788 
     789                 }  
     790             }  
     791             else 
     792             {
     793 
     794                 break;  
     795             }
     796 
     797             wIdx++;  
     798         }  */
     799 
     800 
     801 
     802         
     803         /*wprintf(L"ClassName is %s
    ",ClassName);
     804 
     805         DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
     806 
     807         if (!SetupDiCreateDeviceInfo(DeviceInfoSet, L"USB\VID_0451&PID_AF32\7LUCK", &ClassGUID, NULL, NULL,  DICD_INHERIT_CLASSDRVS, &DeviceInfoData) ) 
     808         { 
     809             printf("SetupDiCreateDeviceInfo fail,Error Code is %x
    ",GetLastError());
     810         }
     811             
     812 
     813         ZeroMemory (hwIdList, sizeof(hwIdList) );
     814 
     815         lstrcpyn (hwIdList, L"USB\VID_0451&PID_AF32", LINE_LEN);
     816 
     817         if (!SetupDiSetDeviceRegistryProperty (DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)hwIdList, 
     818                 ( lstrlen (hwIdList) + 1 + 1) * sizeof (TCHAR) ) ) 
     819         {
     820             printf("SetupDiSetDeviceRegistryProperty fail,Error Code is %d
    ",GetLastError());    
     821                 
     822         }
     823         
     824         
     825 
     826         if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData) ) 
     827         {
     828             printf("SetupDiCallClassInstaller fail,Error Code is %d
    ",GetLastError());
     829         }*/
     830 
     831 
     832             
     833 
     834         /*if (!UpdateDriverForPlugAndPlayDevices(
     835                 NULL,
     836                 L"USB\VID_0451&PID_AF32",
     837                 g_InfList[nInfIndex]->asFullPath,
     838                 INSTALLFLAG_FORCE,
     839                 NULL)  ) 
     840         {
     841             printf("UpdateDriverForPlugAndPlayDevices,Error Code is %x
    ",GetLastError());
     842         }*/
     843         
     844         
     845         //Return Value:0xe0000203指定设备不在当前系统,0xe000020b没为设备指定设备集
     846         /*if(!UpdateDriverForPlugAndPlayDevices(NULL,L"USB\VID_0451&PID_AF32",
     847             g_InfList[nInfIndex]->asFullPath,INSTALLFLAG_FORCE,NULL))
     848             {
     849  850 
     851 
     852 
     853 
     854             printf("UpdateDriverForPlugAndPlayDevices Failed! Error Code is %x
    ",GetLastError());
     855         }*/
     856 
     857         getch();
     858 
     859         /*if(!UpdateDriverForPlugAndPlayDevices(NULL,L"USB\VID_0451&PID_AF32",
     860             g_InfList[nInfIndex]->asFullPath,INSTALLFLAG_FORCE,NULL))
     861         {
     862             printf("UpdateDriverForPlugAndPlayDevices Failed! Error Code is %x
    ",GetLastError());
     863         }*/
     864 
     865 
     866         //getch();
     867 
     868         for(int i = 0; i < g_nHIDCount; i++)
     869         {
     870             if(g_HIDInfo[i]->nInfNum == nInfIndex)
     871             {
     872                 g_HIDInfo[i]->nNumCone = 0;
     873                 g_HIDInfo[i]->nNumNotCone = 0;
     874                 g_HIDInfo[i]->bNeedUpdate = false;
     875             }
     876         }
     877 
     878         // 获取设备实例数
     879         if(g_InfList[nInfIndex]->nResultInstall == 0 && g_InfList[nInfIndex]->asClassName[0])
     880         {
     881 
     882             wprintf(g_InfList[nInfIndex]->asClassName);
     883             printf("
    ");
     884 
     885             // 寻找所有设备,设置Flag值为DIGCF_ALLCLASSES。
     886             dev_info = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
     887 
     888             // class名无效
     889             if(dev_info == INVALID_HANDLE_VALUE){
     890                 printf("class 名无效
    ");
     891                 continue;
     892             }
     893 
     894             nDevIndex = 0;
     895 
     896             // 枚举设备
     897             dev_info_data.cbSize = sizeof(dev_info_data);
     898             while(SetupDiEnumDeviceInfo(dev_info, nDevIndex, &dev_info_data))
     899             {
     900                 // 取设备ID
     901                 if(SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
     902                     SPDRP_HARDWAREID, 
     903                     NULL,
     904                     (BYTE *)tmp_id,
     905                     sizeof(tmp_id), 
     906                     NULL))
     907                 {
     908                     //获得的是一个字符串列表,故而需要遍历
     909                     for(p = tmp_id; *p; p += (wcslen(p) + 1))
     910                     {
     911                         _wcslwr(p);
     912                         for(int x = 0; x < g_nHIDCount; x++)
     913                         {
     914                             if(g_HIDInfo[x]->nInfNum != nInfIndex)
     915                                 continue;
     916 
     917                             if(wcsstr(p, g_HIDInfo[x]->asHID)){
     918                                 g_HIDInfo[x]->bNeedUpdate = true;// 此设备已存在,需要更新。
     919                                 if(CM_Get_DevNode_Status(&status,
     920                                     &problem,
     921                                     dev_info_data.DevInst,
     922                                     0) == CR_NO_SUCH_DEVINST)
     923                                 {
     924                                     g_HIDInfo[x]->nNumNotCone++;
     925                                 }
     926                                 else
     927                                     g_HIDInfo[x]->nNumCone++;
     928                             }
     929                         }
     930                     }
     931                 }
     932 
     933                 nDevIndex++;
     934             }
     935 
     936             SetupDiDestroyDeviceInfoList(dev_info);
     937         }
     938 
     939         SetupDiDestroyDeviceInfoList(dev_info);
     940 
     941 
     942     }    
     943 }
     944 
     945 // 更新驱动程序
     946 int UpdateDriver()
     947 {
     948     HDEVINFO dev_info;
     949     SP_DEVINFO_DATA dev_info_data;
     950     INFCONTEXT infcont;
     951     HINF hInf = NULL;
     952     DWORD config_flags, problem, status;
     953     BOOL reboot;
     954     char inf_path[MAX_PATH];
     955     char id[MAX_PATH];
     956     char tmp_id[MAX_PATH];
     957     char *p;
     958     int dev_index;
     959 
     960     dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA);
     961 
     962     __try
     963     {
     964         for(int i = 0; i < g_nHIDCount; i++)
     965         {
     966             if(g_HIDInfo[i]->bWillBeUpdate)
     967             {
     968                 if(g_HIDInfo[i]->nNumCone)
     969                 {
     970                     // 为当前连接到系统的所有设备更新驱动
     971                     g_HIDInfo[i]->bSuccess = UpdateDriverForPlugAndPlayDevices(NULL, g_HIDInfo[i]->asHID, 
     972                                             g_InfList[g_HIDInfo[i]->nInfNum]->asDesPath, 
     973                                             INSTALLFLAG_FORCE, 
     974                                             &reboot);
     975                 }
     976 
     977                 if(g_HIDInfo[i]->nNumNotCone)
     978                 {
     979                     dev_index = 0;
     980 
     981                     // 寻找所有设备,设置Flag值为DIGCF_ALLCLASSES。
     982                     dev_info = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
     983 
     984                     if(dev_info == INVALID_HANDLE_VALUE)
     985                         continue;
     986 
     987                     // 枚举设备
     988                     while(SetupDiEnumDeviceInfo(dev_info, dev_index, &dev_info_data))
     989                     {
     990                         // 先取设备ID,判断是否是当前更新设备
     991                         if(SetupDiGetDeviceRegistryProperty(dev_info, &dev_info_data,
     992                             SPDRP_HARDWAREID, NULL,
     993                             (BYTE *)tmp_id,
     994                             sizeof(tmp_id), 
     995                             NULL))
     996                         {
     997                             //获得的是一个字符串列表,故而需要遍历
     998                             for(p = tmp_id; *p; p += (strlen(p) + 1))
     999                             {
    1000                                 strlwr(p);
    1001 
    1002                                 if(strstr(p, id))
    1003                                 {
    1004                                     // 判断此设备是不是当前未连接在系统
    1005                                     if(CM_Get_DevNode_Status(&status,
    1006                                         &problem,
    1007                                         dev_info_data.DevInst,
    1008                                         0) == CR_NO_SUCH_DEVINST)
    1009                                     {
    1010                                         // 取当前配置值
    1011                                         if(SetupDiGetDeviceRegistryProperty(dev_info,
    1012                                             &dev_info_data,
    1013                                             SPDRP_CONFIGFLAGS,
    1014                                             NULL,
    1015                                             (BYTE *)&config_flags,
    1016                                             sizeof(config_flags),
    1017                                             NULL))
    1018                                         {
    1019                                             // 与CONFIGFLAG_REINSTALL或
    1020                                             config_flags |= CONFIGFLAG_REINSTALL;
    1021 
    1022                                             // 将新的配置值写入
    1023                                             SetupDiSetDeviceRegistryProperty(dev_info,
    1024                                                 &dev_info_data,
    1025                                                 SPDRP_CONFIGFLAGS,
    1026                                                 (BYTE *)&config_flags,
    1027                                                 sizeof(config_flags));
    1028                                         }
    1029                                     }
    1030                                     
    1031                                     // 找到一个即可,跳出。
    1032                                     break;
    1033                                 }
    1034                             }
    1035                         }
    1036 
    1037                         dev_index++;
    1038                     }
    1039 
    1040                     SetupDiDestroyDeviceInfoList(dev_info);
    1041                 }
    1042             }
    1043         }        
    1044 
    1045     }
    1046     __finally
    1047     {
    1048     }
    1049 
    1050     return 0;
    1051 }
    1052 
    1053 /////////////////////以下函数是移入的//////////////////////////////////////
    1054 
    1055 BOOL IsDeviceInstallInProgress (VOID)
    1056 {
    1057     return !(CM_WaitNoPendingInstallEvents(0) == WAIT_OBJECT_0);
    1058 }
    1059 
    1060 int RemoveDriver(_TCHAR *HardwareID)
    1061 {
    1062     HDEVINFO DeviceInfoSet;
    1063     SP_DEVINFO_DATA DeviceInfoData;
    1064     DWORD i,err;
    1065     //GUID devGUID ={36fc9e60-c465-11cf-8056-444553540000};
    1066 
    1067     DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
    1068         0,
    1069         0,
    1070         DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system
    1071 
    1072     if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    1073     {
    1074         printf("GetClassDevs(All Present Devices)
    ");
    1075         return 1;
    1076     }
    1077 
    1078     //
    1079     //  Enumerate through all Devices.
    1080     //
    1081     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    1082     for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)
    1083     {
    1084         DWORD DataT;
    1085         LPTSTR p,buffer = NULL;
    1086         DWORD buffersize = 0;
    1087 
    1088         //
    1089         // We won't know the size of the HardwareID buffer until we call
    1090         // this function. So call it with a null to begin with, and then
    1091         // use the required buffer size to Alloc the nessicary space.
    1092         // Keep calling we have success or an unknown failure.
    1093         //
    1094         while (!SetupDiGetDeviceRegistryProperty(
    1095             DeviceInfoSet,
    1096             &DeviceInfoData,
    1097             SPDRP_HARDWAREID,
    1098             &DataT,
    1099             (PBYTE)buffer,
    1100             buffersize,
    1101             &buffersize))
    1102         {
    1103             if (GetLastError() == ERROR_INVALID_DATA)
    1104             {
    1105                 //
    1106                 // May be a Legacy Device with no HardwareID. Continue.
    1107                 //
    1108                 break;
    1109             }
    1110             else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    1111             {
    1112                 //
    1113                 // We need to change the buffer size.
    1114                 //
    1115                 if (buffer)
    1116                     LocalFree(buffer);
    1117                 buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
    1118             }
    1119             else
    1120             {
    1121                 //
    1122                 // Unknown Failure.
    1123                 //
    1124                 printf("GetDeviceRegistryProperty");
    1125                 goto cleanup_DeviceInfo;
    1126             }
    1127         }
    1128 
    1129         if (GetLastError() == ERROR_INVALID_DATA)
    1130             continue;
    1131 
    1132         //
    1133         // Compare each entry in the buffer multi-sz list with our HardwareID.
    1134 
    1135 
    1136         //
    1137         for (p = buffer; *p && (p < &buffer[buffersize]);p+=lstrlen(p)*sizeof(TCHAR) + 2)
    1138 
    1139 
    1140         {
    1141             //_tprintf(TEXT("Compare device ID: [%s]/n"),p);
    1142 
    1143             if (!_tcscmp(HardwareID,p))
    1144             {
    1145                 //_tprintf(TEXT("Found! [%s]/n"),p);
    1146 
    1147                 //
    1148                 // Worker function to remove device.
    1149                 //
    1150                 //if (SetupDiCallClassInstaller(DIF_REMOVE,
    1151                 //    DeviceInfoSet,
    1152                 //    &DeviceInfoData))
    1153 
    1154                 if (SetupDiRemoveDevice(DeviceInfoSet, &DeviceInfoData))
    1155 
    1156 
    1157                 {
    1158                     printf("CallClassInstaller(REMOVE)
    ");
    1159                 }
    1160                 else
    1161                     printf("Remove Driver Fail
    ");
    1162                 break;
    1163             }
    1164 
    1165             //printf("TTTTTTTTTTTTTTTTT is %s
    ",p);
    1166             //getch();
    1167         }
    1168 
    1169         if (buffer) LocalFree(buffer);
    1170     }
    1171 
    1172     if ((GetLastError()!=NO_ERROR)&&(GetLastError()!=ERROR_NO_MORE_ITEMS))
    1173     {
    1174         printf("EnumDeviceInfo
    ");
    1175     }
    1176 
    1177     //
    1178     //  Cleanup.
    1179     //
    1180 cleanup_DeviceInfo:
    1181     err = GetLastError();
    1182     SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    1183 
    1184     return err;
    1185 }
    1186 
    1187 VOID UninstallWDMDriver(LPCTSTR theHardware) 
    1188 {
    1189     
    1190     
    1191    /* HKEY hKey;
    1192      //删除安装包inf,不然刷新设备会重新安装
    1193      if(INVALID_HANDLE_VALUE==(hKey = SetupDiOpenDevRegKey(hDevInfo,&spDevInfoData,DICS_FLAG_GLOBAL,0,
    1194          DIREG_DEV,KEY_ALL_ACCESS)))
    1195      {
    1196          printf("Open Key Has Failed.
    ");
    1197      }*/
    1198      
    1199     //RegGetValue(hKey,L"InfPath");
    1200     HKEY hKey[50] = {0};
    1201     DWORD type_1=REG_SZ;
    1202     BYTE buffer[512] = {0};
    1203     BYTE buffer2[512] = {0};
    1204     DWORD cbData_1=512;
    1205     PWCHAR pSubStr = NULL;
    1206     PWCHAR pSubWork = NULL;
    1207     WCHAR SubKeyName[128] = {0};
    1208     DWORD SizeSubKeyName = sizeof(WCHAR)*128;
    1209     DWORD Index = 0;
    1210     WCHAR KeyPath[512] = L"SYSTEM\CurrentControlSet\Enum\USB\VID_0451&PID_AF32";
    1211     //WCHAR constKeyPath[512] = L"SYSTEM\CurrentControlSet\Enum\";
    1212     //wcscat(KeyPath,theHardware);
    1213     //wcscat(constKeyPath,theHardware);
    1214     WCHAR Path[128] = L"MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_0451&PID_AF32";
    1215     //wcscat(Path,theHardware);
    1216     WCHAR DeleteKeyPath[128] = L"SYSTEM\CurrentControlSet\Enum\USB\VID_0451&PID_AF32" ;
    1217     //wcscat(DeleteKeyPath,theHardware);
    1218     //WCHAR  EndChar = 'f';
    1219 
    1220     //if(ConfigRight(Path))
    1221     //    printf("Set Right Success!
    ");
    1222     
    1223     //这里如果是KEY_ALL_ACCESS就会返回失败,以前尝试注册表提权ConfigRight失败。原因是无SYSTEM权限
    1224     //
    1225     if(ERROR_SUCCESS !=RegOpenKeyEx(HKEY_LOCAL_MACHINE,KeyPath,0,KEY_ALL_ACCESS,&hKey[0]))
    1226         printf("UninstallWDMDriver OpenKey Fail! error code is %d
    ",GetLastError());
    1227 
    1228     printf("OpenKey Success!
    ");
    1229 
    1230     //getch();
    1231     
    1232     ZeroMemory(KeyPath,sizeof(WCHAR)*512);
    1233     
    1234     //枚举子键
    1235 
    1236     while(ERROR_SUCCESS == RegEnumKey(hKey[0],Index,SubKeyName,SizeSubKeyName/*,NULL,NULL,NULL,NULL*/))
    1237     {
    1238        
    1239       wcscpy(KeyPath,L"SYSTEM\CurrentControlSet\Enum\USB\VID_0451&PID_AF32");
    1240       wcscat(KeyPath,L"\");
    1241       wcscat(KeyPath,SubKeyName);
    1242        
    1243        Index++;
    1244 
    1245       // ZeroMemory(buffer,sizeof(BYTE)*512);
    1246        //ZeroMemory(buffer2,sizeof(BYTE)*512);
    1247       // ZeroMemory(SubKeyName,SizeSubKeyName);
    1248        //ZeroMemory(KeyPath,sizeof(WCHAR)*512);
    1249        
    1250        if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,KeyPath,0,KEY_READ,&hKey[Index]))
    1251            printf("OpenKey Success!
    ");
    1252 
    1253        if( ERROR_SUCCESS==RegQueryValueEx(hKey[Index],L"DeviceDesc",NULL,&type_1,buffer,&cbData_1))
    1254        
    1255            printf("Get Buffer1 Success!
    ");
    1256 
    1257        printf("%d
    ",GetLastError());
    1258        
    1259        
    1260        if( ERROR_SUCCESS==RegQueryValueEx(hKey[Index],L"Mfg",NULL,&type_1,buffer2,&cbData_1))
    1261            printf("Get Buffer2 Success!
    ");
    1262        
    1263        printf("%d
    ",GetLastError());
    1264 
    1265        RegCloseKey(hKey[Index]);
    1266 
    1267        //搜索OEM文件
    1268 
    1269        if(NULL == (pSubStr = wcsstr((wchar_t*)buffer,L"oem")))
    1270        {
    1271            printf("Search SubString_buffer Fail!
    ");
    1272 
    1273            if(NULL == (pSubStr = wcsstr((wchar_t*)buffer2,L"oem")))
    1274            {
    1275                printf("Search SubString_buffer2 Fail!
    ");
    1276 
    1277                ZeroMemory(buffer,sizeof(BYTE)*512);
    1278                ZeroMemory(buffer2,sizeof(BYTE)*512);
    1279                ZeroMemory(SubKeyName,SizeSubKeyName);
    1280                ZeroMemory(KeyPath,sizeof(WCHAR)*512);
    1281                //KeyPath = NULL;
    1282                continue;
    1283            }
    1284            else
    1285            {
    1286               // ZeroMemory(buffer,sizeof(BYTE)*512);
    1287                //ZeroMemory(buffer2,sizeof(BYTE)*512);
    1288                //ZeroMemory(SubKeyName,SizeSubKeyName);
    1289                //ZeroMemory(KeyPath,sizeof(WCHAR)*512);
    1290                //KeyPath = NULL;
    1291                //continue;
    1292 
    1293                 printf("Search Success!
    ");
    1294 
    1295                 
    1296                
    1297                pSubWork = pSubStr;
    1298 
    1299                while((*pSubWork) != 'f')
    1300                {
    1301                    pSubWork++;
    1302                }
    1303 
    1304                pSubWork++;
    1305 
    1306                *pSubWork = '';
    1307 
    1308                WCHAR OemFileName1[128];
    1309 
    1310                wcscpy(OemFileName1,pSubStr);
    1311 
    1312                SP_DEVINFO_DATA spDevInfoData = {0};  
    1313                HDEVINFO hDevInfo = 0L;  
    1314                WORD wIdx, wCount = 0;  
    1315 
    1316                //得到设备信息结构的句柄  
    1317                hDevInfo = SetupDiGetClassDevs(0L, 0L, 0L, DIGCF_ALLCLASSES | DIGCF_PRESENT);  
    1318                if (hDevInfo == INVALID_HANDLE_VALUE)  
    1319                {  
    1320                    printf("Fail!
    "); 
    1321                    return;  
    1322                }  
    1323 
    1324                wIdx = 0;  
    1325                while (TRUE)  
    1326                {  
    1327                    spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
    1328                    //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
    1329                    if (SetupDiEnumDeviceInfo(hDevInfo, wIdx, &spDevInfoData))  
    1330                    {  
    1331                        char Buffer[2048] = {0};  
    1332 
    1333                        //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
    1334                        if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID,  
    1335                            0L, (PBYTE)Buffer, 2048, 0L))  
    1336                        {  
    1337                            if (!lstrcmpi(theHardware, (LPTSTR)Buffer))  
    1338                            {  
    1339                                //从系统中删除一个注册的设备接口  
    1340                                if (!SetupDiRemoveDevice(hDevInfo, &spDevInfoData))  
    1341                                    printf("Remove Fail is %d!
    ",GetLastError()); 
    1342                                //if(!SetupDiCallClassInstaller(DIF_REMOVE,hDevInfo,&spDevInfoData))
    1343                                //   printf("Remove Fail is %d!
    ",GetLastError());
    1344                                wCount++;  
    1345                            }  
    1346                        }  
    1347                    }  
    1348                    else  
    1349                        break;  
    1350                    wIdx++;  
    1351                }  
    1352 
    1353                if (wCount != 0)  
    1354                    _tprintf(_T("UnInstall Successed...
    ")); 
    1355 
    1356                //getch();
    1357 
    1358                //wprintf("%s
    ",(wchar_t*)pSubStr);
    1359                if(SetupUninstallOEMInf(OemFileName1, SUOI_FORCEDELETE, NULL))
    1360                    printf("Driver Package Has Deleted succced!
    ");
    1361 
    1362                
    1363 
    1364                //销毁一个设备信息集合  
    1365                SetupDiDestroyDeviceInfoList(hDevInfo);
    1366 
    1367               /* for(int i = 0; i <= Index; i++)
    1368                {
    1369                    RegCloseKey(hKey[i]);
    1370                }*/
    1371 
    1372                /*if(ERROR_SUCCESS==RegDeleteTree(hKey[0],NULL))
    1373                {
    1374                    printf("Registry Has Delete Success!
    ");
    1375                    return ;
    1376                }*/
    1377 
    1378                RegCloseKey(hKey[0]);
    1379 
    1380               DeleteTree(HKEY_LOCAL_MACHINE,DeleteKeyPath);
    1381 
    1382                 //printf("Registry Has Delete Su",GetLastError());
    1383 
    1384                return ;
    1385            }
    1386        }
    1387        else
    1388        {
    1389           // ZeroMemory(buffer,sizeof(BYTE)*512);
    1390            //ZeroMemory(buffer2,sizeof(BYTE)*512);
    1391            //ZeroMemory(SubKeyName,SizeSubKeyName);
    1392            //ZeroMemory(KeyPath,sizeof(WCHAR)*512);
    1393            //KeyPath = NULL;
    1394            //continue;
    1395 
    1396            printf("Search Success!
    ");
    1397            
    1398            pSubWork = pSubStr;
    1399 
    1400            while((*pSubWork) != 'f')
    1401            {
    1402                pSubWork++;
    1403            }
    1404 
    1405            pSubWork++;
    1406 
    1407            *pSubWork = '';
    1408 
    1409            WCHAR OemFileName2[128];
    1410 
    1411            wcscpy(OemFileName2,pSubStr);
    1412 
    1413            SP_DEVINFO_DATA spDevInfoData = {0};  
    1414            HDEVINFO hDevInfo = 0L;  
    1415            WORD wIdx, wCount = 0;  
    1416 
    1417            //得到设备信息结构的句柄  
    1418            hDevInfo = SetupDiGetClassDevs(0L, 0L, 0L, DIGCF_ALLCLASSES | DIGCF_PRESENT);  
    1419            if (hDevInfo == INVALID_HANDLE_VALUE)  
    1420            {  
    1421                printf("Fail!
    "); 
    1422                return;  
    1423            }  
    1424 
    1425            wIdx = 0;  
    1426            while (TRUE)  
    1427            {  
    1428                spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
    1429                //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
    1430                if (SetupDiEnumDeviceInfo(hDevInfo, wIdx, &spDevInfoData))  
    1431                {  
    1432                    char Buffer[2048] = {0};  
    1433 
    1434                   
    1435 
    1436                    //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
    1437                    if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID,  
    1438                        0L, (PBYTE)Buffer, 2048, 0L))  
    1439                    {  
    1440                        
    1441                        printf("SetupDiGetDeviceRegistryProperty Success!
    ");
    1442                        
    1443                        if (!lstrcmpi(theHardware, (LPTSTR)Buffer))  
    1444                        {  
    1445                            
    1446                            //从系统中删除一个注册的设备接口  
    1447                            if (!SetupDiRemoveDevice(hDevInfo, &spDevInfoData))  
    1448                                printf("Remove Fail is %d!
    ",GetLastError()); 
    1449                            //if(!SetupDiCallClassInstaller(DIF_REMOVE,hDevInfo,&spDevInfoData))
    1450                            //   printf("Remove Fail is %d!
    ",GetLastError());
    1451                  
    1452                            wCount++;  
    1453                        } 
    1454 
    1455                       
    1456                    }  
    1457                }  
    1458                else  
    1459                    break;  
    1460                wIdx++;  
    1461            }  
    1462 
    1463            if (wCount != 0)  
    1464                _tprintf(_T("UnInstall Successed...
    ")); 
    1465            
    1466           // getch();
    1467            //wprintf("%s
    ",(wchar_t*)pSubStr);
    1468            if(SetupUninstallOEMInf(OemFileName2, SUOI_FORCEDELETE, NULL))
    1469                printf("Driver Package Has Deleted succced!
    ");
    1470 
    1471            //销毁一个设备信息集合  
    1472            SetupDiDestroyDeviceInfoList(hDevInfo);
    1473 
    1474            /*for(int i = 0; i <= Index; i++)
    1475            {
    1476                RegCloseKey(hKey[i]);
    1477            }*/
    1478             //
    1479            /*if(ERROR_SUCCESS==RegDeleteTree(hKey[0],NULL))
    1480            {
    1481                printf("Registry Has Delete Success!
    ");
    1482                return;
    1483            }*/
    1484 
    1485            RegCloseKey(hKey[0]);
    1486 
    1487            DeleteTree(HKEY_LOCAL_MACHINE,DeleteKeyPath);
    1488 
    1489            // printf("Registry Has Delete Fail! Error Code is %d
    ",GetLastError());
    1490 
    1491 
    1492            return;
    1493        }
    1494        
    1495 
    1496 
    1497        
    1498        
    1499     }
    1500 
    1501     printf("Here is windows XP!
    ");
    1502    
    1503     //getch();
    1504     
    1505     SP_DEVINFO_DATA spDevInfoData = {0};  
    1506     HDEVINFO hDevInfo = 0L;  
    1507     WORD wIdx, wCount = 0; 
    1508     WCHAR oem_file_name[128] = {0};
    1509     //GUID usb_guid = {36fc9e60,c465,11cf,8056,444553540000};
    1510     //得到设备信息结构的句柄  
    1511     hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);  
    1512     
    1513     if (hDevInfo == INVALID_HANDLE_VALUE)  
    1514     {  
    1515         printf("Fail!
    ");
    1516         printf("SetupDiGetClassDevs Error Code is %d
    ",GetLastError());
    1517         return;  
    1518     }  
    1519 
    1520     wIdx = 0; 
    1521 
    1522     printf("hDevInfo is %x
    ",hDevInfo);
    1523     
    1524     while (TRUE)  
    1525     {  
    1526         spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
    1527         //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
    1528         if (SetupDiEnumDeviceInfo(hDevInfo, wIdx, &spDevInfoData))  
    1529         {  
    1530 
    1531              
    1532              printf("SetupDiEnumDeviceInfo Success!
    ");
    1533             
    1534              char Buffer[2048] = {0};  
    1535 
    1536             //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
    1537             if (SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID,  
    1538                 0L, (PBYTE)Buffer, 2048, 0L))  
    1539             {  
    1540                 printf("SetupDiGetDeviceRegistryProperty Success!
    ");
    1541 
    1542                 wprintf(L"Buffer is %s
    ",Buffer);
    1543                 
    1544                 if (!lstrcmpi(theHardware, (LPTSTR)Buffer))  
    1545                 {  
    1546                     printf("theHardware is matched!
    ");
    1547                     
    1548                     HKEY hDevKey;
    1549                     BYTE buffer3[512] = {0};
    1550                     DWORD buffer3_size = 512;
    1551                     //打开有关设备注册表
    1552                     hDevKey = SetupDiOpenDevRegKey(hDevInfo,&spDevInfoData, DICS_FLAG_GLOBAL,0,DIREG_DRV,KEY_ALL_ACCESS);
    1553                     
    1554                     if(hDevKey ==  INVALID_HANDLE_VALUE)
    1555                     {
    1556                         printf("SetupDiOpenRegKey Error Code is %d
    ",GetLastError());
    1557                     }
    1558                     
    1559                     if(ERROR_SUCCESS == RegQueryValueEx(hDevKey,L"InfPath",NULL,NULL,buffer3,&buffer3_size))
    1560                     {
    1561                        wprintf(L"Get Buffer3 Success! Buffer3 is %s
    ",buffer3);
    1562                     }
    1563                     
    1564                     wcscpy(oem_file_name,(wchar_t*)buffer3);
    1565                     wprintf(oem_file_name);
    1566                     printf("
    ");
    1567                     //getch();
    1568                     RegCloseKey(hDevKey);
    1569                     //从系统中删除一个注册的设备接口  
    1570                     /*if (!SetupDiRemoveDevice(hDevInfo, &spDevInfoData))  
    1571                     {
    1572                         printf("Remove Fail is %d!
    ",GetLastError());
    1573                     }*/
    1574                     
    1575 
    1576                     /*if(!SetupDiCallClassInstaller(DIF_REMOVE,hDevInfo,&spDevInfoData))
    1577                       printf("Remove Fail is %d!
    ",GetLastError());*/
    1578                     SP_REMOVEDEVICE_PARAMS rmdParams;
    1579                     SP_DEVINSTALL_PARAMS devParams;
    1580 
    1581                     rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
    1582                     rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE;
    1583                     rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL;
    1584                     rmdParams.HwProfile = 0;
    1585 
    1586                     if(SetupDiSetClassInstallParams(hDevInfo, &spDevInfoData, &rmdParams.ClassInstallHeader, sizeof(rmdParams)) &&
    1587                         SetupDiCallClassInstaller(DIF_REMOVE, hDevInfo, &spDevInfoData)) 
    1588                     {
    1589                         
    1590                            
    1591                         
    1592                     }
    1593                     wCount++;  
    1594                 }  
    1595 
    1596 
    1597                 
    1598             }  
    1599         }  
    1600         else 
    1601         {
    1602             
    1603            break;  
    1604         }
    1605             
    1606         wIdx++;  
    1607     }  
    1608 
    1609     if (wCount != 0)  
    1610         _tprintf(_T(" UnInstall Successed on windows XP...
    ")); 
    1611 
    1612     if(SetupUninstallOEMInf(oem_file_name, SUOI_FORCEDELETE, NULL))
    1613         printf("Driver Package Has Deleted succced! on windows XP
    ");
    1614     
    1615     
    1616     //getch();
    1617 
    1618     //销毁一个设备信息集合  
    1619     SetupDiDestroyDeviceInfoList(hDevInfo);
    1620 
    1621     
    1622     //递归删除DeleteKeyPath下子键
    1623     /*DeleteTree(HKEY_LOCAL_MACHINE,DeleteKeyPath);
    1624     
    1625     HKEY hKey2;//删除DeleteKeyPath键本身
    1626     
    1627     if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,DeleteKeyPath,0,KEY_ALL_ACCESS,&hKey2))
    1628     {
    1629         printf("Can not Open Key!(Delete part!) Error Code is %d
    ",GetLastError());
    1630         return ;
    1631     }
    1632     
    1633     RegDeleteKey(hKey2,DeleteKeyPath);
    1634 
    1635     RegCloseKey(hKey2);*/
    1636 
    1637     
    1638     
    1639     //InitialGlobalVar();  
    1640     return;  
    1641 }
    1642 
    1643 BOOL UnicodeToAnsi(LPCWSTR Source, const WORD wLen, LPSTR Destination, const WORD sLen)  
    1644 {  
    1645     return WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, Source, wLen, Destination, 
    1646         sLen, 0L, 0L);  
    1647 }  
    1648 
    1649 BOOL AnsiToUnicode(LPCSTR Source, const WORD sLen, LPWSTR Destination, const WORD wLen)  
    1650 {  
    1651     return MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, Source, sLen, Destination, wLen);  
    1652 }  
    1653 
    1654 
    1655 /*BOOL GetINFData(FILE *pFile)  
    1656 {  
    1657     WORD wLoop;  
    1658 
    1659     if (!g_wVender || !g_wHardware)  
    1660         InitialGlobalVar();  
    1661     if (GetSectionData(pFile, "[Manufacturer]", TRUE) == FALSE)  
    1662         return FALSE;  
    1663 
    1664     //rewind(pFile);
    1665 
    1666     for (wLoop = 0; wLoop < g_wVender; wLoop++)  
    1667     {  
    1668         CHAR szVender[64] = {0};  
    1669         UnicodeToAnsi(g_strVender[wLoop], _tcslen(g_strVender[wLoop]), szVender, 64);  
    1670         GetSectionData(pFile, "Device.NTamd64", FALSE);  
    1671     }  
    1672     if (g_wHardware != 0)  
    1673     {  
    1674         if (IsInstalled() == TRUE)//如果已经安装  
    1675             return FALSE;  
    1676         else  
    1677             return TRUE;  
    1678     }  
    1679     return FALSE;  
    1680 } */ 
    1681 
    1682 /*VOID InitialGlobalVar()  
    1683 {  
    1684     WORD wLoop;  
    1685 
    1686     g_wVender = g_wHardware = 0;  
    1687     for (wLoop = 0; wLoop < 20; wLoop++)  
    1688     {  
    1689         RtlZeroMemory(g_strVender[wLoop], sizeof(TCHAR)*64);  
    1690         RtlZeroMemory(g_strHardware[wLoop], sizeof(TCHAR)*64);  
    1691     }  
    1692 }  */
    1693 
    1694 VOID FindComma(LPSTR szData)  
    1695 {  
    1696     WORD wLen = (WORD)strlen(szData);  
    1697     WORD wIdx;  
    1698     WORD wLoop;   
    1699     CHAR szTmp[128] = {0};  
    1700 
    1701     for (wIdx = 0, wLoop = 0; wLoop < wLen; wLoop++)  
    1702     {  
    1703         if (szData[wLoop] == ',')  
    1704             szData[wLoop] = '.';  
    1705         else if (szData[wLoop] == ' ')  
    1706             continue;  
    1707         szTmp[wIdx++] = szData[wLoop];  
    1708     }  
    1709     memcpy(szData, szTmp, wIdx*sizeof(char));  
    1710     szData[wIdx] = 0;  
    1711 }  
    1712 
    1713 VOID StrLTrim(LPSTR szData)  
    1714 {  
    1715     LPSTR ptr = szData;  
    1716     //判断是否为空格  
    1717     while (isspace(*ptr))  
    1718         ptr++;  
    1719 
    1720     if (strcmp(ptr, szData))  
    1721     {  
    1722         WORD wLen = (WORD)(strlen(szData) - (ptr - szData));  
    1723         memmove(szData, ptr, (wLen+1)*sizeof(char));  
    1724     }  
    1725 }  
    1726 
    1727 VOID StrRTrim(LPSTR szData)  
    1728 {  
    1729     LPSTR ptr  = szData;  
    1730     LPSTR pTmp = NULL;  
    1731 
    1732     //debug模式下 使用isspace判断中文 需要设置编码  
    1733 #if defined(WIN32) && defined(_DEBUG)  
    1734     char* locale = setlocale( LC_ALL, ".OCP" );  
    1735 #endif   
    1736 
    1737     while (*ptr != 0)  
    1738     {  
    1739         //判断是否为空格  
    1740         if (isspace(*ptr))  
    1741         {  
    1742             if (!pTmp)  
    1743                 pTmp = ptr;  
    1744         }  
    1745         else  
    1746             pTmp = NULL;  
    1747         ptr++;  
    1748     }  
    1749 
    1750     if (pTmp)  
    1751     {  
    1752         *pTmp = 0;  
    1753         memmove(szData, szData, strlen(szData) - strlen(pTmp));  
    1754     }  
    1755 }  
    1756 
    1757 //从字符串右边开始截取字符串  
    1758 VOID StrRight(LPSTR szData, WORD wCount)  
    1759 {  
    1760     WORD wLen = (WORD)strlen(szData) - wCount;  
    1761 
    1762     if (wCount > 0x7FFF)//负数  
    1763         wCount = 0;  
    1764     if (wCount >= (WORD)strlen(szData))  
    1765         return;  
    1766 
    1767     memmove(szData, szData + wLen, wCount * sizeof(char));  
    1768     szData[wCount] = 0;  
    1769 }  
    1770 
    1771 VOID ConvertGUIDToString(const GUID guid, LPSTR pData)  
    1772 {  
    1773     CHAR szData[30] = {0};  
    1774     CHAR szTmp[3]   = {0};  
    1775     WORD wLoop;  
    1776 
    1777     sprintf_s(pData, _countof(szData), "%04X-%02X-%02X-", guid.Data1, guid.Data2, guid.Data3);  
    1778     for (wLoop = 0; wLoop < 8; wLoop++)  
    1779     {  
    1780         if (wLoop == 2)  
    1781             strcat_s(szData, "-");  
    1782         sprintf_s(szTmp, _countof(szTmp), "%02X", guid.Data4[wLoop]);  
    1783         strcat_s(szData, szTmp);  
    1784     }  
    1785 
    1786     memcpy(pData + strlen(pData), szData, strlen(szData));  
    1787 }  
    1788 
    1789 /*BOOL IsInstalled()  
    1790 {  
    1791     HDEVINFO hDevInfo = 0L;  
    1792     SP_DEVINFO_DATA spDevInfoData = {0L};  
    1793     WORD wIdx;  
    1794     BOOL bIsFound;  
    1795 
    1796     //得到设备信息结构的句柄  
    1797     hDevInfo = SetupDiGetClassDevs(0L, 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);  
    1798     if (hDevInfo == INVALID_HANDLE_VALUE)  
    1799     {  
    1800         printf("SetupDiGetClassDevs is %d",GetLastError());  
    1801         return FALSE;  
    1802     }  
    1803 
    1804     spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);  
    1805     wIdx = 0;  
    1806     bIsFound = 0;  
    1807     while (++wIdx)  
    1808     {  
    1809         //找到所有的硬件设备,并且可以得到所有的硬件设备的详细信息  
    1810         if (SetupDiEnumDeviceInfo(hDevInfo, wIdx, &spDevInfoData))  
    1811         {  
    1812             LPTSTR ptr;  
    1813             LPBYTE pBuffer = NULL;  
    1814             DWORD dwData  = 0L;  
    1815             DWORD dwRetVal;  
    1816             DWORD dwBufSize = 0L;  
    1817 
    1818             while (TRUE)  
    1819             {  
    1820                 //可以在前面得到的指向某一个具体设备信息集合的指针中取出某一项信息  
    1821                 dwRetVal = SetupDiGetDeviceRegistryProperty(hDevInfo, &spDevInfoData, SPDRP_HARDWAREID,  
    1822                     &dwData, (PBYTE)pBuffer, dwBufSize, &dwBufSize);  
    1823                 if (!dwRetVal)  
    1824                     dwRetVal = GetLastError();  
    1825                 else  
    1826                     break;  
    1827                 if (dwRetVal == ERROR_INVALID_DATA)  
    1828                     break;  
    1829                 else if (dwRetVal == ERROR_INSUFFICIENT_BUFFER)  
    1830                 {  
    1831                     if (pBuffer)  
    1832                         LocalFree(pBuffer);  
    1833                     pBuffer = (LPBYTE)LocalAlloc(LPTR, dwBufSize);  
    1834                 }  
    1835                 else  
    1836                 {  
    1837                     printf("SetupDiGetDeviceRegistryProperty is %d",dwRetVal);  
    1838                     //销毁一个设备信息集合  
    1839                     SetupDiDestroyDeviceInfoList(hDevInfo);  
    1840                     return FALSE;  
    1841                 }  
    1842             }  
    1843 
    1844             if (dwRetVal == ERROR_INVALID_DATA)   
    1845                 continue;  
    1846 
    1847             for (ptr = (LPTSTR)pBuffer; *ptr && (ptr < (LPTSTR)&pBuffer[dwBufSize]); ptr += _tcslen(ptr) + sizeof(TCHAR))  
    1848             {  
    1849                 WORD wLoop;  
    1850 
    1851                 for (wLoop = 0; wLoop < g_wHardware; wLoop++)  
    1852                 {  
    1853                     if (!_tcscmp(g_strHardware[wLoop], ptr))  
    1854                     {  
    1855                         bIsFound = TRUE;  
    1856                         break;  
    1857                     }  
    1858                 }  
    1859             }  
    1860             if (pBuffer)  
    1861                 LocalFree(pBuffer);  
    1862             if (bIsFound)  
    1863                 break;  
    1864         }  
    1865     }  
    1866     //销毁一个设备信息集合  
    1867     SetupDiDestroyDeviceInfoList(hDevInfo);  
    1868     return bIsFound;  
    1869 }  */
    1870 
    1871 //寻找指定的节名 如果找到返回TRUE 反之返回FALSE  
    1872 BOOL FindSectionName(FILE *pFile, const char *szKey)  
    1873 {  
    1874     char szData[256] = {0};  
    1875 
    1876     if (!pFile)  
    1877         return FALSE;  
    1878 
    1879     //将文件内部的位置指针重新指向一个流(数据流/文件)的开头  
    1880     rewind(pFile);  
    1881     //循环读取文件内容  
    1882     while (!feof(pFile))  
    1883     {  
    1884         //读取一行  
    1885         fgets(szData, 255, pFile);  
    1886         //去除前后空格  
    1887         StrLTrim(szData);  
    1888         StrRTrim(szData);  
    1889 
    1890         if (strcmp(szKey, szData) == 0)  
    1891             return TRUE;          
    1892     }  
    1893     return FALSE;  
    1894 }  
    1895 
    1896 //得到INF文件中节的数量  
    1897 /*BOOL GetSectionData(FILE* pFile, const char* szKey, const char bIsVender)  
    1898 {  
    1899     char szData[128] = {0};  
    1900 
    1901     if (bIsVender)  
    1902         strcpy_s(szData, szKey);  
    1903     else  
    1904         sprintf_s(szData, _countof(szData), "[%s]", szKey);  
    1905 
    1906     if (FindSectionName(pFile, szData) == FALSE)  
    1907         return FALSE;  
    1908 
    1909     RtlZeroMemory(szData, sizeof(char)*128);  
    1910     while (!feof(pFile))  
    1911     {  
    1912         char *str = NULL;  
    1913         fgets(szData, 127, pFile);  
    1914         szData[strlen(szData)-1] = 0;  
    1915         StrLTrim(szData);  
    1916         StrRTrim(szData);  
    1917         if (!*szData)  
    1918             continue;  
    1919         if (szData[0] == ';')  
    1920             continue;  
    1921 
    1922         if (strchr(szData, '['))  
    1923         {  
    1924             StrLTrim(szData);  
    1925             if (szData[0] != ';')  
    1926                 return 1;  
    1927             else  
    1928                 continue;  
    1929         }  
    1930 
    1931         if (bIsVender)  
    1932             str = strchr(szData, '=');  
    1933         else  
    1934             str = strchr(szData, ',');  
    1935 
    1936         if (*str)  
    1937         {  
    1938             char szTmp[128] = {0};  
    1939             WORD pos = (WORD)(str - szData + 1);  
    1940 
    1941             StrRight(szData, (short)(strlen(szData)-pos));  
    1942             StrLTrim(szData);  
    1943             StrRTrim(szData);  
    1944             FindComma(szData);  
    1945             if (bIsVender)  
    1946             {  
    1947                 AnsiToUnicode(szData, strlen(szData), g_strVender[g_wVender++], 64);  
    1948             }  
    1949             else  
    1950             {  
    1951                 AnsiToUnicode(szData, strlen(szData), g_strHardware[g_wHardware++], 64);  
    1952             }  
    1953         } //end if   
    1954     }  
    1955     return TRUE;  
    1956 }  */
    1957 
    1958 //实质性的安装驱动  
    1959 BOOL InstallClassDriver(LPCTSTR theINFName)  
    1960 {  
    1961     GUID guid = {0};  
    1962     SP_DEVINFO_DATA spDevData = {0};  
    1963     HDEVINFO hDevInfo = 0L;  
    1964     TCHAR className[MAX_CLASS_NAME_LEN] = {0};  
    1965     LPTSTR pHID = NULL;  
    1966     WORD wLoop;  
    1967     BOOL bRebootRequired;  
    1968 
    1969     //取得此驱动的GUID值  ,className也是输出参数
    1970     if (!SetupDiGetINFClass(theINFName, &guid, className, MAX_CLASS_NAME_LEN, 0))  
    1971     {  
    1972         printf( "SetupDiGetINFClass is %d
    ",GetLastError());  
    1973         return FALSE;  
    1974     }  
    1975 
    1976     //创建设备信息块列表  
    1977     hDevInfo = SetupDiCreateDeviceInfoList(&guid, 0);  
    1978     if (hDevInfo == INVALID_HANDLE_VALUE)  
    1979     {  
    1980         printf("SetupDiCreateDeviceInfoList is %d
    ",GetLastError());  
    1981         return FALSE;  
    1982     }  
    1983 
    1984     spDevData.cbSize = sizeof(SP_DEVINFO_DATA);  
    1985     //创建设备信息块  
    1986     if (!SetupDiCreateDeviceInfo(hDevInfo, className, &guid, 0L, 0L, DICD_GENERATE_ID, &spDevData))  
    1987     {  
    1988         printf("SetupDiCreateDeviceInfo is %d",GetLastError());  
    1989         //销毁一个设备信息集合  
    1990         SetupDiDestroyDeviceInfoList(hDevInfo);  
    1991         return FALSE;  
    1992     }  
    1993 
    1994     // for (wLoop = 0; wLoop < g_wHardware; wLoop++)  
    1995     //{  
    1996     if (pHID)  
    1997         LocalFree(pHID);  
    1998 
    1999 
    2000 
    2001     pHID = (LPTSTR)LocalAlloc(LPTR, _tcslen(L"USB\VID_0451&PID_AF32")*2*sizeof(TCHAR));  
    2002     if (!pHID)  
    2003     {  
    2004         printf("LocalAlloc is %d",GetLastError());  
    2005         //销毁一个设备信息集合  
    2006         SetupDiDestroyDeviceInfoList(hDevInfo);  
    2007         return FALSE;  
    2008     }  
    2009 
    2010     _tcscpy_s(pHID, _tcslen(L"USB\VID_0451&PID_AF32")*2, 
    2011         L"USB\VID_0451&PID_AF32");  
    2012     //设定硬件ID  
    2013     if (!SetupDiSetDeviceRegistryProperty(hDevInfo, &spDevData, SPDRP_HARDWAREID, (PBYTE)pHID,  
    2014         (DWORD)(_tcslen(L"USB\VID_0451&PID_AF32")*2*sizeof(TCHAR))))  
    2015     {  
    2016         printf("SetupDiSetDeviceRegistryProperty is %d",GetLastError());  
    2017         //销毁一个设备信息集合  
    2018         SetupDiDestroyDeviceInfoList(hDevInfo);  
    2019         LocalFree(pHID);  
    2020         return FALSE;  
    2021     }  
    2022     //调用相应的类程序来注册设备  
    2023     if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, hDevInfo, &spDevData))  
    2024     {  
    2025         printf("SetupDiCallClassInstaller is %d", GetLastError());  
    2026         //销毁一个设备信息集合  
    2027         SetupDiDestroyDeviceInfoList(hDevInfo);  
    2028         LocalFree(pHID);  
    2029         return FALSE;  
    2030     }  
    2031 
    2032     bRebootRequired = FALSE;  
    2033     //安装更新和硬件ID相匹配的驱动程序  
    2034     if (!UpdateDriverForPlugAndPlayDevices(0L, L"USB\VID_0451&PID_AF32"
    2035         , theINFName,   
    2036         INSTALLFLAG_FORCE, &bRebootRequired))  
    2037     {  
    2038         DWORD dwErrorCode = GetLastError();  
    2039         //调用相应的类程序来移除设备  
    2040         if (!SetupDiCallClassInstaller(DIF_REMOVE, hDevInfo, &spDevData))  
    2041             printf("SetupDiCallClassInstaller(Remove) is %d",GetLastError());  
    2042         printf("UpdateDriverForPlugAndPlayDevices is %d",(WORD)dwErrorCode);  
    2043         //销毁一个设备信息集合  
    2044         SetupDiDestroyDeviceInfoList(hDevInfo);  
    2045         LocalFree(pHID);
    2046 
    2047         //getch();
    2048         return FALSE;  
    2049     }  
    2050     LocalFree(pHID);  
    2051     pHID = NULL;  
    2052 
    2053     // }  
    2054     //销毁一个设备信息集合  
    2055     SetupDiDestroyDeviceInfoList(hDevInfo);  
    2056     _tprintf(_T("Install Successed
    "));  
    2057     return TRUE;  
    2058 }  
    2059 
    2060 // 安装WDM驱动的测试工作  
    2061 BOOL StartInstallWDMDriver(LPCTSTR theInfName)  
    2062 {  
    2063     HDEVINFO hDevInfo = 0L;  
    2064     GUID guid = {0L};  
    2065     SP_DEVINSTALL_PARAMS spDevInst = {0L};  
    2066     TCHAR strClass[MAX_CLASS_NAME_LEN] = {0L};  
    2067 
    2068     //取得此驱动的GUID值  
    2069     if (!SetupDiGetINFClass(theInfName, &guid, strClass, MAX_CLASS_NAME_LEN, 0))  
    2070     {  
    2071         printf("SetupDiGetINFClass is %d",GetLastError());  
    2072         return FALSE;  
    2073     }  
    2074 
    2075     //得到设备信息结构的句柄  
    2076     hDevInfo = SetupDiGetClassDevs(&guid, 0L, 0L, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_PROFILE);  
    2077     if (!hDevInfo)  
    2078     {  
    2079         printf("SetupDiGetClassDevs is %d",GetLastError());  
    2080         return FALSE;  
    2081     }  
    2082 
    2083 
    2084     spDevInst.cbSize = sizeof(SP_DEVINSTALL_PARAMS);  
    2085     //获得指定设备的安装信息  
    2086     if (!SetupDiGetDeviceInstallParams(hDevInfo, 0L, &spDevInst))  
    2087     {  
    2088         printf("SetupDiGetDeviceInstallParams is %d",GetLastError());  
    2089         return FALSE;  
    2090     }  
    2091 
    2092     spDevInst.Flags   = DI_ENUMSINGLEINF;  
    2093     spDevInst.FlagsEx = DI_FLAGSEX_ALLOWEXCLUDEDDRVS;  
    2094     _tcscpy_s(spDevInst.DriverPath, _countof(spDevInst.DriverPath), theInfName);  
    2095 
    2096     //为设备信息集或者是一个实际的设备信息单元设置或清除类安装参数  
    2097     if (!SetupDiSetDeviceInstallParams(hDevInfo, 0, &spDevInst))  
    2098     {  
    2099 
    2100         printf("SetupDiSetDeviceInstallParams is %d",GetLastError());  
    2101         return FALSE;  
    2102     }  
    2103 
    2104     //获取这个设备的驱动程序信息列表  
    2105     if (!SetupDiBuildDriverInfoList(hDevInfo, 0, SPDIT_CLASSDRIVER))  
    2106     {  
    2107 
    2108         printf("SetupDiDeviceInstallParams is %d",GetLastError());
    2109         return FALSE;  
    2110     }  
    2111 
    2112     //销毁一个设备信息集合  
    2113     SetupDiDestroyDeviceInfoList(hDevInfo);  
    2114 
    2115     //进入安装设备驱动函数  
    2116     return InstallClassDriver(theInfName);  
    2117 }  
    2118 
    2119 BOOL FindExistingDevice(IN LPTSTR HardwareId)
    2120 {
    2121     HDEVINFO DeviceInfoSet;
    2122     SP_DEVINFO_DATA DeviceInfoData;
    2123     DWORD i,err;
    2124     BOOL Found;
    2125 
    2126     //
    2127     // Create a Device Information Set with all present devices.
    2128     //
    2129     DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
    2130         0,
    2131         0,
    2132         DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system
    2133 
    2134     if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    2135     {
    2136         return printf("GetClassDevs(All Present Devices)");
    2137 
    2138 
    2139     }
    2140 
    2141     //_tprintf(TEXT("Search for Device ID: [%s]/n"),HardwareId);
    2142 
    2143     //
    2144     //  Enumerate through all Devices.
    2145     //
    2146     Found = FALSE;
    2147     DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    2148     for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)
    2149     {
    2150         DWORD DataT;
    2151         LPTSTR p,buffer = NULL;
    2152         DWORD buffersize = 0;
    2153 
    2154         //
    2155         // We won't know the size of the HardwareID buffer until we call
    2156         // this function. So call it with a null to begin with, and then
    2157         // use the required buffer size to Alloc the nessicary space.
    2158         // Keep calling we have success or an unknown failure.
    2159         //
    2160         while (!SetupDiGetDeviceRegistryProperty(
    2161             DeviceInfoSet,
    2162             &DeviceInfoData,
    2163             SPDRP_HARDWAREID,
    2164             &DataT,
    2165             (PBYTE)buffer,
    2166             buffersize,
    2167             &buffersize))
    2168         {
    2169             if (GetLastError() == ERROR_INVALID_DATA)
    2170             {
    2171                 //
    2172                 // May be a Legacy Device with no HardwareID. Continue.
    2173                 //
    2174                 break;
    2175             }
    2176             else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    2177             {
    2178                 //
    2179                 // We need to change the buffer size.
    2180                 //
    2181                 if (buffer)
    2182                     LocalFree(buffer);
    2183                 buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
    2184             }
    2185             else
    2186             {
    2187                 //
    2188                 // Unknown Failure.
    2189                 //
    2190                 printf("GetDeviceRegistryProperty");
    2191                 goto cleanup_DeviceInfo;
    2192             }
    2193         }
    2194 
    2195         if (GetLastError() == ERROR_INVALID_DATA)
    2196             continue;
    2197 
    2198         //
    2199         // Compare each entry in the buffer multi-sz list with our HardwareID.
    2200 
    2201 
    2202         //
    2203         for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
    2204 
    2205 
    2206         {
    2207             //_tprintf(TEXT("Compare device ID: [%s]/n"),p);
    2208 
    2209             if (!_tcscmp(HardwareId,p))
    2210             {
    2211                 //_tprintf(TEXT("Found! [%s]/n"),p);
    2212                 Found = TRUE;
    2213                 break;
    2214             }
    2215         }
    2216 
    2217         if (buffer) LocalFree(buffer);
    2218         if (Found) break;
    2219     }
    2220 
    2221     if (GetLastError() != NO_ERROR)
    2222     {
    2223         printf("EnumDeviceInfo");
    2224     }
    2225 
    2226     //
    2227     //  Cleanup.
    2228     //
    2229 cleanup_DeviceInfo:
    2230     err = GetLastError();
    2231     SetupDiDestroyDeviceInfoList(DeviceInfoSet);
    2232     SetLastError(err);
    2233 
    2234     return err == NO_ERROR; //???
    2235 }
    2236 
    2237 BOOL ConfigRight(WCHAR* szPath)
    2238 {
    2239     if (szPath == NULL)
    2240     {
    2241         return FALSE;
    2242     }
    2243     /*BOOL bRet = TRUE;
    2244 
    2245     SE_OBJECT_TYPE objectType;
    2246     PACL newDACL;
    2247     objectType = SE_REGISTRY_KEY;
    2248 
    2249     if (SetEntriesInAclW(0, NULL, NULL, &newDACL) != ERROR_SUCCESS)
    2250     {
    2251         return FALSE;
    2252     }
    2253 
    2254     DWORD dwRet = 0;
    2255 
    2256     EXPLICIT_ACCESSW ea;
    2257     memset(&ea, 0, sizeof(EXPLICIT_ACCESS));
    2258 
    2259     BuildExplicitAccessWithNameW(&ea,L"Everyone", KEY_ALL_ACCESS, SET_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);
    2260 
    2261     if (SetEntriesInAclW(1, &ea, NULL, &newDACL) != ERROR_SUCCESS)
    2262     {
    2263         bRet = FALSE;
    2264         goto Clean_Up;
    2265     }
    2266     DWORD ret;
    2267 
    2268     //调用失败,访问被拒绝
    2269     if (ERROR_SUCCESS!= (ret = SetNamedSecurityInfoW(szPath, objectType, DACL_SECURITY_INFORMATION, NULL, NULL, newDACL, NULL)))
    2270     {
    2271         bRet = FALSE;
    2272         printf("ret value is %d
    ",ret);
    2273         goto Clean_Up;
    2274     }
    2275 
    2276 Clean_Up:
    2277     if (newDACL != NULL)
    2278     {
    2279         LocalFree((HLOCAL)newDACL);
    2280     }*/
    2281     PACL pOldDacl=NULL;
    2282     PACL pNewDacl=NULL;
    2283     DWORD dRet;
    2284     EXPLICIT_ACCESS eia;
    2285     PSECURITY_DESCRIPTOR pSID=NULL;
    2286     
    2287     dRet = GetNamedSecurityInfo(szPath,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDacl,NULL,&pSID);// 获取SAM主键的DACL  
    2288     
    2289     if(dRet!=ERROR_SUCCESS)
    2290     {
    2291         return 0;
    2292     }
    2293     //创建一个ACE,允许Everyone组成员完全控制对象,并允许子对象继承此权限
    2294     ZeroMemory(&eia,sizeof(EXPLICIT_ACCESS));
    2295     BuildExplicitAccessWithName(&eia,L"SYSTEM",KEY_ALL_ACCESS,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
    2296     // 将新的ACE加入DACL  
    2297     dRet = SetEntriesInAcl(1,&eia,pOldDacl,&pNewDacl);
    2298     if(dRet!=ERROR_SUCCESS)
    2299     {
    2300         return 0;
    2301     }
    2302     // 更新SAM主键的DACL  
    2303     dRet = SetNamedSecurityInfo(szPath,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
    2304     
    2305     if(dRet!=ERROR_SUCCESS)
    2306     {
    2307         printf("%d
    ",dRet);
    2308         return 0;
    2309     }
    2310     //return bRet;
    2311 }
    2312 
    2313 
    2314 DWORD DeleteTree(HKEY RootKey, const WCHAR *pSubKey)
    2315 {
    2316 
    2317     HKEY hKey;
    2318     DWORD nRet;
    2319     DWORD NameCnt,NameMaxLen;
    2320     DWORD KeyCnt,KeyMaxLen,MaxDateLen;
    2321     //static WCHAR sFormat[256] = L"";
    2322     //wcscat(sFormat, L"----");
    2323 
    2324     static int dwDeep = -1;
    2325     dwDeep++;
    2326 
    2327     nRet=RegOpenKeyEx(RootKey,pSubKey,0,KEY_ALL_ACCESS,&hKey);
    2328     if(nRet!=ERROR_SUCCESS)
    2329     {
    2330         printf("Can not Open Key!(Delete part!) Error Code is %d
    ",GetLastError());
    2331         return 0;
    2332     }
    2333 
    2334 
    2335     nRet = RegQueryInfoKey(hKey,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,
    2336         &NameMaxLen,&MaxDateLen,NULL,NULL);
    2337     
    2338     if(nRet == ERROR_SUCCESS)
    2339     {
    2340         printf("RegQueryInfoKey Success!
    ");
    2341         
    2342         for(int dwIndex = KeyCnt - 1; dwIndex >= 0; dwIndex--) //枚举键值
    2343         {
    2344             WCHAR sKeyName[256] = {0};
    2345             RegEnumKey(hKey, dwIndex, sKeyName, sizeof(sKeyName));
    2346 
    2347             HKEY hKeySub;
    2348             DWORD KeyCntSub;
    2349             WCHAR pSubKeyTemp[256] = {0};
    2350             wcscpy(pSubKeyTemp, pSubKey);
    2351             wcscat(pSubKeyTemp, L"\");
    2352             wcscat(pSubKeyTemp, sKeyName);
    2353 
    2354             nRet = RegOpenKeyEx(RootKey,pSubKeyTemp,0,KEY_ALL_ACCESS,&hKeySub);
    2355             
    2356             if(nRet == ERROR_SUCCESS)
    2357             {
    2358                 printf("RegOpenKeyEx Success!
    ");
    2359                 
    2360                 nRet = RegQueryInfoKey(hKeySub,NULL,NULL,NULL,&KeyCntSub,&KeyMaxLen,NULL,&NameCnt,
    2361                     &NameMaxLen,&MaxDateLen,NULL,NULL);
    2362                 
    2363                 if(nRet == ERROR_SUCCESS)
    2364                 {
    2365                     if (KeyCntSub != 0)
    2366                     {
    2367                         DeleteTree(RootKey, pSubKeyTemp);
    2368                     }
    2369                     
    2370                     RegCloseKey(hKeySub);
    2371                 }
    2372             }
    2373 
    2374             // cout << sFormat << sKeyName << endl;
    2375 
    2376             RegDeleteKey(RootKey ,pSubKeyTemp);
    2377         }
    2378 
    2379         RegCloseKey(hKey);
    2380     }
    2381 
    2382     // sFormat[strlen(sFormat) - 4] = 0;
    2383 
    2384     if (dwDeep == 0)
    2385     {
    2386         RegDeleteKey(RootKey ,pSubKey);
    2387     }
    2388 
    2389     return 0;
    2390 }
    2391 
    2392 VOID SearchRegistryHardID(PWCHAR pHardIDBuffer)
    2393 {
    2394     const PWCHAR pReg = L"SYSTEM\CurrentControlSet\Enum\USB";
    2395     HKEY hKey;
    2396     
    2397     if(ERROR_SUCCESS !=RegOpenKeyEx(HKEY_LOCAL_MACHINE,pReg,0,KEY_ALL_ACCESS,&hKey))
    2398         printf("in SearchOpenKey Fail! error code is %d
    ",GetLastError());
    2399     
    2400     DWORD Index = 0;
    2401     WCHAR SubKeyName[215] = {0};
    2402 
    2403     while(ERROR_SUCCESS == RegEnumKey(hKey,Index,SubKeyName,sizeof(WCHAR)*215))
    2404     {
    2405         if(!lstrcmpi(SubKeyName,L"VID_0451&PID_AF32"))
    2406         {
    2407             wcscpy(pHardIDBuffer,L"VID_0451&PID_AF32");
    2408             RegCloseKey(hKey);
    2409             return;
    2410         }
    2411 
    2412         else if(!lstrcmpi(SubKeyName,L"VID_04B41&PID_8613"))
    2413         {
    2414            wcscpy(pHardIDBuffer,L"VID_04B41&PID_8613");
    2415            RegCloseKey(hKey);
    2416             return;
    2417         }
    2418 
    2419         else if(!lstrcmpi(SubKeyName,L"VID_0547&PID_1002"))
    2420         {
    2421             wcscpy(pHardIDBuffer,L"VID_0547&PID_1002");
    2422             RegCloseKey(hKey);
    2423             return;
    2424         }
    2425 
    2426         ZeroMemory(SubKeyName,sizeof(WCHAR)*215);
    2427         
    2428         Index++;
    2429     }
    2430 
    2431 }
    Setup.cpp


     

      1 // InstallWDFDriver.cpp : Defines the entry point for the console application.
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "setup.h"
      6 #include "Shlwapi.h"
      7 
      8 
      9 #pragma  comment(lib,"Shlwapi.lib")
     10 
     11 BOOL SystemShutdown();
     12 
     13 int _tmain(int argc, _TCHAR* argv[])
     14 {
     15     WCHAR Wlp_USB_PATH[] = L"C:\Windows\System32\drivers\WLP_USB_Driver.sys";
     16     //WCHAR Wdf_USB_PATH[] = L"C:\Windows\System32\drivers\CYUSB3.sys";
     17     WCHAR New_Inf_Path[] = L"D:\wlp driver\WDF Driver _new\win7\x64\cyusb3.inf";
     18     WCHAR InfFileName[] = L"\cyusb3.inf";
     19     CHAR szInfPath[215] = {0}; 
     20     FILE *fp = NULL;
     21 
     22     WCHAR CurrentDirBuffer[215] = {0};
     23     WCHAR OutCurrentDirBuffer[215] = {0};
     24 
     25 
     26     GetModuleFileName(NULL,CurrentDirBuffer,_countof(CurrentDirBuffer));
     27     //GetCurrentDirectory(215,CurrentDirBuffer);
     28     //lstrcat(CurrentDirBuffer, InfFileName);
     29     _wsplitpath_s(CurrentDirBuffer,NULL,0,OutCurrentDirBuffer,_countof(OutCurrentDirBuffer),
     30         NULL,0,NULL,0);
     31     printf("This Process is Driver Installtion Program...
    ");
     32 
     33 
     34    //getch();
     35     //WCHAR HIDBuffer[128] = {0};
     36 
     37 
     38 
     39     if(PathFileExists(Wlp_USB_PATH))
     40     {
     41         printf("Exists WLP_USB_Driver.sys!
    ");
     42 
     43         //SearchRegistryHardID(HIDBuffer);
     44 
     45         //WCHAR HardID[215] = L"USB\";
     46 
     47         //wcscat(HardID,HIDBuffer);
     48         //getch();
     49 
     50         UninstallWDMDriver(L"USB\VID_0451&PID_AF32&REV_0000");
     51 
     52 
     53 
     54 
     55         if(DeleteFile(Wlp_USB_PATH))
     56         {
     57             printf("WLP_USB_Driver.sys File has Deleted!
    ");
     58         }
     59 
     60          // getch();
     61 
     62         /* if(FindExistingDevice(L"USB\VID_0451&PID_AF32&REV_0000"))
     63         {
     64         printf("找打了!
    ");
     65 
     66         getch();
     67         }
     68         else
     69         {
     70         printf("没找到!
    ");
     71         getch();
     72         }*/
     73 
     74         printf("Get Started Install the New DLF Driver...
    ");
     75 
     76         //  RemoveDriver(L"USB\VID_0451&PID_AF32&REV_0000");
     77         while(IsDeviceInstallInProgress())
     78         {
     79             printf("Has Driver Installtion Program is Processing!
    ");
     80         }
     81 
     82         printf("Get Started analyse inf File!
    ");
     83 
     84 
     85 
     86         UnicodeToAnsi(New_Inf_Path, _tcslen(New_Inf_Path), szInfPath, 215); 
     87 
     88         FindAllInfFiles(OutCurrentDirBuffer/* L"D:\wlp driver\WDF Driver _new\win7\x64"*/);
     89 
     90         for(int i = 0; i < g_nHIDCount; i++)
     91             g_HIDInfo[i]->bNeedUpdate = false;
     92 
     93         for(int i = 0; i < g_nInfCount; i++)
     94             g_InfList[i]->bWillBeInstall = false;
     95 
     96         int SearchInfIndex = 0;
     97 
     98         while(SearchInfIndex < g_nInfCount)
     99         {
    100             if(g_InfList[SearchInfIndex] != NULL)
    101             {
    102                 g_InfList[SearchInfIndex]->bWillBeInstall = TRUE;
    103             }
    104 
    105             SearchInfIndex++;
    106         }
    107 
    108 
    109         InstallDriver();
    110 
    111         
    112         //UpdateDriver();
    113         printf("Install Successed!
    ");
    114         //if ((fopen_s(&fp, szInfPath, "r"))!=0)  
    115         //{  
    116         //  _tprintf(_T("can not open file %s
    "), CurrentDirBuffer);  
    117         //return 0;  
    118         //}  
    119 
    120         // GetINFData(fp);  
    121         // fclose(fp);  
    122 
    123         // 安装WDM驱动  
    124 
    125         /*if (StartInstallWDMDriver(New_Inf_Path) == FALSE)  
    126         {  
    127         _tprintf(_T("Start Install WDF Driver failed
    ")); 
    128         getch();
    129         return 0;  
    130         }  */
    131 
    132         /*if(IDOK == MessageBox(NULL,L"Need to Restart the System to Complete Installation!",
    133             L"Tip",MB_OK))
    134         {
    135            if(SystemShutdown())
    136            {
    137               printf("ShutDown the System And Restart the System!
    ");
    138            }
    139           
    140         }*/
    141 
    142         //getch();
    143 
    144         printf("Press any key to continue!
    ");
    145 
    146 
    147 
    148 
    149     }
    150     else
    151     {
    152         printf("No Exists WLP_USB_Driver.sys!
    ");
    153 
    154         //getch();
    155 
    156         UninstallWDMDriver(L"USB\VID_0451&PID_AF32&REV_0000");
    157 
    158 
    159 
    160         printf("Get Started Install the New DLF Driver...
    ");
    161 
    162 
    163         printf("Get Started analyse inf File!
    ");
    164 
    165         UnicodeToAnsi(New_Inf_Path, _tcslen(New_Inf_Path), szInfPath, 215); 
    166 
    167         /*if ((fopen_s(&fp, szInfPath, "r"))!=0)  
    168         {  
    169         _tprintf(_T("can not open file %s
    "), CurrentDirBuffer);  
    170         return 0;  
    171         }  */
    172 
    173         // GetINFData(fp);  
    174         //fclose(fp);  
    175 
    176         // 安装WDM驱动  
    177 
    178         /*if (StartInstallWDMDriver(New_Inf_Path) == FALSE)  
    179         {  
    180         _tprintf(_T("Start Install WDF Driver failed
    ")); 
    181         getch();
    182         return 0;  
    183         }  */
    184 
    185         FindAllInfFiles( OutCurrentDirBuffer/*L"D:\wlp driver\WDF Driver _new\win7\x64"*/);
    186 
    187         for(int i = 0; i < g_nHIDCount; i++)
    188             g_HIDInfo[i]->bNeedUpdate = false;
    189 
    190         for(int i = 0; i < g_nInfCount; i++)
    191             g_InfList[i]->bWillBeInstall = false;
    192 
    193         int SearchInfIndex = 0;
    194 
    195         while(SearchInfIndex < g_nInfCount)
    196         {
    197             if(g_InfList[SearchInfIndex] != NULL)
    198             {
    199                 g_InfList[SearchInfIndex]->bWillBeInstall = TRUE;
    200             }
    201 
    202             SearchInfIndex++;
    203         }
    204 
    205 
    206         InstallDriver();
    207 
    208 
    209         printf("Install Successed!
    "); 
    210 
    211         /*if(IDOK == MessageBox(NULL,L"Need to Restart the System to Complete Installation!",
    212             L"Tip",MB_OK))
    213         {
    214             if(SystemShutdown())
    215             {
    216                 printf("ShutDown the System And Restart the System!
    ");
    217             }
    218             
    219         }*/
    220 
    221         //getch();
    222 
    223         printf("Press any key to continue!
    ");
    224 
    225 
    226 
    227 
    228     }
    229 
    230     
    231     
    232     
    233 
    234     return 0;
    235 }
    236 
    237 BOOL SystemShutdown()
    238 {
    239     HANDLE hToken;
    240     
    241     TOKEN_PRIVILEGES tkp;
    242     /* OpenProcessToken() 这个函数的作用是打开一个进程的访问令牌
    243     GetCurrentProcess() 函数的作用是得到本进程的句柄*/
    244     if (!OpenProcessToken(GetCurrentProcess(),
    245         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
    246         return FALSE;
    247     // LookupPrivilegeValue() 的作用是修改进程的权限
    248     LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,
    249         &tkp.Privileges[0].Luid);
    250     tkp.PrivilegeCount = 1; // one privilege to set 赋给本进程特权
    251     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    252     // AdjustTokenPrivileges()的作用是通知Windows NT修改本进程的权利
    253     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
    254         (PTOKEN_PRIVILEGES)NULL, 0);
    255     
    256     if (GetLastError() != ERROR_SUCCESS) //失败
    257         return FALSE;
    258     
    259     if (!ExitWindowsEx(EWX_REBOOT, 0)) //参数在这里设置。强行退出WINDOWS(EWX_FORCE)。
    260         return FALSE;
    261     return TRUE;
    262 }
    main.cpp

     附加产物:

    发现MSDN的代码样例中由实现设备管理器功能的命令行工具

    https://code.msdn.microsoft.com/DevCon-Sample-4e95d71c#content

  • 相关阅读:
    Java集合中List,Set以及Map等集合体系详解
    Rabbit-MQ-3 队列的属性和消息的属性
    RabbitMQ-1 基本概念和实现简单生产消费者
    ActiveMQ-3
    日期时间类
    字符串反转
    SpringBoot2.0+Shiro+MyBatisPlus权限管理系统
    Servlet+JSP+JDBC学生选课系统
    SpringMVC+Spring+Hibernate个人家庭财务管理系统
    Servlet中FilterConfig的使用
  • 原文地址:https://www.cnblogs.com/foohack/p/3464736.html
Copyright © 2011-2022 走看看