vc++实现控制USB设备启用与否    

  1. #include   
  2. #include   
  3. #include   
  4. //#include   
  5. #pragma comment(lib, "setupapi.lib")    
  6. //#pragma comment(lib, "shlwapi.lib")    
  7. HDEVINFO hDevInfo = NULL;   
  8. // 出错信息    
  9. void FormatMSG(DWORD dwError, LPTSTR * o)   
  10. {   
  11.     LPTSTR oo=(LPTSTR)o;   
  12.     BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,   
  13.         MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), oo, 0, NULL);   
  14.   if(!bOk)                                                  //将**变成*2007 /01 /10    
  15.   {                                                         //新建的字符串由oo指向。    
  16.       HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);   
  17.       if(NULL != hDll)   
  18.       {   
  19.         FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |    
  20.         FORMAT_MESSAGE_FROM_SYSTEM,hDll,   
  21.         dwError,   
  22.         MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),   
  23.         (LPTSTR)o,0, NULL);   
  24.         FreeLibrary(hDll);   
  25.       }   
  26.   }   
  27. }   
  28. BOOL ChangeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)   
  29. {   
  30.     LPTSTR lpszMsg = NULL;   
  31.     HCURSOR hCursor = NULL;   
  32.     try   
  33.     {   
  34.         SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};   
  35.         SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};   
  36.         hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));   
  37.         // Get a handle to the Selected Item.    
  38.         if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))   
  39.         {   
  40.             FormatMSG(GetLastError(), &lpszMsg);   
  41.             throw lpszMsg;   
  42.         }   
  43.         // Set the PropChangeParams structure.    
  44.         PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;   
  45.         PropChangeParams.Scope = DICS_FLAG_GLOBAL;   
  46.         PropChangeParams.StateChange = NewStatus;   
  47.         if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,   
  48.                 sizeof(PropChangeParams)))   
  49.         {   
  50.             FormatMSG(GetLastError(), &lpszMsg);   
  51.             throw lpszMsg;   
  52.         }   
  53.    
  54.         // Call the ClassInstaller and perform the change.    
  55.         if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))   
  56.         {   
  57.             FormatMSG(GetLastError(), &lpszMsg);   
  58.             throw lpszMsg;   
  59.         }   
  60.         SetCursor(hCursor);    
  61.         return TRUE;   
  62.     }   
  63.     catch (TCHAR * pszError)   
  64.     {   
  65.         SetCursor(hCursor);   
  66.         ::MessageBox(NULL,pszError,_T("提示"),MB_OK);   
  67.         if (NULL != lpszMsg)   
  68.         {   
  69.             LocalFree((HLOCAL)lpszMsg);   
  70.         }    
  71.         return FALSE;   
  72.     }   
  73. }   
  74.    
  75. // 这些设备的启用和禁用主要有此函数实现    
  76. // 参数说明,nStatus 可取3个值,-1 :啥也不做    
  77. // 0 禁用设备,1启用设备。    
  78. // nIndex用于控制是对光驱,软驱还是对USB启用或禁用    
  79. // 也是可取3个值,0 代表软驱,1 代表光驱    
  80. // 2 代表USB    
  81. // 譬如要对光驱实现禁用,可以这样调用此函数    
  82. // ControlDisk(0, 1);    
  83. BOOL ControlDisk(int nStatus, int nIndex)   
  84. {   
  85.     if (-1 == nStatus)   
  86.     {   
  87.         return FALSE;   
  88.     }   
  89.     LPTSTR lpszMsg = NULL;   
  90.     try   
  91.     {   
  92.         TCHAR * GUIDString = NULL;   
  93.         GUID guid;   
  94.         ZeroMemory(&guid, sizeof(GUID));   
  95.         switch(nIndex)   
  96.         {   
  97.             case 0: // 0 代表软驱    
  98.                 GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");   
  99.                 UuidFromString((unsigned char *)GUIDString, &guid);   
  100.                 break;    
  101.             case 1: // 1 代表光驱    
  102.                 GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");   
  103.                 UuidFromString((unsigned char *)GUIDString, &guid);   
  104.                 break;   
  105.             case 2: // 2 代表USB    
  106.                 GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");   
  107.                 UuidFromString((unsigned char *)GUIDString, &guid);   
  108.                 break;   
  109.         }   
  110.         hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);   
  111.         if (INVALID_HANDLE_VALUE != hDevInfo)   
  112.         {lpszMsg="hahazx";   
  113.             FormatMSG(GetLastError(), &lpszMsg);   
  114.                
  115.             throw lpszMsg;   
  116.         }   
  117.         DWORD i;   
  118.         SP_DEVINFO_DATA DeviceInfoData;   
  119.         ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));   
  120.         DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);   
  121.         for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)   
  122.         {   
  123.             if (1 == nStatus)   
  124.             {::MessageBox(NULL,"启用","correct",MB_OK);   
  125.                 ChangeStatus(DICS_ENABLE, i, hDevInfo);   
  126.             }   
  127.             else if (0 == nStatus)   
  128.             {::MessageBox(NULL,"禁用","error",MB_OK);   
  129.                 ChangeStatus(DICS_DISABLE, i, hDevInfo);   
  130.             }    
  131.         }   
  132.         // 释放 device information set    
  133.         return SetupDiDestroyDeviceInfoList(hDevInfo);   
  134.     }   
  135.     catch (TCHAR * pszError)   
  136.     {   
  137.         ::MessageBox(NULL,pszError,_T("提示"),MB_OK);   
  138.         if (NULL != lpszMsg)   
  139.         {   
  140.             LocalFree((HLOCAL)lpszMsg);   
  141.         }   
  142.         return FALSE;   
  143.     }   
  144.     return FALSE;   
  145. }   
  146. void main()   
  147. {   
  148.     ControlDisk(1, 2);   
  149. }