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 #define WIN32_NO_STATUS
11 #include <ndk/rtlfuncs.h>
13 NTSTATUS (NTAPI
*pRtlNtPathNameToDosPathName
)(ULONG Flags
, RTL_UNICODE_STRING_BUFFER
* Path
, ULONG
* Type
, ULONG
* Unknown4
);
15 #define ok_hex_(expression, result) \
17 int _value = (expression); \
18 winetest_ok(_value == (result), "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
19 #expression, (int)(result), _value); \
23 #define ok_ptr_(expression, result) \
25 void *_value = (expression); \
26 winetest_ok(_value == (result), "Wrong value for '%s', expected: " #result " (%p), got: %p\n", \
27 #expression, (void*)(result), _value); \
30 #define ok_wstr_(x, y) \
31 winetest_ok(wcscmp(x, y) == 0, "Wrong string. Expected '%S', got '%S'\n", y, x)
46 static struct test_entry test_data
[] =
48 /* Originally from RtlGetFullPathName_*.c (edited) */
49 { L
"", L
"", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
50 { L
".\\test", L
".\\test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
51 { L
"/test", L
"/test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
52 { L
"??\\", L
"??\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
53 { L
"??\\C:", L
"??\\C:", 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_UNK_PATH
, __FILE__
, __LINE__
},
56 { L
"??\\C:\\test\\", L
"??\\C:\\test\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
57 { L
"C:", L
"C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
58 { L
"C:/test/", L
"C:/test/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
59 { L
"C:\\", L
"C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
60 { L
"C:\\", L
"C:\\", 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
"C:\\test\\", L
"C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
66 { L
"C:\\test\\", L
"C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
67 { L
"C:\\test\\", L
"C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
68 { L
"\\.", L
"\\.", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
69 { L
"\\.\\", L
"\\.\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
70 { L
"\\??\\", L
"", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
71 { L
"\\??\\C:", L
"C:", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
72 { L
"\\??\\C:\\", L
"C:\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
73 { L
"\\??\\C:\\test", L
"C:\\test", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
74 { L
"\\??\\C:\\test\\", L
"C:\\test\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
75 { L
"\\\\.", L
"\\\\.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
76 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
77 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
78 { L
"\\\\.\\", L
"\\\\.\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
79 { L
"\\\\.\\Something\\", L
"\\\\.\\Something\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
80 { L
"\\\\.\\Something\\", L
"\\\\.\\Something\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
81 { L
"\\\\??\\", L
"\\\\??\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
82 { L
"\\\\??\\", L
"\\\\??\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
83 { L
"\\\\??\\C:", L
"\\\\??\\C:", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
84 { L
"\\\\??\\C:", L
"\\\\??\\C:", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
85 { L
"\\\\??\\C:\\", L
"\\\\??\\C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
86 { L
"\\\\??\\C:\\", L
"\\\\??\\C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
87 { L
"\\\\??\\C:\\test", L
"\\\\??\\C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
88 { L
"\\\\??\\C:\\test", L
"\\\\??\\C:\\test", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
89 { L
"\\\\??\\C:\\test\\", L
"\\\\??\\C:\\test\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
90 { L
"\\\\??\\C:\\test\\", L
"\\\\??\\C:\\test\\", RTL_UNCHANGED_DOS_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__
},
94 { L
"test", L
"test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
95 { L
"test", L
"test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
96 { L
"test", L
"test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
98 /* Originally from RtlDetermineDosPathNameType.c (edited) */
99 { L
"", L
"", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
100 { L
" ", L
" ", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
101 { L
"xyz", L
"xyz", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
102 { L
"CON", L
"CON", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
103 { L
"NUL", L
"NUL", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
104 { L
":", L
":", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
105 { L
"::", L
"::", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
106 { L
":::", L
":::", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
107 { L
"::::", L
"::::", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
108 { L
"::\\", L
"::\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
109 { L
"\\", L
"\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
110 { L
"\\:", L
"\\:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
111 { L
"\\C:", L
"\\C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
112 { L
"\\C:\\", L
"\\C:\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
113 { L
"/", L
"/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
114 { L
"/:", L
"/:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
115 { L
"/C:", L
"/C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
116 { L
"/C:/", L
"/C:/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
117 { L
"C", L
"C", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
118 { L
"C:", L
"C:", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
119 { L
"C:a", L
"C:a", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
120 { L
"C:a\\", L
"C:a\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
121 { L
"C:\\", L
"C:\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
122 { L
"C:/", L
"C:/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
123 { L
"C:\\a", L
"C:\\a", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
124 { L
"C:/a", L
"C:/a", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
125 { L
"C:\\\\", L
"C:\\\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
126 { L
"\\\\", L
"\\\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
127 { L
"\\\\\\", L
"\\\\\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
128 { L
"\\\\;", L
"\\\\;", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
129 { L
"\\\\f\\b\\", L
"\\\\f\\b\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
130 { L
"\\\\f\\b", L
"\\\\f\\b", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
131 { L
"\\\\f\\", L
"\\\\f\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
132 { L
"\\\\f", L
"\\\\f", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
133 { L
"\\??\\UNC", L
"UNC", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
134 { L
"\\??\\UNC\\", L
"\\\\", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
135 { L
"\\??\\UNC\\pth1\\pth2", L
"\\\\pth1\\pth2", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
136 { L
"\\??\\UNC\\path1", L
"\\\\path1", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
137 { L
"\\?", L
"\\?", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
138 { L
"\\?\\", L
"\\?\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
139 { L
"\\?\\UNC", L
"\\?\\UNC", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
140 { L
"\\?\\UNC\\", L
"\\?\\UNC\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
141 { L
"\\\\?\\UNC\\", L
"\\\\?\\UNC\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
142 { L
"\\??\\unc", L
"unc", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
143 { L
"\\??\\unc\\", L
"\\\\", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
144 { L
"\\??\\unc\\pth1\\pth2", L
"\\\\pth1\\pth2", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
145 { L
"\\??\\unc\\path1", L
"\\\\path1", RTL_CONVERTED_UNC_PATH
, __FILE__
, __LINE__
},
146 { L
"\\?", L
"\\?", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
147 { L
"\\?\\", L
"\\?\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
148 { L
"\\?\\unc", L
"\\?\\unc", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
149 { L
"\\?\\unc\\", L
"\\?\\unc\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
150 { L
"\\\\?\\unc\\", L
"\\\\?\\unc\\", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
151 { L
"\\\\?", L
"\\\\?", 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
"\\\\.\\C:\\", L
"\\\\.\\C:\\", 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
"/\\?", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
165 { L
"\\/?", L
"\\/?", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
166 { L
"//??", L
"//??", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
167 { L
"//?" L
"?/", L
"//?" L
"?/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
168 { L
"//?" L
"?/C:/", L
"//?" L
"?/C:/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
169 { L
"//.", L
"//.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
170 { L
"\\/.", L
"\\/.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
171 { L
"/\\.", L
"/\\.", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
172 { L
"//./", L
"//./", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
173 { L
"//./C:/", L
"//./C:/", RTL_UNCHANGED_DOS_PATH
, __FILE__
, __LINE__
},
174 { L
"%SystemRoot%", L
"%SystemRoot%", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
177 /* Tests from RtlGetLengthWithoutTrailingPathSeperators.c */
178 { L
"", L
"", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
179 { L
"T", L
"T", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
180 { L
"Te", L
"Te", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
181 { L
"Tes", L
"Tes", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
182 { L
"Test", L
"Test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
184 /* Separators tests */
185 { L
"\\.", L
"\\.", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
186 { L
"\\.", L
"\\.", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
187 { L
"\\.\\", L
"\\.\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
188 { L
"\\.\\T", L
"\\.\\T", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
189 { L
"\\.\\Te", L
"\\.\\Te", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
190 { L
"\\.\\Tes", L
"\\.\\Tes", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
191 { L
"\\.\\Test", L
"\\.\\Test", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
192 { L
"\\.\\Test\\", L
"\\.\\Test\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
193 { L
"\\.\\Test\\s", L
"\\.\\Test\\s", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
194 { L
"\\.\\T\\est", L
"\\.\\T\\est", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
195 { L
"\\.\\T\\e\\st", L
"\\.\\T\\e\\st", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
196 { L
"\\.\\T\\e\\s\\t", L
"\\.\\T\\e\\s\\t", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
197 { L
"\\.\\T\\e\\s\\t\\", L
"\\.\\T\\e\\s\\t\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
198 { L
"\\Tests\\String\\", L
"\\Tests\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
199 { L
"\\.\\Test\\String\\", L
"\\.\\Test\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
200 { L
"\\.\\Tests\\String\\", L
"\\.\\Tests\\String\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
201 { L
"\\.\\Tests\\String\\s", L
"\\.\\Tests\\String\\s", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
203 /* Separator-only tests */
204 { L
"\\", L
"\\", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
205 { L
"/", L
"/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
207 /* Mixed separators tests */
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__
},
219 { L
"\\Test/String/", L
"\\Test/String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
220 { L
"\\Test/String/", L
"\\Test/String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
221 { L
"\\Test\\\\String/", L
"\\Test\\\\String/", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
223 /* Common path formats tests */
224 { L
"Test\\String", L
"Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
225 { L
"\\Test\\String", L
"\\Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
226 { L
".\\Test\\String", L
".\\Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
227 { L
"\\.\\Test\\String", L
"\\.\\Test\\String", RTL_UNCHANGED_UNK_PATH
, __FILE__
, __LINE__
},
228 { L
"\\??\\Test\\String", L
"Test\\String", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
230 /* Redundant trailing tests */
231 { L
"\\??\\Test\\String\\", L
"Test\\String\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
232 { L
"\\??\\Test\\String\\\\",L
"Test\\String\\\\", RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
233 { L
"\\??\\Test\\String\\\\\\\\\\", L
"Test\\String\\\\\\\\\\",RTL_CONVERTED_NT_PATH
, __FILE__
, __LINE__
},
237 static void test_specialhandling()
239 RTL_UNICODE_STRING_BUFFER Buffer
;
240 const WCHAR TestString
[] = L
"\\??\\C:\\Test";
241 WCHAR StaticBuffer
[_countof(TestString
)];
245 /* Just initializing the ByteBuffer does not work */
246 memset(&Buffer
, 0, sizeof(Buffer
));
247 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
248 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
251 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
252 ok_hex(Type
, RTL_UNCHANGED_UNK_PATH
);
253 ok_ptr(Buffer
.String
.Buffer
, NULL
);
254 ok_int(Buffer
.String
.Length
, 0);
255 ok_int(Buffer
.String
.MaximumLength
, 0);
256 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
257 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
258 RtlFreeBuffer(&Buffer
.ByteBuffer
);
260 /* Different strings in the String and ByteBuffer part */
261 memset(&Buffer
, 0, sizeof(Buffer
));
262 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
263 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
266 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
268 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
269 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
270 ok_wstr(Buffer
.String
.Buffer
, L
"C:\\Test");
271 ok_int(Buffer
.String
.Length
, 14);
272 ok_int(Buffer
.String
.MaximumLength
, 24);
273 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
274 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
275 RtlFreeBuffer(&Buffer
.ByteBuffer
);
278 /* Different strings, Buffer.String is not prefixed with \??\ */
279 memset(&Buffer
, 0, sizeof(Buffer
));
280 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
281 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
284 RtlInitUnicodeString(&Buffer
.String
, L
"D:\\1234");
286 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
287 ok_hex(Type
, RTL_UNCHANGED_DOS_PATH
);
288 ok_wstr(Buffer
.String
.Buffer
, L
"D:\\1234");
289 ok_int(Buffer
.String
.Length
, 14);
290 ok_int(Buffer
.String
.MaximumLength
, 16);
291 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
292 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
293 RtlFreeBuffer(&Buffer
.ByteBuffer
);
296 /* Different strings, smaller ByteBuffer */
297 memset(&Buffer
, 0, sizeof(Buffer
));
298 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
299 memcpy(StaticBuffer
, TestString
, sizeof(TestString
));
302 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
303 Buffer
.ByteBuffer
.Size
-= 4 * sizeof(WCHAR
);
305 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
306 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
307 ok_wstr(Buffer
.String
.Buffer
, L
"C:\\Test");
308 ok_int(Buffer
.String
.Length
, 14);
309 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
310 ok_int(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
- 4 * sizeof(WCHAR
));
311 RtlFreeBuffer(&Buffer
.ByteBuffer
);
314 /* These tests show that the size of the ByteBuffer should
315 at least equal the size of the string (minus 4, in case of \??\)!
316 The results are all over the place, and are most likely the result of implementation details.. */
319 /* Different strings, too small ByteBuffer
320 --> corrupt buffer, but none of the output params suggests so? */
321 memset(&Buffer
, 0, sizeof(Buffer
));
322 Buffer
.ByteBuffer
.Size
= wcslen(TestString
) * sizeof(WCHAR
) + sizeof(UNICODE_NULL
);
323 Buffer
.ByteBuffer
.Buffer
= Ptr
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Buffer
.ByteBuffer
.Size
);
324 memcpy(Buffer
.ByteBuffer
.Buffer
, TestString
, Buffer
.ByteBuffer
.Size
);
327 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
328 Buffer
.ByteBuffer
.Size
-= 5 * sizeof(WCHAR
);
330 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
331 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
332 //ok_wstr(Buffer.String.Buffer, L"C:\\");
333 ok_int(Buffer
.String
.Length
, 14);
334 ok_int(Buffer
.String
.MaximumLength
, 16);
335 //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??
336 ok_int(Buffer
.ByteBuffer
.Size
, 16);
338 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
.ByteBuffer
.Buffer
);
340 /* Different strings, too small ByteBuffer, different path separators
341 --> corrupt buffer, but none of the output params suggests so? */
342 memset(&Buffer
, 0, sizeof(Buffer
));
343 Buffer
.ByteBuffer
.Size
= wcslen(L
"\\??\\C://Test") * sizeof(WCHAR
) + sizeof(UNICODE_NULL
);
344 Buffer
.ByteBuffer
.Buffer
= Ptr
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, Buffer
.ByteBuffer
.Size
);
345 memcpy(Buffer
.ByteBuffer
.Buffer
, L
"\\??\\C://Test", Buffer
.ByteBuffer
.Size
);
348 RtlInitUnicodeString(&Buffer
.String
, L
"\\??\\D:\\1234");
349 Buffer
.ByteBuffer
.Size
-= 5 * sizeof(WCHAR
);
351 ok_hex(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
352 ok_hex(Type
, RTL_CONVERTED_NT_PATH
);
353 //ok_wstr(Buffer.String.Buffer, L"C:\\");
354 ok_int(Buffer
.String
.Length
, 14);
355 ok_int(Buffer
.String
.MaximumLength
, 16);
356 ok_ptr(Buffer
.ByteBuffer
.Buffer
, Ptr
);
357 ok_int(Buffer
.ByteBuffer
.Size
, 16);
359 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer
.ByteBuffer
.Buffer
);
363 static void test_table(struct test_entry
* Entry
)
365 RTL_UNICODE_STRING_BUFFER Buffer
= { { 0 } };
366 WCHAR StaticBuffer
[MAX_PATH
];
367 ULONG Type
= 0x12345;
369 RtlInitBuffer(&Buffer
.ByteBuffer
, (PUCHAR
)StaticBuffer
, sizeof(StaticBuffer
));
371 RtlInitUnicodeString(&Buffer
.String
, Entry
->InputPath
);
372 RtlEnsureBufferSize(RTL_SKIP_BUFFER_COPY
, &Buffer
.ByteBuffer
, Buffer
.String
.MaximumLength
);
373 memcpy(Buffer
.ByteBuffer
.Buffer
, Buffer
.String
.Buffer
, Buffer
.String
.MaximumLength
);
375 ok_hex_(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
377 ok_hex_(Type
, Entry
->Type
);
378 ok_wstr_(Buffer
.String
.Buffer
, Entry
->OutputPath
);
379 /* If there is no change in the path, the pointer is unchanged */
380 if (!wcscmp(Entry
->InputPath
, Entry
->OutputPath
))
382 ok_ptr_(Buffer
.String
.Buffer
, Entry
->InputPath
);
386 /* If there is a change in the path, the 'ByteBuffer' is used */
387 winetest_ok((PUCHAR
)Buffer
.String
.Buffer
>= Buffer
.ByteBuffer
.StaticBuffer
&&
388 (PUCHAR
)Buffer
.String
.Buffer
<= (Buffer
.ByteBuffer
.StaticBuffer
+ Buffer
.ByteBuffer
.StaticSize
),
389 "Expected Buffer to point inside StaticBuffer\n");
391 ok_wstr_((const WCHAR
*)Buffer
.ByteBuffer
.Buffer
, Entry
->OutputPath
);
393 ok_hex_(Buffer
.MinimumStaticBufferForTerminalNul
, 0);
395 /* For none of our tests should we exceed the StaticBuffer size! */
396 ok_ptr_(Buffer
.ByteBuffer
.Buffer
, Buffer
.ByteBuffer
.StaticBuffer
);
397 ok_hex_(Buffer
.ByteBuffer
.Size
, Buffer
.ByteBuffer
.StaticSize
);
399 ok_hex_(Buffer
.ByteBuffer
.ReservedForAllocatedSize
, 0);
400 ok_ptr_(Buffer
.ByteBuffer
.ReservedForIMalloc
, NULL
);
402 RtlFreeBuffer(&Buffer
.ByteBuffer
);
406 START_TEST(RtlNtPathNameToDosPathName
)
408 RTL_UNICODE_STRING_BUFFER Buffer
= { { 0 } };
412 HMODULE ntdll
= GetModuleHandleW(L
"ntdll.dll");
413 pRtlNtPathNameToDosPathName
= (void *)GetProcAddress(ntdll
, "RtlNtPathNameToDosPathName");
415 if (!pRtlNtPathNameToDosPathName
)
417 skip("RtlNtPathNameToDosPathName not found?\n");
421 ok_ntstatus(pRtlNtPathNameToDosPathName(0, NULL
, NULL
, NULL
), STATUS_INVALID_PARAMETER
);
422 ok_ntstatus(pRtlNtPathNameToDosPathName(0, &Buffer
, NULL
, NULL
), STATUS_SUCCESS
);
423 ok_ntstatus(pRtlNtPathNameToDosPathName(1, &Buffer
, NULL
, NULL
), STATUS_INVALID_PARAMETER
);
426 ok_ntstatus(pRtlNtPathNameToDosPathName(0, NULL
, &Type
, NULL
), STATUS_INVALID_PARAMETER
);
429 ok_ntstatus(pRtlNtPathNameToDosPathName(0, &Buffer
, &Type
, NULL
), STATUS_SUCCESS
);
430 ok_int(Type
, RTL_UNCHANGED_UNK_PATH
);
432 ok_ntstatus(pRtlNtPathNameToDosPathName(1, &Buffer
, &Type
, NULL
), STATUS_INVALID_PARAMETER
);
435 test_specialhandling();
437 for (n
= 0; n
< _countof(test_data
); ++n
)
439 winetest_set_location(test_data
[n
].File
, test_data
[n
].Line
);
440 test_table(test_data
+ n
);