查询端口是否被占用,并找出占用端口的进程

windows下的一个查询端口是否被占用的函数,若端口被占用,则输出占用该端口的进程。

时间关系,目前只检查了TCP的端口占用情况,晚上再回来补上UDP的。

若有问题和宝贵意见,还请不吝赐教。

bool CheckPortState( IN unsigned num)
{
PMIB_TCPTABLE_OWNER_PID pTcpTable;
pTcpTable = new MIB_TCPTABLE_OWNER_PID;

//获取所需要的内存大小
DWORD tmpSize = sizeof(MIB_TCPTABLE_OWNER_PID); 
GetExtendedTcpTable( pTcpTable, &tmpSize,false , AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);

//分配足够大小的内存并获取端口信息
DWORD dwSize = tmpSize/sizeof(MIB_TCPTABLE_OWNER_PID);
delete pTcpTable;
pTcpTable = NULL;
pTcpTable = new MIB_TCPTABLE_OWNER_PID[dwSize];
GetExtendedTcpTable( pTcpTable, &tmpSize, true, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);

//判断端口是否被占用,并找出占用端口的进程,对于某些system权限的进程需要提权
for (int i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
if ( num == ntohs( (u_short) pTcpTable->table[i].dwLocalPort ) )
{
HANDLE provileges = NULL;
LUID Luid;
//提权操作
if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &provileges) )
{
long res = GetLastError();
cout<<"error code"<<res<<endl;
if (pTcpTable != NULL)
{
delete []pTcpTable;
pTcpTable = NULL;
}
return false;
}

if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid))
{
cout<<"LookupPrivilegeValue err!"<<endl;
if (pTcpTable != NULL)
{
delete []pTcpTable;
pTcpTable = NULL;
}
return false;
}

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=Luid;

if (!AdjustTokenPrivileges(provileges,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
cout<<"AdjustTokenPrivileges err!"<<endl;
if (pTcpTable != NULL)
{
delete []pTcpTable;
pTcpTable = NULL;
}
return false;
}

HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, pTcpTable->table[i].dwOwningPid);
if ( hProcess == NULL )
{
long res = GetLastError();
cout<<"error code"<<res<<endl;
if (pTcpTable != NULL)
{
delete []pTcpTable;
pTcpTable = NULL;
}
return false;
}
wchar_t wsProcessName[MAX_PATH + 1] = {0};
DWORD len = MAX_PATH;
if ( QueryFullProcessImageName(hProcess, 0, wsProcessName, &len) )
{
wcout<<L"Port["<<num<<L"] is occupied"<<L"by process["<<wsProcessName<<L"] PID["
<<pTcpTable->table[i].dwOwningPid<<L"]"<<endl;
CloseHandle(hProcess);
}
else
{
CloseHandle(hProcess);
hProcess = NULL;
if (pTcpTable != NULL)
{
delete []pTcpTable;
pTcpTable = NULL;
}
return false;
}
}
}

if (pTcpTable != NULL)
{
delete []pTcpTable;
pTcpTable = NULL;
}

return true;
}
bool CheckUdpPortState(IN unsigned num )
{
PMIB_UDPTABLE_OWNER_PID pUdpTable;
pUdpTable = new MIB_UDPTABLE_OWNER_PID;

//获取所需要的内存大小
DWORD tmpSize = sizeof(MIB_UDPTABLE_OWNER_PID); 
GetExtendedUdpTable( pUdpTable, &tmpSize,false , AF_INET, UDP_TABLE_OWNER_PID, 0);

//分配足够大小的内存并获取端口信息
DWORD dwSize = tmpSize/sizeof(MIB_UDPTABLE_OWNER_PID);
delete pUdpTable;
pUdpTable = NULL;
pUdpTable = new MIB_UDPTABLE_OWNER_PID[dwSize];
GetExtendedUdpTable( pUdpTable, &tmpSize, true, AF_INET, UDP_TABLE_OWNER_PID, 0);

HANDLE provileges = NULL;
LUID Luid;
//提权操作
if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &provileges) )
{
long res = GetLastError();
cout<<"error code"<<res<<endl;
if (pUdpTable != NULL)
{
delete []pUdpTable;
pUdpTable = NULL;
}
return false;
}

if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid))
{
cout<<"LookupPrivilegeValue err!"<<endl;
if (pUdpTable != NULL)
{
delete []pUdpTable;
pUdpTable = NULL;
}
return false;
}

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=Luid;

if (!AdjustTokenPrivileges(provileges,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
cout<<"AdjustTokenPrivileges err!"<<endl;
if (pUdpTable != NULL)
{
delete []pUdpTable;
pUdpTable = NULL;
}
return false;
}

//判断端口是否被占用,并找出占用端口的进程,对于某些system权限的进程需要提权
for (int i = 0; i < (int) pUdpTable->dwNumEntries; i++) {
if ( num == ntohs( (u_short) pUdpTable->table[i].dwLocalPort ) )
{
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, pUdpTable->table[i].dwOwningPid);
if ( hProcess == NULL )
{
long res = GetLastError();
cout<<"error code"<<res<<endl;
if (pUdpTable != NULL)
{
delete []pUdpTable;
pUdpTable = NULL;
}
return false;
}
wchar_t wsProcessName[MAX_PATH + 1] = {0};
DWORD len = MAX_PATH;
if ( QueryFullProcessImageName(hProcess, 0, wsProcessName, &len) )
{
wcout<<L"Port["<<num<<L"] is occupied"<<L"by process["<<wsProcessName<<L"] PID["
<<pUdpTable->table[i].dwOwningPid<<L"]"<<endl;
CloseHandle(hProcess);
}
else
{
CloseHandle(hProcess);
hProcess = NULL;
if (pUdpTable != NULL)
{
delete []pUdpTable;
pUdpTable = NULL;
}
return false;
}
}
}

if (pUdpTable != NULL)
{
delete []pUdpTable;
pUdpTable = NULL;
}

return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值