void SimpleString::push_back(const char tidbit) { check_and_allocate(); *_last_element = tidbit; _last_element = _first_free; _alloc.construct(_first_free++, '\0'); }
/* * retrieve udp table for win 2000 and NT4 ? */ DWORD windows_get_udp_table_win2000_down(struct connection_table **table_connection) { PMIB_UDPTABLE pUdpTable = NULL; struct connection_entry * current_connection; DWORD dwSize = 0; DWORD dwRetVal = 0; DWORD result = ERROR_SUCCESS; DWORD i; do { dwRetVal = GetUdpTable(pUdpTable, &dwSize, TRUE); dprintf("[NETSTAT UDP] need %d bytes",dwSize); /* Get the size required by GetUdpTable() */ if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) { pUdpTable = (MIB_UDPTABLE *) malloc (dwSize); } else if (dwRetVal != NO_ERROR) { result = ERROR_NOT_SUPPORTED; break; } if ((dwRetVal = GetUdpTable(pUdpTable, &dwSize, TRUE)) == NO_ERROR) { dprintf("[NETSTAT] found %d udp connections", pUdpTable->dwNumEntries); for (i = 0 ; i < pUdpTable->dwNumEntries ; i++) { // check available memory and allocate if necessary if (check_and_allocate(table_connection) == ERROR_NOT_ENOUGH_MEMORY) { free(pUdpTable); return ERROR_NOT_ENOUGH_MEMORY; } // GetUdpTable reports only listening UDP sockets, not "active" ones current_connection = &(*table_connection)->table[(*table_connection)->entries]; current_connection->type = AF_INET; current_connection->local_addr.addr = pUdpTable->table[i].dwLocalAddr; current_connection->remote_addr.addr = 0; current_connection->local_port = ntohs((u_short)(pUdpTable->table[i].dwLocalPort & 0x0000ffff)); current_connection->remote_port = 0; // force state to "" strncpy(current_connection->state, "", sizeof(current_connection->state)); strncpy(current_connection->protocol, "udp", sizeof(current_connection->protocol)); // force program_name to "-" strncpy(current_connection->program_name, "-", sizeof(current_connection->program_name)); (*table_connection)->entries++; } free(pUdpTable); } else { // GetUdpTable failed result = GetLastError(); break; } } while (0) ; return result; }
/* * retrieve udp table for win xp and up */ DWORD windows_get_udp_table(struct connection_table **table_connection) { DWORD result = ERROR_SUCCESS; struct connection_entry * current_connection = NULL; MIB_UDPTABLE_OWNER_MODULE * tablev4 = NULL; MIB_UDP6TABLE_OWNER_MODULE * tablev6 = NULL; MIB_UDPROW_OWNER_MODULE * currentv4 = NULL; MIB_UDP6ROW_OWNER_MODULE * currentv6 = NULL; DWORD i, dwSize; ptr_GetExtendedUdpTable geut = NULL; geut = (ptr_GetExtendedTcpTable)GetProcAddress(GetModuleHandle("iphlpapi"), "GetExtendedUdpTable"); // systems that don't support GetExtendedUdpTable if (geut == NULL) { return windows_get_udp_table_win2000_down(table_connection); } do { // IPv4 part dwSize = 0; if (geut(NULL,&dwSize, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0) == ERROR_INSUFFICIENT_BUFFER) { tablev4 = (MIB_UDPTABLE_OWNER_MODULE *)malloc(dwSize); if (geut(tablev4, &dwSize, TRUE, AF_INET, UDP_TABLE_OWNER_MODULE, 0) == NO_ERROR) { for(i=0; i<tablev4->dwNumEntries; i++) { // check available memory and allocate if necessary if (check_and_allocate(table_connection) == ERROR_NOT_ENOUGH_MEMORY) { free(tablev4); return ERROR_NOT_ENOUGH_MEMORY; } // GetExtendedUdpTable reports only listening UDP sockets, not "active" ones currentv4 = &tablev4->table[i]; current_connection = &(*table_connection)->table[(*table_connection)->entries]; current_connection->type = AF_INET; current_connection->local_addr.addr = currentv4->dwLocalAddr; current_connection->remote_addr.addr = 0; current_connection->local_port = ntohs((u_short)(currentv4->dwLocalPort & 0x0000ffff)); current_connection->remote_port = 0; strncpy(current_connection->state, "", sizeof(current_connection->state)); strncpy(current_connection->protocol, "udp", sizeof(current_connection->protocol)); // force program_name to "-" and try to get real name through GetOwnerModuleFromXXXEntry strncpy(current_connection->program_name, "-", sizeof(current_connection->program_name)); set_process_name(currentv4->dwOwningPid, current_connection->program_name, sizeof(current_connection->program_name)); (*table_connection)->entries++; } } else { // geut failed result = GetLastError(); if (tablev4) free(tablev4); break; } if (tablev4) free(tablev4); } // IPv6 part dwSize = 0; if (geut(NULL,&dwSize, TRUE, AF_INET6, UDP_TABLE_OWNER_MODULE, 0) == ERROR_INSUFFICIENT_BUFFER) { tablev6 = (MIB_UDP6TABLE_OWNER_MODULE *)malloc(dwSize); if (geut(tablev6, &dwSize, TRUE, AF_INET6, UDP_TABLE_OWNER_MODULE, 0) == NO_ERROR) { for(i=0; i<tablev6->dwNumEntries; i++) { // check available memory and allocate if necessary if (check_and_allocate(table_connection) == ERROR_NOT_ENOUGH_MEMORY) { free(tablev6); return ERROR_NOT_ENOUGH_MEMORY; } currentv6 = &tablev6->table[i]; current_connection = &(*table_connection)->table[(*table_connection)->entries]; current_connection->type = AF_INET6; memcpy(¤t_connection->local_addr.addr6, currentv6->ucLocalAddr, sizeof(current_connection->local_addr.addr6)); memset(¤t_connection->remote_addr.addr6, 0, sizeof(current_connection->remote_addr.addr6)); current_connection->local_port = ntohs((u_short)(currentv6->dwLocalPort & 0x0000ffff)); current_connection->remote_port = 0; strncpy(current_connection->state, "", sizeof(current_connection->state)); strncpy(current_connection->protocol, "udp6", sizeof(current_connection->protocol)); // force program_name to "-" and try to get real name through GetOwnerModuleFromXXXEntry strncpy(current_connection->program_name, "-", sizeof(current_connection->program_name)); set_process_name(currentv6->dwOwningPid, current_connection->program_name, sizeof(current_connection->program_name)); (*table_connection)->entries++; } } else { // gett failed result = GetLastError(); if (tablev6) free(tablev6); break; } if (tablev6) free(tablev6); } } while (0); return result; }
/* * retrieve tcp table for win xp and up */ DWORD windows_get_tcp_table(struct connection_table **table_connection) { DWORD result = ERROR_SUCCESS; struct connection_entry * current_connection = NULL; MIB_TCPTABLE_OWNER_MODULE * tablev4 = NULL; MIB_TCP6TABLE_OWNER_MODULE * tablev6 = NULL; MIB_TCPROW_OWNER_MODULE * currentv4 = NULL; MIB_TCP6ROW_OWNER_MODULE * currentv6 = NULL; DWORD i, state, dwSize; ptr_GetExtendedTcpTable gett = NULL; gett = (ptr_GetExtendedTcpTable)GetProcAddress(GetModuleHandle("iphlpapi"), "GetExtendedTcpTable"); // systems that don't support GetExtendedTcpTable if (gett == NULL) { return windows_get_tcp_table_win2000_down(table_connection); } do { // IPv4 part dwSize = 0; if (gett(NULL,&dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0) == ERROR_INSUFFICIENT_BUFFER) { tablev4 = (MIB_TCPTABLE_OWNER_MODULE *)malloc(dwSize); if (gett(tablev4, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL, 0) == NO_ERROR) { for(i=0; i<tablev4->dwNumEntries; i++) { // check available memory and allocate if necessary if (check_and_allocate(table_connection) == ERROR_NOT_ENOUGH_MEMORY) { free(tablev4); return ERROR_NOT_ENOUGH_MEMORY; } currentv4 = &tablev4->table[i]; current_connection = &(*table_connection)->table[(*table_connection)->entries]; current_connection->type = AF_INET; current_connection->local_addr.addr = currentv4->dwLocalAddr; current_connection->remote_addr.addr = currentv4->dwRemoteAddr; current_connection->local_port = ntohs((u_short)(currentv4->dwLocalPort & 0x0000ffff)); // if socket is in LISTEN, remote_port is garbage, force value to 0 if (currentv4->dwState == MIB_TCP_STATE_LISTEN) current_connection->remote_port = 0; else current_connection->remote_port = ntohs((u_short)(currentv4->dwRemotePort & 0x0000ffff)); state = currentv4->dwState; if ((state <= 0) || (state > 12)) state = 13; // points to UNKNOWN in the state array strncpy(current_connection->state, tcp_connection_states[state], sizeof(current_connection->state)); strncpy(current_connection->protocol, "tcp", sizeof(current_connection->protocol)); // force program_name to "-" and try to get real name through GetOwnerModuleFromXXXEntry strncpy(current_connection->program_name, "-", sizeof(current_connection->program_name)); set_process_name(currentv4->dwOwningPid, current_connection->program_name, sizeof(current_connection->program_name)); (*table_connection)->entries++; } } else { // gett failed result = GetLastError(); if (tablev4) free(tablev4); break; } if (tablev4) free(tablev4); } // IPv6 part dwSize = 0; if (gett(NULL,&dwSize, TRUE, AF_INET6, TCP_TABLE_OWNER_MODULE_ALL, 0) == ERROR_INSUFFICIENT_BUFFER) { tablev6 = (MIB_TCP6TABLE_OWNER_MODULE *)malloc(dwSize); if (gett(tablev6, &dwSize, TRUE, AF_INET6, TCP_TABLE_OWNER_MODULE_ALL, 0) == NO_ERROR) { for(i=0; i<tablev6->dwNumEntries; i++) { // check available memory and allocate if necessary if (check_and_allocate(table_connection) == ERROR_NOT_ENOUGH_MEMORY) { free(tablev6); return ERROR_NOT_ENOUGH_MEMORY; } currentv6 = &tablev6->table[i]; current_connection = &(*table_connection)->table[(*table_connection)->entries]; current_connection->type = AF_INET6; memcpy(¤t_connection->local_addr.addr6, currentv6->ucLocalAddr, sizeof(current_connection->local_addr.addr6)); memcpy(¤t_connection->remote_addr.addr6, currentv6->ucRemoteAddr, sizeof(current_connection->remote_addr.addr6)); current_connection->local_port = ntohs((u_short)(currentv6->dwLocalPort & 0x0000ffff)); // if socket is in LISTEN, remote_port is garbage, force value to 0 if (currentv6->dwState == MIB_TCP_STATE_LISTEN) current_connection->remote_port = 0; else current_connection->remote_port = ntohs((u_short)(currentv6->dwRemotePort & 0x0000ffff)); state = currentv6->dwState; if ((state <= 0) || (state > 12)) state = 13; // points to UNKNOWN in the state array strncpy(current_connection->state, tcp_connection_states[state], sizeof(current_connection->state)); strncpy(current_connection->protocol, "tcp6", sizeof(current_connection->protocol)); // force program_name to "-" and try to get real name through GetOwnerModuleFromXXXEntry strncpy(current_connection->program_name, "-", sizeof(current_connection->program_name)); set_process_name(currentv6->dwOwningPid, current_connection->program_name, sizeof(current_connection->program_name)); (*table_connection)->entries++; } } else { // gett failed result = GetLastError(); if (tablev6) free(tablev6); break; } if (tablev6) free(tablev6); } } while (0); return result; }
/* * retrieve tcp table for win 2000 and NT4 ? */ DWORD windows_get_tcp_table_win2000_down(struct connection_table **table_connection) { PMIB_TCPTABLE pTcpTable = NULL; struct connection_entry * current_connection; DWORD dwSize = 0; DWORD dwRetVal = 0; DWORD result = ERROR_SUCCESS; DWORD i, state; do { dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE); dprintf("[NETSTAT TCP] need %d bytes",dwSize); /* Get the size required by GetTcpTable() */ if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) { pTcpTable = (MIB_TCPTABLE *) malloc (dwSize); } else if (dwRetVal != NO_ERROR) { result = ERROR_NOT_SUPPORTED; break; } if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) == NO_ERROR) { dprintf("[NETSTAT] found %d tcp connections", pTcpTable->dwNumEntries); for (i = 0 ; i < pTcpTable->dwNumEntries ; i++) { // check available memory and allocate if necessary if (check_and_allocate(table_connection) == ERROR_NOT_ENOUGH_MEMORY) { free(pTcpTable); return ERROR_NOT_ENOUGH_MEMORY; } current_connection = &(*table_connection)->table[(*table_connection)->entries]; current_connection->type = AF_INET; current_connection->local_addr.addr = pTcpTable->table[i].dwLocalAddr; current_connection->remote_addr.addr = pTcpTable->table[i].dwRemoteAddr; current_connection->local_port = ntohs((u_short)(pTcpTable->table[i].dwLocalPort & 0x0000ffff)); // if socket is in LISTEN, remote_port is garbage, force value to 0 if (pTcpTable->table[i].dwState == MIB_TCP_STATE_LISTEN) current_connection->remote_port = 0; else current_connection->remote_port = ntohs((u_short)(pTcpTable->table[i].dwRemotePort & 0x0000ffff)); state = pTcpTable->table[i].dwState; if ((state <= 0) || (state > 12)) state = 13; // points to UNKNOWN in the state array strncpy(current_connection->state, tcp_connection_states[state], sizeof(current_connection->state)); strncpy(current_connection->protocol, "tcp", sizeof(current_connection->protocol)); // force program_name to "-" strncpy(current_connection->program_name, "-", sizeof(current_connection->program_name)); (*table_connection)->entries++; } free(pTcpTable); } else { // GetTcpTable failed result = GetLastError(); break; } } while (0) ; return result; }
/** * add a element in the back of the vector * * @param s :a referenece to the string to be added */ void StringVector::push_back(const std::string &s){ check_and_allocate(); alloc.construct(first_free_element++, s); }