2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for WSAStartup
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
8 #define WIN32_NO_STATUS
10 #include <wine/test.h>
11 #include <pseh/pseh2.h>
12 #include <ndk/rtlfuncs.h>
13 #include <ndk/mmfuncs.h>
15 #define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
16 #define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok(ExceptionStatus == ExpectedStatus, "Exception %lx, expected %lx\n", ExceptionStatus, ExpectedStatus)
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", 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
)
136 NTSTATUS ExceptionStatus
;
143 BOOLEAN ExpectedSuccess
;
144 WORD ExpectedVersion
;
147 { MAKEWORD(0, 0), FALSE
, MAKEWORD(2, 2) },
148 { MAKEWORD(0, 9), FALSE
, MAKEWORD(2, 2) },
149 { MAKEWORD(1, 0), TRUE
},
150 { MAKEWORD(1, 1), TRUE
},
151 { MAKEWORD(1, 2), TRUE
, MAKEWORD(1, 1) },
152 { MAKEWORD(1, 15), TRUE
, MAKEWORD(1, 1) },
153 { MAKEWORD(1, 255), TRUE
, MAKEWORD(1, 1) },
154 { MAKEWORD(2, 0), TRUE
},
155 { MAKEWORD(2, 1), TRUE
},
156 { MAKEWORD(2, 2), TRUE
},
157 { MAKEWORD(2, 3), TRUE
, MAKEWORD(2, 2) },
158 { MAKEWORD(2, 15), TRUE
, MAKEWORD(2, 2) },
159 { MAKEWORD(2, 255), TRUE
, MAKEWORD(2, 2) },
160 { MAKEWORD(3, 0), TRUE
, MAKEWORD(2, 2) },
161 { MAKEWORD(3, 1), TRUE
, MAKEWORD(2, 2) },
162 { MAKEWORD(3, 2), TRUE
, MAKEWORD(2, 2) },
163 { MAKEWORD(3, 3), TRUE
, MAKEWORD(2, 2) },
164 { MAKEWORD(3, 15), TRUE
, MAKEWORD(2, 2) },
165 { MAKEWORD(3, 255), TRUE
, MAKEWORD(2, 2) },
166 { MAKEWORD(15, 255), TRUE
, MAKEWORD(2, 2) },
167 { MAKEWORD(255, 255), TRUE
, MAKEWORD(2, 2) },
169 const INT TestCount
= sizeof(Tests
) / sizeof(Tests
[0]);
172 ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
174 /* parameter checks */
176 Error
= WSAStartup(0, NULL
);
177 ok_dec(Error
, WSAVERNOTSUPPORTED
);
178 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
179 EndSeh(STATUS_SUCCESS
);
181 Error
= WSAStartup(MAKEWORD(2, 2), NULL
);
182 ok_dec(Error
, WSAEFAULT
);
183 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
184 EndSeh(STATUS_SUCCESS
);
185 ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
187 WsaData
= AllocateGuarded(sizeof(*WsaData
));
190 skip("Out of memory\n");
194 /* test different version */
195 for (i
= 0; i
< TestCount
; i
++)
197 trace("%d: version %d.%d\n",
198 i
, LOBYTE(Tests
[i
].Version
), HIBYTE(Tests
[i
].Version
));
199 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
200 Error
= WSANO_RECOVERY
;
202 Error
= WSAStartup(Tests
[i
].Version
, WsaData
);
203 EndSeh(STATUS_SUCCESS
);
206 ok(!Tests
[i
].ExpectedSuccess
, "WSAStartup failed unexpectedly\n");
207 ok_dec(Error
, WSAVERNOTSUPPORTED
);
208 ok_dec(WSAGetLastError(), WSANOTINITIALISED
);
209 ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
213 ok(Tests
[i
].ExpectedSuccess
, "WSAStartup succeeded unexpectedly\n");
214 ok_dec(WSAGetLastError(), 0);
215 ok(IsWinsockInitialized(), "Winsock not initialized despite success\n");
216 if (LOBYTE(Tests
[i
].Version
) < 2)
217 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
219 ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
221 ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
223 if (Tests
[i
].ExpectedVersion
)
224 ok_hex(WsaData
->wVersion
, Tests
[i
].ExpectedVersion
);
226 ok_hex(WsaData
->wVersion
, Tests
[i
].Version
);
227 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
228 Okay
= CheckStringBuffer(WsaData
->szDescription
,
229 sizeof(WsaData
->szDescription
),
232 ok(Okay
, "CheckStringBuffer failed\n");
233 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
234 sizeof(WsaData
->szSystemStatus
),
237 ok(Okay
, "CheckStringBuffer failed\n");
238 if (LOBYTE(WsaData
->wVersion
) >= 2)
240 ok_dec(WsaData
->iMaxSockets
, 0);
241 ok_dec(WsaData
->iMaxUdpDg
, 0);
245 ok_dec(WsaData
->iMaxSockets
, 32767);
246 ok_dec(WsaData
->iMaxUdpDg
, 65467);
248 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
251 /* upgrade the version */
252 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
253 Error
= WSAStartup(MAKEWORD(1, 1), WsaData
);
255 ok_dec(WSAGetLastError(), 0);
256 ok_hex(WsaData
->wVersion
, MAKEWORD(1, 1));
257 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
258 Okay
= CheckStringBuffer(WsaData
->szDescription
,
259 sizeof(WsaData
->szDescription
),
262 ok(Okay
, "CheckStringBuffer failed\n");
263 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
264 sizeof(WsaData
->szSystemStatus
),
267 ok(Okay
, "CheckStringBuffer failed\n");
268 ok_dec(WsaData
->iMaxSockets
, 32767);
269 ok_dec(WsaData
->iMaxUdpDg
, 65467);
270 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
271 ok(IsWinsockInitialized(), "Winsock not initialized\n");
274 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
275 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
276 Error
= WSAStartup(MAKEWORD(2, 2), WsaData
);
278 ok_hex(WsaData
->wVersion
, MAKEWORD(2, 2));
279 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
280 Okay
= CheckStringBuffer(WsaData
->szDescription
,
281 sizeof(WsaData
->szDescription
),
284 ok(Okay
, "CheckStringBuffer failed\n");
285 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
286 sizeof(WsaData
->szSystemStatus
),
289 ok(Okay
, "CheckStringBuffer failed\n");
290 ok_dec(WsaData
->iMaxSockets
, 0);
291 ok_dec(WsaData
->iMaxUdpDg
, 0);
292 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
295 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
297 ok(IsWinsockInitialized(), "Winsock prematurely uninitialized\n");
300 ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
303 /* downgrade the version */
304 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
305 Error
= WSAStartup(MAKEWORD(2, 2), WsaData
);
307 ok_dec(WSAGetLastError(), 0);
308 ok_hex(WsaData
->wVersion
, MAKEWORD(2, 2));
309 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
310 Okay
= CheckStringBuffer(WsaData
->szDescription
,
311 sizeof(WsaData
->szDescription
),
314 ok(Okay
, "CheckStringBuffer failed\n");
315 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
316 sizeof(WsaData
->szSystemStatus
),
319 ok(Okay
, "CheckStringBuffer failed\n");
320 ok_dec(WsaData
->iMaxSockets
, 0);
321 ok_dec(WsaData
->iMaxUdpDg
, 0);
322 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
323 ok(IsWinsockInitialized(), "Winsock not initialized\n");
326 ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
327 FillMemory(WsaData
, sizeof(*WsaData
), 0x55);
328 Error
= WSAStartup(MAKEWORD(1, 1), WsaData
);
330 ok_hex(WsaData
->wVersion
, MAKEWORD(1, 1));
331 ok_hex(WsaData
->wHighVersion
, MAKEWORD(2, 2));
332 Okay
= CheckStringBuffer(WsaData
->szDescription
,
333 sizeof(WsaData
->szDescription
),
336 ok(Okay
, "CheckStringBuffer failed\n");
337 Okay
= CheckStringBuffer(WsaData
->szSystemStatus
,
338 sizeof(WsaData
->szSystemStatus
),
341 ok(Okay
, "CheckStringBuffer failed\n");
342 ok_dec(WsaData
->iMaxSockets
, 32767);
343 ok_dec(WsaData
->iMaxUdpDg
, 65467);
344 ok_ptr(WsaData
->lpVendorInfo
, (PVOID
)0x5555555555555555ULL
);
347 ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
349 ok(IsWinsockInitialized(), "Winsock prematurely uninitialized\n");
352 ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
355 FreeGuarded(WsaData
);