#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. JS数组array常用方法

    JS数组array常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2)获取对象的 ...

  2. 一步一步学Silverlight 2系列(3):界面布局

    述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  3. bzoj4196 [Noi2015]软件包管理器——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...

  4. softmax regression in c++

    #include <iostream>#include <vector>#include <cmath>#include <algorithm>#inc ...

  5. 【411】COMP9024 Assignment1 问题汇总

    1. 构建 Makefile 文件后运行错误,undefined reference to 'sqrt' 实际上是没有链接math数学库,所以要 $gcc test.c –lm //-lm就是链接到m ...

  6. MD5加密 和Sha256加密

    //MD5加密 private static string GetMd5Hash(string emailAddress) { byte[] data = MD5.Create().ComputeHa ...

  7. unity3d中对像之间的相互作用的实现

    首先这里的对像是面向对像中的对像: 其实就是C#中对像间相互作用的实现: 一.一般面向对像中关联和依赖的方式: 如关联方式: class A{ B m_B; A(B b){ m_B = b; } ac ...

  8. idea打印gc日志

    1.在idea里添加配置 -XX:+PrintGCDetails 2.打印GC的详细信息: -XX:+PrintGCDetails 解释:打印GC详细信息. -XX:+PrintGCTimeStamp ...

  9. (矩阵快速幂)51NOD 1242斐波那契数列的第N项

    斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2)   (1, 1, 2, 3, 5, 8, 13, 21, ...

  10. 动态规划基础复习 By cellur925

    结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...