檢測TCP端口占用狀態的函數

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章