ProcPort udp support
This commit is contained in:
		
							parent
							
								
									2fb7a2fab3
								
							
						
					
					
						commit
						2582ada2b9
					
				@ -84,6 +84,9 @@ typedef DWORD (CALLBACK *LPGETUDPTABLE)(PMIB_UDPTABLE, PDWORD, BOOL);
 | 
				
			|||||||
typedef DWORD (CALLBACK *LPGETTCPEXTABLE)(PMIB_TCPEXTABLE *, BOOL, HANDLE,
 | 
					typedef DWORD (CALLBACK *LPGETTCPEXTABLE)(PMIB_TCPEXTABLE *, BOOL, HANDLE,
 | 
				
			||||||
                                          DWORD, DWORD);
 | 
					                                          DWORD, DWORD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef DWORD (CALLBACK *LPGETUDPEXTABLE)(PMIB_UDPEXTABLE *, BOOL, HANDLE,
 | 
				
			||||||
 | 
					                                          DWORD, DWORD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef DWORD (CALLBACK *LPSYSINFO)(DWORD, PVOID, ULONG, PULONG);
 | 
					typedef DWORD (CALLBACK *LPSYSINFO)(DWORD, PVOID, ULONG, PULONG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* no longer in the standard header files */
 | 
					/* no longer in the standard header files */
 | 
				
			||||||
@ -124,6 +127,7 @@ struct sigar_t {
 | 
				
			|||||||
    LPGETTCPTABLE get_tcp_table;
 | 
					    LPGETTCPTABLE get_tcp_table;
 | 
				
			||||||
    LPGETTCPEXTABLE get_tcpx_table;
 | 
					    LPGETTCPEXTABLE get_tcpx_table;
 | 
				
			||||||
    LPGETUDPTABLE get_udp_table;
 | 
					    LPGETUDPTABLE get_udp_table;
 | 
				
			||||||
 | 
					    LPGETUDPEXTABLE get_udpx_table;
 | 
				
			||||||
    LPSYSINFO get_ntsys_info;
 | 
					    LPSYSINFO get_ntsys_info;
 | 
				
			||||||
    sigar_win32_pinfo_t pinfo;
 | 
					    sigar_win32_pinfo_t pinfo;
 | 
				
			||||||
    WORD ws_version;
 | 
					    WORD ws_version;
 | 
				
			||||||
 | 
				
			|||||||
@ -209,6 +209,10 @@ int sigar_os_open(sigar_t **sigar)
 | 
				
			|||||||
                                            "TcpExTableFromStack");
 | 
					                                            "TcpExTableFromStack");
 | 
				
			||||||
        (*sigar)->get_udp_table = 
 | 
					        (*sigar)->get_udp_table = 
 | 
				
			||||||
            (LPGETUDPTABLE)GetProcAddress(h, "GetUdpTable");
 | 
					            (LPGETUDPTABLE)GetProcAddress(h, "GetUdpTable");
 | 
				
			||||||
 | 
					        (*sigar)->get_udpx_table = 
 | 
				
			||||||
 | 
					            (LPGETUDPEXTABLE)GetProcAddress(h,
 | 
				
			||||||
 | 
					                                            "AllocateAndGet"
 | 
				
			||||||
 | 
					                                            "UdpExTableFromStack");
 | 
				
			||||||
        (*sigar)->ip_handle = h;
 | 
					        (*sigar)->ip_handle = h;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
@ -2156,38 +2160,63 @@ SIGAR_DECLARE(int) sigar_proc_port_get(sigar_t *sigar,
 | 
				
			|||||||
                                       unsigned long port,
 | 
					                                       unsigned long port,
 | 
				
			||||||
                                       sigar_pid_t *pid)
 | 
					                                       sigar_pid_t *pid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int status;
 | 
					 | 
				
			||||||
    DWORD rc, i;
 | 
					    DWORD rc, i;
 | 
				
			||||||
    PMIB_TCPEXTABLE tcp;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!sigar->get_tcpx_table) {
 | 
					    if (protocol == SIGAR_NETCONN_TCP) {
 | 
				
			||||||
 | 
					        PMIB_TCPEXTABLE tcp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!sigar->get_tcpx_table) {
 | 
				
			||||||
 | 
					            return SIGAR_ENOTIMPL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        rc = sigar->get_tcpx_table(&tcp, FALSE, GetProcessHeap(),
 | 
				
			||||||
 | 
					                                   2, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (rc) {
 | 
				
			||||||
 | 
					            return GetLastError();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (i=0; i<tcp->dwNumEntries; i++) {
 | 
				
			||||||
 | 
					            if (tcp->table[i].dwState != MIB_TCP_STATE_LISTEN) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (htons((WORD)tcp->table[i].dwLocalPort) != port) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            *pid = tcp->table[i].dwProcessId;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return SIGAR_OK;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (protocol == SIGAR_NETCONN_UDP) {
 | 
				
			||||||
 | 
					        PMIB_UDPEXTABLE udp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!sigar->get_udpx_table) {
 | 
				
			||||||
 | 
					            return SIGAR_ENOTIMPL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        rc = sigar->get_udpx_table(&udp, FALSE, GetProcessHeap(),
 | 
				
			||||||
 | 
					                                   2, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (rc) {
 | 
				
			||||||
 | 
					            return GetLastError();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (i=0; i<udp->dwNumEntries; i++) {
 | 
				
			||||||
 | 
					            if (htons((WORD)udp->table[i].dwLocalPort) != port) {
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            *pid = udp->table[i].dwProcessId;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return SIGAR_OK;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
        return SIGAR_ENOTIMPL;
 | 
					        return SIGAR_ENOTIMPL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (protocol != SIGAR_NETCONN_TCP) {
 | 
					 | 
				
			||||||
        return SIGAR_ENOTIMPL; /* XXX UDP */
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rc = sigar->get_tcpx_table(&tcp, FALSE, GetProcessHeap(),
 | 
					 | 
				
			||||||
                               2, 2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (rc) {
 | 
					 | 
				
			||||||
        return GetLastError();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (i=0; i<tcp->dwNumEntries; i++) {
 | 
					 | 
				
			||||||
        if (tcp->table[i].dwState != MIB_TCP_STATE_LISTEN) {
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (htons((WORD)tcp->table[i].dwLocalPort) != port) {
 | 
					 | 
				
			||||||
            continue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        *pid = tcp->table[i].dwProcessId;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return SIGAR_OK;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return ENOENT;
 | 
					    return ENOENT;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user