2 * Unit test suite for virtual substituted drive functions.
4 * Copyright 2011 Sam Arun Raj
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.
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.
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
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:\\*"
35 static void test_DefineDosDeviceA(void)
37 CHAR Buffer
[MAX_PATH
], Target
[MAX_PATH
];
41 WIN32_FIND_DATAA Data
;
42 UINT SystemDriveType
, DriveType1
, DriveType2
;
43 DWORD dwMaskPrev
, dwMaskCur
;
46 /* Choose the symbolic link target */
47 CharCount
= GetSystemWindowsDirectoryA(Target
, MAX_PATH
);
48 ok(CharCount
> 0, "Failed to get windows directory\n");
51 SystemDriveType
= GetDriveTypeA(Target
);
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
345 static void test_QueryDosDeviceA(void)
347 CHAR Buffer
[MAX_PATH
], Target
[MAX_PATH
];
351 /* Choose the symbolic link target */
352 CharCount
= GetSystemWindowsDirectoryA(Target
, MAX_PATH
);
353 ok(CharCount
> 0, "Failed to get windows directory\n");
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
);
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());
376 test_DefineDosDeviceA();
377 test_QueryDosDeviceA();