#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. Java 基本类型和对象类型的区别

    Java 基本类型和对象类型的区别 基本类型: int long byte float double char boolean short 对象类型: Integer Long Byte Float ...

  2. bzoj2038 小Z的袜子(hose)——莫队算法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 就是莫队算法: 先写了个分块,惨WA: #include<iostream> ...

  3. 洛谷P4141 消失之物——背包

    题目:https://www.luogu.org/problemnew/show/P4141 竟然是容斥:不选 i 物品只需减去选了 i 物品的方案: 范围原来是2*10^3而不是2*103啊... ...

  4. SimpliciTI 地址分配

    1.多个ED节点和AP正确连接后,AP都会给ED分配一个相应的地址.当某个ED出现意外,比如电源问题,和AP断开连接,AP并不将该ED节点的地址消除.当该ED恢复正常,重新申请加入网络时,AP会检测该 ...

  5. 2-17 numpy模块使用

    #CURD import numpy as np data1 = np.array([1,2,3,4,5]) print(data1) data2 = np.array([[1,2], [3,4]]) ...

  6. Xenocode Postbuild 2010 for .NET 使用

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

  7. UVa 12718 Dromicpalin Substrings (暴力)

    题意:给定一个序列,问你它有多少上连续的子串,能够重排后是一个回文串. 析:直接暴力,n 比较小不会超时. 代码如下: #pragma comment(linker, "/STACK:102 ...

  8. E20180225-hm-xa

    variation  n. 变化,变动; 变异,演变; 变奏曲; 变量; auxiliary adj. 辅助的 subscript  adj. 下标的,写在下方的,脚注的;  n. 下标,脚注,下角数 ...

  9. (2)css的复合选择器与特性

    css的复合选择器与特性 在本篇学习资料中,将深入了解css的相关概念,上一篇介绍的3种基本选择器的基础上,学习3种由基本选择器复合构成的选择器,然后再介绍css的两个重要的特性. 1.复合选择器 复 ...

  10. 递推DP UVA 473 Raucous Rockers

    题目传送门 题意:n首个按照给定顺序存在m张光盘里,每首歌有播放时间ti,并且只能完整的存在一张光盘里,问最多能存几首歌 分析:类似01背包和完全背包,每首歌可存可不存,存到下一张光盘的情况是当前存不 ...