Forward WNetGetUniversalNameA to WNetGetUniversalNameW
Maarten Lankhorst
m.b.lankhorst at gmail.com
Mon May 21 15:40:59 CDT 2007
Unstub it by forwarding it to wide version.
-------------- next part --------------
>From d6b17583ffde951be159343c831ea8cd8eeebd88 Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Mon, 21 May 2007 20:11:50 +0200
Subject: [PATCH] mpr: Forward WNetGetUniversalNameA to WNetGetUniversalNameW
---
dlls/mpr/wnet.c | 75 ++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 53 insertions(+), 22 deletions(-)
diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 8999b74..356bf14 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -3,6 +3,7 @@
*
* Copyright 1999 Ulrich Weigand
* Copyright 2004 Juan Lang
+ * Copyright 2007 Maarten Lankhorst
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1701,37 +1702,67 @@ DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
LPVOID lpBuffer, LPDWORD lpBufferSize )
{
DWORD err, size;
+ LPWSTR wLocalPath = NULL;
+ LPVOID wlpBuffer = NULL;
+ DWORD structsize;
- FIXME( "(%s, 0x%08X, %p, %p): stub\n",
+ switch (dwInfoLevel)
+ {
+ 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;
+ }
+
+ TRACE( "(%s, 0x%08X, %p, %p)\n",
debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
- switch (dwInfoLevel)
+ if (*lpBufferSize <= structsize)
{
- case UNIVERSAL_NAME_INFO_LEVEL:
+ err = WN_MORE_DATA;
+ goto err;
+ }
+
+ size = (*lpBufferSize - structsize) * sizeof(WCHAR);
+ size += structsize;
+
+ wlpBuffer = HeapAlloc(GetProcessHeap(), 0, size);
+ wLocalPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenA(lpLocalPath) + 1) * sizeof(WCHAR));
+ if (!wLocalPath || !wlpBuffer)
{
- LPUNIVERSAL_NAME_INFOA info = (LPUNIVERSAL_NAME_INFOA)lpBuffer;
+ err = WN_OUT_OF_MEMORY;
+ goto err;
+ }
- size = sizeof(*info) + lstrlenA(lpLocalPath) + 1;
- if (*lpBufferSize < size)
- {
- err = WN_MORE_DATA;
+ MultiByteToWideChar(CP_ACP, 0, lpLocalPath, -1, wLocalPath, -1);
+ 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, -1, 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));
+ WideCharToMultiByte(CP_ACP, 0, wInfo->lpUniversalName, -1, aInfo->lpUniversalName, -1, NULL, NULL);
+ aInfo->lpConnectionName = (LPVOID)((DWORD_PTR)aInfo->lpUniversalName + 1 + strlenW(wInfo->lpUniversalName));
+ WideCharToMultiByte(CP_ACP, 0, wInfo->lpConnectionName, -1, aInfo->lpConnectionName, -1, NULL, NULL);
+ aInfo->lpRemainingPath = (LPVOID)((DWORD_PTR)aInfo->lpConnectionName + 1 + strlenW(wInfo->lpConnectionName));
+ WideCharToMultiByte(CP_ACP, 0, wInfo->lpRemainingPath, -1, aInfo->lpRemainingPath, -1, NULL, NULL);
+ }
}
- 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;
-
- default:
- err = WN_BAD_VALUE;
- break;
- }
+ 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