}\r
\r
/*****************************************************************\r
-@@ -1577,12 +1659,75 @@\r
- LPWSTR lpAccessName, LPDWORD lpBufferSize,\r
- LPDWORD lpResult )\r
- {\r
-- FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",\r
-- hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,\r
-- debugstr_w(lpAccessName), lpBufferSize, lpResult );\r
-+ DWORD provider;\r
-+ DWORD cap;\r
-+ char id;\r
-+ DWORD drives;\r
-+ DWORD ret;\r
-+ PF_NPAddConnection3 addConn3;\r
-+ PF_NPAddConnection addConn;\r
- \r
-- SetLastError(WN_NO_NETWORK);\r
-- return WN_NO_NETWORK;\r
-+ if (!providerTable || providerTable->numProviders == 0) {\r
-+ SetLastError(WN_NO_NETWORK);\r
-+ return WN_NO_NETWORK;\r
-+ }\r
-+\r
-+ if (!lpNetResource) {\r
-+ SetLastError(ERROR_INVALID_PARAMETER);\r
-+ return ERROR_INVALID_PARAMETER;\r
-+ }\r
-+\r
-+ if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {\r
-+ SetLastError(ERROR_BAD_PROVIDER);\r
-+ return ERROR_BAD_PROVIDER;\r
-+ }\r
-+\r
-+ if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {\r
-+ SetLastError(ERROR_BAD_DEVICE);\r
-+ return ERROR_BAD_DEVICE;\r
-+ }\r
-+\r
-+ if ((!(lpNetResource->lpLocalName[0] >= 'a' && lpNetResource->lpLocalName[0] <= 'z') &&\r
-+ !(lpNetResource->lpLocalName[0] >= 'A' && lpNetResource->lpLocalName[0] <= 'Z')) ||\r
-+ lpNetResource->lpLocalName[1] != ':' || lpNetResource->lpLocalName[2]) {\r
-+ SetLastError(ERROR_BAD_DEVICE);\r
-+ return ERROR_BAD_DEVICE;\r
-+ }\r
-+\r
-+ id = (lpNetResource->lpLocalName[0] >= 'a') ? lpNetResource->lpLocalName[0] - 'a' : lpNetResource->lpLocalName[0] - 'A';\r
-+ drives = GetLogicalDrives();\r
-+ if (drives & (1 << id)) {\r
-+ SetLastError(ERROR_ALREADY_ASSIGNED);\r
-+ return ERROR_ALREADY_ASSIGNED;\r
-+ }\r
-+\r
-+ provider = _findProviderIndexW(lpNetResource->lpProvider);\r
-+ if (provider == BAD_PROVIDER_INDEX) {\r
-+ SetLastError(ERROR_BAD_PROVIDER);\r
-+ return ERROR_BAD_PROVIDER;\r
-+ }\r
-+\r
-+ cap = providerTable->table[provider].getCaps(WNNC_CONNECTION);\r
-+ if (!(cap & WNNC_CON_ADDCONNECTION) && !(cap & WNNC_CON_ADDCONNECTION3)) {\r
-+ SetLastError(ERROR_BAD_PROVIDER);\r
-+ return ERROR_BAD_PROVIDER;\r
-+ }\r
-+\r
-+ ret = WN_ACCESS_DENIED;\r
-+ if (cap & WNNC_CON_ADDCONNECTION3) {\r
-+ addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");\r
-+ if (addConn3) {\r
-+ ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);\r
-+ }\r
-+ }\r
-+ else if (cap & WNNC_CON_ADDCONNECTION) {\r
-+ addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");\r
-+ if (addConn) {\r
-+ ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);\r
-+ }\r
-+ }\r
-+\r
-+ return ret;\r
- }\r
- \r
- /*********************************************************************\r