#include <iphlpapi.h>
#include <winsock2.h>
-static DWORD (WINAPI * pAllocateAndGetTcpExTable2FromStack)(PVOID*,BOOL,HANDLE,DWORD,DWORD,TCP_TABLE_CLASS);
+DWORD GetExtendedTcpTableWithAlloc(PVOID *TcpTable, BOOL Order, DWORD Family, TCP_TABLE_CLASS Class)
+{
+ DWORD ret;
+ DWORD Size = 0;
+
+ *TcpTable = NULL;
+
+ ret = GetExtendedTcpTable(*TcpTable, &Size, Order, Family, Class, 0);
+ if (ret == ERROR_INSUFFICIENT_BUFFER)
+ {
+ *TcpTable = HeapAlloc(GetProcessHeap(), 0, Size);
+ if (*TcpTable == NULL)
+ {
+ return ERROR_OUTOFMEMORY;
+ }
+
+ ret = GetExtendedTcpTable(*TcpTable, &Size, Order, Family, Class, 0);
+ if (ret != NO_ERROR)
+ {
+ HeapFree(GetProcessHeap(), 0, *TcpTable);
+ *TcpTable = NULL;
+ }
+ }
-START_TEST(AllocateAndGetTcpExTable2FromStack)
+ return ret;
+}
+
+START_TEST(GetExtendedTcpTable)
{
WSADATA wsaData;
SOCKET sock;
PMIB_TCPTABLE_OWNER_MODULE TcpTableOwnerMod;
DWORD i;
BOOLEAN Found;
- HINSTANCE hIpHlpApi;
FILETIME Creation;
LARGE_INTEGER CreationTime;
DWORD Pid = GetCurrentProcessId();
- hIpHlpApi = GetModuleHandleW(L"iphlpapi.dll");
- if (!hIpHlpApi)
- {
- skip("Failed to load iphlpapi.dll\n");
- return;
- }
-
- pAllocateAndGetTcpExTable2FromStack = (void *)GetProcAddress(hIpHlpApi, "AllocateAndGetTcpExTable2FromStack");
- if (pAllocateAndGetTcpExTable2FromStack == NULL)
- {
- skip("AllocateAndGetTcpExTable2FromStack not found\n");
- return;
- }
-
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
skip("Failed to init WS2\n");
goto quit2;
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTable, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_BASIC_ALL) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTable, TRUE, AF_INET, TCP_TABLE_BASIC_ALL) == ERROR_SUCCESS)
{
ok(TcpTable->dwNumEntries > 0, "No TCP connections?!\n");
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTable, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_BASIC_CONNECTIONS) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTable, TRUE, AF_INET, TCP_TABLE_BASIC_CONNECTIONS) == ERROR_SUCCESS)
{
Found = FALSE;
for (i = 0; i < TcpTable->dwNumEntries; ++i)
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTable, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_BASIC_LISTENER) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTable, TRUE, AF_INET, TCP_TABLE_BASIC_LISTENER) == ERROR_SUCCESS)
{
ok(TcpTable->dwNumEntries > 0, "No TCP connections?!\n");
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTableOwner, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_OWNER_PID_ALL) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTableOwner, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL) == ERROR_SUCCESS)
{
ok(TcpTableOwner->dwNumEntries > 0, "No TCP connections?!\n");
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTableOwner, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_OWNER_PID_CONNECTIONS) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTableOwner, TRUE, AF_INET, TCP_TABLE_OWNER_PID_CONNECTIONS) == ERROR_SUCCESS)
{
Found = FALSE;
for (i = 0; i < TcpTableOwner->dwNumEntries; ++i)
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTableOwner, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_OWNER_PID_LISTENER) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTableOwner, TRUE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER) == ERROR_SUCCESS)
{
ok(TcpTableOwner->dwNumEntries > 0, "No TCP connections?!\n");
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTableOwnerMod, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_OWNER_MODULE_ALL) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTableOwnerMod, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_ALL) == ERROR_SUCCESS)
{
ok(TcpTableOwnerMod->dwNumEntries > 0, "No TCP connections?!\n");
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTableOwnerMod, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_OWNER_MODULE_CONNECTIONS) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTableOwnerMod, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_CONNECTIONS) == ERROR_SUCCESS)
{
Found = FALSE;
for (i = 0; i < TcpTableOwnerMod->dwNumEntries; ++i)
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
- if (pAllocateAndGetTcpExTable2FromStack((PVOID *)&TcpTableOwnerMod, TRUE, GetProcessHeap(), 0, AF_INET, TCP_TABLE_OWNER_MODULE_LISTENER) == ERROR_SUCCESS)
+ if (GetExtendedTcpTableWithAlloc((PVOID *)&TcpTableOwnerMod, TRUE, AF_INET, TCP_TABLE_OWNER_MODULE_LISTENER) == ERROR_SUCCESS)
{
ok(TcpTableOwnerMod->dwNumEntries > 0, "No TCP connections?!\n");
}
else
{
- skip("AllocateAndGetTcpExTable2FromStack failure\n");
+ skip("GetExtendedTcpTableWithAlloc failure\n");
}
quit2: