[MPR]
[reactos.git] / reactos / dll / win32 / mpr / mpr_ros.diff
1 Index: mpr.spec
2 ===================================================================
3 --- mpr.spec (revision 49877)
4 +++ mpr.spec (working copy)
5 @@ -1,23 +1,23 @@
6 # ordinal exports
7 - 1 stub @
8 - 2 stub @
9 - 3 stub @
10 - 4 stub @
11 - 5 stub @
12 - 6 stub @
13 - 7 stub @
14 - 8 stub @
15 - 9 stub @
16 -12 stub @
17 -13 stub @
18 -14 stub @
19 -15 stub @
20 -16 stub @
21 -17 stub @
22 -18 stub @
23 -19 stub @
24 -20 stub @
25 -21 stub @
26 + 1 stub MPR_1
27 + 2 stub MPR_2
28 + 3 stub MPR_3
29 + 4 stub MPR_4
30 + 5 stub MPR_5
31 + 6 stub MPR_6
32 + 7 stub MPR_7
33 + 8 stub MPR_8
34 + 9 stub MPR_9
35 +12 stub MPR_12
36 +13 stub MPR_13
37 +14 stub MPR_14
38 +15 stub MPR_15
39 +16 stub MPR_16
40 +17 stub MPR_17
41 +18 stub MPR_18
42 +19 stub MPR_19
43 +20 stub MPR_20
44 +21 stub MPR_21
45 22 stdcall @(long) MPR_Alloc
46 23 stdcall @(ptr long) MPR_ReAlloc
47 24 stdcall @(ptr) MPR_Free
48 Index: wnet.c
49 ===================================================================
50 --- wnet.c (révision 70645)
51 +++ wnet.c (copie de travail)
52 @@ -1549,6 +1549,33 @@
53 dwFlags, NULL, 0, NULL);
54 }
55
56 +/* Convert an ANSI string to wide */
57 +static LPWSTR strdupAtoW( LPCSTR str )
58 +{
59 + LPWSTR ret;
60 + INT len;
61 +
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 );
66 + return ret;
67 +}
68 +
69 +/* Convert ANSI NETRESOURCE struct to wide structure */
70 +static VOID convert_netresourcea_to_w( LPNETRESOURCEA lpNetResourceA,
71 + LPNETRESOURCEW lpNetResourceW )
72 +{
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);
81 +}
82 +
83 /*****************************************************************
84 * WNetUseConnectionA [MPR.@]
85 */
86 @@ -1557,12 +1584,67 @@
87 LPSTR lpAccessName, LPDWORD lpBufferSize,
88 LPDWORD lpResult )
89 {
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;
97 + int len;
98
99 - SetLastError(WN_NO_NETWORK);
100 - return WN_NO_NETWORK;
101 + if (lpNetResource)
102 + {
103 + convert_netresourcea_to_w(lpNetResource, &resourcesW);
104 + pRes = &resourcesW;
105 + }
106 +
107 + passW = strdupAtoW(lpPassword);
108 + userIDW = strdupAtoW(lpUserID);
109 +
110 + if (lpAccessName && lpBufferSize && *lpBufferSize)
111 + {
112 + WCHAR probe;
113 +
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));
118 + }
119 +
120 + if (ret == WN_MORE_DATA)
121 + {
122 + ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags,
123 + accessNameW, &bufferSize, lpResult);
124 + if (ret == WN_SUCCESS)
125 + {
126 + if (lpAccessName && lpBufferSize && *lpBufferSize && accessNameW)
127 + {
128 + len = WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, NULL, 0, NULL, NULL);
129 + if (len)
130 + {
131 + if (len <= *lpBufferSize)
132 + WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, lpAccessName, len, NULL, NULL);
133 + else
134 + {
135 + WNetCancelConnectionW(accessNameW, TRUE);
136 + *lpBufferSize = len;
137 + ret = WN_MORE_DATA;
138 + }
139 + }
140 + }
141 + }
142 + }
143 +
144 + if (lpNetResource)
145 + {
146 + HeapFree(GetProcessHeap(), 0, resourcesW.lpLocalName);
147 + HeapFree(GetProcessHeap(), 0, resourcesW.lpRemoteName);
148 + HeapFree(GetProcessHeap(), 0, resourcesW.lpComment);
149 + HeapFree(GetProcessHeap(), 0, resourcesW.lpProvider);
150 + }
151 + HeapFree(GetProcessHeap(), 0, passW);
152 + HeapFree(GetProcessHeap(), 0, userIDW);
153 + HeapFree(GetProcessHeap(), 0, accessNameW);
154 +
155 + return ret;
156 }
157
158 /*****************************************************************
159 @@ -1573,12 +1655,75 @@
160 LPWSTR lpAccessName, LPDWORD lpBufferSize,
161 LPDWORD lpResult )
162 {
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 );
166 + DWORD provider;
167 + DWORD cap;
168 + char id;
169 + DWORD drives;
170 + DWORD ret;
171 + PF_NPAddConnection3 addConn3;
172 + PF_NPAddConnection addConn;
173
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;
179 + }
180 +
181 + if (!lpNetResource) {
182 + SetLastError(ERROR_INVALID_PARAMETER);
183 + return ERROR_INVALID_PARAMETER;
184 + }
185 +
186 + if (!lpNetResource->lpProvider || !*lpNetResource->lpProvider) {
187 + SetLastError(ERROR_BAD_PROVIDER);
188 + return ERROR_BAD_PROVIDER;
189 + }
190 +
191 + if (!lpNetResource->lpLocalName || !*lpNetResource->lpLocalName) {
192 + SetLastError(ERROR_BAD_DEVICE);
193 + return ERROR_BAD_DEVICE;
194 + }
195 +
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;
201 + }
202 +
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;
208 + }
209 +
210 + provider = _findProviderIndexW(lpNetResource->lpProvider);
211 + if (provider == BAD_PROVIDER_INDEX) {
212 + SetLastError(ERROR_BAD_PROVIDER);
213 + return ERROR_BAD_PROVIDER;
214 + }
215 +
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;
220 + }
221 +
222 + ret = WN_ACCESS_DENIED;
223 + if (cap & WNNC_CON_ADDCONNECTION3) {
224 + addConn3 = (PF_NPAddConnection3)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection3");
225 + if (addConn3) {
226 + ret = addConn3(hwndOwner, lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID, dwFlags);
227 + }
228 + }
229 + else if (cap & WNNC_CON_ADDCONNECTION) {
230 + addConn = (PF_NPAddConnection)GetProcAddress(providerTable->table[provider].hLib, "NPAddConnection");
231 + if (addConn) {
232 + ret = addConn(lpNetResource, (LPWSTR)lpPassword, (LPWSTR)lpUserID);
233 + }
234 + }
235 +
236 + return ret;
237 }
238
239 /*********************************************************************