04605380688214431350212b358596e56854c692
[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 @@ -1553,6 +1553,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 @@ -1561,12 +1588,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 /*****************************************************************