⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deviceinterface.cpp

📁 设备管理程序
💻 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 + -