boolCheckPortState( IN unsigned num)
{
PMIB_TCPTABLE_OWNER_PID pTcpTable;
pTcpTable = newMIB_TCPTABLE_OWNER_PID;
//獲取所需要的內存大小
DWORDtmpSize = sizeof(MIB_TCPTABLE_OWNER_PID);
GetExtendedTcpTable( pTcpTable, &tmpSize,false, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
//分配足夠大小的內存並獲取端口信息
DWORDdwSize = tmpSize/sizeof(MIB_TCPTABLE_OWNER_PID);
deletepTcpTable;
pTcpTable = NULL;
pTcpTable = newMIB_TCPTABLE_OWNER_PID[dwSize];
GetExtendedTcpTable( pTcpTable, &tmpSize, true, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
//判斷端口是否被佔用,並找出佔用端口的進程,對於某些system權限的進程需要提權
for(inti = 0; i < (int) pTcpTable->dwNumEntries; i++) {
if( num == ntohs( (u_short) pTcpTable->table[i].dwLocalPort ) )
{
HANDLEprovileges = NULL;
LUID Luid;
//提權操作
if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES| TOKEN_QUERY, &provileges) )
{
longres = GetLastError();
cout<<"error code "<<res<<endl;
if(pTcpTable != NULL)
{
delete[]pTcpTable;
pTcpTable = NULL;
}
returnfalse;
}
if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Luid))
{
cout<<"LookupPrivilegeValue err!"<<endl;
if(pTcpTable != NULL)
{
delete[]pTcpTable;
pTcpTable = NULL;
}
returnfalse;
}
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;
}
returnfalse;
}
HANDLEhProcess = OpenProcess( PROCESS_ALL_ACCESS, false, pTcpTable->table[i].dwOwningPid);
if( hProcess == NULL )
{
longres = GetLastError();
cout<<"error code "<<res<<endl;
if(pTcpTable != NULL)
{
delete[]pTcpTable;
pTcpTable = NULL;
}
returnfalse;
}
wchar_twsProcessName[MAX_PATH + 1] = {0};
DWORDlen = 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;
}
returnfalse;
}
}
}
if(pTcpTable != NULL)
{
delete[]pTcpTable;
pTcpTable = NULL;
}
returntrue;
}
檢測TCP端口占用狀態的函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.