2 * Copyright 2012 Andrew Eikum for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/test.h"
27 static void test_WNetGetUniversalName(void)
31 DWORD drive_type
, info_size
, fail_size
;
32 char driveA
[] = "A:\\";
33 char driveandpathA
[] = "A:\\file.txt";
34 WCHAR driveW
[] = L
"A:\\";
36 for(; *driveA
<= 'Z'; ++*driveA
, ++*driveandpathA
, ++*driveW
){
37 drive_type
= GetDriveTypeW(driveW
);
39 info_size
= sizeof(buffer
);
40 ret
= WNetGetUniversalNameA(driveA
, UNIVERSAL_NAME_INFO_LEVEL
,
43 if(drive_type
== DRIVE_REMOTE
)
44 ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
46 /* WN_NO_NET_OR_BAD_PATH (DRIVE_FIXED) returned from the virtual drive (usual Q:)
47 created by the microsoft application virtualization client */
48 ok((ret
== WN_NOT_CONNECTED
) || (ret
== WN_NO_NET_OR_BAD_PATH
),
49 "WNetGetUniversalNameA(%s, ...) returned %lu (drive_type: %lu)\n",
50 driveA
, ret
, drive_type
);
52 ok(info_size
== sizeof(buffer
), "Got wrong size: %lu\n", info_size
);
55 ret
= WNetGetUniversalNameA(driveA
, UNIVERSAL_NAME_INFO_LEVEL
,
57 if(drive_type
== DRIVE_REMOTE
)
59 todo_wine
ok(ret
== WN_BAD_VALUE
|| ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
60 ok(fail_size
> 1, "Got %ld\n", fail_size
);
63 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
64 "(%s) WNetGetUniversalNameW gave wrong error: %lu\n", driveA
, ret
);
66 fail_size
= ARRAY_SIZE(driveA
) - 1;
67 ret
= WNetGetUniversalNameA(driveA
, UNIVERSAL_NAME_INFO_LEVEL
,
69 if(drive_type
== DRIVE_REMOTE
)
70 ok(ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
72 ret
= WNetGetUniversalNameA(driveandpathA
, UNIVERSAL_NAME_INFO_LEVEL
,
74 if(drive_type
== DRIVE_REMOTE
)
75 todo_wine
ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
77 info_size
= sizeof(buffer
);
78 ret
= WNetGetUniversalNameW(driveW
, UNIVERSAL_NAME_INFO_LEVEL
,
81 if(drive_type
== DRIVE_REMOTE
)
82 ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameW failed: %08lx\n", ret
);
84 ok((ret
== WN_NOT_CONNECTED
) || (ret
== WN_NO_NET_OR_BAD_PATH
),
85 "WNetGetUniversalNameW(%s, ...) returned %lu (drive_type: %lu)\n",
86 wine_dbgstr_w(driveW
), ret
, drive_type
);
87 if(drive_type
!= DRIVE_REMOTE
)
88 ok(info_size
== sizeof(buffer
), "Got wrong size: %lu\n", info_size
);
92 static void test_WNetGetRemoteName(void)
96 DWORD drive_type
, info_size
, fail_size
;
97 char driveA
[] = "A:\\";
98 char driveandpathA
[] = "A:\\file.txt";
99 WCHAR driveW
[] = L
"A:\\";
101 for(; *driveA
<= 'Z'; ++*driveA
, ++*driveandpathA
, ++*driveW
){
102 drive_type
= GetDriveTypeW(driveW
);
104 info_size
= sizeof(buffer
);
105 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
107 if(drive_type
== DRIVE_REMOTE
)
109 ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
111 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
112 "(%s) WNetGetUniversalNameA gave wrong error: %lu\n", driveA
, ret
);
113 ok(info_size
== sizeof(buffer
), "Got wrong size: %lu\n", info_size
);
116 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
118 if(drive_type
== DRIVE_REMOTE
)
120 ok(ret
== WN_BAD_VALUE
|| ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
122 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
123 "(%s) WNetGetUniversalNameA gave wrong error: %lu\n", driveA
, ret
);
124 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
126 todo_wine
ok(ret
== WN_BAD_POINTER
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
128 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
131 if(drive_type
== DRIVE_REMOTE
)
133 ok(ret
== WN_BAD_POINTER
|| ret
== WN_BAD_VALUE
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
135 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_BAD_VALUE
,
136 "(%s) WNetGetUniversalNameA gave wrong error: %lu\n", driveA
, ret
);
138 fail_size
= ARRAY_SIZE(driveA
) - 1;
139 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
141 if(drive_type
== DRIVE_REMOTE
)
142 todo_wine
ok(ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
144 ret
= WNetGetUniversalNameA(driveandpathA
, REMOTE_NAME_INFO_LEVEL
,
146 if(drive_type
== DRIVE_REMOTE
)
147 todo_wine
ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameA failed: %08lx\n", ret
);
149 info_size
= sizeof(buffer
);
150 ret
= WNetGetUniversalNameW(driveW
, REMOTE_NAME_INFO_LEVEL
,
153 if(drive_type
== DRIVE_REMOTE
)
154 ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameW failed: %08lx\n", ret
);
156 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
157 "(%s) WNetGetUniversalNameW gave wrong error: %lu\n", driveA
, ret
);
159 ok(info_size
== sizeof(buffer
), "Got wrong size: %lu\n", info_size
);
163 static DWORD (WINAPI
*pWNetCachePassword
)( LPSTR
, WORD
, LPSTR
, WORD
, BYTE
, WORD
);
164 static DWORD (WINAPI
*pWNetGetCachedPassword
)( LPSTR
, WORD
, LPSTR
, LPWORD
, BYTE
);
165 static UINT (WINAPI
*pWNetEnumCachedPasswords
)( LPSTR
, WORD
, BYTE
, ENUMPASSWORDPROC
, DWORD
);
166 static UINT (WINAPI
*pWNetRemoveCachedPassword
)( LPSTR
, WORD
, BYTE
);
167 static DWORD (WINAPI
*pWNetUseConnectionA
)( HWND
, LPNETRESOURCEA
, LPCSTR
, LPCSTR
, DWORD
, LPSTR
, LPDWORD
, LPDWORD
);
169 #define MPR_GET_PROC(func) \
170 p ## func = (void*)GetProcAddress(hmpr, #func)
172 static void InitFunctionPtrs(void)
174 HMODULE hmpr
= GetModuleHandleA("mpr.dll");
176 MPR_GET_PROC(WNetCachePassword
);
177 MPR_GET_PROC(WNetGetCachedPassword
);
178 MPR_GET_PROC(WNetEnumCachedPasswords
);
179 MPR_GET_PROC(WNetRemoveCachedPassword
);
180 MPR_GET_PROC(WNetUseConnectionA
);
183 static const char* m_resource
= "wine-test-resource";
184 static const char* m_password
= "wine-test-password";
185 static const BYTE m_type
= 1;
186 static const DWORD m_param
= 8;
187 static BOOL m_callback_reached
;
189 static BOOL CALLBACK
enum_password_proc(PASSWORD_CACHE_ENTRY
* pce
, DWORD param
)
194 ok(param
== m_param
, "param, got %ld, got %ld\n", param
, m_param
);
196 size
= offsetof( PASSWORD_CACHE_ENTRY
, abResource
[pce
->cbResource
+ pce
->cbPassword
] );
197 ok(pce
->cbEntry
== size
, "cbEntry, got %d, expected %d\n", pce
->cbEntry
, size
);
198 ok(pce
->cbResource
== strlen(m_resource
), "cbResource, got %d\n", pce
->cbResource
);
199 ok(pce
->cbPassword
== strlen(m_password
), "cbPassword, got %d\n", pce
->cbPassword
);
200 ok(pce
->iEntry
== 0, "iEntry, got %d, got %d\n", pce
->iEntry
, 0);
201 ok(pce
->nType
== m_type
, "nType, got %d, got %d\n", pce
->nType
, m_type
);
203 buf
= (char*)pce
->abResource
;
204 ok(strncmp(buf
, m_resource
, pce
->cbResource
)==0, "enumerated resource differs, got %.*s, expected %s\n", pce
->cbResource
, buf
, m_resource
);
206 buf
+= pce
->cbResource
;
207 ok(strncmp(buf
, m_password
, pce
->cbPassword
)==0, "enumerated resource differs, got %.*s, expected %s\n", pce
->cbPassword
, buf
, m_password
);
209 m_callback_reached
= 1;
213 static void test_WNetCachePassword(void)
215 char resource_buf
[32];
216 char password_buf
[32];
225 if (pWNetCachePassword
&&
226 pWNetGetCachedPassword
&&
227 pWNetEnumCachedPasswords
&&
228 pWNetRemoveCachedPassword
)
230 strcpy(resource_buf
, m_resource
);
231 resource_len
= strlen(m_resource
);
232 strcpy(password_buf
, m_password
);
233 password_len
= strlen(m_password
);
234 ret
= pWNetCachePassword(resource_buf
, resource_len
, password_buf
, password_len
, m_type
, 0);
235 ok(ret
== WN_SUCCESS
, "WNetCachePassword failed: got %ld, expected %d\n", ret
, WN_SUCCESS
);
237 strcpy(resource_buf
, m_resource
);
238 resource_len
= strlen(m_resource
);
239 strcpy(password_buf
, "------");
240 password_len
= sizeof(password_buf
);
241 ret
= pWNetGetCachedPassword(resource_buf
, resource_len
, password_buf
, &password_len
, m_type
);
242 ok(ret
== WN_SUCCESS
, "WNetGetCachedPassword failed: got %ld, expected %d\n", ret
, WN_SUCCESS
);
243 ok(password_len
== strlen(m_password
), "password length different, got %d\n", password_len
);
244 ok(strncmp(password_buf
, m_password
, password_len
)==0, "passwords different, got %.*s, expected %s\n", password_len
, password_buf
, m_password
);
247 strcpy(prefix_buf
, m_resource
);
248 prefix_buf
[prefix_len
] = '0';
249 ret
= pWNetEnumCachedPasswords(prefix_buf
, prefix_len
, m_type
, enum_password_proc
, m_param
);
250 ok(ret
== WN_SUCCESS
, "WNetEnumCachedPasswords failed: got %ld, expected %d\n", ret
, WN_SUCCESS
);
251 ok(m_callback_reached
== 1, "callback was not reached\n");
253 strcpy(resource_buf
, m_resource
);
254 resource_len
= strlen(m_resource
);
255 ret
= pWNetRemoveCachedPassword(resource_buf
, resource_len
, m_type
);
256 ok(ret
== WN_SUCCESS
, "WNetRemoveCachedPassword failed: got %ld, expected %d\n", ret
, WN_SUCCESS
);
258 win_skip("WNetCachePassword() is not supported.\n");
262 static void test_WNetUseConnection(void)
264 DWORD ret
, bufSize
, outRes
;
265 LPNETRESOURCEA netRes
;
266 char outBuf
[4], drive
[] = "J:", letter
;
268 if (!pWNetUseConnectionA
)
270 win_skip("WNetUseConnection() is not supported.\n");
273 netRes
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(NETRESOURCEA
) + sizeof("\\\\127.0.0.1\\c$") + sizeof("J:"));
274 netRes
->dwType
= RESOURCETYPE_DISK
;
275 netRes
->dwDisplayType
= RESOURCEDISPLAYTYPE_SHARE
;
276 netRes
->dwUsage
= RESOURCEUSAGE_CONNECTABLE
;
277 netRes
->lpLocalName
= (LPSTR
)((LPBYTE
)netRes
+ sizeof(NETRESOURCEA
));
278 netRes
->lpRemoteName
= (LPSTR
)((LPBYTE
)netRes
+ sizeof(NETRESOURCEA
) + sizeof("J:"));
280 for (letter
= 'J'; letter
<= 'Z'; letter
++)
283 strcpy(netRes
->lpLocalName
, drive
);
284 strcpy(netRes
->lpRemoteName
, "\\\\127.0.0.1\\c$");
286 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, NULL
, &bufSize
, &outRes
);
287 if (ret
!= ERROR_ALREADY_ASSIGNED
) break;
289 if (ret
== ERROR_ALREADY_ASSIGNED
) goto end
; /* no drives available */
290 todo_wine
ok(ret
== WN_SUCCESS
, "Unexpected return: %lu\n", ret
);
291 ok(bufSize
== 0, "Unexpected buffer size: %lu\n", bufSize
);
292 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
295 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, outBuf
, &bufSize
, &outRes
);
296 todo_wine
ok(ret
== ERROR_INVALID_PARAMETER
, "Unexpected return: %lu\n", ret
);
297 ok(bufSize
== 0, "Unexpected buffer size: %lu\n", bufSize
);
298 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
302 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, outBuf
, &bufSize
, &outRes
);
303 ok(ret
== ERROR_MORE_DATA
, "Unexpected return: %lu\n", ret
);
304 ok(bufSize
== 3, "Unexpected buffer size: %lu\n", bufSize
);
305 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
308 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, outBuf
, &bufSize
, &outRes
);
309 ok(ret
== WN_SUCCESS
, "Unexpected return: %lu\n", ret
);
311 ok(bufSize
== 4, "Unexpected buffer size: %lu\n", bufSize
);
312 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
315 HeapFree(GetProcessHeap(), 0, netRes
);
320 test_WNetGetUniversalName();
321 test_WNetGetRemoteName();
322 test_WNetCachePassword();
323 test_WNetUseConnection();