2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for RtlNtPathNameToDosPathName
5 * PROGRAMMER: Mark Jansen
10 NTSTATUS (NTAPI
*pRtlNtPathNameToDosPathName
)(ULONG Flags
, PRTL_UNICODE_STRING_BUFFER Path
, PULONG Type
, PULONG Unknown4
);
12 #define ok_hex_(expression, result) \
14 int _value = (expression); \
15 winetest_ok(_value == (result), "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
16 #expression, (int)(result), _value); \
20 #define ok_ptr_(expression, result) \
22 void *_value = (expression); \
23 winetest_ok(_value == (result), "Wrong value for '%s', expected: " #result " (%p), got: %p\n", \
24 #expression, (void*)(result), _value); \
27 #define ok_wstr_(x, y) \
28 winetest_ok(wcscmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
43 static struct test_entry test_data
[] =
45 /* Originally from RtlGetFullPathName_*.c (edited) */
46 { L
"", L
"", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
47 { L
".\\test", L
".\\test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
48 { L
"/test", L
"/test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
49 { L
"??\\", L
"??\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
50 { L
"??\\C:", L
"??\\C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
51 { L
"??\\C:\\", L
"??\\C:\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
52 { L
"??\\C:\\test", L
"??\\C:\\test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
53 { L
"??\\C:\\test\\", L
"??\\C:\\test\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
54 { L
"C:", L
"C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
55 { L
"C:/test/", L
"C:/test/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
56 { L
"C:\\", L
"C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
57 { L
"C:\\", L
"C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
58 { L
"C:\\\\test", L
"C:\\\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
59 { L
"C:\\test", L
"C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
60 { L
"C:\\test", L
"C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
61 { L
"C:\\test", L
"C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
62 { L
"C:\\test\\", L
"C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
63 { L
"C:\\test\\", L
"C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
64 { L
"C:\\test\\", L
"C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
65 { L
"\\.", L
"\\.", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
66 { L
"\\.\\", L
"\\.\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
67 { L
"\\??\\", L
"", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
68 { L
"\\??\\C:", L
"C:", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
69 { L
"\\??\\C:\\", L
"C:\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
70 { L
"\\??\\C:\\test", L
"C:\\test", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
71 { L
"\\??\\C:\\test\\", L
"C:\\test\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
72 { L
"\\\\.", L
"\\\\.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
73 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
74 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
75 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
76 { L
"\\\\.\\Something\\", L
"\\\\.\\Something\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
77 { L
"\\\\.\\Something\\", L
"\\\\.\\Something\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
78 { L
"\\\\??\\", L
"\\\\??\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
79 { L
"\\\\??\\", L
"\\\\??\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
80 { L
"\\\\??\\C:", L
"\\\\??\\C:", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
81 { L
"\\\\??\\C:", L
"\\\\??\\C:", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
82 { L
"\\\\??\\C:\\", L
"\\\\??\\C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
83 { L
"\\\\??\\C:\\", L
"\\\\??\\C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
84 { L
"\\\\??\\C:\\test", L
"\\\\??\\C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
85 { L
"\\\\??\\C:\\test", L
"\\\\??\\C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
86 { L
"\\\\??\\C:\\test\\", L
"\\\\??\\C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
87 { L
"\\\\??\\C:\\test\\", L
"\\\\??\\C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
88 { L
"\\test", L
"\\test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
89 { L
"\\test", L
"\\test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
90 { L
"\\test", L
"\\test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
91 { L
"test", L
"test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
92 { L
"test", L
"test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
93 { L
"test", L
"test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
95 /* Originally from RtlDetermineDosPathNameType.c (edited) */
96 { L
"", L
"", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
97 { L
" ", L
" ", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
98 { L
"xyz", L
"xyz", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
99 { L
"CON", L
"CON", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
100 { L
"NUL", L
"NUL", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
101 { L
":", L
":", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
102 { L
"::", L
"::", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
103 { L
":::", L
":::", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
104 { L
"::::", L
"::::", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
105 { L
"::\\", L
"::\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
106 { L
"\\", L
"\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
107 { L
"\\:", L
"\\:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
108 { L
"\\C:", L
"\\C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
109 { L
"\\C:\\", L
"\\C:\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
110 { L
"/", L
"/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
111 { L
"/:", L
"/:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
112 { L
"/C:", L
"/C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
113 { L
"/C:/", L
"/C:/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
114 { L
"C", L
"C", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
115 { L
"C:", L
"C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
116 { L
"C:a", L
"C:a", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
117 { L
"C:a\\", L
"C:a\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
118 { L
"C:\\", L
"C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
119 { L
"C:/", L
"C:/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
120 { L
"C:\\a", L
"C:\\a", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
121 { L
"C:/a", L
"C:/a", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
122 { L
"C:\\\\", L
"C:\\\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
123 { L
"\\\\", L
"\\\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
124 { L
"\\\\\\", L
"\\\\\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
125 { L
"\\\\;", L
"\\\\;", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
126 { L
"\\\\f\\b\\", L
"\\\\f\\b\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
127 { L
"\\\\f\\b", L
"\\\\f\\b", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
128 { L
"\\\\f\\", L
"\\\\f\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
129 { L
"\\\\f", L
"\\\\f", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
130 { L
"\\??\\UNC", L
"UNC", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
131 { L
"\\??\\UNC\\", L
"\\\\", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
132 { L
"\\??\\UNC\\pth1\\pth2", L
"\\\\pth1\\pth2", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
133 { L
"\\??\\UNC\\path1", L
"\\\\path1", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
134 { L
"\\?", L
"\\?", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
135 { L
"\\?\\", L
"\\?\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
136 { L
"\\?\\UNC", L
"\\?\\UNC", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
137 { L
"\\?\\UNC\\", L
"\\?\\UNC\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
138 { L
"\\\\?\\UNC\\", L
"\\\\?\\UNC\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
139 { L
"\\??\\unc", L
"unc", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
140 { L
"\\??\\unc\\", L
"\\\\", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
141 { L
"\\??\\unc\\pth1\\pth2", L
"\\\\pth1\\pth2", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
142 { L
"\\??\\unc\\path1", L
"\\\\path1", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
143 { L
"\\?", L
"\\?", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
144 { L
"\\?\\", L
"\\?\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
145 { L
"\\?\\unc", L
"\\?\\unc", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
146 { L
"\\?\\unc\\", L
"\\?\\unc\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
147 { L
"\\\\?\\unc\\", L
"\\\\?\\unc\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
148 { L
"\\\\?", L
"\\\\?", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
149 { L
"\\\\??", L
"\\\\??", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
150 { L
"\\\\??\\", L
"\\\\??\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
151 { L
"\\\\??\\C:\\", L
"\\\\??\\C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
152 { L
"\\\\.", L
"\\\\.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
153 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
154 { L
"\\\\.\\C:\\", L
"\\\\.\\C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
155 { L
"\\/", L
"\\/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
156 { L
"/\\", L
"/\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
157 { L
"//", L
"//", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
158 { L
"///", L
"///", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
159 { L
"//;", L
"//;", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
160 { L
"//?", L
"//?", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
161 { L
"/\\?", L
"/\\?", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
162 { L
"\\/?", L
"\\/?", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
163 { L
"//??", L
"//??", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
164 { L
"//?" L
"?/", L
"//?" L
"?/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
165 { L
"//?" L
"?/C:/", L
"//?" L
"?/C:/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
166 { L
"//.", L
"//.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
167 { L
"\\/.", L
"\\/.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
168 { L
"/\\.", L
"/\\.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
169 { L
"//./", L
"//./", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
170 { L
"//./C:/", L
"//./C:/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
171 { L
"%SystemRoot%", L
"%SystemRoot%", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
174 /* Tests from RtlGetLengthWithoutTrailingPathSeperators.c */
175 { L
"", L
"", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
176 { L
"T", L
"T", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
177 { L
"Te", L
"Te", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
178 { L
"Tes", L
"Tes", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
179 { L
"Test", L
"Test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
181 /* Separators tests */
182 { L
"\\.", L
"\\.", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
183 { L
"\\.", L
"\\.", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
184 { L
"\\.\\", L
"\\.\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
185 { L
"\\.\\T", L
"\\.\\T", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
186 { L
"\\.\\Te", L
"\\.\\Te", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
187 { L
"\\.\\Tes", L
"\\.\\Tes", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
188 { L
"\\.\\Test", L
"\\.\\Test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
189 { L
"\\.\\Test\\", L
"\\.\\Test\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
190 { L
"\\.\\Test\\s", L
"\\.\\Test\\s", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
191 { L
"\\.\\T\\est", L
"\\.\\T\\est", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
192 { L
"\\.\\T\\e\\st", L
"\\.\\T\\e\\st", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
193 { L
"\\.\\T\\e\\s\\t", L
"\\.\\T\\e\\s\\t", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
194 { L
"\\.\\T\\e\\s\\t\\", L
"\\.\\T\\e\\s\\t\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
195 { L
"\\Tests\\String\\", L
"\\Tests\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
196 { L
"\\.\\Test\\String\\", L
"\\.\\Test\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
197 { L
"\\.\\Tests\\String\\", L
"\\.\\Tests\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
198 { L
"\\.\\Tests\\String\\s", L
"\\.\\Tests\\String\\s", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
200 /* Separator-only tests */
201 { L
"\\", L
"\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
202 { L
"/", L
"/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
204 /* Mixed separators tests */
205 { L
"/Test/String", L
"/Test/String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
206 { L
"\\Test/String", L
"\\Test/String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
207 { L
"/Test\\String", L
"/Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
208 { L
"\\Test/String", L
"\\Test/String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
209 { L
"/Test/String\\", L
"/Test/String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
210 { L
"\\Test/String\\", L
"\\Test/String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
211 { L
"/Test\\String\\", L
"/Test\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
212 { L
"\\Test/String\\", L
"\\Test/String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
213 { L
"/Test/String/", L
"/Test/String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
214 { L
"\\Test/String/", L
"\\Test/String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
215 { L
"/Test\\String/", L
"/Test\\String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
216 { L
"\\Test/String/", L
"\\Test/String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
217 { L
"\\Test/String/", L
"\\Test/String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
218 { L
"\\Test\\\\String/", L
"\\Test\\\\String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
220 /* Common path formats tests */
221 { L
"Test\\String", L
"Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
222 { L
"\\Test\\String", L
"\\Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
223 { L
".\\Test\\String", L
".\\Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
224 { L
"\\.\\Test\\String", L
"\\.\\Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
225 { L
"\\??\\Test\\String", L
"Test\\String", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
227 /* Redundant trailing tests */
228 { L
"\\??\\Test\\String\\", L
"Test\\String\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
229 { L
"\\??\\Test\\String\\\\",L
"Test\\String\\\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
230 { L
"\\??\\Test\\String\\\\\\\\\\", L
"Test\\String\\\\\\\\\\",RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
234 static void test_specialhandling()
236 RTL_UNICODE_STRING_BUFFER Buffer
;
237 const WCHAR TestString
[] = L
"\\??\\C:\\Test";
238 WCHAR StaticBuffer
[_countof(TestString
)];
242 /* Just initializing the ByteBuffer does not work */
243 memset(&Buffer
, 0, sizeof(Buffer
));
244 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
245 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
248 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
249 ok_hex(Type
, RTL_UNCHANGED_UNK_PATH
);
250 ok_ptr(Buffer
.String
.Buffer
, NULL
);
251 ok_int(Buffer
.String
.Length
, 0);
252 ok_int(Buffer
.String
.MaximumLength
, 0);
253 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
254 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
255 RtlFreeBuffer(&Buffer
.ByteBuffer
);
257 /* Different strings in the String and ByteBuffer part */
258 memset(&Buffer
, 0, sizeof(Buffer
));
259 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
260 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
263 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
265 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
266 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
267 ok_wstr(Buffer
.String
.Buffer
, L
"C:\\Test");
268 ok_int(Buffer
.String
.Length
, 14);
269 ok_int(Buffer
.String
.MaximumLength
, 24);
270 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
271 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
272 RtlFreeBuffer(&Buffer
.ByteBuffer
);
275 /* Different strings, Buffer.String is not prefixed with \??\ */
276 memset(&Buffer
, 0, sizeof(Buffer
));
277 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
278 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
281 RtlInitUnicodeString(&Buffer
.String
, L
"D:\\1234");
283 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
284 ok_hex(Type
, RTL_UNCHANGED_DOS_PATH
);
285 ok_wstr(Buffer
.String
.Buffer
, L
"D:\\1234");
286 ok_int(Buffer
.String
.Length
, 14);
287 ok_int(Buffer
.String
.MaximumLength
, 16);
288 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
289 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
290 RtlFreeBuffer(&Buffer
.ByteBuffer
);
293 /* Different strings, smaller ByteBuffer */
294 memset(&Buffer
, 0, sizeof(Buffer
));
295 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
296 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
299 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
300 Buffer
.ByteBuffer
.Size
-= 4 * sizeof(WCHAR
);
302 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
303 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
304 ok_wstr(Buffer
.String
.Buffer
, L
"C:\\Test");
305 ok_int(Buffer
.String
.Length
, 14);
306 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
307 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
- 4 * sizeof(WCHAR
));
308 RtlFreeBuffer(&Buffer
.ByteBuffer
);
311 /* These tests show that the size of the ByteBuffer should
312 at least equal the size of the string (minus 4, in case of \??\)!
313 The results are all over the place, and are most likely the result of implementation details.. */
316 /* Different strings, too small ByteBuffer
317 --> corrupt buffer, but none of the output params suggests so? */
318 memset(&Buffer
, 0, sizeof(Buffer
));
319 Buffer
.ByteBuffer
.Size
= wcslen(TestString
) * sizeof(WCHAR
) + sizeof(UNICODE_NULL
);
320 Buffer
.ByteBuffer
.Buffer
= Ptr
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Buffer
.ByteBuffer
.Size
);
321 memcpy(Buffer
.ByteBuffer
.Buffer
, TestString
, Buffer
.ByteBuffer
.Size
);
324 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
325 Buffer
.ByteBuffer
.Size
-= 5 * sizeof(WCHAR
);
327 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
328 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
329 //ok_wstr(Buffer.String.Buffer, L"C:\\");
330 ok_int(Buffer
.String
.Length
, 14);
331 ok_int(Buffer
.String
.MaximumLength
, 16);
332 //ok_ptr(Buffer.ByteBuffer.Buffer, Ptr); // An attempt is made at allocating a buffer, but the move fails because the size of ByteBuffer seems to be used??
333 ok_int(Buffer
.ByteBuffer
.Size
, 16);
335 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
.ByteBuffer
.Buffer
);
337 /* Different strings, too small ByteBuffer, different path separators
338 --> corrupt buffer, but none of the output params suggests so? */
339 memset(&Buffer
, 0, sizeof(Buffer
));
340 Buffer
.ByteBuffer
.Size
= wcslen(L
"\\??\\C://Test") * sizeof(WCHAR
) + sizeof(UNICODE_NULL
);
341 Buffer
.ByteBuffer
.Buffer
= Ptr
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Buffer
.ByteBuffer
.Size
);
342 memcpy(Buffer
.ByteBuffer
.Buffer
, L
"\\??\\C://Test", Buffer
.ByteBuffer
.Size
);
345 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
346 Buffer
.ByteBuffer
.Size
-= 5 * sizeof(WCHAR
);
348 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
349 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
350 //ok_wstr(Buffer.String.Buffer, L"C:\\");
351 ok_int(Buffer
.String
.Length
, 14);
352 ok_int(Buffer
.String
.MaximumLength
, 16);
353 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Ptr
);
354 ok_int(Buffer
.ByteBuffer
.Size
, 16);
356 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
.ByteBuffer
.Buffer
);
360 static void test_table(struct test_entry
* Entry
)
362 RTL_UNICODE_STRING_BUFFER Buffer
= { { 0 } };
363 WCHAR StaticBuffer
[MAX_PATH
];
364 ULONG Type
= 0x12345;
366 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
368 RtlInitUnicodeString(&Buffer
.String
, Entry
->InputPath
);
369 RtlEnsureBufferSize(RTL_SKIP_BUFFER_COPY
, &Buffer
.ByteBuffer
, Buffer
.String
.MaximumLength
);
370 memcpy(Buffer
.ByteBuffer
.Buffer
, Buffer
.String
.Buffer
, Buffer
.String
.MaximumLength
);
372 ok_hex_(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
374 ok_hex_(Type
, Entry
->Type
);
375 ok_wstr_(Buffer
.String
.Buffer
, Entry
->OutputPath
);
376 /* If there is no change in the path, the pointer is unchanged */
377 if (!wcscmp(Entry
->InputPath
, Entry
->OutputPath
))
379 ok_ptr_(Buffer
.String
.Buffer
, Entry
->InputPath
);
383 /* If there is a change in the path, the 'ByteBuffer' is used */
384 winetest_ok((PUCHAR
)Buffer
.String
.Buffer
>= Buffer
.ByteBuffer
.StaticBuffer
&&
385 (PUCHAR
)Buffer
.String
.Buffer
<= (Buffer
.ByteBuffer
.StaticBuffer
+ Buffer
.ByteBuffer
.StaticSize
),
386 "Expected Buffer to point inside StaticBuffer\n");
388 ok_wstr_((const WCHAR
*)Buffer
.ByteBuffer
.Buffer
, Entry
->OutputPath
);
390 ok_hex_(Buffer
.MinimumStaticBufferForTerminalNul
, 0);
392 /* For none of our tests should we exceed the StaticBuffer size! */
393 ok_ptr_(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
394 ok_hex_(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
396 ok_hex_(Buffer
.ByteBuffer
.ReservedForAllocatedSize
, 0);
397 ok_ptr_(Buffer
.ByteBuffer
.ReservedForIMalloc
, NULL
);
399 RtlFreeBuffer(&Buffer
.ByteBuffer
);
403 START_TEST(RtlNtPathNameToDosPathName
)
405 RTL_UNICODE_STRING_BUFFER Buffer
= { { 0 } };
409 HMODULE ntdll
= GetModuleHandleW(L
"ntdll.dll");
410 pRtlNtPathNameToDosPathName
= (void *)GetProcAddress(ntdll
, "RtlNtPathNameToDosPathName");
412 if (!pRtlNtPathNameToDosPathName
)
414 skip("RtlNtPathNameToDosPathName not found?\n");
418 ok_ntstatus(pRtlNtPathNameToDosPathName(0, NULL
, NULL
, NULL
), STATUS_INVALID_PARAMETER
);
419 ok_ntstatus(pRtlNtPathNameToDosPathName(0, &Buffer
, NULL
, NULL
), STATUS_SUCCESS
);
420 ok_ntstatus(pRtlNtPathNameToDosPathName(1, &Buffer
, NULL
, NULL
), STATUS_INVALID_PARAMETER
);
423 ok_ntstatus(pRtlNtPathNameToDosPathName(0, NULL
, &Type
, NULL
), STATUS_INVALID_PARAMETER
);
426 ok_ntstatus(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
427 ok_int(Type
, RTL_UNCHANGED_UNK_PATH
);
429 ok_ntstatus(pRtlNtPathNameToDosPathName(1, &Buffer
, &Type
, NULL
), STATUS_INVALID_PARAMETER
);
432 test_specialhandling();
434 for (n
= 0; n
< _countof(test_data
); ++n
)
436 winetest_set_location(test_data
[n
].File
, test_data
[n
].Line
);
437 test_table(test_data
+ n
);