mpr: Implement WNetGetUniversalNameW using WNetGetConnectionW, try 2
Maarten Lankhorst
m.b.lankhorst at gmail.com
Tue May 22 15:00:26 CDT 2007
Try 2
-------------- next part --------------
>From 2fa726a1fc50817259b6114fa77a4e1d2334798b Mon Sep 17 00:00:00 2001
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Tue, 22 May 2007 21:59:28 +0200
Subject: [PATCH] mpr: Implement WNetGetUniversalNameW using WNetGetConnectionW
---
dlls/mpr/wnet.c | 92 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 70 insertions(+), 22 deletions(-)
diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c
index 371f192..0a88af7 100644
--- a/dlls/mpr/wnet.c
+++ b/dlls/mpr/wnet.c
@@ -1796,38 +1796,86 @@ DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel,
LPVOID lpBuffer, LPDWORD lpBufferSize )
{
- DWORD err, size;
+ DWORD err, size, nsize, bufsize;
+ LPWSTR fullName = NULL;
+ WCHAR station[] = { 'A', ':', 0 };
- FIXME( "(%s, 0x%08X, %p, %p): stub\n",
+ TRACE( "(%s, 0x%08X, %p, %p)\n",
debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
- switch (dwInfoLevel)
+ if (!lpBufferSize || !lpLocalPath || (!lpBuffer && *lpBufferSize))
{
- case UNIVERSAL_NAME_INFO_LEVEL:
- {
- LPUNIVERSAL_NAME_INFOW info = (LPUNIVERSAL_NAME_INFOW)lpBuffer;
+ err = WN_BAD_POINTER;
+ goto err;
+ }
- size = sizeof(*info) + (lstrlenW(lpLocalPath) + 1) * sizeof(WCHAR);
- if (*lpBufferSize < size)
- {
- err = WN_MORE_DATA;
- break;
- }
- info->lpUniversalName = (LPWSTR)((char *)info + sizeof(*info));
- lstrcpyW(info->lpUniversalName, lpLocalPath);
- *lpBufferSize = size;
- err = WN_NO_ERROR;
- break;
+ if (!lpLocalPath[0] || lpLocalPath[1] != ':')
+ {
+ err = WN_BAD_LOCALNAME;
+ goto err;
}
- case REMOTE_NAME_INFO_LEVEL:
- err = WN_NO_NETWORK;
- break;
- default:
+ station[0] = lpLocalPath[0];
+
+ if (dwInfoLevel == UNIVERSAL_NAME_INFO_LEVEL) {
+ LPUNIVERSAL_NAME_INFOW info = lpBuffer;
+ size = sizeof(*info);
+
+ if (*lpBufferSize > size)
+ fullName = info->lpUniversalName = (LPVOID)((DWORD_PTR)info + size);
+ } else if (dwInfoLevel == REMOTE_NAME_INFO_LEVEL) {
+ LPREMOTE_NAME_INFOW info = lpBuffer;
+ size = sizeof(*info);
+
+ if (*lpBufferSize > size)
+ fullName = info->lpUniversalName = (LPVOID)((DWORD_PTR)info + size);
+ } else {
+ FIXME("Unhandled dwInfoLevel %d\n", dwInfoLevel);
err = WN_BAD_VALUE;
- break;
+ goto err;
}
+ if (fullName)
+ nsize = *lpBufferSize - size;
+ else
+ nsize = 0;
+
+ /* Determine if it's a local path or not */
+ err = WNetGetConnectionW(station, fullName, &nsize);
+
+ /* Append local path to nsize */
+ nsize += sizeof(WCHAR) * strlenW(&lpLocalPath[2]);
+
+ /* Calculate buffer size and set it */
+ bufsize = size + nsize;
+ if (dwInfoLevel == REMOTE_NAME_INFO_LEVEL)
+ bufsize += nsize + sizeof(WCHAR);
+ if (*lpBufferSize < bufsize)
+ err = WN_MORE_DATA;
+ *lpBufferSize = bufsize;
+ if (err == WN_MORE_DATA)
+ goto err;
+
+ if (dwInfoLevel == REMOTE_NAME_INFO_LEVEL) {
+ LPREMOTE_NAME_INFOW info = lpBuffer;
+ if (err != WN_SUCCESS)
+ goto err;
+
+ strcpyW(info->lpConnectionName, fullName);
+ strcpyW(info->lpRemainingPath, &lpLocalPath[2]);
+ }
+
+ if (err == WN_SUCCESS) {
+ strcpyW(&fullName[strlenW(fullName)], &lpLocalPath[2]);
+ }
+ else if (err == WN_NOT_CONNECTED) {
+ err = WN_SUCCESS;
+ strcpyW(fullName, lpLocalPath);
+ }
+
+ TRACE("Returning path %s\n", debugstr_w(fullName));
+
+ err:
SetLastError(err);
return err;
}
--
1.4.4.2
More information about the wine-patches
mailing list