📄 deviceinterface.cpp
字号:
#include "StdAfx.h"
#include "DeviceInterface.h"
const GUID GUID_DEVICE_CLASS[] =
{// Defines GUIDs for device classes used in Plug & Play.
GUID_DEVCLASS_APMSUPPORT,
GUID_DEVCLASS_1394,
GUID_DEVCLASS_1394DEBUG,
GUID_DEVCLASS_61883,
GUID_DEVCLASS_ADAPTER,
GUID_DEVCLASS_APMSUPPORT,
GUID_DEVCLASS_AVC,
GUID_DEVCLASS_BATTERY,
GUID_DEVCLASS_BIOMETRIC,
GUID_DEVCLASS_BLUETOOTH, // 蓝牙
GUID_DEVCLASS_CDROM, // 光驱
GUID_DEVCLASS_COMPUTER, // 计算机
GUID_DEVCLASS_DECODER,
GUID_DEVCLASS_DISKDRIVE,
GUID_DEVCLASS_DISPLAY, // 显示卡
GUID_DEVCLASS_DOT4,
GUID_DEVCLASS_DOT4PRINT,
GUID_DEVCLASS_ENUM1394,
GUID_DEVCLASS_FDC, // 软件盘控制器
GUID_DEVCLASS_FLOPPYDISK, // 软盘驱动器
GUID_DEVCLASS_GPS,
GUID_DEVCLASS_HDC, // IDE ATA/ATAPI控制器
GUID_DEVCLASS_HIDCLASS,
GUID_DEVCLASS_IMAGE,
GUID_DEVCLASS_INFINIBAND,
GUID_DEVCLASS_INFRARED, // 红外
GUID_DEVCLASS_KEYBOARD, // 键盘
GUID_DEVCLASS_LEGACYDRIVER,
GUID_DEVCLASS_MEDIA, // 声音、视频和游戏控制器
GUID_DEVCLASS_MEDIUM_CHANGER,
GUID_DEVCLASS_MODEM, // MODEM
GUID_DEVCLASS_MONITOR, // 监视器
GUID_DEVCLASS_MOUSE, // 鼠标
GUID_DEVCLASS_MTD,
GUID_DEVCLASS_MULTIFUNCTION,
GUID_DEVCLASS_MULTIPORTSERIAL,
GUID_DEVCLASS_NET, // 网络设备(网卡)
GUID_DEVCLASS_NETCLIENT,
GUID_DEVCLASS_NETSERVICE,
GUID_DEVCLASS_NETTRANS,
GUID_DEVCLASS_NODRIVER,
GUID_DEVCLASS_PCMCIA,
GUID_DEVCLASS_PNPPRINTERS,
GUID_DEVCLASS_PORTS, // 端器(COM和LPT)
GUID_DEVCLASS_PRINTER, // 打印机 ?????
GUID_DEVCLASS_PRINTERUPGRADE,
GUID_DEVCLASS_PROCESSOR, // CPU 处理器
GUID_DEVCLASS_SBP2,
GUID_DEVCLASS_SCSIADAPTER, // SCSI和RAID控制器
GUID_DEVCLASS_SECURITYACCELERATOR,
GUID_DEVCLASS_SMARTCARDREADER,
GUID_DEVCLASS_SOUND,
GUID_DEVCLASS_SYSTEM, // 系统
GUID_DEVCLASS_TAPEDRIVE,
GUID_DEVCLASS_UNKNOWN, // 未知设备
GUID_DEVCLASS_USB, // 通用串行总线控制器 USB
GUID_DEVCLASS_VOLUME,
GUID_DEVCLASS_VOLUMESNAPSHOT,
GUID_DEVCLASS_WCEUSBS,
// Define filesystem filter classes used for classification and load ordering.
// Classes are listed below in order from "highest" (i.e., farthest from the
// filesystem) to "lowest" (i.e., closest to the filesystem).
//
GUID_DEVCLASS_FSFILTER_ACTIVITYMONITOR,
GUID_DEVCLASS_FSFILTER_UNDELETE,
GUID_DEVCLASS_FSFILTER_ANTIVIRUS,
GUID_DEVCLASS_FSFILTER_REPLICATION,
GUID_DEVCLASS_FSFILTER_CONTINUOUSBACKUP,
GUID_DEVCLASS_FSFILTER_CONTENTSCREENER,
GUID_DEVCLASS_FSFILTER_QUOTAMANAGEMENT,
GUID_DEVCLASS_FSFILTER_SYSTEMRECOVERY,
GUID_DEVCLASS_FSFILTER_CFSMETADATASERVER,
GUID_DEVCLASS_FSFILTER_HSM,
GUID_DEVCLASS_FSFILTER_COMPRESSION,
GUID_DEVCLASS_FSFILTER_ENCRYPTION,
GUID_DEVCLASS_FSFILTER_PHYSICALQUOTAMANAGEMENT,
GUID_DEVCLASS_FSFILTER_OPENFILEBACKUP,
GUID_DEVCLASS_FSFILTER_SECURITYENHANCER,
GUID_DEVCLASS_FSFILTER_COPYPROTECTION,
GUID_DEVCLASS_FSFILTER_SYSTEM,
GUID_DEVCLASS_FSFILTER_INFRASTRUCTURE
};
CDeviceInterfaceClass::CDeviceInterfaceClass() : hDevInfo(INVALID_HANDLE_VALUE)
{
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
}
CDeviceInterfaceClass::~CDeviceInterfaceClass()
{
if ( hDevInfo != INVALID_HANDLE_VALUE )
{
::SetupDiDestroyDeviceInfoList( hDevInfo ); // 销毁设备
}
}
CDeviceInterface::CDeviceInterface( GUID pClassGuid, DWORD Index, BOOL IsDisab )
: m_Guid(pClassGuid),
m_Detail(NULL),
m_IsDisab(IsDisab)
{
m_device_info.DevID = Index;
}
CDeviceInterface::~CDeviceInterface()
{
if ( m_Detail != NULL )
{
delete [] m_Detail;
m_Detail = NULL;
}
}
BOOL
CDeviceInterface::Initial(void)
{
//DWORD flags = DIGCF_PRESENT | DIGCF_ALLCLASSES;
//DWORD flags = DIGCF_PRESENT | DIGCF_DEVICEINTERFACE;
DWORD flags = DIGCF_PRESENT | DIGCF_PROFILE;
// 先销毁设备
if ( m_device_info.hDevInfo != INVALID_HANDLE_VALUE )
{
::SetupDiDestroyDeviceInfoList( m_device_info.hDevInfo );
}
//HDEVINFO NewDev = ::SetupDiCreateDeviceInfoList( NULL, NULL );
//m_device_info.hDevInfo = ::SetupDiGetClassDevsEx( &m_Guid, NULL, NULL, flags, NewDev, NULL,NULL ); // 返回设备信息句柄
m_device_info.hDevInfo = ::SetupDiGetClassDevs( &m_Guid, NULL, NULL, flags ); // 返回设备信息句柄
BOOL status = FALSE;
if ( m_device_info.hDevInfo != INVALID_HANDLE_VALUE )
{
m_device_info.DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
status = ::SetupDiEnumDeviceInfo( m_device_info.hDevInfo, m_device_info.DevID, &m_device_info.DeviceInfoData );
if( status )
{
ConstructDeviceName( m_device_info.hDevInfo, m_device_info.DeviceInfoData, m_device_info.lpszDevName );
DWORD len = sizeof(m_device_info.lpszDevClass); // 获取指定 GUID 类描述
if ( !SetupDiGetClassDescription( &m_device_info.DeviceInfoData.ClassGuid, // GUID
m_device_info.lpszDevClass, // 类描述存放的缓存区
len, // 缓存区大小
&len) ) // 实际长度
{
}
}
status = TRUE;
StateChange( m_device_info.DevID, m_device_info.hDevInfo, m_IsDisab );
/*
m_Data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
status = ::SetupDiEnumDeviceInterfaces( m_device_info.hDevInfo,
&m_device_info.DeviceInfoData,
&m_Guid,
m_device_info.DevID,
&m_Data);
int n = GetLastError();
if ( status )
{
DWORD ReqLen;// 获取长度
SetupDiGetInterfaceDeviceDetail( m_device_info.hDevInfo,
&m_Data,
NULL,
0,
&ReqLen,
NULL);
status = FALSE;
if ( GetLastError() != ERROR_INSUFFICIENT_BUFFER )
{
m_Detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) new char[ReqLen];
m_Detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
// 获取设备信息
status = ::SetupDiGetInterfaceDeviceDetail( m_device_info.hDevInfo,
&m_Data,
m_Detail,
ReqLen,
&ReqLen,
NULL);
}
} // end if ( status ) */
} // end if
return status;
}
CHAR *
CDeviceInterface::DevicePath(void)
{
if ( m_Detail != NULL )
{
return (CHAR*)m_Detail->DevicePath;
}
return NULL;
}
HANDLE
CDeviceInterface::OpenInterface( PCHAR FilePath )
{
return CreateFile( FilePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
}
int
CDeviceInterface::GetStatus() // 查询状态
{
DWORD dwCltCode;
DWORD dwReturn;
int flag;
HANDLE m_handle = OpenInterface( DevicePath() );
::DeviceIoControl( m_handle,
dwCltCode,
NULL,
0,
(LPVOID)&flag,
sizeof(flag),
&dwReturn,
NULL);
return flag;
}
BOOL
CDeviceInterface::IsDisabled( DWORD DevID, HDEVINFO hDevInfo ) // 该设备是否已被禁用
{
SP_DEVINFO_DATA hDevInfoData = {sizeof(SP_DEVINFO_DATA)};
if ( !::SetupDiEnumDeviceInfo( hDevInfo, DevID, &hDevInfoData ) )
{
return FALSE;
}
DWORD Status, Problem;
if( ::CM_Get_DevNode_Status( &Status, &Problem, hDevInfoData.DevInst, 0 ) != CR_SUCCESS )
return FALSE;
return ( (Status&DN_HAS_PROBLEM) && (Problem==CM_PROB_DISABLED) );
}
BOOL
CDeviceInterface::IsDisabled(void) // 该设备是否已被禁用
{
return IsDisabled( m_device_info.DevID, m_device_info.hDevInfo );
}
BOOL
CDeviceInterface::IsDisableable( DWORD DevID, HDEVINFO hDevInfo ) // 该设备是否可以被禁用
{
SP_DEVINFO_DATA hDevInfoData = {sizeof(SP_DEVINFO_DATA)};
if ( !::SetupDiEnumDeviceInfo( hDevInfo, DevID, &hDevInfoData ) )
{
return FALSE;
}
DWORD Status, Problem;
if( ::CM_Get_DevNode_Status( &Status, &Problem, hDevInfoData.DevInst, 0 ) != CR_SUCCESS )
return FALSE;
return ( (Status&DN_DISABLEABLE) && (Problem==CM_PROB_HARDWARE_DISABLED) );
}
BOOL
CDeviceInterface::IsDisableable(void) // 该设备是否可以被禁用
{
return IsDisableable( m_device_info.DevID, m_device_info.hDevInfo );
}
BOOL
CDeviceInterface::EnableDevice( DWORD DevID, HDEVINFO hDevInfo ) // 启用这个设备
{
return StateChange( DevID, hDevInfo, TRUE );
}
BOOL
CDeviceInterface::EnableDevice(void) // 启用这个设备
{
return StateChange( m_device_info.DevID, m_device_info.hDevInfo, TRUE );
}
BOOL
CDeviceInterface::DisableDevice( DWORD DevID, HDEVINFO hDevInfo ) // 禁用这个设备
{
return StateChange( DevID, hDevInfo, FALSE );
}
BOOL
CDeviceInterface::DisableDevice(void) // 禁用这个设备
{
return StateChange( m_device_info.DevID, m_device_info.hDevInfo, FALSE );
}
BOOL
CDeviceInterface::StateChange( DWORD DevID, HDEVINFO hDevInfo, BOOL bState ) // 改变这个设备的状态
{
SP_DEVINFO_DATA hDevInfoData = {sizeof(SP_DEVINFO_DATA)};
if ( !::SetupDiEnumDeviceInfo( hDevInfo, DevID, &hDevInfoData ) )
{
return FALSE;
}
// DICS_ENABLE : 启用、DICS_DISABLE : 禁用
DWORD NewState = ( (bState==TRUE) ? DICS_ENABLE : DICS_DISABLE );
SP_PROPCHANGE_PARAMS ChangeParams;
// 设置设备属性变化参数
ChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
ChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; // DIF_REMOVE | DIF_UNREMOVE
ChangeParams.Scope = DICS_FLAG_GLOBAL; // 修改属性保存在所有硬件属性文件 禁用或启用设备时使用该属性
//ChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; // 修改属性保存在指定硬件属性文件
ChangeParams.HwProfile = 0;
ChangeParams.StateChange = NewState; //DICS_START | DICS_STOP
if ( !::SetupDiSetClassInstallParams( hDevInfo, &hDevInfoData, (SP_CLASSINSTALL_HEADER*)&ChangeParams, sizeof(ChangeParams) ) )
{
return FALSE;
}
ChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
ChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; // DIF_REMOVE | DIF_UNREMOVE
//ChangeParams.Scope = DICS_FLAG_GLOBAL; // 修改属性保存在所有硬件属性文件 禁用或启用设备时使用该属性
ChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; // 修改属性保存在指定硬件属性文件
ChangeParams.HwProfile = 0;
ChangeParams.StateChange = NewState; //DICS_START | DICS_STOP
// 改变属性并调用安装服务
if ( !SetupDiSetClassInstallParams( hDevInfo, &hDevInfoData, (SP_CLASSINSTALL_HEADER*)&ChangeParams, sizeof(ChangeParams) ) || // 设置(包括取消)设备类的安装参数
!SetupDiCallClassInstaller( DIF_PROPERTYCHANGE, hDevInfo, &hDevInfoData ) ) // 安装指定设备
{
return FALSE;
}else
{
SP_DEVINSTALL_PARAMS DevParams;
DevParams.cbSize = sizeof(DevParams);
if ( !SetupDiGetDeviceInstallParams( hDevInfo, &hDevInfoData, &DevParams ) )
{
return FALSE;
}
// 需要重启
if ( DevParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT) )
{
}
//::SetupDiChangeState( hDevInfo, (PSP_DEVINFO_DATA)&hDevInfoData );
}
return TRUE;
}
BOOL
CDeviceInterface::GetRegistryProperty( HDEVINFO hdev, SP_DEVINFO_DATA & devinfo, ULONG Property, PCHAR pszDevName )
{
DWORD len = 1024;// 从注册表中读取PnP设备的属性
return SetupDiGetDeviceRegistryProperty( hdev,
&devinfo,
Property,
NULL,
(PBYTE)pszDevName,
len,
&len);
}
BOOL
CDeviceInterface::ConstructDeviceName( HDEVINFO hdev, SP_DEVINFO_DATA & devInfo, PCHAR pszDevName )
{
if ( !GetRegistryProperty(hdev, devInfo, SPDRP_FRIENDLYNAME, pszDevName ) ) //设备的现实名称
{
if ( !GetRegistryProperty(hdev, devInfo, SPDRP_DEVICEDESC, pszDevName ) ) // 设备描述
{
if ( !GetRegistryProperty(hdev, devInfo, SPDRP_CLASS, pszDevName ) ) // 设备类
{
if ( !GetRegistryProperty(hdev, devInfo, SPDRP_CLASSGUID, pszDevName ) ) // 设备GUID
{
strcpy( pszDevName, UnknownDevice );
}
}
}
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -