ReactOS 0.4.15-dev-5666-gc548b97
RtlGetFullPathName_Ustr.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for RtlGetFullPathName_Ustr
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8#include "precomp.h"
9
10/*
11ULONG
12NTAPI
13RtlGetFullPathName_Ustr(
14 IN PCUNICODE_STRING FileName,
15 IN ULONG Size,
16 IN PWSTR Buffer,
17 OUT PCWSTR *ShortName,
18 OUT PBOOLEAN InvalidName,
19 OUT RTL_PATH_TYPE* PathType
20);
21*/
22
23/* This seems to be a struct of some kind in Windows 7... returns 0 or 32 in the second member */
25{
29
30static
32(NTAPI
40)
41//= (PVOID)0x7c83086c // 2003 sp1 x86
42//= (PVOID)0x77ef49f0 // 2003 sp1 x64
43//= (PVOID)0x7769a3dd // win7 sp1 wow64
44;
45
46#define ok_eq_ustr(str1, str2) do { \
47 ok((str1)->Buffer == (str2)->Buffer, "Buffer modified\n"); \
48 ok((str1)->Length == (str2)->Length, "Length modified\n"); \
49 ok((str1)->MaximumLength == (str2)->MaximumLength, "MaximumLength modified\n"); \
50 } while (0)
51
52static
59{
60 SIZE_T ExpectedLength = wcslen(Expected) * sizeof(WCHAR);
61 SIZE_T EqualLength;
63 SIZE_T i;
64
65 if (Length != ExpectedLength)
66 {
67 ok(0, "String length is %lu, expected %lu\n", (ULONG)Length, (ULONG)ExpectedLength);
68 Result = FALSE;
69 }
70
71 EqualLength = RtlCompareMemory(Buffer, Expected, Length);
72 if (EqualLength != Length)
73 {
74 ok(0, "String is '%S', expected '%S'\n", Buffer, Expected);
75 Result = FALSE;
76 }
77
78 if (Buffer[Length / sizeof(WCHAR)] != UNICODE_NULL)
79 {
80 ok(0, "Not null terminated\n");
81 Result = FALSE;
82 }
83
84 /* The function nulls the rest of the buffer! */
85 for (i = Length + sizeof(UNICODE_NULL); i < MaximumLength; i++)
86 {
87 UCHAR Char = ((PUCHAR)Buffer)[i];
88 if (Char != 0)
89 {
90 ok(0, "Found 0x%x at offset %lu, expected 0x%x\n", Char, (ULONG)i, 0);
91 /* Don't count this as a failure unless the string was actually wrong */
92 //Result = FALSE;
93 /* Don't flood the log */
94 break;
95 }
96 }
97
98 return Result;
99}
100
101static
105 SIZE_T Size,
106 UCHAR Value)
107{
108 PUCHAR Array = Buffer;
109 SIZE_T i;
110
111 for (i = 0; i < Size; i++)
112 if (Array[i] != Value)
113 {
114 trace("Expected %x, found %x at offset %lu\n", Value, Array[i], (ULONG)i);
115 return FALSE;
116 }
117 return TRUE;
118}
119
120#define RtlPathTypeNotSet 123
121
122/* winetest_platform is "windows" for us, so broken() doesn't do what it should :( */
123#undef broken
124#define broken(x) 0
125
126typedef enum
127{
133
134static
135VOID
137{
138 /* TODO: don't duplicate this in the other tests */
139 /* TODO: Drive Relative tests don't work yet if the current drive isn't C: */
140 struct
141 {
142 ULONG Line;
144 PREFIX_TYPE PrefixType;
145 PCWSTR FullPathName;
147 PREFIX_TYPE FilePartPrefixType;
148 SIZE_T FilePartSize;
149 } TestCases[] =
150 {
152 { __LINE__, L"C:\\", PrefixNone, L"C:\\", RtlPathTypeDriveAbsolute },
153 { __LINE__, L"C:\\test", PrefixNone, L"C:\\test", RtlPathTypeDriveAbsolute, PrefixCurrentDrive },
154 { __LINE__, L"C:\\test\\", PrefixNone, L"C:\\test\\", RtlPathTypeDriveAbsolute },
155 { __LINE__, L"C:/test/", PrefixNone, L"C:\\test\\", RtlPathTypeDriveAbsolute },
156
157 { __LINE__, L"C:\\\\test", PrefixNone, L"C:\\test", RtlPathTypeDriveAbsolute, PrefixCurrentDrive },
158 { __LINE__, L"test", PrefixCurrentPath, L"\\test", RtlPathTypeRelative, PrefixCurrentPath, sizeof(WCHAR) },
159 { __LINE__, L"\\test", PrefixCurrentDrive, L"test", RtlPathTypeRooted, PrefixCurrentDrive },
160 { __LINE__, L"/test", PrefixCurrentDrive, L"test", RtlPathTypeRooted, PrefixCurrentDrive },
161 { __LINE__, L".\\test", PrefixCurrentPath, L"\\test", RtlPathTypeRelative, PrefixCurrentPath, sizeof(WCHAR) },
162
163 { __LINE__, L"\\.", PrefixCurrentDrive, L"", RtlPathTypeRooted },
164 { __LINE__, L"\\.\\", PrefixCurrentDrive, L"", RtlPathTypeRooted },
165 { __LINE__, L"\\\\.", PrefixNone, L"\\\\.\\", RtlPathTypeRootLocalDevice },
166 { __LINE__, L"\\\\.\\", PrefixNone, L"\\\\.\\", RtlPathTypeLocalDevice },
167 { __LINE__, L"\\\\.\\Something\\", PrefixNone, L"\\\\.\\Something\\", RtlPathTypeLocalDevice },
168
169 { __LINE__, L"\\??\\", PrefixCurrentDrive, L"??\\", RtlPathTypeRooted },
170 { __LINE__, L"\\??\\C:", PrefixCurrentDrive, L"??\\C:", RtlPathTypeRooted, PrefixCurrentDrive, 3 * sizeof(WCHAR) },
171 { __LINE__, L"\\??\\C:\\", PrefixCurrentDrive, L"??\\C:\\", RtlPathTypeRooted },
172 { __LINE__, L"\\??\\C:\\test", PrefixCurrentDrive, L"??\\C:\\test", RtlPathTypeRooted, PrefixCurrentDrive, 6 * sizeof(WCHAR) },
173 { __LINE__, L"\\??\\C:\\test\\", PrefixCurrentDrive, L"??\\C:\\test\\", RtlPathTypeRooted },
174
175 { __LINE__, L"\\\\??\\", PrefixNone, L"\\\\??\\", RtlPathTypeUncAbsolute },
176 { __LINE__, L"\\\\??\\C:", PrefixNone, L"\\\\??\\C:", RtlPathTypeUncAbsolute },
177 { __LINE__, L"\\\\??\\C:\\", PrefixNone, L"\\\\??\\C:\\", RtlPathTypeUncAbsolute },
178 { __LINE__, L"\\\\??\\C:\\test", PrefixNone, L"\\\\??\\C:\\test", RtlPathTypeUncAbsolute, PrefixNone, sizeof(L"\\\\??\\C:\\") },
179 { __LINE__, L"\\\\??\\C:\\test\\", PrefixNone, L"\\\\??\\C:\\test\\", RtlPathTypeUncAbsolute },
180 };
183 WCHAR FullPathNameBuffer[MAX_PATH];
184 UNICODE_STRING TempString;
185 const WCHAR *ShortName;
188 WCHAR ExpectedPathName[MAX_PATH];
189 SIZE_T ExpectedFilePartSize;
190 const WCHAR *ExpectedShortName;
191 const INT TestCount = sizeof(TestCases) / sizeof(TestCases[0]);
192 INT i;
193 BOOLEAN Okay;
194
195 for (i = 0; i < TestCount; i++)
196 {
197 trace("i = %d\n", i);
198 switch (TestCases[i].PrefixType)
199 {
200 case PrefixNone:
201 ExpectedPathName[0] = UNICODE_NULL;
202 break;
204 GetCurrentDirectoryW(sizeof(ExpectedPathName) / sizeof(WCHAR), ExpectedPathName);
205 ExpectedPathName[3] = UNICODE_NULL;
206 break;
208 {
210 Length = GetCurrentDirectoryW(sizeof(ExpectedPathName) / sizeof(WCHAR), ExpectedPathName);
211 if (Length == 3 && TestCases[i].FullPathName[0])
212 ExpectedPathName[2] = UNICODE_NULL;
213 break;
214 }
215 default:
216 skip("Invalid test!\n");
217 continue;
218 }
219 wcscat(ExpectedPathName, TestCases[i].FullPathName);
221 RtlFillMemory(FullPathNameBuffer, sizeof(FullPathNameBuffer), 0xAA);
222 TempString = FileName;
224 PathType.Unknown = 1234;
226 NameInvalid = (BOOLEAN)-1;
227 Length = 1234;
228 StartSeh()
230 sizeof(FullPathNameBuffer),
231 FullPathNameBuffer,
232 &ShortName,
234 &PathType);
236 ok_eq_ustr(&FileName, &TempString);
237 Okay = CheckStringBuffer(FullPathNameBuffer, Length, sizeof(FullPathNameBuffer), ExpectedPathName);
238 ok(Okay, "Line %lu: Wrong path name '%S', expected '%S'\n", TestCases[i].Line, FullPathNameBuffer, ExpectedPathName);
239 switch (TestCases[i].FilePartPrefixType)
240 {
241 case PrefixNone:
242 ExpectedFilePartSize = 0;
243 break;
245 ExpectedFilePartSize = sizeof(L"C:\\");
246 break;
248 ExpectedFilePartSize = GetCurrentDirectoryW(0, NULL) * sizeof(WCHAR);
249 if (ExpectedFilePartSize == sizeof(L"C:\\"))
250 ExpectedFilePartSize -= sizeof(WCHAR);
251 break;
253 {
254 WCHAR CurrentPath[MAX_PATH];
256 ExpectedFilePartSize = GetCurrentDirectoryW(sizeof(CurrentPath) / sizeof(WCHAR), CurrentPath) * sizeof(WCHAR) + sizeof(UNICODE_NULL);
257 if (ExpectedFilePartSize == sizeof(L"C:\\"))
258 ExpectedFilePartSize = 0;
259 else
260 {
261 BackSlash = wcsrchr(CurrentPath, L'\\');
262 if (BackSlash)
263 ExpectedFilePartSize -= wcslen(BackSlash + 1) * sizeof(WCHAR);
264 else
265 ok(0, "Line %lu: GetCurrentDirectory returned %S\n", TestCases[i].Line, CurrentPath);
266 }
267 break;
268 }
269 default:
270 skip("Invalid test!\n");
271 continue;
272 }
273 ExpectedFilePartSize += TestCases[i].FilePartSize;
274 if (ExpectedFilePartSize == 0)
275 {
276 ExpectedShortName = NULL;
277 }
278 else
279 {
280 ExpectedFilePartSize = (ExpectedFilePartSize - sizeof(UNICODE_NULL)) / sizeof(WCHAR);
281 ExpectedShortName = FullPathNameBuffer + ExpectedFilePartSize;
282 }
283 ok(ShortName == ExpectedShortName,
284 "ShortName = %p, expected %p\n", ShortName, ExpectedShortName);
285 ok(NameInvalid == FALSE, "Line %lu: NameInvalid = %u\n", TestCases[i].Line, NameInvalid);
286 ok(PathType.Type == TestCases[i].PathType, "Line %lu: PathType = %d, expected %d\n", TestCases[i].Line, PathType.Type, TestCases[i].PathType);
287 ok(PathType.Unknown == 1234 ||
288 broken(PathType.Unknown == 0) ||
289 broken(PathType.Unknown == 32), "Line %lu: Unknown = %lu\n", TestCases[i].Line, PathType.Unknown);
290 }
291}
292
294{
297 UNICODE_STRING TempString;
300 BOOLEAN NameInvalidArray[sizeof(ULONGLONG)];
302 BOOLEAN Okay;
303
305 {
306 RtlGetFullPathName_Ustr = (PVOID)GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlGetFullPathName_Ustr");
308 {
309 skip("RtlGetFullPathName_Ustr unavailable\n");
310 return;
311 }
312 }
313
314 /* NULL parameters */
315 StartSeh()
318
320 TempString = FileName;
321 StartSeh()
324 ok_eq_ustr(&FileName, &TempString);
325
327 TempString = FileName;
328 StartSeh()
331 ok_eq_ustr(&FileName, &TempString);
332
334 PathType.Unknown = 1234;
335 StartSeh()
338 ok(PathType.Type == RtlPathTypeUnknown, "PathType = %d\n", PathType.Type);
339 ok(PathType.Unknown == 1234 ||
340 broken(PathType.Unknown == 0) /* Win7 */, "Unknown = %lu\n", PathType.Unknown);
341
342 /* check what else is initialized before it crashes */
344 PathType.Unknown = 1234;
346 NameInvalid = (BOOLEAN)-1;
347 StartSeh()
350 ok(NameInvalid == FALSE, "NameInvalid = %u\n", NameInvalid);
352 broken(ShortName == NULL) /* Win7 */, "ShortName = %p\n", ShortName);
353 ok(PathType.Type == RtlPathTypeUnknown, "PathType = %d\n", PathType.Type);
354 ok(PathType.Unknown == 1234 ||
355 broken(PathType.Unknown == 0) /* Win7 */, "Unknown = %lu\n", PathType.Unknown);
356
358 TempString = FileName;
360 NameInvalid = (BOOLEAN)-1;
361 StartSeh()
364 ok_eq_ustr(&FileName, &TempString);
366 broken(ShortName == NULL) /* Win7 */, "ShortName = %p\n", ShortName);
367 ok(NameInvalid == FALSE, "NameInvalid = %u\n", NameInvalid);
368
369 /* This is the first one that doesn't crash. FileName and PathType cannot be NULL */
371 TempString = FileName;
373 PathType.Unknown = 1234;
374 StartSeh()
376 ok(Length == 0, "Length = %lu\n", Length);
378 ok_eq_ustr(&FileName, &TempString);
379 ok(PathType.Type == RtlPathTypeUnknown, "PathType = %d\n", PathType.Type);
380 ok(PathType.Unknown == 1234 ||
381 broken(PathType.Unknown == 0) /* Win7 */, "Unknown = %lu\n", PathType.Unknown);
382
384 TempString = FileName;
386 PathType.Unknown = 1234;
387 StartSeh()
389 ok(Length == 0, "Length = %lu\n", Length);
391 ok_eq_ustr(&FileName, &TempString);
392 ok(PathType.Type == RtlPathTypeUnknown, "PathType = %d\n", PathType.Type);
393 ok(PathType.Unknown == 1234 ||
394 broken(PathType.Unknown == 0) /* Win7 */, "Unknown = %lu\n", PathType.Unknown);
395
396 /* Show that NameInvalid is indeed BOOLEAN */
398 TempString = FileName;
400 PathType.Unknown = 1234;
401 RtlFillMemory(NameInvalidArray, sizeof(NameInvalidArray), 0x55);
402 StartSeh()
403 Length = RtlGetFullPathName_Ustr(&FileName, 0, NULL, NULL, NameInvalidArray, &PathType);
404 ok(Length == 0, "Length = %lu\n", Length);
406 ok_eq_ustr(&FileName, &TempString);
407 ok(PathType.Type == RtlPathTypeUnknown, "PathType = %d\n", PathType.Type);
408 ok(PathType.Unknown == 1234 ||
409 broken(PathType.Unknown == 0) /* Win7 */, "Unknown = %lu\n", PathType.Unknown);
410 ok(NameInvalidArray[0] == FALSE, "NameInvalid = %u\n", NameInvalidArray[0]);
411 Okay = CheckBuffer(NameInvalidArray + 1, sizeof(NameInvalidArray) - sizeof(NameInvalidArray[0]), 0x55);
412 ok(Okay, "CheckBuffer failed\n");
413
414 /* Give it a valid path */
415 RtlInitUnicodeString(&FileName, L"C:\\test");
416 TempString = FileName;
418 PathType.Unknown = 1234;
419 StartSeh()
421 ok(Length == sizeof(L"C:\\test"), "Length = %lu\n", Length);
423 ok_eq_ustr(&FileName, &TempString);
424 ok(PathType.Type == RtlPathTypeDriveAbsolute, "PathType = %d\n", PathType.Type);
425 ok(PathType.Unknown == 1234 ||
426 broken(PathType.Unknown == 0) /* Win7 */, "Unknown = %lu\n", PathType.Unknown);
427
428 /* check the actual functionality with different paths */
429 RunTestCases();
430}
static TEST_CASE TestCases[]
Definition: CommandLine.c:101
BOOLEAN Expected
unsigned char BOOLEAN
IN PUNICODE_STRING IN PUNICODE_STRING IN PUNICODE_STRING IN PSIZE_T FilePartSize OUT PBOOLEAN NameInvalid
static IN ULONG IN PWSTR Buffer
@ PrefixCurrentDrive
@ PrefixCurrentPathWithoutLastPart
@ PrefixCurrentPath
static IN ULONG IN PWSTR OUT PCWSTR OUT PBOOLEAN OUT PATH_TYPE_AND_UNKNOWN * PathType
static IN ULONG IN PWSTR OUT PCWSTR * ShortName
static VOID RunTestCases(VOID)
#define ok_eq_ustr(str1, str2)
static BOOLEAN CheckStringBuffer(PCWSTR Buffer, SIZE_T Length, SIZE_T MaximumLength, PCWSTR Expected)
#define RtlPathTypeNotSet
#define broken(x)
struct _PATH_TYPE_AND_UNKNOWN PATH_TYPE_AND_UNKNOWN
static IN ULONG Size
static IN ULONG IN PWSTR OUT PCWSTR OUT PBOOLEAN InvalidName
static BOOLEAN CheckBuffer(PVOID Buffer, SIZE_T Size, UCHAR Value)
#define InvalidPointer
#define StartSeh()
Definition: _sntprintf.h:16
#define EndSeh(ExpectedStatus)
Definition: _sntprintf.h:17
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
Definition: bufpool.h:45
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetCurrentDirectoryW(x, y)
Definition: compat.h:756
#define wcsrchr
Definition: compat.h:16
#define GetProcAddress(x, y)
Definition: compat.h:753
#define MAX_PATH
Definition: compat.h:34
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
static const WCHAR BackSlash[]
Definition: devclass.c:29
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
struct _FileName FileName
Definition: fatprocs.h:896
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define RtlFillMemory(Dest, Length, Fill)
Definition: winternl.h:593
char * PBOOLEAN
Definition: retypes.h:11
void * PVOID
Definition: retypes.h:9
unsigned char * PUCHAR
Definition: retypes.h:3
unsigned int ULONG
Definition: retypes.h:1
@ RtlPathTypeRootLocalDevice
Definition: rtltypes.h:478
@ RtlPathTypeDriveRelative
Definition: rtltypes.h:474
@ RtlPathTypeRelative
Definition: rtltypes.h:476
@ RtlPathTypeUncAbsolute
Definition: rtltypes.h:472
@ RtlPathTypeRooted
Definition: rtltypes.h:475
@ RtlPathTypeLocalDevice
Definition: rtltypes.h:477
@ RtlPathTypeDriveAbsolute
Definition: rtltypes.h:473
@ RtlPathTypeUnknown
Definition: rtltypes.h:471
enum _RTL_PATH_TYPE RTL_PATH_TYPE
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define UNICODE_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
#define L(x)
Definition: ntvdm.h:50
#define BOOLEAN
Definition: pedump.c:73
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
ULONG NTAPI RtlGetFullPathName_Ustr(_In_ PUNICODE_STRING FileName, _In_ ULONG Size, _Out_z_bytecap_(Size) PWSTR Buffer, _Out_opt_ PCWSTR *ShortName, _Out_opt_ PBOOLEAN InvalidName, _Out_ RTL_PATH_TYPE *PathType)
Definition: path.c:734
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: ncftp.h:79
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
uint64_t ULONGLONG
Definition: typedefs.h:67
#define OUT
Definition: typedefs.h:40
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_In_ WDFDMATRANSACTION _In_ size_t MaximumLength
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180