#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. Apache POI组件操作Excel,制作报表(三)

    Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试      上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...

  2. BZOJ_4199_[Noi2015]品酒大会_后缀自动机

    BZOJ_4199_[Noi2015]品酒大会_后缀自动机 Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席 ...

  3. Xenocode Postbuild 2010 for .NET 使用

    代码混淆工具 参考地址1:http://blog.csdn.net/yanpingsoft/article/details/7997212 参考地址2:http://www.cnblogs.com/w ...

  4. Gym 100962J Jimi Hendrix (树形DP)

    题意:给定一棵树,然后每条边有一个字母,然后给定一行字符串,问你能不能从这棵树上找到,并输出两个端点. 析:树形DP,先进行递归到叶子结点,然后再回溯,在回溯的时候要四个值,一个是正着匹配的长度和端点 ...

  5. mybatis基础学习5---懒加载和缓存

    1:懒加载 1)在主配置文件设置(要放在配置文件最前面) 1 <!-- 延迟加载配置,两个都必须同时有 --> <settings> 3 <!-- lazyLoading ...

  6. python 面向对象二 类和实例

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

  7. bzoj 3205: [Apio2013]机器人【dfs+斯坦纳树+spfa】

    第一次听说斯坦纳树这种东西 先dfs预处理出来dis[i][j][k]表示格子(i,j)向k方向转移能到哪,记忆话搜索预处理,注意如果有环的话特判一下 设f[i][j][x][y]表示复合机器人i-j ...

  8. codeforces 28D(dp)

    D. Don't fear, DravDe is kind time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  9. PHP简单实现单点登录功能示例

    1.准备两个虚拟域名 127.0.0.1  www.openpoor.com127.0.0.1  www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...

  10. 团队作业-项目Alpha版本发布

    一. 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cn ...