mpr: Forward WNetGetUniversalNameA to WNetGetUniversalNameA, try 2

Maarten Lankhorst m.b.lankhorst at gmail.com
Tue May 22 14:55:51 CDT 2007


With some fixes regarding pointer checking and size used.
-------------- next part --------------
>From e7ac67d8746bc27465f2a2fe2ad5cc4337bc1beb Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Tue, 22 May 2007 21:45:17 +0200
Subject: [PATCH] mpr: Forward WNetGetUniversalNameA to WNetGetUniversalNameW

---
 dlls/mpr/wnet.c |   82 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 63 insertions(+), 19 deletions(-)

diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 09d125c..371f192 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -1710,38 +1710,82 @@ DWORD WINAPI WNetSetConnectionW( LPCWSTR lpName, DWORD dwProperty,
 DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
 {
-    DWORD err, size;
+    DWORD err, size, len;
+    LPWSTR wLocalPath = NULL;
+    LPVOID wlpBuffer = NULL;
+    DWORD structsize;
 
-    FIXME( "(%s, 0x%08X, %p, %p): stub\n",
+    TRACE( "(%s, 0x%08X, %p, %p)\n",
            debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
 
     switch (dwInfoLevel)
     {
-    case UNIVERSAL_NAME_INFO_LEVEL:
+    case REMOTE_NAME_INFO_LEVEL: structsize = sizeof(UNIVERSAL_NAME_INFOA); break;
+    case UNIVERSAL_NAME_INFO_LEVEL: structsize = sizeof(REMOTE_NAME_INFOA); break;
+    default:
+        FIXME("Unhandled dwInfoLevel %d\n", dwInfoLevel);
+        err = WN_BAD_VALUE;
+        goto err;
+    }
+
+    if (!lpLocalPath || !lpBufferSize || (!lpBuffer && *lpBufferSize))
     {
-        LPUNIVERSAL_NAME_INFOA info = (LPUNIVERSAL_NAME_INFOA)lpBuffer;
+        err = WN_BAD_POINTER;
+        goto err;
+    }
 
-        size = sizeof(*info) + lstrlenA(lpLocalPath) + 1;
-        if (*lpBufferSize < size)
+    if (*lpBufferSize > structsize)
+    {
+        size = (*lpBufferSize - structsize) * sizeof(WCHAR);
+        size += structsize;
+        wlpBuffer = HeapAlloc(GetProcessHeap(), 0, size);
+        if (!wlpBuffer)
         {
-            err = WN_MORE_DATA;
-            break;
+            err = WN_OUT_OF_MEMORY;
+            goto err;
         }
-        info->lpUniversalName = (char *)info + sizeof(*info);
-        lstrcpyA(info->lpUniversalName, lpLocalPath);
-        *lpBufferSize = size;
-        err = WN_NO_ERROR;
-        break;
     }
-    case REMOTE_NAME_INFO_LEVEL:
-        err = WN_NO_NETWORK;
-        break;
+    else *lpBufferSize = size = 0;
 
-    default:
-        err = WN_BAD_VALUE;
-        break;
+    len = lstrlenA(lpLocalPath) + 1;
+    wLocalPath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+    if (!wLocalPath)
+    {
+        err = WN_OUT_OF_MEMORY;
+        goto err;
     }
 
+    MultiByteToWideChar(CP_ACP, 0, lpLocalPath, -1, wLocalPath, len*sizeof(WCHAR));
+    err = WNetGetUniversalNameW(wLocalPath, dwInfoLevel, wlpBuffer, &size);
+    if (err == WN_NO_ERROR)
+        switch (dwInfoLevel) {
+        case UNIVERSAL_NAME_INFO_LEVEL: {
+            LPUNIVERSAL_NAME_INFOA aInfo = lpBuffer;
+            LPUNIVERSAL_NAME_INFOW wInfo = wlpBuffer;
+            aInfo->lpUniversalName = (LPVOID)((DWORD_PTR)aInfo + sizeof(*aInfo));
+            WideCharToMultiByte(CP_ACP, 0, wInfo->lpUniversalName, -1, aInfo->lpUniversalName, *lpBufferSize - sizeof(*aInfo), NULL, NULL);
+            *lpBufferSize = sizeof(*aInfo) + strlenW(wInfo->lpUniversalName) + 1;
+            break;
+            }
+        case REMOTE_NAME_INFO_LEVEL: {
+            LPREMOTE_NAME_INFOA aInfo = lpBuffer;
+            LPREMOTE_NAME_INFOW wInfo = wlpBuffer;
+            aInfo->lpUniversalName = (LPVOID)((DWORD_PTR)aInfo + sizeof(*aInfo));
+            size = *lpBufferSize - sizeof(*aInfo);
+            size -= WideCharToMultiByte(CP_ACP, 0, wInfo->lpUniversalName, -1, aInfo->lpUniversalName, size, NULL, NULL);
+            aInfo->lpConnectionName = (LPVOID)((DWORD_PTR)aInfo->lpUniversalName + 1 + strlenW(wInfo->lpUniversalName));
+            size -= WideCharToMultiByte(CP_ACP, 0, wInfo->lpConnectionName, -1, aInfo->lpConnectionName, size, NULL, NULL);
+            aInfo->lpRemainingPath = (LPVOID)((DWORD_PTR)aInfo->lpConnectionName + 1 + strlenW(wInfo->lpConnectionName));
+            size -= WideCharToMultiByte(CP_ACP, 0, wInfo->lpRemainingPath, -1, aInfo->lpRemainingPath, size, NULL, NULL);
+            *lpBufferSize -= size;
+            }
+        }
+    else if (err == WN_MORE_DATA)
+        *lpBufferSize = structsize + (size - structsize)/sizeof(WCHAR);
+
+    err:
+    HeapFree(GetProcessHeap(), 0, wLocalPath);
+    HeapFree(GetProcessHeap(), 0, wlpBuffer);
     SetLastError(err);
     return err;
 }
-- 
1.4.4.2



More information about the wine-patches mailing list