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

原文地址:https://www.cnblogs.com/foohack/p/3464736.html