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

本文提供了一段C++代码,展示了如何通过Windows API禁用或启用指定的设备,如USB、软驱或光驱。该代码利用了Setup API来枚举设备,并通过发送属性更改请求来实现设备状态的变更。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <WINDOWS.H>    
#include <TCHAR.H>    
#include <SETUPAPI.H>    
//#include <SHLWAPI.H>    
#pragma comment(lib, "setupapi.lib")    
//#pragma comment(lib, "shlwapi.lib")    
HDEVINFO hDevInfo = NULL;   
// 出错信息    
void FormatMSG(DWORD dwError, LPTSTR * o)   
{   
    LPTSTR oo=(LPTSTR)o;   
    BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,   
        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), oo, 0, NULL);   
  if(!bOk)                                                  //将**变成*2007 /01 /10    
  {                                                         //新建的字符串由oo指向。    
      HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);   
      if(NULL != hDll)   
      {   
        FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |    
        FORMAT_MESSAGE_FROM_SYSTEM,hDll,   
        dwError,   
        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),   
        (LPTSTR)o,0, NULL);   
        FreeLibrary(hDll);   
      }   
  }   
}   
BOOL ChangeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)   
{   
    LPTSTR lpszMsg = NULL;   
    HCURSOR hCursor = NULL;   
    try   
    {   
        SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};   
        SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};   
        hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));   
        // Get a handle to the Selected Item.    
        if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))   
        {   
            FormatMSG(GetLastError(), &lpszMsg);   
            throw lpszMsg;   
        }   
        // Set the PropChangeParams structure.    
        PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;   
        PropChangeParams.Scope = DICS_FLAG_GLOBAL;   
        PropChangeParams.StateChange = NewStatus;   
        if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,   
                sizeof(PropChangeParams)))   
        {   
            FormatMSG(GetLastError(), &lpszMsg);   
            throw lpszMsg;   
        }   
   
        // Call the ClassInstaller and perform the change.    
        if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))   
        {   
            FormatMSG(GetLastError(), &lpszMsg);   
            throw lpszMsg;   
        }   
        SetCursor(hCursor);    
        return TRUE;   
    }   
    catch (TCHAR * pszError)   
    {   
        SetCursor(hCursor);   
        ::MessageBox(NULL,pszError,_T("提示"),MB_OK);   
        if (NULL != lpszMsg)   
        {   
            LocalFree((HLOCAL)lpszMsg);   
        }    
        return FALSE;   
    }   
}   
   
// 这些设备的启用和禁用主要有此函数实现    
// 参数说明,nStatus 可取3个值,-1 :啥也不做    
// 0 禁用设备,1启用设备。    
// nIndex用于控制是对光驱,软驱还是对USB启用或禁用    
// 也是可取3个值,0 代表软驱,1 代表光驱    
// 2 代表USB    
// 譬如要对光驱实现禁用,可以这样调用此函数    
// ControlDisk(0, 1);    
BOOL ControlDisk(int nStatus, int nIndex)   
{   
    if (-1 == nStatus)   
    {   
        return FALSE;   
    }   
    LPTSTR lpszMsg = NULL;   
    try   
    {   
        TCHAR * GUIDString = NULL;   
        GUID guid;   
        ZeroMemory(&guid, sizeof(GUID));   
        switch(nIndex)   
        {   
            case 0: // 0 代表软驱    
                GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318");   
                UuidFromString((unsigned char *)GUIDString, &guid);   
                break;    
            case 1: // 1 代表光驱    
                GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318");   
                UuidFromString((unsigned char *)GUIDString, &guid);   
                break;   
            case 2: // 2 代表USB    
                GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000");   
                UuidFromString((unsigned char *)GUIDString, &guid);   
                break;   
        }   
        hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);   
        if (INVALID_HANDLE_VALUE != hDevInfo)   
        {lpszMsg="hahazx";   
            FormatMSG(GetLastError(), &lpszMsg);   
               
            throw lpszMsg;   
        }   
        DWORD i;   
        SP_DEVINFO_DATA DeviceInfoData;   
        ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));   
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);   
        for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)   
        {   
            if (1 == nStatus)   
            {::MessageBox(NULL,"启用","correct",MB_OK);   
                ChangeStatus(DICS_ENABLE, i, hDevInfo);   
            }   
            else if (0 == nStatus)   
            {::MessageBox(NULL,"禁用","error",MB_OK);   
                ChangeStatus(DICS_DISABLE, i, hDevInfo);   
            }    
        }   
        // 释放 device information set    
        return SetupDiDestroyDeviceInfoList(hDevInfo);   
    }   
    catch (TCHAR * pszError)   
    {   
        ::MessageBox(NULL,pszError,_T("提示"),MB_OK);   
        if (NULL != lpszMsg)   
        {   
            LocalFree((HLOCAL)lpszMsg);   
        }   
        return FALSE;   
    }   
    return FALSE;   
}   
void main()   
{   
    ControlDisk(1, 2);   
}   


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yincheng01/archive/2009/06/05/4244982.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值