禁用USB接口的例子

// 这是一个禁用USB接口的例子
// newUsbInfo.cpp : Defines the exported functions for the DLL application.
//
 
#include "stdafx.h"
#include <iostream>
#include <initguid.h>
#include <windows.h>
#include <setupapi.h>
#include <usbiodef.h>
#include <Usbioctl.h>
#include <cfgmgr32.h>
#include <cstring>
#include <stdlib.h> 
#include <malloc.h>
#include <basetyps.h>
#include <tchar.h>
#include <SDKDDKVer.h>
#include <winioctl.h>
#pragma comment(lib,"setupapi")
 
using namespace std;
 
BOOL StateChange( DWORD dwNewState, DWORD dwDevID, HDEVINFO hDevInfo);
BOOL IsDisableable(DWORD dwDevID, HDEVINFO hDevInfo);
BOOL IsDisabled(DWORD dwDevID, HDEVINFO hDevInfo);
 
BOOL GetRegistryProperty( HDEVINFO DeviceInfoSet, 
                        PSP_DEVINFO_DATA DeviceInfoData, 
                        ULONG Property, 
                        PVOID Buffer, 
                        PULONG Length ) 
{ 
    while ( !SetupDiGetDeviceRegistryProperty( DeviceInfoSet, 
                                              DeviceInfoData, 
                                              Property, 
                                              NULL, 
                                              (BYTE *)*(TCHAR **)Buffer, 
                                              *Length, 
                                              Length)) 
    { 
        // 长度不够则重新分配缓冲区 
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
        { 
            if (*(LPTSTR *)Buffer) 
                LocalFree(*(LPTSTR *)Buffer); 
  
            *(LPTSTR *)Buffer = reinterpret_cast<LPTSTR>((PCHAR)LocalAlloc(LPTR,*Length)); 
        } 
        else 
        { 
            return false; 
        } 
    } 
  
    return (BOOL)(*(LPTSTR *)Buffer)[0]; 
} 
  
BOOL EnableDevice(DWORD dwDevID, HDEVINFO hDevInfo) 
{ 
    return StateChange(DICS_ENABLE,dwDevID,hDevInfo); 
} 
  
BOOL DisableDevice(DWORD dwDevID, HDEVINFO hDevInfo) 
{ 
    return StateChange(DICS_DISABLE,dwDevID,hDevInfo); 
} 
  
BOOL ControlDevice(DWORD dwDevID, HDEVINFO hDevInfo , BOOL bEnable) 
{ 
    BOOL bCanDisable; 
    bCanDisable = (IsDisableable(dwDevID,hDevInfo) && (!IsDisabled(dwDevID,hDevInfo))); 
    cout << bEnable << bCanDisable <<endl;
    if (bEnable)//Enable NetCard 
    { 
        if (!bCanDisable) 
        { 
            return EnableDevice(dwDevID,hDevInfo); 
        } 
    } 
    else //Disable NetCard 
    { 
        if (bCanDisable ) 
        { 
            return DisableDevice(dwDevID,hDevInfo); 
        } 
    } 
  
    return TRUE; 
} 
  
BOOL SetCOMDevState(BOOL bEnable) 
{ 
    DWORD Status, Problem; 
    LPTSTR Buffer = NULL; 
    DWORD BufSize = 0; 
    BOOL bResult = FALSE; 
  
    // 返回所有设备信息 
    HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES); 
  
    if (INVALID_HANDLE_VALUE == hDevInfo )        
        return bResult; 
  
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}; 
  
    // 
    // 枚举设备 
    // 
    for ( DWORD DeviceId=0; 
        SetupDiEnumDeviceInfo( hDevInfo,DeviceId,&DeviceInfoData); 
        DeviceId++) 
    { 
// 获得设备的状态 
        if (CM_Get_DevNode_Status(&Status, &Problem, DeviceInfoData.DevInst ,0) != CR_SUCCESS) 
            continue; 
  
        // 获取设备类名 
        TCHAR szDevName [MAX_PATH] = _T("") ; 
        if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize)) 
        { 
            lstrcpyn( szDevName, Buffer, MAX_PATH );          
        } 
        //printf("%S \n",szDevName);
      //  if ( lstrcmp( szDevName, _T("Ports") ) == 0 )      
        if ( lstrcmp( szDevName, _T("USB") ) == 0 )  
        {            
            TCHAR szName [MAX_PATH] = _T("") ; 
            if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize)) 
            { 
                lstrcpyn( szName, Buffer, MAX_PATH ); 
            } 
            printf("-------%S \n",szName);
  
            if ( lstrcmp( szName, _T("USB") ) == 0 )                
            { 
                if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize)) 
                { 
                    lstrcpyn( szName, Buffer, MAX_PATH ); 
  
                    // 获取设备描述 
                    if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize)) 
                    { 
                      
                        lstrcpyn( szName, Buffer, MAX_PATH ); 
                        printf("----------------%S \n",szName);
                        //if ( lstrcmp( szName, _T("USB Composite Device") ) == 0 )//找到设备          
                        //{ 
                            cout << "begin->"<<endl;
                            bResult = ControlDevice(DeviceId,hDevInfo,bEnable); 
                        //} 
                    } 
                } 
            } 
        } 
    } 
    SetupDiDestroyDeviceInfoList(hDevInfo); 
  
    return bResult; 
} 
  
BOOL StateChange( DWORD dwNewState, DWORD dwDevID, HDEVINFO hDevInfo) 
{ 
    SP_PROPCHANGE_PARAMS PropChangeParams; 
    SP_DEVINFO_DATA        DevInfoData = {sizeof(SP_DEVINFO_DATA)}; 
    SP_DEVINSTALL_PARAMS devParams; 
  
    //查询设备信息 
    if (!SetupDiEnumDeviceInfo( hDevInfo, dwDevID, &DevInfoData)) 
    { 
        cout << "SetupDiEnumDeviceInfo FAILED" << endl; 
        return FALSE; 
    } 
  
    //设置设备属性变化参数 
    PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); 
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; 
    PropChangeParams.Scope = DICS_FLAG_GLOBAL; //使修改的属性保存在所有的硬件属性文件 
    PropChangeParams.StateChange = dwNewState; 
    PropChangeParams.HwProfile = 0; 
  
  
    //改变设备属性 
    if (!SetupDiSetClassInstallParams( hDevInfo, 
                                        &DevInfoData, 
                                        (SP_CLASSINSTALL_HEADER *)&PropChangeParams, 
                                        sizeof(PropChangeParams))) 
    { 
        cout << "SetupDiSetClassInstallParams FAILED" << endl; 
        return FALSE; 
    } 
     
      
    PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); 
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; 
    PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;//使修改的属性保存在指定的属性文件 
    PropChangeParams.StateChange = dwNewState; 
    PropChangeParams.HwProfile = 0; 
  
    //改变设备属性并调用安装服务 
    if (!SetupDiSetClassInstallParams( hDevInfo, 
                                      &DevInfoData, 
                                      (SP_CLASSINSTALL_HEADER *)&PropChangeParams, 
                                      sizeof(PropChangeParams)) || 
        !SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DevInfoData)) 
    { 
        cout << "failed" << GetLastError() << endl;
        return TRUE; 
    } 
    else 
    { 
        cout << "success" << endl;
        //判断是否需要重新启动 
        devParams.cbSize = sizeof(devParams); 
        if (!SetupDiGetDeviceInstallParams( hDevInfo, &DevInfoData, &devParams)) 
        { 
            cout << "SetupDiGetDeviceInstallParams FAILED" << endl; 
            return FALSE; 
        } 
  
        if (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT)) 
        { 
            cout << "Need Restart Computer" << endl; 
            return TRUE; 
        } 
        return TRUE; 
    } 
} 
  
BOOL IsDisableable(DWORD dwDevID, HDEVINFO hDevInfo) 
{ 
    SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)}; 
    DWORD    dwDevStatus,dwProblem; 
    if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData)) 
    { 
        cout << "SetupDiEnumDeviceInfo FAILED" << endl; 
        return FALSE; 
    } 
    //查询设备状态 
    if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS) 
    { 
        cout << "CM_GET_DevNode_Status FAILED" << endl; 
        return FALSE; 
    } 
    return ((dwDevStatus & DN_DISABLEABLE) && (dwProblem != CM_PROB_HARDWARE_DISABLED)); 
} 
 
BOOL IsDisabled(DWORD dwDevID, HDEVINFO hDevInfo) 
{ 
    SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)}; 
    DWORD    dwDevStatus,dwProblem; 
    if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData)) 
    { 
        cout << "SetupDiEnumDeviceInfo FAILED" << endl; 
        return FALSE; 
    } 
    //查询设备状态 
    if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS) 
    { 
        cout << "CM_GET_DevNode_Status FAILED" << endl; 
        return FALSE; 
    } 
    return ((dwDevStatus & DN_HAS_PROBLEM) && (dwProblem == CM_PROB_DISABLED)); 
} 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetCOMDevState(false);
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值