#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);    
}    

vc++实现控制USB设备启用与否的更多相关文章

  1. 截取usb数据包,控制usb设备----Relay设备

    在项目开发当中,我们需要一个usb转继电器的设备当开关控制无线发射设备,采购部采购时并未详细了解Relay设备的运行环境就买了一批设备,之后发现设备厂家只提供了windows库,而我们是要在linux ...

  2. ubuntu14.04上Virtualbox安装win7(使用Ghost镜像安装,启用USB设备支持,设置共享目录)

    由于某些软件只有windows版本,于是只好安装个虚拟机win7 /**************************安装*************************************/ ...

  3. 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错

    原文网址:http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.html 虚拟机我一直在用,不是说离不开Windows,而是有些时候一些应 ...

  4. 在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持

    在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持  http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.htm ...

  5. Ubuntu 12.04 Virtualbox 启用USB 设备支持

    转载自:http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.html 具体步骤在上面的链接中 今天在ubuntu下安装了Virtualb ...

  6. USB协议-USB设备的枚举过程

    USB主机在检测到USB设备插入后,就要对设备进行枚举了.为什么要枚举?枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道设备是什么样的设备,如何进行通信等. ...

  7. Linux下usb设备驱动详解

    USB驱动分为两块,一块是USB的bus驱动,这个东西,Linux内核已经做好了,我们可以不管,我们只需要了解它的功能.形象的说,USB的bus驱动相当于铺出一条路来,让所有的信息都可以通过这条USB ...

  8. USB设备请求命令详解

    USB设备请求命令 :bmRequestType + bRequest + wValue + wIndex + wLength 编号 值  名称 (0) 0  GET_STATUS:用来返回特定接收者 ...

  9. usb设备枚举过程

    USB主机在检测到USB设备插入后,就要对设备进行枚举了.为什么要枚举呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序.调试USB设 ...

随机推荐

  1. I.MX6 wpa_applicant 开启 debug 输出

    /*********************************************************************** * I.MX6 wpa_applicant 开启 de ...

  2. appium的get_attribute方法

    转http://blog.csdn.net/bear_w/article/details/50330753 问题描述 当使用类似下面的代码获取元素的 content-desc 属性时,会报 NoSuc ...

  3. hdu 5534

    题目描述:n个节点度数之和为n-2,每个节点预分配了1个度,任意分配度数是否有可能形成树? 从1到n节点,考虑树的形状,考虑分配给当前节点i的度数,并且注意到当前节点的度数不会影响其他节点(之前或者之 ...

  4. 解决Linux主机上的 远程MySQL客户端无法连接的问题

    无法连接到 MySQL 数据库可能的原因有: 1. PHP 无法连接 MySQL 可能是 PHP 配置不正确,没加上连接 MySQL 的功能. 2. MySQL 软件包升级,但没有升级数据库,或安装 ...

  5. 使用maven新建类目录是,报错The folder is already a source folder.的解决办法

    转自:https://www.cnblogs.com/loger1995/p/6539139.html 我们有时候新建一个webapp的maven项目时,生成的目录结构是这样子的: 缺少maven规范 ...

  6. 关于loadrunner运行场景时提示“初始化失败,通信错误”的解决方案

    1)在loadrunner的安装目录下的bin文件夹下有个“wlrun.exe”的文件 2)右键点击“属性”->"兼容性"->兼容模式中选择“windows xp(se ...

  7. Linux 常用命令十四 killall和pkill

    用killall杀死所有同名的进程. wang@wang:~/workpalce/git$ ps -aux | grep vim wang pts/ S+ : : vim a wang pts/ S+ ...

  8. python 面向对象八 多继承

    python是支持多继承的,在设计类的继承关系时,通常,主线都是单一继承下来的.但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn. 为了更好地看出继承关系,以Mi ...

  9. 比特币搬砖对冲策略Python源码

    策略复制地址:https://www.fmz.com/strategy/21023 策略原理 比特币搬砖策略是入门程序化交易的基础策略.原理简单,是新手尝试程序化的好选择,在其黄金时期,比特币搬砖也带 ...

  10. Magento Order 状态详解

    流程图: