对所有的USB接口禁用启用都可以,但是我的目的是要对几个USB接口中的一个或几个禁用或启用
比如:
我电脑有四个USB接口,其中一个必须插入鼠标,所以不能禁用,其它三USB接口把它们禁用掉
请高手指点如何办得到还一个问题:优盘插进去时我想判断该优盘是否是我允许使用的优盘,如果不是,则禁用,如果是则可以正常使用
如果分不够另开贴加分

解决方案 »

  1.   

    禁用USB:
    #include <setupapi.h>
    #include <devguid.h>
    #include <regstr.h>
    #pragma comment(lib,"Setupapi.lib")void GetHardDevices()//查找所有硬件设备
    {
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;

    // Create a HDEVINFO with all present devices. 
    hDevInfo = SetupDiGetClassDevs(NULL,0, 0,
    DIGCF_PRESENT | DIGCF_ALLCLASSES );

    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
    // Insert error handling here.
    return ;
    }

    // Enumerate through all devices in Set.
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i, &DeviceInfoData);i++)
    {
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;

    while (!SetupDiGetDeviceRegistryProperty(
    hDevInfo,
    &DeviceInfoData,
    SPDRP_DEVICEDESC,
    &DataT,
    (PBYTE)buffer,
    buffersize,
    &buffersize))
    {
    if (GetLastError() ==
    ERROR_INSUFFICIENT_BUFFER)
    {
    // Change the buffer size.
    if (buffer) LocalFree(buffer);
    buffer = (char*)LocalAlloc(LPTR,buffersize);
    }
    else
    {
    // Insert error handling here.
    break;
    }
    } CString strTemp;
    strTemp.Format("%s",buffer);
    if (strTemp.Find("USB") == 0)
    {
    StateChange(DICS_DISABLE, i, hDevInfo);//禁用USB
    //StateChange(DICS_ENABLE, i, hDevInfo); //启用USB
    }

    if (buffer) LocalFree(buffer);
    }

    if ( GetLastError()!=NO_ERROR &&
    GetLastError()!=ERROR_NO_MORE_ITEMS )
    {
    // Insert error handling here.
    return ;
    }

    // Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
    }BOOL StateChange(DWORD NewState, DWORD SelectedItem, HDEVINFO hDevInfo)//设置设备状态
    {
    SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
        SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
        
        //
        // Get a handle to the Selected Item.
        //
        if (!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))
        {

            return FALSE;
        }

        //
        // Set the PropChangeParams structure.
        //
        PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
        PropChangeParams.Scope = DICS_FLAG_GLOBAL;
        PropChangeParams.StateChange = NewState; 

        if (!SetupDiSetClassInstallParams(hDevInfo,
            &DeviceInfoData,
            (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
            sizeof(PropChangeParams)))
        {


            return FALSE;
        }

        //
        // Call the ClassInstaller and perform the change.
        //
        if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
            hDevInfo,
            &DeviceInfoData))
        {

            
            return TRUE;
        }
        
        return TRUE;
    }
    对于第二个问题,你可以查查Setupapi相关函数
      

  2.   

    恩,setupapi关于对不同usb的区分,貌似需要硬件的驱动来协助
      

  3.   

    my_girlf 你这个给我的是禁用及启用所有的USB我要求是禁用其中一个或几个,另外能不能得到优盘的序列号?
      

  4.   

    那我怎么知道USB 接口上接的是什么设备呢能不能得到优盘的序列号?
    rageliu 你说的通过ID可以区别,该ID指的是哪个ID??
      

  5.   

    CSDN里面就没有人知道吗?大家还是来接分的
      

  6.   

    假设你有3个USB设备,你可以通过调试过程中,看哪个USB设备被禁用,查看其ID,就是该设备的,GUID应该在DeviceInfoData里
      

  7.   

    如果还不行,你可以通过判断设备和厂商ID,这个肯定是可以的,我做过一个类似的。setup API函数里面有一个函数可以获得这两个ID的,具体哪一个我忘了,你自己看一下,然后比较一下就可以了,用于比较的ID是你调试过程中得到的
      

  8.   

    poleyu 我现在正是想得到这个设备ID,就是不知道怎么取得
      

  9.   

    你用setupdigetdeviceregistryproperty()函数可以获得设备名,也就是设备管理器里面显示的名称。具体的参数设置主要是Property,你在ddk里面查一下SPDRP_* ,就能知道你该设置为什么能得到设备名。至于你需要的ID,这是另外一种方法,用SetupDiGetClassInstallParams可以获得
      

  10.   

    可惜我们单位不能上传代码,不然倒是可以给你传一份我写的。USB设备的classGUID都是一样的,在DDK里面能查到,厂商ID应该有区别 ,不过我没用过,我是用设备的名称来去不同设备的。