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
[] = {'A',':','\\',0};
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: %08x\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 %u (drive_type: %u)\n",
50 driveA
, ret
, drive_type
);
52 ok(info_size
== sizeof(buffer
), "Got wrong size: %u\n", info_size
);
55 ret
= WNetGetUniversalNameA(driveA
, UNIVERSAL_NAME_INFO_LEVEL
,
57 if(drive_type
== DRIVE_REMOTE
)
58 todo_wine
ok(ret
== WN_BAD_VALUE
|| ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08x\n", ret
);
60 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
61 "(%s) WNetGetUniversalNameW gave wrong error: %u\n", driveA
, ret
);
63 fail_size
= sizeof(driveA
) / sizeof(char) - 1;
64 ret
= WNetGetUniversalNameA(driveA
, UNIVERSAL_NAME_INFO_LEVEL
,
66 if(drive_type
== DRIVE_REMOTE
)
67 ok(ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08x\n", ret
);
69 ret
= WNetGetUniversalNameA(driveandpathA
, UNIVERSAL_NAME_INFO_LEVEL
,
71 if(drive_type
== DRIVE_REMOTE
)
72 todo_wine
ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameA failed: %08x\n", ret
);
74 info_size
= sizeof(buffer
);
75 ret
= WNetGetUniversalNameW(driveW
, UNIVERSAL_NAME_INFO_LEVEL
,
78 if(drive_type
== DRIVE_REMOTE
)
79 ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameW failed: %08x\n", ret
);
81 ok((ret
== WN_NOT_CONNECTED
) || (ret
== WN_NO_NET_OR_BAD_PATH
),
82 "WNetGetUniversalNameW(%s, ...) returned %u (drive_type: %u)\n",
83 wine_dbgstr_w(driveW
), ret
, drive_type
);
84 if(drive_type
!= DRIVE_REMOTE
)
85 ok(info_size
== sizeof(buffer
), "Got wrong size: %u\n", info_size
);
89 static void test_WNetGetRemoteName(void)
93 DWORD drive_type
, info_size
, fail_size
;
94 char driveA
[] = "A:\\";
95 char driveandpathA
[] = "A:\\file.txt";
96 WCHAR driveW
[] = {'A',':','\\',0};
98 for(; *driveA
<= 'Z'; ++*driveA
, ++*driveandpathA
, ++*driveW
){
99 drive_type
= GetDriveTypeW(driveW
);
101 info_size
= sizeof(buffer
);
102 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
105 if(drive_type
== DRIVE_REMOTE
)
106 ok(ret
== WN_NO_ERROR
, "WNetGetUniversalNameA failed: %08x\n", ret
);
108 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
109 "(%s) WNetGetUniversalNameA gave wrong error: %u\n", driveA
, ret
);
111 ok(info_size
== sizeof(buffer
), "Got wrong size: %u\n", info_size
);
114 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
117 if(drive_type
== DRIVE_REMOTE
)
118 ok(ret
== WN_BAD_VALUE
|| ret
== WN_MORE_DATA
, "WNetGetUniversalNameA failed: %08x\n", ret
);
120 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
121 "(%s) WNetGetUniversalNameA gave wrong error: %u\n", driveA
, ret
);
123 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
125 todo_wine
ok(ret
== WN_BAD_POINTER
, "WNetGetUniversalNameA failed: %08x\n", ret
);
127 ret
= WNetGetUniversalNameA(driveA
, REMOTE_NAME_INFO_LEVEL
,
131 if(drive_type
== DRIVE_REMOTE
)
132 ok(ret
== WN_BAD_POINTER
|| ret
== WN_BAD_VALUE
, "WNetGetUniversalNameA failed: %08x\n", ret
);
134 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_BAD_VALUE
,
135 "(%s) WNetGetUniversalNameA gave wrong error: %u\n", driveA
, ret
);
138 fail_size
= sizeof(driveA
) / sizeof(char) - 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: %08x\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: %08x\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: %08x\n", ret
);
156 ok(ret
== WN_NOT_CONNECTED
|| ret
== WN_NO_NET_OR_BAD_PATH
,
157 "(%s) WNetGetUniversalNameW gave wrong error: %u\n", driveA
, ret
);
159 ok(info_size
== sizeof(buffer
), "Got wrong size: %u\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 %d, got %d\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 %d, 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 %d, 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 %d, 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 %d, 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
) continue;
289 todo_wine
ok(ret
== WN_SUCCESS
, "Unexpected return: %u\n", ret
);
290 ok(bufSize
== 0, "Unexpected buffer size: %u\n", bufSize
);
291 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
294 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, outBuf
, &bufSize
, &outRes
);
295 todo_wine
ok(ret
== ERROR_INVALID_PARAMETER
, "Unexpected return: %u\n", ret
);
296 ok(bufSize
== 0, "Unexpected buffer size: %u\n", bufSize
);
297 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
301 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, outBuf
, &bufSize
, &outRes
);
302 ok(ret
== ERROR_MORE_DATA
, "Unexpected return: %u\n", ret
);
303 ok(bufSize
== 3, "Unexpected buffer size: %u\n", bufSize
);
304 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
307 ret
= pWNetUseConnectionA(NULL
, netRes
, NULL
, NULL
, 0, outBuf
, &bufSize
, &outRes
);
308 ok(ret
== WN_SUCCESS
, "Unexpected return: %u\n", ret
);
310 ok(bufSize
== 4, "Unexpected buffer size: %u\n", bufSize
);
311 if (ret
== WN_SUCCESS
) WNetCancelConnectionA(drive
, TRUE
);
313 HeapFree(GetProcessHeap(), 0, netRes
);
318 test_WNetGetUniversalName();
319 test_WNetGetRemoteName();
320 test_WNetCachePassword();
321 test_WNetUseConnection();