检测com端口代码实现
1:scan
HRESULT CDevHound::Scan(const vector<CString> &guiInfo, vector<DEV_INFO> &vPortInfo) // scan port
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
DEV_INFO epi; // Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_PORTS,
0, // Enumerator
0,
DIGCF_PRESENT); if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return 1;
} // Enumerate through all devices in Set. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for(DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo,i,&DeviceInfoData); i++)
{ memset( &epi,0,sizeof(epi) );
int msgType = WM_DEV_MSG;
TCHAR szDIS[MAX_PATH] = {0};
DWORD nsize = 0;
memset( &szDIS, 0, MAX_PATH);
DWORD DataT;
LPTSTR buffer = NULL;
DWORD buffersize = 0;
memset( &epi,0,sizeof(epi) );
if(FALSE==m_bWork)
{
break;
}
//
// Call function with null to begin with,
// then use the returned buffer size
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL,(PBYTE)epi.szFriendlyName, DEV_NAME_MAX_LEN*sizeof(TCHAR), NULL);
// Get port description from registry
SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, NULL,(PBYTE)epi.szDescription, DEV_NAME_MAX_LEN*sizeof(TCHAR), NULL); HKEY hDevKey = SetupDiOpenDevRegKey( hDevInfo,&DeviceInfoData,DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_READ );
if( INVALID_HANDLE_VALUE != hDevKey )
{
// Get port name
DWORD dwCount = 256;
RegQueryValueEx( hDevKey,_T( "PortName" ),NULL,NULL,(BYTE*)epi.szPortName,&dwCount );
RegCloseKey( hDevKey );
} // TCHAR szDIS[MAX_PATH] = {0};
// DWORD nsize = 0;
BOOL bGet = SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, szDIS, sizeof(szDIS), &nsize);
if(TRUE==bGet)
{
tstring strid(szDIS);
tstring strchar(_T("\\"));
std::size_t pos = strid.rfind(_T("\\"));
strchar = strid.substr(0,pos);
if(GuidInfoFind(strchar, msgType,guiInfo))
{
pos = strid.find_first_of('&');
_tcscpy(epi.szVid,strid.substr(0,pos).c_str());
pos = strid.rfind(_T("\\"));
strchar = strid.substr(pos+1);
_tcscpy(epi.szGUID,strchar.c_str());
InsertPortInfo(epi, false, msgType,vPortInfo);
}
else
{
continue;
}
} } if(hDevInfo != INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(hDevInfo);
hDevInfo = INVALID_HANDLE_VALUE;
} return S_OK;
}
2:detect for one type
UINT CDevHound::HoundThreadProc() //detect for one type port
{
GUID *guidDev = (GUID*)&GUID_CLASS_PORT;
HDEVINFO hDevInfo = INVALID_HANDLE_VALUE; // Get Port class set
// Note:We use DIGCF_PRESENT flag,so maybe you can see
// some ports on the device manager,but they are not
// enumerated by SetupDiEnumDeviceInterfaces in the do-while
// loop,because their driver are disabled,no application
// can open and use them. hDevInfo = SetupDiGetClassDevs( guidDev,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
); if(hDevInfo == INVALID_HANDLE_VALUE)
{
return 0;
} SP_DEVICE_INTERFACE_DATA ifcData;
ifcData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); DWORD dwIndex = 0; DEV_INFO epi; bool bInit = true; // Enumerate port and modem class device interfaces
do
{
memset( &epi,0,sizeof(epi) ); if( SetupDiEnumDeviceInterfaces(hDevInfo,NULL, guidDev, dwIndex, &ifcData) )
{
SP_DEVINFO_DATA devData;
devData.cbSize = sizeof( SP_DEVINFO_DATA ); if( !SetupDiGetDeviceInterfaceDetail( hDevInfo,&ifcData,NULL,0,NULL,&devData ) )
{
if( ERROR_INSUFFICIENT_BUFFER != GetLastError() )
{
// Can not get detail interface info
continue;
}
} // Get Friendly name from registry
SetupDiGetDeviceRegistryProperty( hDevInfo, &devData, SPDRP_FRIENDLYNAME, NULL,(PBYTE)epi.szFriendlyName, DEV_NAME_MAX_LEN*sizeof(TCHAR), NULL);
// Get port description from registry
SetupDiGetDeviceRegistryProperty( hDevInfo, &devData, SPDRP_DEVICEDESC, NULL,(PBYTE)epi.szDescription, DEV_NAME_MAX_LEN*sizeof(TCHAR), NULL);
// Get class name from registry
//TCHAR szClass[EPI_MAX_LEN];
//SetupDiGetDeviceRegistryProperty( hDevInfo, &devData, SPDRP_CLASS, NULL,(PBYTE)szClass, EPI_MAX_LEN*sizeof(TCHAR), NULL);
//epi.nType = CheckDeviceClass( szClass ); HKEY hDevKey = SetupDiOpenDevRegKey( hDevInfo,&devData,DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_READ );
if( INVALID_HANDLE_VALUE != hDevKey )
{
// Get port name
DWORD dwCount = DEV_NAME_MAX_LEN;
RegQueryValueEx( hDevKey,_T( "PortName" ),NULL,NULL,(BYTE*)epi.szPortName,&dwCount );
RegCloseKey( hDevKey );
} // Insert to port info array
TCHAR szDIS[MAX_PATH] = {0};
DWORD nsize = 0;
BOOL bGet = SetupDiGetDeviceInstanceId(hDevInfo, &devData, szDIS, sizeof(szDIS), &nsize);
if(TRUE==bGet)
{
tstring strid(szDIS);
tstring strchar(_T("\\"));
std::size_t pos = strid.rfind(_T("\\"));
std::size_t posbegin = strid.find_first_of('\\');
strchar = strid.substr(0,pos);
dwIndex++;
USES_CONVERSION;
if(tstring::npos != strchar.find(_T("USB\\VID_1782&PID_4D00")))
{
strchar = strchar.substr(posbegin+1,pos);
_tcscpy(epi.szVid,strchar.c_str());
pos = strid.rfind(_T("\\"));
strchar = strid.substr(pos+1);
tstring strcominfo(epi.szPortName);
tstring strcominfo2 = boost::to_lower_copy(strcominfo);
boost::erase_first(strcominfo2, "com");
_tcscpy(epi.szGUID,strcominfo2.c_str());
#if 0
string strlog;
ofstream out("d:\\scanport.log",ios::app);
strlog = convert<string>(bInit);
out <<"init="<< strlog << "\n";
out << W2A(epi.szDescription) << "\n";
out << W2A(epi.szFriendlyName)<< "\n";
#endif
for(size_t nthreadx=0; nthreadx<m_guidvec.size(); nthreadx++)
{
if(m_guidvec[nthreadx]==strcominfo2)
{
InsertPortInfo( epi,nthreadx, bInit);
#ifdef _WRITE_PORT_LOGFILE
string strthrdxlog;
string strinitlog;
strthrdxlog = convert<string>(nthreadx);
ofstream out("d:\\scanport2.log",ios::app);
strinitlog = convert<string>(bInit);
out <<"init="<< strinitlog << "\n";
out << "thread id= " << strthrdxlog << "\n";
#endif }
}
} }
}
else
{
if( ERROR_NO_MORE_ITEMS != GetLastError() )
{
dwIndex++;
continue;
} dwIndex = 0;
bInit = false;
ClearState();
Sleep(1); SetupDiDestroyDeviceInfoList(hDevInfo);
hDevInfo = INVALID_HANDLE_VALUE;
hDevInfo = SetupDiGetClassDevs( guidDev,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
); memset(&ifcData,0,sizeof(SP_DEVICE_INTERFACE_DATA));
ifcData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
} }while( m_bWork && (hDevInfo != INVALID_HANDLE_VALUE) ); if(hDevInfo != INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(hDevInfo);
hDevInfo = INVALID_HANDLE_VALUE;
} return 0;
}
检测com端口代码实现的更多相关文章
- linux 检测远程端口是否打开
linux 检测远程端口是否打开 检测远程端口是否打开 常用telnet 110.101.101.101 80方式测试远程主机端口是否打开. 除此之外还可以使用: 方法1.nmap i ...
- Dlib库中实现正脸人脸关键点(landmark)检测的测试代码
Dlib库中提供了正脸人脸关键点检测的接口,这里参考dlib/examples/face_landmark_detection_ex.cpp中的代码,通过调用Dlib中的接口,实现正脸人脸关键点检测的 ...
- keepalived使用nc命令检测udp端口
keepalived支持的健康检测方式有:HTTP_GET|SSL_GET.TCP_CHECK.SMTP_CHECK.MISC_CHECK. 由于keepalived自身并不支持udp检测,有TCP_ ...
- Dlib库中实现正脸人脸检测的测试代码
Dlib库中提供了正脸人脸检测的接口,这里参考dlib/examples/face_detection_ex.cpp中的代码,通过调用Dlib中的接口,实现正脸人脸检测的测试代码,测试代码如下: #i ...
- shell-006:检测80端口的存活情况
注意细节问题,如下图所示 #!/bin/bash # 检测80端口是否存在 while : do n=`netstat -lnpt |grep ':80 ' |wc -l` if [ $n -eq ] ...
- C#如何检测网络端口连接的状态
原文:C#如何检测网络端口连接的状态 C#如何检测/监控远程连接网络端口的情况(例如:3389端口是否处于监听状态,是否建立了连接等). using System; using System.Coll ...
- Mask R-CNN用于目标检测和分割代码实现
Mask R-CNN用于目标检测和分割代码实现 Mask R-CNN for object detection and instance segmentation on Keras and Tenso ...
- 心跳机制tcp keepalive的讨论、应用及“断网”、"断电"检测的C代码实现(Windows环境下)
版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权. https://blog.csdn.net/stpeace/article/details/441 ...
- Python批量检测服务器端口可用性与Socket函数使用
socket函数 简述 socket又称套间字或者插口,是网络通信中必不可少的工具.有道是:"无socket,不网络".由于socket最早在BSD Unix上使用,而Unix/L ...
随机推荐
- 图书管理系统 基于form组件
models: from django.db import models # Create your models here. class Book(models.Model): name = mod ...
- 【转】snmpwalk常用用法
在日常监控中,经常会用到snmp服务,而snmpwalk命令则是测试系统各种信息最有效的方法,现总结一些常用的方法如下: 1.snmpwalk -v 2c -c public 10.103.33.1 ...
- mysql服务器硬件配置选择参考
这是在网上找的一个关于如何评估一个mysql服务器的硬件需求的文章,转载以备用 5 Minute DBA – Database Server Hardware Selection Posted on ...
- DRAM(动态)存储器
一.DRAM的存储元电路 常见的DRAM存储元电路有四管式和单管式两种,它们的共同特点是靠电容存储电荷的原理来存储信息.电容上存有足够多的电荷表示“1”,电容上无电荷表示“0”. 由于电容存储的电荷会 ...
- java基础易混点
1.进制转换由低到高:byte<short(char)<int<long<float<double 2.java八种基本数据类型(存在栈里): 整数类型 byte,s ...
- C对64位整数类型的支持
在使用C语言过程中可能需要接触长整数类型,其中包括固定长度数据类型的声明.输入输出函数的标志符等细节,在此记录. int64_t 与 uint64_t C的标准只规定特定数据类型需要实现的最小长度,特 ...
- 随手记——数据结构可视化(graphviz)
普通二叉树 void writedot(BTree tree, FILE* fw) { if (tree == NULL) return; else{ fprintf(fw, "%d [la ...
- 【node.js】Buffer(缓冲区)
Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区. 创建 Buffer 类 Node Buffer 类可以通过多种方式来创建. 1.创建长度为 10 字节的 ...
- 简单属性margin和padding
关于margin属性的介绍 margin:20px 上 右 下 左 都是20px margin:20px 40 px 上 下 20px 左 右 40px margin:20px 40px 60px ...
- notepad++怎样添加文件目录
需要安装一个Explorer.dll文件 方法一:这个方法我个人试了不成功,可能因为版本问题,进入后选择Explorer进行安装 方法二:网上下载 Explorer.dll文件,放到\\No ...