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