2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Tests for network interface name resolving functions
5 * COPYRIGHT: Copyright 2017 Stanislav Motylkov
10 #define WIN32_NO_STATUS
12 #include <ndk/rtlfuncs.h>
15 DEFINE_GUID(MY_TEST_GUID
, 0x8D1AB70F, 0xADF0, 0x49FC, 0x9D, 0x07, 0x4E, 0x89, 0x29, 0x2D, 0xC5, 0x2B);
16 static DWORD (WINAPI
* pNhGetInterfaceNameFromGuid
)(PVOID
, PVOID
, PULONG
, DWORD
, DWORD
);
17 static DWORD (WINAPI
* pNhGetInterfaceNameFromDeviceGuid
)(PVOID
, PVOID
, PULONG
, DWORD
, DWORD
);
20 * Tests for NhGetInterfaceNameFromGuid
24 test_NhGetInterfaceNameFromGuid(GUID AdapterGUID
, DWORD par1
, DWORD par2
)
26 DWORD ApiReturn
, Error
;
28 WCHAR Name
[MAX_INTERFACE_NAME_LEN
+ 4];
29 GUID UniqueGUID
= MY_TEST_GUID
;
32 SetLastError(0xbeeffeed);
34 ZeroMemory(&Name
, sizeof(Name
));
35 ApiReturn
= ERROR_SUCCESS
;
36 ulOutBufLen
= sizeof(Name
);
38 ApiReturn
= pNhGetInterfaceNameFromGuid(NULL
, &Name
, &ulOutBufLen
, par1
, par2
);
39 Error
= GetLastError();
40 EndSeh(STATUS_SUCCESS
);
42 ok(ApiReturn
== ERROR_INVALID_PARAMETER
,
43 "ApiReturn returned %ld, expected ERROR_INVALID_PARAMETER\n",
45 ok(Error
== 0xbeeffeed,
46 "GetLastError() returned %ld, expected 0xbeeffeed\n",
48 ok(ulOutBufLen
== sizeof(Name
),
49 "ulOutBufLen is %ld, expected = sizeof(Name)\n",
53 // Test correct GUID, but NULL name
54 SetLastError(0xbeeffeed);
55 ZeroMemory(&Name
, sizeof(Name
));
56 ApiReturn
= pNhGetInterfaceNameFromGuid(&AdapterGUID
, NULL
, &ulOutBufLen
, par1
, par2
);
57 Error
= GetLastError();
59 ok(ApiReturn
== ERROR_SUCCESS
,
60 "ApiReturn returned %ld, expected ERROR_SUCCESS\n",
62 ok(Error
== 0xbeeffeed,
63 "GetLastError() returned %ld, expected 0xbeeffeed\n",
66 "ulOutBufLen is %ld, expected > 0\n",
70 // NhGetInterfaceNameFromGuid will throw exception if pOutBufLen is NULL
71 SetLastError(0xbeeffeed);
73 ZeroMemory(&Name
, sizeof(Name
));
74 ApiReturn
= ERROR_SUCCESS
;
76 ApiReturn
= pNhGetInterfaceNameFromGuid(&AdapterGUID
, &Name
, NULL
, par1
, par2
);
77 Error
= GetLastError();
78 EndSeh(STATUS_SUCCESS
);
80 ok(ApiReturn
== ERROR_INVALID_PARAMETER
,
81 "ApiReturn returned %ld, expected ERROR_INVALID_PARAMETER\n",
83 ok(Error
== 0xbeeffeed,
84 "GetLastError() returned %ld, expected 0xbeeffeed\n",
87 "ulOutBufLen is %ld, expected > 0\n",
91 // Test correct values
92 SetLastError(0xbeeffeed);
93 ZeroMemory(&Name
, sizeof(Name
));
94 ulOutBufLen
= sizeof(Name
);
95 ApiReturn
= pNhGetInterfaceNameFromGuid(&AdapterGUID
, &Name
, &ulOutBufLen
, par1
, par2
);
96 Error
= GetLastError();
98 ok(ApiReturn
== ERROR_SUCCESS
,
99 "ApiReturn returned %ld, expected ERROR_SUCCESS\n",
101 ok(Error
== 0xbeeffeed,
102 "GetLastError() returned %ld, expected 0xbeeffeed\n",
105 "ulOutBufLen is %ld, expected > 0\n",
107 Error
= wcslen(Name
);
109 "wcslen(Name) is %ld, expected > 0\n",
112 trace("Adapter name: \"%S\"\n", Name
);
114 // Test correct values, but with new unique GUID
115 SetLastError(0xbeeffeed);
116 ZeroMemory(&Name
, sizeof(Name
));
117 ulOutBufLen
= sizeof(Name
);
118 ApiReturn
= pNhGetInterfaceNameFromGuid((PVOID
)&UniqueGUID
, &Name
, &ulOutBufLen
, par1
, par2
);
119 Error
= GetLastError();
121 ok(ApiReturn
== ERROR_NOT_FOUND
,
122 "ApiReturn returned %ld, expected ERROR_NOT_FOUND\n",
124 ok(Error
== ERROR_PATH_NOT_FOUND
,
125 "GetLastError() returned %ld, expected ERROR_PATH_NOT_FOUND\n",
127 ok(ulOutBufLen
== sizeof(Name
),
128 "ulOutBufLen is %ld, expected = sizeof(Name)\n",
132 // Test correct values, but with small length
133 SetLastError(0xbeeffeed);
134 ZeroMemory(&Name
, sizeof(Name
));
136 ApiReturn
= pNhGetInterfaceNameFromGuid(&AdapterGUID
, &Name
, &ulOutBufLen
, par1
, par2
);
137 Error
= GetLastError();
139 ok(ApiReturn
== ERROR_INSUFFICIENT_BUFFER
,
140 "ApiReturn returned %ld, expected ERROR_INSUFFICIENT_BUFFER\n",
142 ok(Error
== 0xbeeffeed,
143 "GetLastError() returned %ld, expected 0xbeeffeed\n",
145 ok(ulOutBufLen
== MAX_INTERFACE_NAME_LEN
* 2,
146 "ulOutBufLen is %ld, expected = MAX_INTERFACE_NAME_LEN * 2\n",
152 * Tests for NhGetInterfaceNameFromDeviceGuid
156 test_NhGetInterfaceNameFromDeviceGuid(GUID AdapterGUID
, DWORD par1
, DWORD par2
)
158 DWORD ApiReturn
, Error
;
160 WCHAR Name
[MAX_INTERFACE_NAME_LEN
];
161 GUID UniqueGUID
= MY_TEST_GUID
;
164 // Windows XP: NhGetInterfaceNameFromDeviceGuid throws exception here
165 SetLastError(0xbeeffeed);
167 ZeroMemory(&Name
, sizeof(Name
));
168 ApiReturn
= ERROR_SUCCESS
;
169 ulOutBufLen
= sizeof(Name
);
171 ApiReturn
= pNhGetInterfaceNameFromDeviceGuid(NULL
, &Name
, &ulOutBufLen
, par1
, par2
);
172 Error
= GetLastError();
173 EndSeh(STATUS_SUCCESS
);
175 ok(ApiReturn
== ERROR_INVALID_PARAMETER
,
176 "ApiReturn returned %ld, expected ERROR_INVALID_PARAMETER\n",
178 ok(Error
== ERROR_SUCCESS
,
179 "GetLastError() returned %ld, expected ERROR_SUCCESS\n",
181 ok(ulOutBufLen
== sizeof(Name
),
182 "ulOutBufLen is %ld, expected = sizeof(Name)\n",
186 // Test correct GUID, but NULL name
187 SetLastError(0xbeeffeed);
189 ZeroMemory(&Name
, sizeof(Name
));
190 ApiReturn
= ERROR_SUCCESS
;
192 ApiReturn
= pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID
, NULL
, &ulOutBufLen
, par1
, par2
);
193 Error
= GetLastError();
194 EndSeh(STATUS_SUCCESS
);
196 ok(ApiReturn
== ERROR_INVALID_PARAMETER
,
197 "ApiReturn returned %ld, expected ERROR_INVALID_PARAMETER\n",
199 ok(Error
== ERROR_SUCCESS
,
200 "GetLastError() returned %ld, expected ERROR_SUCCESS\n",
203 "ulOutBufLen is %ld, expected > 0\n",
207 // NhGetInterfaceNameFromDeviceGuid will throw exception if pOutBufLen is NULL
208 SetLastError(0xbeeffeed);
210 ZeroMemory(&Name
, sizeof(Name
));
211 ApiReturn
= ERROR_SUCCESS
;
213 ApiReturn
= pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID
, &Name
, NULL
, par1
, par2
);
214 Error
= GetLastError();
215 EndSeh(STATUS_SUCCESS
);
217 ok(ApiReturn
== ERROR_INVALID_PARAMETER
,
218 "ApiReturn returned %ld, expected ERROR_INVALID_PARAMETER\n",
220 ok(Error
== ERROR_SUCCESS
,
221 "GetLastError() returned %ld, expected ERROR_SUCCESS\n",
224 "ulOutBufLen is %ld, expected > 0\n",
228 // Test correct values
229 SetLastError(0xbeeffeed);
230 ZeroMemory(&Name
, sizeof(Name
));
231 ulOutBufLen
= sizeof(Name
);
232 ApiReturn
= pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID
, &Name
, &ulOutBufLen
, par1
, par2
);
233 Error
= GetLastError();
235 ok(ApiReturn
== ERROR_SUCCESS
,
236 "ApiReturn returned %ld, expected ERROR_SUCCESS\n",
238 ok(Error
== ERROR_SUCCESS
,
239 "GetLastError() returned %ld, expected ERROR_SUCCESS\n",
242 "ulOutBufLen is %ld, expected > 0\n",
244 Error
= wcslen(Name
);
246 "wcslen(Name) is %ld, expected > 0\n",
249 trace("Adapter name: \"%S\"\n", Name
);
251 // Test correct values, but with new unique GUID
252 SetLastError(0xbeeffeed);
253 ZeroMemory(&Name
, sizeof(Name
));
254 ulOutBufLen
= sizeof(Name
);
255 ApiReturn
= pNhGetInterfaceNameFromDeviceGuid((PVOID
)&UniqueGUID
, &Name
, &ulOutBufLen
, par1
, par2
);
256 Error
= GetLastError();
258 ok(ApiReturn
== ERROR_NOT_FOUND
,
259 "ApiReturn returned %ld, expected ERROR_NOT_FOUND\n",
261 ok(Error
== ERROR_SUCCESS
,
262 "GetLastError() returned %ld, expected ERROR_SUCCESS\n",
264 ok(ulOutBufLen
== sizeof(Name
),
265 "ulOutBufLen is %ld, expected = sizeof(Name)\n",
269 // Test correct values, but with small length
270 SetLastError(0xbeeffeed);
271 ZeroMemory(&Name
, sizeof(Name
));
273 ApiReturn
= pNhGetInterfaceNameFromDeviceGuid(&AdapterGUID
, &Name
, &ulOutBufLen
, par1
, par2
);
274 Error
= GetLastError();
276 ok(ApiReturn
== ERROR_INSUFFICIENT_BUFFER
,
277 "ApiReturn returned %ld, expected ERROR_INSUFFICIENT_BUFFER\n",
279 ok(Error
== ERROR_SUCCESS
,
280 "GetLastError() returned %ld, expected ERROR_SUCCESS\n",
282 ok(ulOutBufLen
== MAX_INTERFACE_NAME_LEN
* 2,
283 "ulOutBufLen is %ld, expected = MAX_INTERFACE_NAME_LEN * 2\n",
290 test_GetInterfaceName(VOID
)
292 PIP_INTERFACE_INFO pInfo
= NULL
;
293 ULONG ulOutBufLen
= 0;
295 WCHAR Name
[MAX_ADAPTER_NAME
];
296 UNICODE_STRING GuidString
;
300 ApiReturn
= GetInterfaceInfo(pInfo
, &ulOutBufLen
);
301 ok(ApiReturn
== ERROR_INSUFFICIENT_BUFFER
,
302 "GetInterfaceInfo(pInfo, &ulOutBufLen) returned %ld, expected ERROR_INSUFFICIENT_BUFFER\n",
304 if (ApiReturn
!= ERROR_INSUFFICIENT_BUFFER
)
306 skip("Can't determine size of IP_INTERFACE_INFO. Can't proceed\n");
310 pInfo
= (IP_INTERFACE_INFO
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, ulOutBufLen
);
313 skip("pInfo is NULL. Can't proceed\n");
317 ApiReturn
= GetInterfaceInfo(pInfo
, &ulOutBufLen
);
318 ok(ApiReturn
== NO_ERROR
,
319 "GetInterfaceInfo(pInfo, &ulOutBufLen) returned %ld, expected NO_ERROR\n",
321 if (ApiReturn
!= NO_ERROR
|| ulOutBufLen
== 0)
323 skip("GetInterfaceInfo failed with error %ld. Can't proceed\n", ApiReturn
);
327 if (pInfo
->NumAdapters
> 0)
328 CopyMemory(&Name
, &pInfo
->Adapter
[0].Name
, sizeof(Name
));
330 if (pInfo
->NumAdapters
== 0)
332 HeapFree(GetProcessHeap(), 0, pInfo
);
333 skip("pInfo->NumAdapters = 0. Can't proceed\n");
336 trace("pInfo->NumAdapters: %lu\n", pInfo
->NumAdapters
);
338 HeapFree(GetProcessHeap(), 0, pInfo
);
340 ApiReturn
= wcsncmp(Name
, L
"\\DEVICE\\TCPIP_", 14);
342 "wcsncmp(Name, L\"\\DEVICE\\TCPIP_\", 14) returned %ld, expected 0\n",
346 if (wcslen(Name
) == 0)
348 skip("pInfo->Adapter[0].Name is empty. Can't proceed\n");
353 // workaround for ReactOS
354 trace("pInfo->Adapter[0].Name = \"%ls\" is incorrect.\n", Name
);
355 RtlInitUnicodeString(&GuidString
, &Name
[0]);
360 RtlInitUnicodeString(&GuidString
, &Name
[14]);
363 ApiReturn
= RtlGUIDFromString(&GuidString
, &AdapterGUID
);
366 skip("RtlGUIDFromString failed. Can't proceed\n");
370 hIpHlpApi
= GetModuleHandleW(L
"iphlpapi.dll");
373 skip("Failed to load iphlpapi.dll. Can't proceed\n");
377 pNhGetInterfaceNameFromGuid
= (void *)GetProcAddress(hIpHlpApi
, "NhGetInterfaceNameFromGuid");
379 if (!pNhGetInterfaceNameFromGuid
)
380 skip("NhGetInterfaceNameFromGuid not found. Can't proceed\n");
382 test_NhGetInterfaceNameFromGuid(AdapterGUID
, 0, 0);
384 pNhGetInterfaceNameFromDeviceGuid
= (void *)GetProcAddress(hIpHlpApi
, "NhGetInterfaceNameFromDeviceGuid");
386 if (!pNhGetInterfaceNameFromDeviceGuid
)
387 skip("NhGetInterfaceNameFromDeviceGuid not found. Can't proceed\n");
389 test_NhGetInterfaceNameFromDeviceGuid(AdapterGUID
, 1, 0);
392 START_TEST(GetInterfaceName
)
394 test_GetInterfaceName();