Index: dll/win32/mpr/wnet.c
===================================================================
--- dll/win32/mpr/wnet.c	(révision 70605)
+++ dll/win32/mpr/wnet.c	(copie de travail)
@@ -1477,11 +1477,12 @@
 DWORD WINAPI WNetAddConnectionA( LPCSTR lpRemoteName, LPCSTR lpPassword,
                                  LPCSTR lpLocalName )
 {
-    FIXME( "(%s, %p, %s): stub\n",
-           debugstr_a(lpRemoteName), lpPassword, debugstr_a(lpLocalName) );
+    NETRESOURCEA resourcesA;
 
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    memset(&resourcesA, 0, sizeof(resourcesA));
+    resourcesA.lpRemoteName = (LPSTR)lpRemoteName;
+    resourcesA.lpLocalName = (LPSTR)lpLocalName;
+    return WNetUseConnectionA(NULL, &resourcesA, lpPassword, NULL, 0, NULL, 0, NULL);
 }
 
 /*********************************************************************
@@ -1490,11 +1491,12 @@
 DWORD WINAPI WNetAddConnectionW( LPCWSTR lpRemoteName, LPCWSTR lpPassword,
                                  LPCWSTR lpLocalName )
 {
-    FIXME( "(%s, %p, %s): stub\n",
-           debugstr_w(lpRemoteName), lpPassword, debugstr_w(lpLocalName) );
+    NETRESOURCEW resourcesW;
 
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    memset(&resourcesW, 0, sizeof(resourcesW));
+    resourcesW.lpRemoteName = (LPWSTR)lpRemoteName;
+    resourcesW.lpLocalName = (LPWSTR)lpLocalName;
+    return WNetUseConnectionW(NULL, &resourcesW, lpPassword, NULL, 0, NULL, 0, NULL);
 }
 
 /*********************************************************************
@@ -1504,11 +1506,8 @@
                                   LPCSTR lpPassword, LPCSTR lpUserID,
                                   DWORD dwFlags )
 {
-    FIXME( "(%p, %p, %s, 0x%08X): stub\n",
-           lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
-
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    return WNetUseConnectionA(NULL, lpNetResource, lpPassword, lpUserID, dwFlags,
+                              NULL, 0, NULL);
 }
 
 /*********************************************************************
@@ -1518,11 +1517,8 @@
                                   LPCWSTR lpPassword, LPCWSTR lpUserID,
                                   DWORD dwFlags )
 {
-    FIXME( "(%p, %p, %s, 0x%08X): stub\n",
-           lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
-
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    return WNetUseConnectionW(NULL, lpNetResource, lpPassword, lpUserID, dwFlags,
+                              NULL, 0, NULL);
 }
 
 /*********************************************************************
@@ -1532,11 +1528,8 @@
                                   LPCSTR lpPassword, LPCSTR lpUserID,
                                   DWORD dwFlags )
 {
-    FIXME( "(%p, %p, %p, %s, 0x%08X), stub\n",
-           hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
-
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    return WNetUseConnectionA(hwndOwner, lpNetResource, lpPassword, lpUserID,
+                              dwFlags, NULL, 0, NULL);
 }
 
 /*********************************************************************
@@ -1546,13 +1539,37 @@
                                   LPCWSTR lpPassword, LPCWSTR lpUserID,
                                   DWORD dwFlags )
 {
-    FIXME( "(%p, %p, %p, %s, 0x%08X), stub\n",
-           hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
+    return WNetUseConnectionW(hwndOwner, lpNetResource, lpPassword, lpUserID,
+                              dwFlags, NULL, 0, NULL);
+}
 
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+/* Convert an ANSI string to wide */
+static LPWSTR strdupAtoW( LPCSTR str )
+{
+    LPWSTR ret;
+    INT len;
+
+    if (!str) return NULL;
+    len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+    ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+    if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
+    return ret;
 }
 
+/* Convert ANSI NETRESOURCE struct to wide structure */
+static VOID convert_netresourcea_to_w( LPNETRESOURCEA lpNetResourceA,
+                                       LPNETRESOURCEW lpNetResourceW )
+{
+    lpNetResourceW->dwScope = lpNetResourceA->dwScope;
+    lpNetResourceW->dwType = lpNetResourceA->dwType;
+    lpNetResourceW->dwDisplayType = lpNetResourceA->dwDisplayType;
+    lpNetResourceW->dwUsage = lpNetResourceA->dwUsage;
+    lpNetResourceW->lpLocalName = strdupAtoW(lpNetResourceA->lpLocalName);
+    lpNetResourceW->lpRemoteName = strdupAtoW(lpNetResourceA->lpRemoteName);
+    lpNetResourceW->lpComment = strdupAtoW(lpNetResourceA->lpComment);
+    lpNetResourceW->lpProvider = strdupAtoW(lpNetResourceA->lpProvider);
+}
+
 /*****************************************************************
  *  WNetUseConnectionA [MPR.@]
  */
@@ -1561,12 +1578,50 @@
                                  LPSTR lpAccessName, LPDWORD lpBufferSize,
                                  LPDWORD lpResult )
 {
-    FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
-           hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags,
-           debugstr_a(lpAccessName), lpBufferSize, lpResult );
+    NETRESOURCEW resourcesW, *pRes = NULL;
+    PWSTR passW, userIDW, accessNameW = NULL;
+    DWORD ret;
+    int len;
 
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    if (lpNetResource) {
+        convert_netresourcea_to_w(lpNetResource, &resourcesW);
+        pRes = &resourcesW;
+    }
+
+    if (lpAccessName && lpBufferSize && *lpBufferSize) {
+        accessNameW = HeapAlloc(GetProcessHeap(), 0, *lpBufferSize * sizeof(WCHAR));
+    }
+
+    passW = strdupAtoW(lpPassword);
+    userIDW = strdupAtoW(lpUserID);
+
+    ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags,
+                             accessNameW, lpBufferSize, lpResult);
+    if (lpAccessName && lpBufferSize && *lpBufferSize && accessNameW) {
+        len = WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, NULL, 0, NULL, NULL);
+        if (len && len <= *lpBufferSize) {
+            WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, lpAccessName, len, NULL, NULL);
+        }
+    }
+
+    if (lpNetResource) {
+        if (resourcesW.lpLocalName)
+            HeapFree(GetProcessHeap(), 0, resourcesW.lpLocalName);
+        if (resourcesW.lpRemoteName)
+            HeapFree(GetProcessHeap(), 0, resourcesW.lpRemoteName);
+        if (resourcesW.lpComment)
+            HeapFree(GetProcessHeap(), 0, resourcesW.lpComment);
+        if (resourcesW.lpProvider)
+            HeapFree(GetProcessHeap(), 0, resourcesW.lpProvider);
+    }
+    if (passW)
+        HeapFree(GetProcessHeap(), 0, passW);
+    if (userIDW)
+        HeapFree(GetProcessHeap(), 0, userIDW);
+    if (accessNameW)
+        HeapFree(GetProcessHeap(), 0, accessNameW);
+
+    return ret;
 }
 
 /*****************************************************************
@@ -1577,12 +1632,75 @@
                                  LPWSTR lpAccessName, LPDWORD lpBufferSize,
                                  LPDWORD lpResult )
 {
-    FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
-           hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
-           debugstr_w(lpAccessName), lpBufferSize, lpResult );
+    DWORD provider;
+    DWORD cap;
+    char id;
+    DWORD drives;
+    DWORD ret;
+    PF_NPAddConnection3 addConn3;
+    PF_NPAddConnection addConn;
 
-    SetLastError(WN_NO_NETWORK);
-    return WN_NO_NETWORK;
+    if (!providerTable || providerTable->numProviders == 0) {
+        SetLastError(WN_NO_NETWORK);
+        return WN_NO_NETWORK;
+    }
+
+    if (!lpNetResource) {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {
+        SetLastError(ERROR_BAD_PROVIDER);
+        return ERROR_BAD_PROVIDER;
+    }
+
+    if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {
+        SetLastError(ERROR_BAD_DEVICE);
+        return ERROR_BAD_DEVICE;
+    }
+
+    if ((!(lpNetResource->lpLocalName[0] >= 'a' && lpNetResource->lpLocalName[0] <= 'z') &&
+        !(lpNetResource->lpLocalName[0] >= 'A' && lpNetResource->lpLocalName[0] <= 'Z')) ||
+        lpNetResource->lpLocalName[1] != ':' || lpNetResource->lpLocalName[2]) {
+        SetLastError(ERROR_BAD_DEVICE);
+        return ERROR_BAD_DEVICE;
+    }
+
+    id = (lpNetResource->lpLocalName[0] >= 'a') ? lpNetResource->lpLocalName[0] - 'a' : lpNetResource->lpLocalName[0] - 'A';
+    drives = GetLogicalDrives();
+    if (drives & (1 << id)) {
+        SetLastError(ERROR_ALREADY_ASSIGNED);
+        return ERROR_ALREADY_ASSIGNED;
+    }
+
+    provider = _findProviderIndexW(lpNetResource->lpProvider);
+    if (provider == BAD_PROVIDER_INDEX) {
+        SetLastError(ERROR_BAD_PROVIDER);
+        return ERROR_BAD_PROVIDER;
+    }
+
+    cap = providerTable->table[provider].getCaps(WNNC_CONNECTION);
+    if (!(cap & WNNC_CON_ADDCONNECTION) && !(cap & WNNC_CON_ADDCONNECTION3)) {
+        SetLastError(ERROR_BAD_PROVIDER);
+        return ERROR_BAD_PROVIDER;
+    }
+
+    ret = WN_ACCESS_DENIED;
+    if (cap & WNNC_CON_ADDCONNECTION3) {
+        addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");
+        if (addConn3) {
+            ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);
+        }
+    }
+    else if (cap & WNNC_CON_ADDCONNECTION) {
+        addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");
+        if (addConn) {
+            ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);
+        }
+    }
+
+    return ret;
 }
 
 /*********************************************************************
