[APITESTS] Use StringCbPrintfA instead of sprintf
[reactos.git] / modules / rostests / apitests / kernel32 / dosdev.c
1 /*
2 * Unit test suite for virtual substituted drive functions.
3 *
4 * Copyright 2011 Sam Arun Raj
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 #include "precomp.h"
22
23 #define SUBST_DRIVE_LETTER 'M'
24 #define SUBST_DRIVE "M:"
25 #define SUBST_DRIVE_NON_EXIST_DIR "M:\\deadbeef"
26 #define SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR "M:\\"
27 #define SUBST_DRIVE_SEARCH "M:\\*"
28 #define SUBST_DRIVE_LOWERCASE "m:"
29 #define SUBST_DRIVE_LOWERCASE_SEARCH "m:\\*"
30 #define SUBST_DRIVE2_LETTER 'R'
31 #define SUBST_DRIVE2 "R:"
32 #define SUBST_DRIVE2_WITH_TRAILING_PATH_SEPERATOR "R:\\"
33 #define SUBST_DRIVE2_SEARCH "R:\\*"
34
35 static void test_DefineDosDeviceA(void)
36 {
37 CHAR Buffer[MAX_PATH], Target[MAX_PATH];
38 BOOL Result;
39 UINT CharCount;
40 HANDLE hnd;
41 WIN32_FIND_DATAA Data;
42 UINT SystemDriveType, DriveType1, DriveType2;
43 DWORD dwMaskPrev, dwMaskCur;
44 CHAR c;
45
46 /* Choose the symbolic link target */
47 CharCount = GetSystemWindowsDirectoryA(Target, MAX_PATH);
48 ok(CharCount > 0, "Failed to get windows directory\n");
49 c = Target[3];
50 Target[3] = '\0';
51 SystemDriveType = GetDriveTypeA(Target);
52 Target[3] = c;
53
54 /* Test with a subst drive pointing to another substed drive */
55 dwMaskPrev = GetLogicalDrives();
56 Result = DefineDosDeviceA(0, SUBST_DRIVE, Target);
57 ok(Result, "Failed to subst drive\n");
58 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
59 Result = DefineDosDeviceA(0, SUBST_DRIVE2, SUBST_DRIVE);
60 ok(Result, "Failed to subst drive\n");
61 DriveType2 = GetDriveTypeA(SUBST_DRIVE2_WITH_TRAILING_PATH_SEPERATOR);
62 dwMaskCur = GetLogicalDrives();
63 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
64 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
65 ok((dwMaskCur & (1 << (SUBST_DRIVE2_LETTER - 'A'))), "Drive bit is not set\n");
66 hnd = FindFirstFileA(SUBST_DRIVE2_SEARCH, &Data);
67 ok(hnd != INVALID_HANDLE_VALUE, "Failed to open subst drive\n");
68 if (hnd) FindClose(hnd);
69 ok(DriveType1 == DriveType2, "subst drive types don't match\n");
70 ok(DriveType1 == SystemDriveType, "subst drive types don't match\n");
71 ok(DriveType2 == SystemDriveType, "subst drive types don't match\n");
72 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, Target);
73 ok(Result, "Failed to remove subst drive using NULL Target name\n");
74 hnd = FindFirstFileA(SUBST_DRIVE2_SEARCH, &Data);
75 ok(hnd == INVALID_HANDLE_VALUE, "Opened subst drive when it should fail, we removed the target\n");
76 if (hnd) FindClose(hnd);
77 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE2, SUBST_DRIVE);
78 ok(Result, "Failed to remove subst drive using NULL Target name\n");
79 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
80 ok(!Result, "Subst drive is present even after remove attempt\n");
81 Result = QueryDosDeviceA(SUBST_DRIVE2, Buffer, MAX_PATH);
82 ok(!Result, "Subst drive is present even after remove attempt\n");
83 dwMaskCur = GetLogicalDrives();
84 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
85
86 /* Test using lowercase drive letter */
87 dwMaskPrev = GetLogicalDrives();
88 Result = DefineDosDeviceA(0, SUBST_DRIVE_LOWERCASE, Target);
89 ok(Result, "Failed to subst drive using lowercase drive letter\n");
90 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
91 ok(DriveType1 == SystemDriveType, "subst drive types don't match\n");
92 dwMaskCur = GetLogicalDrives();
93 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
94 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
95 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
96 ok(hnd != INVALID_HANDLE_VALUE, "Failed to open subst drive\n");
97 if (hnd) FindClose(hnd);
98 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE_LOWERCASE, Target);
99 ok(Result, "Failed to remove subst drive using lowercase drive letter\n");
100 Result = QueryDosDeviceA(SUBST_DRIVE_LOWERCASE, Buffer, MAX_PATH);
101 ok(!Result, "Subst drive is present even after remove attempt\n");
102 dwMaskCur = GetLogicalDrives();
103 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
104
105 /* Test remove without using DDD_EXACT_MATCH_ON_REMOVE */
106 dwMaskPrev = GetLogicalDrives();
107 Result = DefineDosDeviceA(0, SUBST_DRIVE, Target);
108 ok(Result, "Failed to subst drive\n");
109 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
110 ok(DriveType1 == SystemDriveType, "subst drive types don't match\n");
111 dwMaskCur = GetLogicalDrives();
112 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
113 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
114 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
115 ok(hnd != INVALID_HANDLE_VALUE, "Failed to open subst drive\n");
116 if (hnd) FindClose(hnd);
117 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION, SUBST_DRIVE, NULL);
118 ok(Result, "Failed to remove subst drive using NULL Target name\n");
119 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
120 ok(!Result, "Subst drive is present even after remove attempt\n");
121 dwMaskCur = GetLogicalDrives();
122 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
123
124 /* Test multiple adds and multiple removes in add order */
125 dwMaskPrev = GetLogicalDrives();
126 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp1");
127 ok(Result, "Failed to subst drive\n");
128 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp2");
129 ok(Result, "Failed to subst drive\n");
130 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp3");
131 ok(Result, "Failed to subst drive\n");
132 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
133 ok(DriveType1 != SystemDriveType, "subst drive types match when it shouldn't\n");
134 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_FILE_NOT_FOUND), GetLastError());
135 dwMaskCur = GetLogicalDrives();
136 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
137 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
138 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp1");
139 ok(Result, "Failed to remove subst drive\n");
140 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
141 ok(Result, "Failed to query subst drive\n");
142 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target\n");
143 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp2");
144 ok(Result, "Failed to remove subst drive\n");
145 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
146 ok(Result, "Failed to query subst drive\n");
147 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp3") == 0), "Subst drive is not pointing to correct target\n");
148 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp3");
149 ok(Result, "Failed to remove subst drive\n");
150 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
151 ok(!Result, "Subst drive is present even after remove attempt\n");
152 dwMaskCur = GetLogicalDrives();
153 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
154
155 /* Test multiple adds and multiple removes in reverse order */
156 dwMaskPrev = GetLogicalDrives();
157 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp1");
158 ok(Result, "Failed to subst drive\n");
159 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp2");
160 ok(Result, "Failed to subst drive\n");
161 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp3");
162 ok(Result, "Failed to subst drive\n");
163 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
164 ok(DriveType1 != SystemDriveType, "subst drive types match when it shouldn't\n");
165 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_FILE_NOT_FOUND), GetLastError());
166 dwMaskCur = GetLogicalDrives();
167 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
168 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
169 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp3");
170 ok(Result, "Failed to remove subst drive\n");
171 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
172 ok(Result, "Failed to query subst drive\n");
173 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp2") == 0), "Subst drive is not pointing to correct target\n");
174 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp2");
175 ok(Result, "Failed to remove subst drive\n");
176 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
177 ok(Result, "Failed to query subst drive\n");
178 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp1") == 0), "Subst drive is not pointing to correct target\n");
179 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp1");
180 ok(Result, "Failed to remove subst drive\n");
181 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
182 ok(!Result, "Subst drive is present even after remove attempt\n");
183 dwMaskCur = GetLogicalDrives();
184 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
185
186 /* Test multiple adds and multiple removes out of order */
187 dwMaskPrev = GetLogicalDrives();
188 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp1");
189 ok(Result, "Failed to subst drive\n");
190 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp2");
191 ok(Result, "Failed to subst drive\n");
192 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp3");
193 ok(Result, "Failed to subst drive\n");
194 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp4");
195 ok(Result, "Failed to subst drive\n");
196 Result = DefineDosDeviceA(0, SUBST_DRIVE, "C:\\temp5");
197 ok(Result, "Failed to subst drive\n");
198 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
199 ok(DriveType1 != SystemDriveType, "subst drive types match when it shouldn't\n");
200 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_FILE_NOT_FOUND), GetLastError());
201 dwMaskCur = GetLogicalDrives();
202 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
203 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
204 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp2");
205 ok(Result, "Failed to remove subst drive\n");
206 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
207 ok(Result, "Failed to query subst drive\n");
208 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp5") == 0), "Subst drive is not pointing to correct target\n");
209 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp5");
210 ok(Result, "Failed to remove subst drive\n");
211 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
212 ok(Result, "Failed to query subst drive\n");
213 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target\n");
214 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp1");
215 ok(Result, "Failed to remove subst drive\n");
216 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
217 ok(Result, "Failed to query subst drive\n");
218 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target\n");
219 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp3");
220 ok(Result, "Failed to remove subst drive\n");
221 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
222 ok(Result, "Failed to query subst drive\n");
223 if (Result) ok((_stricmp(Buffer, "\\??\\C:\\temp4") == 0), "Subst drive is not pointing to correct target");
224 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, "C:\\temp4");
225 ok(Result, "Failed to remove subst drive\n");
226 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
227 ok(!Result, "Subst drive is present even after remove attempt\n");
228 dwMaskCur = GetLogicalDrives();
229 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
230
231 /* Test with trailing '\' appended to TargetPath */
232 dwMaskPrev = GetLogicalDrives();
233 snprintf(Buffer, sizeof(Buffer), "%s\\\\\\", Target);
234 Result = DefineDosDeviceA(0, SUBST_DRIVE, Buffer);
235 ok(Result, "Failed to subst drive\n");
236 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
237 ok(DriveType1 == SystemDriveType, "subst drive types don't match\n");
238 dwMaskCur = GetLogicalDrives();
239 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
240 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
241 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
242 ok(hnd != INVALID_HANDLE_VALUE, "Failed to open subst drive\n");
243 if (hnd) FindClose(hnd);
244 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, Buffer);
245 ok(Result, "Failed to remove subst drive using NULL Target name\n");
246 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
247 ok(!Result, "Subst drive is present even after remove attempt\n");
248 dwMaskCur = GetLogicalDrives();
249 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
250
251 /* Test with trailing '\' appended to TargetPath and DDD_RAW_TARGET_PATH flag */
252 dwMaskPrev = GetLogicalDrives();
253 snprintf(Buffer, sizeof(Buffer), "\\??\\%s\\\\\\", Target);
254 Result = DefineDosDeviceA(DDD_RAW_TARGET_PATH, SUBST_DRIVE, Buffer);
255 ok(Result, "Failed to subst drive\n");
256 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
257 ok(DriveType1 != SystemDriveType, "subst drive types match when they shouldn't\n");
258 dwMaskCur = GetLogicalDrives();
259 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
260 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
261 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
262 ok(hnd == INVALID_HANDLE_VALUE, "Opened subst drive when it should fail\n");
263 ok(GetLastError() == ERROR_INVALID_NAME, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_INVALID_NAME), GetLastError());
264 if (hnd) FindClose(hnd);
265 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION, SUBST_DRIVE, NULL);
266 ok(Result, "Failed to remove subst drive using NULL Target name\n");
267 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
268 ok(!Result, "Subst drive is present even after remove attempt\n");
269 dwMaskCur = GetLogicalDrives();
270 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
271
272 /* Test using trailing \ against drive letter */
273 dwMaskPrev = GetLogicalDrives();
274 Result = DefineDosDeviceA(0, SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR, Target);
275 ok(!Result, "Subst drive using trailing path seperator, this should not happen\n");
276 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
277 ok(DriveType1 != SystemDriveType, "subst drive types match when it shouldn't\n");
278 dwMaskCur = GetLogicalDrives();
279 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
280 ok(!(dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is set when it shouldn't\n");
281 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
282 ok(hnd == INVALID_HANDLE_VALUE, "Opened subst drive when it should fail\n");
283 if (hnd) FindClose(hnd);
284 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR, Target);
285 ok(!Result, "Removing Subst drive using trailing path seperator passed when it should fail\n");
286 Result = QueryDosDeviceA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR, Buffer, MAX_PATH);
287 ok(!Result, "Subst drive is present when it should not be created in the first place\n");
288 dwMaskCur = GetLogicalDrives();
289 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
290
291 /* Test using arbitary string, not necessarily a DOS drive letter */
292 dwMaskPrev = GetLogicalDrives();
293 Result = DefineDosDeviceA(0, "!QHello:", Target);
294 ok(Result, "Failed to subst drive using non-DOS drive name\n");
295 dwMaskCur = GetLogicalDrives();
296 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
297 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, "!QHello:", Target);
298 ok(Result, "Failed to subst drive using non-DOS drive name\n");
299 Result = QueryDosDeviceA("!QHello:", Buffer, MAX_PATH);
300 ok(!Result, "Subst drive is present even after remove attempt\n");
301 dwMaskCur = GetLogicalDrives();
302 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
303
304 /* Test by subst a drive to itself */
305 dwMaskPrev = GetLogicalDrives();
306 Result = DefineDosDeviceA(0, SUBST_DRIVE, SUBST_DRIVE);
307 ok(Result, "Failed to subst drive\n");
308 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
309 ok(DriveType1 != SystemDriveType, "subst drive types match when it shouldn't\n");
310 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_FILE_NOT_FOUND), GetLastError());
311 dwMaskCur = GetLogicalDrives();
312 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
313 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
314 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
315 ok(hnd == INVALID_HANDLE_VALUE, "Opened subst drive when it should fail\n");
316 if (hnd) FindClose(hnd);
317 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, SUBST_DRIVE);
318 ok(Result, "Failed to remove subst drive using lowercase drive letter\n");
319 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
320 ok(!Result, "Subst drive is present even after remove attempt\n");
321 dwMaskCur = GetLogicalDrives();
322 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
323
324 /* Test by subst a drive to an non-existent folder under itself */
325 dwMaskPrev = GetLogicalDrives();
326 Result = DefineDosDeviceA(0, SUBST_DRIVE, SUBST_DRIVE_NON_EXIST_DIR);
327 ok(Result, "Failed to subst drive\n");
328 DriveType1 = GetDriveTypeA(SUBST_DRIVE_WITH_TRAILING_PATH_SEPERATOR);
329 ok(DriveType1 != SystemDriveType, "subst drive types match when it shouldn't\n");
330 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_FILE_NOT_FOUND), GetLastError());
331 dwMaskCur = GetLogicalDrives();
332 ok(dwMaskCur != dwMaskPrev, "Drive masks match when it shouldn't\n");
333 ok((dwMaskCur & (1 << (SUBST_DRIVE_LETTER - 'A'))), "Drive bit is not set\n");
334 hnd = FindFirstFileA(SUBST_DRIVE_SEARCH, &Data);
335 ok(hnd == INVALID_HANDLE_VALUE, "Opened subst drive when it should fail\n");
336 if (hnd) FindClose(hnd);
337 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, SUBST_DRIVE_NON_EXIST_DIR);
338 ok(Result, "Failed to remove subst drive using lowercase drive letter\n");
339 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
340 ok(!Result, "Subst drive is present even after remove attempt\n");
341 dwMaskCur = GetLogicalDrives();
342 ok(dwMaskCur == dwMaskPrev, "Drive masks don't match\n");
343 }
344
345 static void test_QueryDosDeviceA(void)
346 {
347 CHAR Buffer[MAX_PATH], Target[MAX_PATH];
348 BOOL Result;
349 UINT CharCount;
350
351 /* Choose the symbolic link target */
352 CharCount = GetSystemWindowsDirectoryA(Target, MAX_PATH);
353 ok(CharCount > 0, "Failed to get windows directory\n");
354
355 Result = DefineDosDeviceA(0, SUBST_DRIVE, Target);
356 ok(Result, "Failed to subst drive\n");
357 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, 0);
358 ok(!Result, "Should fail as the buffer passed is supposed to be small\n");
359 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_INSUFFICIENT_BUFFER), GetLastError());
360 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
361 ok(Result, "failed to get target path\n");
362 ok(_strnicmp(Buffer, "\\??\\", 4) == 0, "The target returned does have correct prefix set\n");
363 ok(stricmp(&Buffer[4], Target) == 0, "The target returned does not match the one set\n");
364 Result = DefineDosDeviceA(DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, SUBST_DRIVE, Target);
365 ok(Result, "Failed to remove subst drive using lowercase drive letter\n");
366 Result = QueryDosDeviceA(SUBST_DRIVE, Buffer, MAX_PATH);
367
368 /* This will try to retrieve all existing MS-DOS device names */
369 Result = QueryDosDeviceA(NULL, Buffer, 0);
370 ok(!Result, "Should fail as the buffer passed is supposed to be small\n");
371 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Wrong last error. Expected %lu, got %lu\n", (DWORD)(ERROR_INSUFFICIENT_BUFFER), GetLastError());
372 }
373
374 START_TEST(dosdev)
375 {
376 test_DefineDosDeviceA();
377 test_QueryDosDeviceA();
378 }