2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Tests for TCP connections enumeration functions
5 * COPYRIGHT: Copyright 2018 Pierre Schweitzer
10 #define WIN32_NO_STATUS
14 static DWORD (WINAPI
* pAllocateAndGetTcpExTable2FromStack
)(PVOID
*,BOOL
,HANDLE
,DWORD
,DWORD
,TCP_TABLE_CLASS
);
16 START_TEST(AllocateAndGetTcpExTable2FromStack
)
21 PMIB_TCPTABLE TcpTable
;
22 PMIB_TCPTABLE_OWNER_PID TcpTableOwner
;
23 PMIB_TCPTABLE_OWNER_MODULE TcpTableOwnerMod
;
28 LARGE_INTEGER CreationTime
;
29 DWORD Pid
= GetCurrentProcessId();
31 hIpHlpApi
= GetModuleHandleW(L
"iphlpapi.dll");
34 skip("Failed to load iphlpapi.dll\n");
38 pAllocateAndGetTcpExTable2FromStack
= (void *)GetProcAddress(hIpHlpApi
, "AllocateAndGetTcpExTable2FromStack");
39 if (pAllocateAndGetTcpExTable2FromStack
== NULL
)
41 skip("AllocateAndGetTcpExTable2FromStack not found\n");
45 if (WSAStartup(MAKEWORD(2, 2), &wsaData
) != 0)
47 skip("Failed to init WS2\n");
51 GetSystemTimeAsFileTime(&Creation
);
52 CreationTime
.LowPart
= Creation
.dwLowDateTime
;
53 CreationTime
.HighPart
= Creation
.dwHighDateTime
;
55 sock
= socket(AF_INET
, SOCK_STREAM
, 0);
56 if (sock
== INVALID_SOCKET
)
58 skip("Cannot create socket\n");
62 ZeroMemory(&server
, sizeof(SOCKADDR_IN
));
63 server
.sin_family
= AF_INET
;
64 server
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
65 server
.sin_port
= htons(9876);
67 if (bind(sock
, (SOCKADDR
*)&server
, sizeof(SOCKADDR_IN
)) == SOCKET_ERROR
)
69 skip("Cannot bind socket\n");
73 if (listen(sock
, SOMAXCONN
) == SOCKET_ERROR
)
75 skip("Cannot listen on socket\n");
79 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTable
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_BASIC_ALL
) == ERROR_SUCCESS
)
81 ok(TcpTable
->dwNumEntries
> 0, "No TCP connections?!\n");
84 for (i
= 0; i
< TcpTable
->dwNumEntries
; ++i
)
86 if (TcpTable
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
87 TcpTable
->table
[i
].dwLocalAddr
== 0 &&
88 TcpTable
->table
[i
].dwLocalPort
== htons(9876) &&
89 TcpTable
->table
[i
].dwRemoteAddr
== 0)
95 ok(Found
, "Our socket wasn't found!\n");
97 HeapFree(GetProcessHeap(), 0, TcpTable
);
101 skip("AllocateAndGetTcpExTable2FromStack failure\n");
104 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTable
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_BASIC_CONNECTIONS
) == ERROR_SUCCESS
)
107 for (i
= 0; i
< TcpTable
->dwNumEntries
; ++i
)
109 if (TcpTable
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
110 TcpTable
->table
[i
].dwLocalAddr
== 0 &&
111 TcpTable
->table
[i
].dwLocalPort
== htons(9876) &&
112 TcpTable
->table
[i
].dwRemoteAddr
== 0)
118 ok(Found
== FALSE
, "Our socket was found!\n");
120 HeapFree(GetProcessHeap(), 0, TcpTable
);
124 skip("AllocateAndGetTcpExTable2FromStack failure\n");
127 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTable
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_BASIC_LISTENER
) == ERROR_SUCCESS
)
129 ok(TcpTable
->dwNumEntries
> 0, "No TCP connections?!\n");
132 for (i
= 0; i
< TcpTable
->dwNumEntries
; ++i
)
134 if (TcpTable
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
135 TcpTable
->table
[i
].dwLocalAddr
== 0 &&
136 TcpTable
->table
[i
].dwLocalPort
== htons(9876) &&
137 TcpTable
->table
[i
].dwRemoteAddr
== 0)
143 ok(Found
, "Our socket wasn't found!\n");
145 HeapFree(GetProcessHeap(), 0, TcpTable
);
149 skip("AllocateAndGetTcpExTable2FromStack failure\n");
152 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTableOwner
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_OWNER_PID_ALL
) == ERROR_SUCCESS
)
154 ok(TcpTableOwner
->dwNumEntries
> 0, "No TCP connections?!\n");
157 for (i
= 0; i
< TcpTableOwner
->dwNumEntries
; ++i
)
159 if (TcpTableOwner
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
160 TcpTableOwner
->table
[i
].dwLocalAddr
== 0 &&
161 TcpTableOwner
->table
[i
].dwLocalPort
== htons(9876) &&
162 TcpTableOwner
->table
[i
].dwRemoteAddr
== 0)
171 skip("Our socket wasn't found!\n");
175 ok(TcpTableOwner
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
178 HeapFree(GetProcessHeap(), 0, TcpTableOwner
);
182 skip("AllocateAndGetTcpExTable2FromStack failure\n");
185 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTableOwner
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_OWNER_PID_CONNECTIONS
) == ERROR_SUCCESS
)
188 for (i
= 0; i
< TcpTableOwner
->dwNumEntries
; ++i
)
190 if (TcpTableOwner
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
191 TcpTableOwner
->table
[i
].dwLocalAddr
== 0 &&
192 TcpTableOwner
->table
[i
].dwLocalPort
== htons(9876) &&
193 TcpTableOwner
->table
[i
].dwRemoteAddr
== 0)
199 ok(Found
== FALSE
, "Our socket was found!\n");
201 HeapFree(GetProcessHeap(), 0, TcpTableOwner
);
205 skip("AllocateAndGetTcpExTable2FromStack failure\n");
208 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTableOwner
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_OWNER_PID_LISTENER
) == ERROR_SUCCESS
)
210 ok(TcpTableOwner
->dwNumEntries
> 0, "No TCP connections?!\n");
213 for (i
= 0; i
< TcpTableOwner
->dwNumEntries
; ++i
)
215 if (TcpTableOwner
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
216 TcpTableOwner
->table
[i
].dwLocalAddr
== 0 &&
217 TcpTableOwner
->table
[i
].dwLocalPort
== htons(9876) &&
218 TcpTableOwner
->table
[i
].dwRemoteAddr
== 0)
227 skip("Our socket wasn't found!\n");
231 ok(TcpTableOwner
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
234 HeapFree(GetProcessHeap(), 0, TcpTableOwner
);
238 skip("AllocateAndGetTcpExTable2FromStack failure\n");
241 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTableOwnerMod
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_OWNER_MODULE_ALL
) == ERROR_SUCCESS
)
243 ok(TcpTableOwnerMod
->dwNumEntries
> 0, "No TCP connections?!\n");
246 for (i
= 0; i
< TcpTableOwnerMod
->dwNumEntries
; ++i
)
248 if (TcpTableOwnerMod
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
249 TcpTableOwnerMod
->table
[i
].dwLocalAddr
== 0 &&
250 TcpTableOwnerMod
->table
[i
].dwLocalPort
== htons(9876) &&
251 TcpTableOwnerMod
->table
[i
].dwRemoteAddr
== 0)
260 skip("Our socket wasn't found!\n");
264 ok(TcpTableOwnerMod
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
266 ok(TcpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
>= CreationTime
.QuadPart
, "Invalid time\n");
267 ok(TcpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
<= CreationTime
.QuadPart
+ 60000000000LL, "Invalid time\n");
270 HeapFree(GetProcessHeap(), 0, TcpTableOwnerMod
);
274 skip("AllocateAndGetTcpExTable2FromStack failure\n");
277 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTableOwnerMod
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_OWNER_MODULE_CONNECTIONS
) == ERROR_SUCCESS
)
280 for (i
= 0; i
< TcpTableOwnerMod
->dwNumEntries
; ++i
)
282 if (TcpTableOwnerMod
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
283 TcpTableOwnerMod
->table
[i
].dwLocalAddr
== 0 &&
284 TcpTableOwnerMod
->table
[i
].dwLocalPort
== htons(9876) &&
285 TcpTableOwnerMod
->table
[i
].dwRemoteAddr
== 0)
291 ok(Found
== FALSE
, "Our socket was found!\n");
293 HeapFree(GetProcessHeap(), 0, TcpTableOwnerMod
);
297 skip("AllocateAndGetTcpExTable2FromStack failure\n");
300 if (pAllocateAndGetTcpExTable2FromStack((PVOID
*)&TcpTableOwnerMod
, TRUE
, GetProcessHeap(), 0, AF_INET
, TCP_TABLE_OWNER_MODULE_LISTENER
) == ERROR_SUCCESS
)
302 ok(TcpTableOwnerMod
->dwNumEntries
> 0, "No TCP connections?!\n");
305 for (i
= 0; i
< TcpTableOwnerMod
->dwNumEntries
; ++i
)
307 if (TcpTableOwnerMod
->table
[i
].dwState
== MIB_TCP_STATE_LISTEN
&&
308 TcpTableOwnerMod
->table
[i
].dwLocalAddr
== 0 &&
309 TcpTableOwnerMod
->table
[i
].dwLocalPort
== htons(9876) &&
310 TcpTableOwnerMod
->table
[i
].dwRemoteAddr
== 0)
319 skip("Our socket wasn't found!\n");
323 ok(TcpTableOwnerMod
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
325 ok(TcpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
>= CreationTime
.QuadPart
, "Invalid time\n");
326 ok(TcpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
<= CreationTime
.QuadPart
+ 60000000000LL, "Invalid time\n");
329 HeapFree(GetProcessHeap(), 0, TcpTableOwnerMod
);
333 skip("AllocateAndGetTcpExTable2FromStack failure\n");