2 ===================================================================
3 --- mpr.spec (revision 49877)
4 +++ mpr.spec (working copy)
45 22 stdcall @(long) MPR_Alloc
46 23 stdcall @(ptr long) MPR_ReAlloc
47 24 stdcall @(ptr) MPR_Free
49 ===================================================================
50 --- wnet.c (révision 70645)
51 +++ wnet.c (copie de travail)
52 @@ -1549,6 +1549,33 @@
53 dwFlags, NULL, 0, NULL);
56 +/* Convert an ANSI string to wide */
57 +static LPWSTR strdupAtoW( LPCSTR str )
62 + if (!str) return NULL;
63 + len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
64 + ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
65 + if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
69 +/* Convert ANSI NETRESOURCE struct to wide structure */
70 +static VOID convert_netresourcea_to_w( LPNETRESOURCEA lpNetResourceA,
71 + LPNETRESOURCEW lpNetResourceW )
73 + lpNetResourceW->dwScope = lpNetResourceA->dwScope;
74 + lpNetResourceW->dwType = lpNetResourceA->dwType;
75 + lpNetResourceW->dwDisplayType = lpNetResourceA->dwDisplayType;
76 + lpNetResourceW->dwUsage = lpNetResourceA->dwUsage;
77 + lpNetResourceW->lpLocalName = strdupAtoW(lpNetResourceA->lpLocalName);
78 + lpNetResourceW->lpRemoteName = strdupAtoW(lpNetResourceA->lpRemoteName);
79 + lpNetResourceW->lpComment = strdupAtoW(lpNetResourceA->lpComment);
80 + lpNetResourceW->lpProvider = strdupAtoW(lpNetResourceA->lpProvider);
83 /*****************************************************************
84 * WNetUseConnectionA [MPR.@]
86 @@ -1557,12 +1584,67 @@
87 LPSTR lpAccessName, LPDWORD lpBufferSize,
90 - FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
91 - hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags,
92 - debugstr_a(lpAccessName), lpBufferSize, lpResult );
93 + NETRESOURCEW resourcesW, *pRes = NULL;
94 + PWSTR passW, userIDW, accessNameW = NULL;
95 + DWORD ret = WN_MORE_DATA;
96 + DWORD bufferSize = 1;
99 - SetLastError(WN_NO_NETWORK);
100 - return WN_NO_NETWORK;
103 + convert_netresourcea_to_w(lpNetResource, &resourcesW);
104 + pRes = &resourcesW;
107 + passW = strdupAtoW(lpPassword);
108 + userIDW = strdupAtoW(lpUserID);
110 + if (lpAccessName && lpBufferSize && *lpBufferSize)
114 + ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags,
115 + &probe, &bufferSize, lpResult);
116 + if (ret == WN_MORE_DATA)
117 + accessNameW = HeapAlloc(GetProcessHeap(), 0, bufferSize * sizeof(WCHAR));
120 + if (ret == WN_MORE_DATA)
122 + ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags,
123 + accessNameW, &bufferSize, lpResult);
124 + if (ret == WN_SUCCESS)
126 + if (lpAccessName && lpBufferSize && *lpBufferSize && accessNameW)
128 + len = WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, NULL, 0, NULL, NULL);
131 + if (len <= *lpBufferSize)
132 + WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, lpAccessName, len, NULL, NULL);
135 + WNetCancelConnectionW(accessNameW, TRUE);
136 + *lpBufferSize = len;
137 + ret = WN_MORE_DATA;
146 + HeapFree(GetProcessHeap(), 0, resourcesW.lpLocalName);
147 + HeapFree(GetProcessHeap(), 0, resourcesW.lpRemoteName);
148 + HeapFree(GetProcessHeap(), 0, resourcesW.lpComment);
149 + HeapFree(GetProcessHeap(), 0, resourcesW.lpProvider);
151 + HeapFree(GetProcessHeap(), 0, passW);
152 + HeapFree(GetProcessHeap(), 0, userIDW);
153 + HeapFree(GetProcessHeap(), 0, accessNameW);
158 /*****************************************************************
159 @@ -1573,12 +1655,75 @@
160 LPWSTR lpAccessName, LPDWORD lpBufferSize,
163 - FIXME( "(%p, %p, %p, %s, 0x%08X, %s, %p, %p), stub\n",
164 - hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
165 - debugstr_w(lpAccessName), lpBufferSize, lpResult );
171 + PF_NPAddConnection3 addConn3;
172 + PF_NPAddConnection addConn;
174 - SetLastError(WN_NO_NETWORK);
175 - return WN_NO_NETWORK;
176 + if (!providerTable || providerTable->numProviders == 0) {
177 + SetLastError(WN_NO_NETWORK);
178 + return WN_NO_NETWORK;
181 + if (!lpNetResource) {
182 + SetLastError(ERROR_INVALID_PARAMETER);
183 + return ERROR_INVALID_PARAMETER;
186 + if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {
187 + SetLastError(ERROR_BAD_PROVIDER);
188 + return ERROR_BAD_PROVIDER;
191 + if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {
192 + SetLastError(ERROR_BAD_DEVICE);
193 + return ERROR_BAD_DEVICE;
196 + if ((!(lpNetResource->lpLocalName[0] >= 'a' && lpNetResource->lpLocalName[0] <= 'z') &&
197 + !(lpNetResource->lpLocalName[0] >= 'A' && lpNetResource->lpLocalName[0] <= 'Z')) ||
198 + lpNetResource->lpLocalName[1] != ':' || lpNetResource->lpLocalName[2]) {
199 + SetLastError(ERROR_BAD_DEVICE);
200 + return ERROR_BAD_DEVICE;
203 + id = (lpNetResource->lpLocalName[0] >= 'a') ? lpNetResource->lpLocalName[0] - 'a' : lpNetResource->lpLocalName[0] - 'A';
204 + drives = GetLogicalDrives();
205 + if (drives & (1 << id)) {
206 + SetLastError(ERROR_ALREADY_ASSIGNED);
207 + return ERROR_ALREADY_ASSIGNED;
210 + provider = _findProviderIndexW(lpNetResource->lpProvider);
211 + if (provider == BAD_PROVIDER_INDEX) {
212 + SetLastError(ERROR_BAD_PROVIDER);
213 + return ERROR_BAD_PROVIDER;
216 + cap = providerTable->table[provider].getCaps(WNNC_CONNECTION);
217 + if (!(cap & WNNC_CON_ADDCONNECTION) && !(cap & WNNC_CON_ADDCONNECTION3)) {
218 + SetLastError(ERROR_BAD_PROVIDER);
219 + return ERROR_BAD_PROVIDER;
222 + ret = WN_ACCESS_DENIED;
223 + if (cap & WNNC_CON_ADDCONNECTION3) {
224 + addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");
226 + ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);
229 + else if (cap & WNNC_CON_ADDCONNECTION) {
230 + addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");
232 + ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);
239 /*********************************************************************