[MPR]
[reactos.git] / reactos / dll / win32 / mpr / mpr_ros.diff
index 82eb990..8c4a8e8 100644 (file)
@@ -3,45 +3,178 @@ Index: mpr.spec
 --- mpr.spec   (revision 49877)\r
 +++ mpr.spec   (working copy)\r
 @@ -1,23 +1,23 @@\r
- # ordinal exports
-- 1 stub @
-- 2 stub @
-- 3 stub @
-- 4 stub @
-- 5 stub @
-- 6 stub @
-- 7 stub @
-- 8 stub @
-- 9 stub @
--12 stub @
--13 stub @
--14 stub @
--15 stub @
--16 stub @
--17 stub @
--18 stub @
--19 stub @
--20 stub @
--21 stub @
-+ 1 stub MPR_1
-+ 2 stub MPR_2
-+ 3 stub MPR_3
-+ 4 stub MPR_4
-+ 5 stub MPR_5
-+ 6 stub MPR_6
-+ 7 stub MPR_7
-+ 8 stub MPR_8
-+ 9 stub MPR_9
-+12 stub MPR_12
-+13 stub MPR_13
-+14 stub MPR_14
-+15 stub MPR_15
-+16 stub MPR_16
-+17 stub MPR_17
-+18 stub MPR_18
-+19 stub MPR_19
-+20 stub MPR_20
-+21 stub MPR_21
- 22 stdcall @(long) MPR_Alloc
- 23 stdcall @(ptr long) MPR_ReAlloc
- 24 stdcall @(ptr) MPR_Free
+ # ordinal exports\r
+- 1 stub @\r
+- 2 stub @\r
+- 3 stub @\r
+- 4 stub @\r
+- 5 stub @\r
+- 6 stub @\r
+- 7 stub @\r
+- 8 stub @\r
+- 9 stub @\r
+-12 stub @\r
+-13 stub @\r
+-14 stub @\r
+-15 stub @\r
+-16 stub @\r
+-17 stub @\r
+-18 stub @\r
+-19 stub @\r
+-20 stub @\r
+-21 stub @\r
++ 1 stub MPR_1\r
++ 2 stub MPR_2\r
++ 3 stub MPR_3\r
++ 4 stub MPR_4\r
++ 5 stub MPR_5\r
++ 6 stub MPR_6\r
++ 7 stub MPR_7\r
++ 8 stub MPR_8\r
++ 9 stub MPR_9\r
++12 stub MPR_12\r
++13 stub MPR_13\r
++14 stub MPR_14\r
++15 stub MPR_15\r
++16 stub MPR_16\r
++17 stub MPR_17\r
++18 stub MPR_18\r
++19 stub MPR_19\r
++20 stub MPR_20\r
++21 stub MPR_21\r
+ 22 stdcall @(long) MPR_Alloc\r
+ 23 stdcall @(ptr long) MPR_ReAlloc\r
+ 24 stdcall @(ptr) MPR_Free\r
+Index: wnet.c\r
+===================================================================\r
+--- wnet.c     (rĂ©vision 70645)\r
++++ wnet.c     (copie de travail)\r
+@@ -750,7 +750,12 @@\r
+                              providerTable->table[index].dwEnumScopes & WNNC_ENUM_GLOBAL)\r
+                             {\r
+                                 HANDLE handle;\r
++                                PVOID RemoteName = lpNet->lpRemoteName;\r
\r
++                                if ((lpNet->dwUsage & RESOURCEUSAGE_CONTAINER) &&\r
++                                    RemoteName && !strcmpW(RemoteName, lpNet->lpProvider))\r
++                                    lpNet->lpRemoteName = NULL;\r
++\r
+                                 ret = providerTable->table[index].openEnum(\r
+                                  dwScope, dwType, dwUsage, lpNet, &handle);\r
+                                 if (ret == WN_SUCCESS)\r
+@@ -760,6 +765,8 @@\r
+                                     ret = *lphEnum ? WN_SUCCESS :\r
+                                      WN_OUT_OF_MEMORY;\r
+                                 }\r
++\r
++                                lpNet->lpRemoteName = RemoteName;\r
+                             }\r
+                             else\r
+                                 ret = WN_NOT_SUPPORTED;\r
+@@ -1553,6 +1553,33 @@\r
+                               dwFlags, NULL, 0, NULL);\r
+ }\r
\r
++/* Convert an ANSI string to wide */\r
++static LPWSTR strdupAtoW( LPCSTR str )\r
++{\r
++    LPWSTR ret;\r
++    INT len;\r
++\r
++    if (!str) return NULL;\r
++    len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );\r
++    ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );\r
++    if (ret) MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );\r
++    return ret;\r
++}\r
++\r
++/* Convert ANSI NETRESOURCE struct to wide structure */\r
++static VOID convert_netresourcea_to_w( LPNETRESOURCEA lpNetResourceA,\r
++                                       LPNETRESOURCEW lpNetResourceW )\r
++{\r
++    lpNetResourceW->dwScope = lpNetResourceA->dwScope;\r
++    lpNetResourceW->dwType = lpNetResourceA->dwType;\r
++    lpNetResourceW->dwDisplayType = lpNetResourceA->dwDisplayType;\r
++    lpNetResourceW->dwUsage = lpNetResourceA->dwUsage;\r
++    lpNetResourceW->lpLocalName = strdupAtoW(lpNetResourceA->lpLocalName);\r
++    lpNetResourceW->lpRemoteName = strdupAtoW(lpNetResourceA->lpRemoteName);\r
++    lpNetResourceW->lpComment = strdupAtoW(lpNetResourceA->lpComment);\r
++    lpNetResourceW->lpProvider = strdupAtoW(lpNetResourceA->lpProvider);\r
++}\r
++\r
+ /*****************************************************************\r
+  *  WNetUseConnectionA [MPR.@]\r
+  */\r
+@@ -1561,12 +1588,67 @@\r
+                                  LPSTR 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_a(lpUserID), dwFlags,\r
+-           debugstr_a(lpAccessName), lpBufferSize, lpResult );\r
++    NETRESOURCEW resourcesW, *pRes = NULL;\r
++    PWSTR passW, userIDW, accessNameW = NULL;\r
++    DWORD ret = WN_MORE_DATA;\r
++    DWORD bufferSize = 1;\r
++    int len;\r
\r
+-    SetLastError(WN_NO_NETWORK);\r
+-    return WN_NO_NETWORK;\r
++    if (lpNetResource)\r
++    {\r
++        convert_netresourcea_to_w(lpNetResource, &resourcesW);\r
++        pRes = &resourcesW;\r
++    }\r
++\r
++    passW = strdupAtoW(lpPassword);\r
++    userIDW = strdupAtoW(lpUserID);\r
++\r
++    if (lpAccessName && lpBufferSize && *lpBufferSize)\r
++    {\r
++        WCHAR probe;\r
++\r
++        ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags,\r
++                                 &probe, &bufferSize, lpResult);\r
++        if (ret == WN_MORE_DATA)\r
++            accessNameW = HeapAlloc(GetProcessHeap(), 0, bufferSize * sizeof(WCHAR));\r
++    }\r
++\r
++    if (ret == WN_MORE_DATA)\r
++    {\r
++        ret = WNetUseConnectionW(hwndOwner, pRes, passW, userIDW, dwFlags,\r
++                                 accessNameW, &bufferSize, lpResult);\r
++        if (ret == WN_SUCCESS)\r
++        {\r
++            if (lpAccessName && lpBufferSize && *lpBufferSize && accessNameW)\r
++            {\r
++                len = WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, NULL, 0, NULL, NULL);\r
++                if (len)\r
++                {\r
++                    if (len <= *lpBufferSize)\r
++                        WideCharToMultiByte(CP_ACP, 0, accessNameW, -1, lpAccessName, len, NULL, NULL);\r
++                    else\r
++                    {\r
++                        WNetCancelConnectionW(accessNameW, TRUE);\r
++                        *lpBufferSize = len;\r
++                       ret = WN_MORE_DATA;\r
++                    }\r
++                }\r
++            }\r
++        }\r
++    }\r
++\r
++    if (lpNetResource)\r
++    {\r
++        HeapFree(GetProcessHeap(), 0, resourcesW.lpLocalName);\r
++        HeapFree(GetProcessHeap(), 0, resourcesW.lpRemoteName);\r
++        HeapFree(GetProcessHeap(), 0, resourcesW.lpComment);\r
++        HeapFree(GetProcessHeap(), 0, resourcesW.lpProvider);\r
++    }\r
++    HeapFree(GetProcessHeap(), 0, passW);\r
++    HeapFree(GetProcessHeap(), 0, userIDW);\r
++    HeapFree(GetProcessHeap(), 0, accessNameW);\r
++\r
++    return ret;\r
+ }\r
\r
+ /*****************************************************************\r