2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Tests for UDP connections owner functions
5 * COPYRIGHT: Copyright 2018 Pierre Schweitzer
10 #define WIN32_NO_STATUS
14 static DWORD
GetExtendedUdpTableWithAlloc(PVOID
*UdpTable
, BOOL Order
, DWORD Family
, UDP_TABLE_CLASS Class
)
21 ret
= GetExtendedUdpTable(*UdpTable
, &Size
, Order
, Family
, Class
, 0);
22 if (ret
== ERROR_INSUFFICIENT_BUFFER
)
24 *UdpTable
= HeapAlloc(GetProcessHeap(), 0, Size
);
25 if (*UdpTable
== NULL
)
27 return ERROR_OUTOFMEMORY
;
30 ret
= GetExtendedUdpTable(*UdpTable
, &Size
, Order
, Family
, Class
, 0);
33 HeapFree(GetProcessHeap(), 0, *UdpTable
);
41 START_TEST(GetOwnerModuleFromUdpEntry
)
46 PMIB_UDPTABLE_OWNER_MODULE UdpTableOwnerMod
;
50 LARGE_INTEGER CreationTime
;
51 DWORD Pid
= GetCurrentProcessId();
53 if (WSAStartup(MAKEWORD(2, 2), &wsaData
) != 0)
55 skip("Failed to init WS2\n");
59 GetSystemTimeAsFileTime(&Creation
);
60 CreationTime
.LowPart
= Creation
.dwLowDateTime
;
61 CreationTime
.HighPart
= Creation
.dwHighDateTime
;
63 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
64 if (sock
== INVALID_SOCKET
)
66 skip("Cannot create socket\n");
70 ZeroMemory(&server
, sizeof(SOCKADDR_IN
));
71 server
.sin_family
= AF_INET
;
72 server
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
73 server
.sin_port
= htons(9876);
75 if (bind(sock
, (SOCKADDR
*)&server
, sizeof(SOCKADDR_IN
)) == SOCKET_ERROR
)
77 skip("Cannot bind socket\n");
81 if (GetExtendedUdpTableWithAlloc((PVOID
*)&UdpTableOwnerMod
, TRUE
, AF_INET
, UDP_TABLE_OWNER_MODULE
) == ERROR_SUCCESS
)
83 ok(UdpTableOwnerMod
->dwNumEntries
> 0, "No UDP connections?!\n");
86 for (i
= 0; i
< UdpTableOwnerMod
->dwNumEntries
; ++i
)
88 if (UdpTableOwnerMod
->table
[i
].dwLocalAddr
== 0 &&
89 UdpTableOwnerMod
->table
[i
].dwLocalPort
== htons(9876))
98 skip("Our socket wasn't found!\n");
103 PTCPIP_OWNER_MODULE_BASIC_INFO BasicInfo
= NULL
;
105 ok(UdpTableOwnerMod
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
107 ok(UdpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
>= CreationTime
.QuadPart
, "Invalid time\n");
108 ok(UdpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
<= CreationTime
.QuadPart
+ 60000000000LL, "Invalid time\n");
110 if (GetOwnerModuleFromUdpEntry(&UdpTableOwnerMod
->table
[i
], TCPIP_OWNER_MODULE_INFO_BASIC
, BasicInfo
, &Size
) == ERROR_INSUFFICIENT_BUFFER
)
112 BasicInfo
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, Size
);
113 ok(BasicInfo
!= NULL
, "HeapAlloc failed\n");
115 if (GetOwnerModuleFromUdpEntry(&UdpTableOwnerMod
->table
[i
], TCPIP_OWNER_MODULE_INFO_BASIC
, BasicInfo
, &Size
) == ERROR_SUCCESS
)
117 WCHAR CurrentModule
[MAX_PATH
];
120 if (GetModuleFileNameW(NULL
, CurrentModule
, MAX_PATH
) != 0)
122 FileName
= wcsrchr(CurrentModule
, L
'\\');
125 ok(_wcsicmp(CurrentModule
, BasicInfo
->pModulePath
) == 0, "Mismatching names (%S, %S)\n", CurrentModule
, BasicInfo
->pModulePath
);
126 ok(_wcsicmp(FileName
, BasicInfo
->pModuleName
) == 0, "Mismatching names (%S, %S)\n", FileName
, BasicInfo
->pModuleName
);
130 skip("GetModuleFileNameW failed\n");
135 skip("GetOwnerModuleFromTcpEntry failed\n");
140 skip("GetOwnerModuleFromTcpEntry failed\n");
144 HeapFree(GetProcessHeap(), 0, UdpTableOwnerMod
);
148 skip("GetExtendedUdpTableWithAlloc failure\n");