2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for WSAStartup
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
10 #define WIN32_NO_STATUS
12 #define COM_NO_WINDOWS_H
15 #include <ndk/rtlfuncs.h>
16 #include <ndk/mmfuncs.h>
24 SIZE_T Size
= PAGE_ROUND_UP(SizeRequested
+ PAGE_SIZE
);
25 PVOID VirtualMemory
= NULL
;
28 Status
= NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory
, 0, &Size
, MEM_RESERVE
, PAGE_NOACCESS
);
30 if (!NT_SUCCESS(Status
))
36 Status
= NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory
, 0, &Size
, MEM_COMMIT
, PAGE_READWRITE
);
37 if (!NT_SUCCESS(Status
))
40 Status
= NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory
, &Size
, MEM_RELEASE
);
41 ok(Status
== STATUS_SUCCESS
, "Status = %lx\n", Status
);
46 StartOfBuffer
= VirtualMemory
;
47 StartOfBuffer
+= Size
- SizeRequested
;
58 PVOID VirtualMemory
= (PVOID
)PAGE_ROUND_DOWN((SIZE_T
)Pointer
);
61 Status
= NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory
, &Size
, MEM_RELEASE
);
62 ok(Status
== STATUS_SUCCESS
, "Status = %lx\n", Status
);
73 SIZE_T Length
= strlen(Expected
);
75 BOOLEAN Result
= TRUE
;
78 EqualLength
= RtlCompareMemory(Buffer
, Expected
, Length
);
79 if (EqualLength
!= Length
)
81 ok(0, "String is '%.*s', expected '%s'\n", (int)MaximumLength
, Buffer
, Expected
);
85 if (Buffer
[Length
] != ANSI_NULL
)
87 ok(0, "Not null terminated\n");
91 /* The function nulls the rest of the buffer! */
92 for (i
= Length
+ 1; i
< MaximumLength
; i
++)
94 UCHAR Char
= ((PUCHAR
)Buffer
)[i
];
97 ok(0, "Found 0x%x at offset %lu, expected 0x%x\n", Char
, (ULONG
)i
, Fill
);
98 /* Don't count this as a failure unless the string was actually wrong */
100 /* Don't flood the log */
110 IsWinsockInitialized(VOID
)
112 struct hostent
*Hostent
;
114 Hostent
= gethostbyname("localhost");
116 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
117 return Hostent
!= NULL
;
122 AreLegacyFunctionsSupported(VOID
)
126 Error
= WSACancelBlockingCall();
127 ok(Error
== SOCKET_ERROR
, "Error = %d\n", Error
);
128 ok(WSAGetLastError() == WSAEOPNOTSUPP
||
129 WSAGetLastError() == WSAEINVAL
, "WSAGetLastError = %d\n", WSAGetLastError());
131 return WSAGetLastError() != WSAEOPNOTSUPP
;
134 START_TEST(WSAStartup
)
142 BOOLEAN ExpectedSuccess
;
143 WORD ExpectedVersion
;
146 { MAKEWORD(0, 0), FALSE
, MAKEWORD(2, 2) },
147 { MAKEWORD(0, 9), FALSE
, MAKEWORD(2, 2) },
148 { MAKEWORD(1, 0), TRUE
},
149 { MAKEWORD(1, 1), TRUE
},
150 { MAKEWORD(1, 2), TRUE
, MAKEWORD(1, 1) },
151 { MAKEWORD(1, 15), TRUE
, MAKEWORD(1, 1) },
152 { MAKEWORD(1, 255), TRUE
, MAKEWORD(1, 1) },
153 { MAKEWORD(2, 0), TRUE
},
154 { MAKEWORD(2, 1), TRUE
},
155 { MAKEWORD(2, 2), TRUE
},
156 { MAKEWORD(2, 3), TRUE
, MAKEWORD(2, 2) },
157 { MAKEWORD(2, 15), TRUE
, MAKEWORD(2, 2) },
158 { MAKEWORD(2, 255), TRUE
, MAKEWORD(2, 2) },
159 { MAKEWORD(3, 0), TRUE
, MAKEWORD(2, 2) },
160 { MAKEWORD(3, 1), TRUE
, MAKEWORD(2, 2) },
161 { MAKEWORD(3, 2), TRUE
, MAKEWORD(2, 2) },
162 { MAKEWORD(3, 3), TRUE
, MAKEWORD(2, 2) },
163 { MAKEWORD(3, 15), TRUE
, MAKEWORD(2, 2) },
164 { MAKEWORD(3, 255), TRUE
, MAKEWORD(2, 2) },
165 { MAKEWORD(15, 255), TRUE
, MAKEWORD(2, 2) },
166 { MAKEWORD(255, 255), TRUE
, MAKEWORD(2, 2) },
168 const INT TestCount
= sizeof(Tests
) / sizeof(Tests
[0]);
171 ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
173 /* parameter checks */
175 Error
= WSAStartup(0, NULL
);
176 ok_dec(Error
, WSAVERNOTSUPPORTED
);
177 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
178 EndSeh(STATUS_SUCCESS
);
180 Error
= WSAStartup(MAKEWORD(2, 2), NULL
);
181 ok_dec(Error
, WSAEFAULT
);
182 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
183 EndSeh(STATUS_SUCCESS
);
184 ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
186 WsaData
= AllocateGuarded(sizeof(*WsaData
));
189 skip("Out of memory\n");
193 /* test different version */
194 for (i
= 0; i
< TestCount
; i
++)
196 trace("%d: version %d.%d\n",
197 i
, LOBYTE(Tests
[i
].Version
), HIBYTE(Tests
[i
].Version
));
198 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
199 Error
= WSANO_RECOVERY
;
201 Error
= WSAStartup(Tests
[i
].Version
, WsaData
);
202 EndSeh(STATUS_SUCCESS
);
205 ok(!Tests
[i
].ExpectedSuccess
, "WSAStartup failed unexpectedly\n");
206 ok_dec(Error
, WSAVERNOTSUPPORTED
);
207 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
208 ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
212 ok(Tests
[i
].ExpectedSuccess
, "WSAStartup succeeded unexpectedly\n");
213 ok_dec(WSAGetLastError(), 0);
214 ok(IsWinsockInitialized(), "Winsock not initialized despite success\n");
215 if (LOBYTE(Tests
[i
].Version
) < 2)
216 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
218 ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
220 ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
222 if (Tests
[i
].ExpectedVersion
)
223 ok_hex(WsaData
->wVersion
, Tests
[i
].ExpectedVersion
);
225 ok_hex(WsaData
->wVersion
, Tests
[i
].Version
);
226 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
227 Okay
= CheckStringBuffer(WsaData
->szDescription
,
228 sizeof(WsaData
->szDescription
),
231 ok(Okay
, "CheckStringBuffer failed\n");
232 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
233 sizeof(WsaData
->szSystemStatus
),
236 ok(Okay
, "CheckStringBuffer failed\n");
237 if (LOBYTE(WsaData
->wVersion
) >= 2)
239 ok_dec(WsaData
->iMaxSockets
, 0);
240 ok_dec(WsaData
->iMaxUdpDg
, 0);
244 ok_dec(WsaData
->iMaxSockets
, 32767);
245 ok_dec(WsaData
->iMaxUdpDg
, 65467);
247 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
250 /* upgrade the version */
251 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
252 Error
= WSAStartup(MAKEWORD(1, 1), WsaData
);
254 ok_dec(WSAGetLastError(), 0);
255 ok_hex(WsaData
->wVersion
, MAKEWORD(1, 1));
256 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
257 Okay
= CheckStringBuffer(WsaData
->szDescription
,
258 sizeof(WsaData
->szDescription
),
261 ok(Okay
, "CheckStringBuffer failed\n");
262 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
263 sizeof(WsaData
->szSystemStatus
),
266 ok(Okay
, "CheckStringBuffer failed\n");
267 ok_dec(WsaData
->iMaxSockets
, 32767);
268 ok_dec(WsaData
->iMaxUdpDg
, 65467);
269 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
270 ok(IsWinsockInitialized(), "Winsock not initialized\n");
273 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
274 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
275 Error
= WSAStartup(MAKEWORD(2, 2), WsaData
);
277 ok_hex(WsaData
->wVersion
, MAKEWORD(2, 2));
278 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
279 Okay
= CheckStringBuffer(WsaData
->szDescription
,
280 sizeof(WsaData
->szDescription
),
283 ok(Okay
, "CheckStringBuffer failed\n");
284 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
285 sizeof(WsaData
->szSystemStatus
),
288 ok(Okay
, "CheckStringBuffer failed\n");
289 ok_dec(WsaData
->iMaxSockets
, 0);
290 ok_dec(WsaData
->iMaxUdpDg
, 0);
291 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
294 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
296 ok(IsWinsockInitialized(), "Winsock prematurely uninitialized\n");
299 ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
302 /* downgrade the version */
303 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
304 Error
= WSAStartup(MAKEWORD(2, 2), WsaData
);
306 ok_dec(WSAGetLastError(), 0);
307 ok_hex(WsaData
->wVersion
, MAKEWORD(2, 2));
308 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
309 Okay
= CheckStringBuffer(WsaData
->szDescription
,
310 sizeof(WsaData
->szDescription
),
313 ok(Okay
, "CheckStringBuffer failed\n");
314 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
315 sizeof(WsaData
->szSystemStatus
),
318 ok(Okay
, "CheckStringBuffer failed\n");
319 ok_dec(WsaData
->iMaxSockets
, 0);
320 ok_dec(WsaData
->iMaxUdpDg
, 0);
321 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
322 ok(IsWinsockInitialized(), "Winsock not initialized\n");
325 ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
326 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
327 Error
= WSAStartup(MAKEWORD(1, 1), WsaData
);
329 ok_hex(WsaData
->wVersion
, MAKEWORD(1, 1));
330 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
331 Okay
= CheckStringBuffer(WsaData
->szDescription
,
332 sizeof(WsaData
->szDescription
),
335 ok(Okay
, "CheckStringBuffer failed\n");
336 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
337 sizeof(WsaData
->szSystemStatus
),
340 ok(Okay
, "CheckStringBuffer failed\n");
341 ok_dec(WsaData
->iMaxSockets
, 32767);
342 ok_dec(WsaData
->iMaxUdpDg
, 65467);
343 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
346 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
348 ok(IsWinsockInitialized(), "Winsock prematurely uninitialized\n");
351 ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
354 FreeGuarded(WsaData
);