Implement the TCP table query, netstat.exe now shows TCP listening and
connected sockets.
This commit is contained in:
parent
2835ebee12
commit
94670d40ef
|
@ -421,9 +421,7 @@ DWORD WINAPI WsControl(DWORD protocol,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: not real name. Value is 0x101. Obviously it's a bad name,
|
case IP_MIB_TABLE_ENTRY_ID:
|
||||||
* too, because it can be used to get the ARP table--see below. */
|
|
||||||
case IP_MIB_ROUTETABLE_ENTRY_ID:
|
|
||||||
{
|
{
|
||||||
switch (pcommand->toi_entity.tei_entity)
|
switch (pcommand->toi_entity.tei_entity)
|
||||||
{
|
{
|
||||||
|
@ -517,6 +515,51 @@ DWORD WINAPI WsControl(DWORD protocol,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CO_TL_ENTITY:
|
||||||
|
{
|
||||||
|
DWORD tcpTableSize, numEntries, ret;
|
||||||
|
PMIB_TCPTABLE table;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
if (!pcbResponseInfoLen)
|
||||||
|
return ERROR_BAD_ENVIRONMENT;
|
||||||
|
GetTcpTable(NULL, &tcpTableSize, FALSE);
|
||||||
|
numEntries = min(tcpTableSize - sizeof(MIB_TCPTABLE),
|
||||||
|
0) / sizeof(MIB_TCPROW) + 1;
|
||||||
|
if (*pcbResponseInfoLen < sizeof(MIB_TCPROW) * numEntries)
|
||||||
|
return (ERROR_LOCK_VIOLATION);
|
||||||
|
table = (PMIB_TCPTABLE)calloc(1, tcpTableSize);
|
||||||
|
if (!table)
|
||||||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
ret = GetTcpTable(table, &tcpTableSize, FALSE);
|
||||||
|
if (ret != NO_ERROR)
|
||||||
|
return ret;
|
||||||
|
if (*pcbResponseInfoLen < sizeof(MIB_TCPROW) *
|
||||||
|
table->dwNumEntries)
|
||||||
|
{
|
||||||
|
free(table);
|
||||||
|
return ERROR_LOCK_VIOLATION;
|
||||||
|
}
|
||||||
|
for (i = 0; i < table->dwNumEntries; i++)
|
||||||
|
{
|
||||||
|
USHORT sPort;
|
||||||
|
|
||||||
|
sPort = ntohs((USHORT)table->table[i].dwLocalPort);
|
||||||
|
table->table[i].dwLocalPort = (DWORD)sPort;
|
||||||
|
sPort = ntohs((USHORT)table->table[i].dwRemotePort);
|
||||||
|
table->table[i].dwRemotePort = (DWORD)sPort;
|
||||||
|
}
|
||||||
|
memcpy(pResponseInfo, table->table, sizeof(MIB_TCPROW) *
|
||||||
|
table->dwNumEntries);
|
||||||
|
|
||||||
|
/* calculate the length of the data in the output buffer */
|
||||||
|
*pcbResponseInfoLen = sizeof(MIB_TCPROW) *
|
||||||
|
table->dwNumEntries;
|
||||||
|
|
||||||
|
free(table);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
FIXME ("Command ID Not Supported -> toi_id=0x%lx, toi_entity={tei_entity=0x%lx, tei_instance=0x%lx}, toi_class=0x%lx\n",
|
FIXME ("Command ID Not Supported -> toi_id=0x%lx, toi_entity={tei_entity=0x%lx, tei_instance=0x%lx}, toi_class=0x%lx\n",
|
||||||
|
|
|
@ -119,7 +119,7 @@ typedef struct IPRouteEntry {
|
||||||
/* Constants for use in the toi_id field */
|
/* Constants for use in the toi_id field */
|
||||||
#define ENTITY_LIST_ID 0 /* to get the list of entity IDs */
|
#define ENTITY_LIST_ID 0 /* to get the list of entity IDs */
|
||||||
#define ENTITY_TYPE_ID 1 /* it's an interface; what type of interface is it? */
|
#define ENTITY_TYPE_ID 1 /* it's an interface; what type of interface is it? */
|
||||||
#define IP_MIB_ROUTETABLE_ENTRY_ID 0x101 /* not real name */
|
#define IP_MIB_TABLE_ENTRY_ID 0x101 /* not real name */
|
||||||
#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
|
#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
|
||||||
|
|
||||||
/* Constants for use in the toi_class field */
|
/* Constants for use in the toi_class field */
|
||||||
|
|
Loading…
Reference in New Issue