[2/4] netapi32: Add support for remote computers in NetWkstaGetInfo.
Hans Leidekker
hans at codeweavers.com
Wed Nov 13 08:34:29 CST 2013
---
dlls/netapi32/netapi32.c | 90 ++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 84 insertions(+), 6 deletions(-)
diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c
index e09c6ce..9ae040e 100644
--- a/dlls/netapi32/netapi32.c
+++ b/dlls/netapi32/netapi32.c
@@ -79,6 +79,7 @@ static DWORD (*plibnetapi_set_debuglevel)(void *, const char *);
static NET_API_STATUS (*pNetApiBufferAllocate)(unsigned int, void **);
static NET_API_STATUS (*pNetApiBufferFree)(void *);
static NET_API_STATUS (*pNetServerGetInfo)(const char *, unsigned int, unsigned char **);
+static NET_API_STATUS (*pNetWkstaGetInfo)(const char *, unsigned int, unsigned char **);
static BOOL libnetapi_init(void)
{
@@ -106,6 +107,7 @@ static BOOL libnetapi_init(void)
LOAD_FUNCPTR(NetApiBufferAllocate)
LOAD_FUNCPTR(NetApiBufferFree)
LOAD_FUNCPTR(NetServerGetInfo)
+ LOAD_FUNCPTR(NetWkstaGetInfo)
#undef LOAD_FUNCPTR
if ((status = plibnetapi_init( &libnetapi_ctx )))
@@ -202,6 +204,77 @@ static NET_API_STATUS server_getinfo( LMSTR servername, DWORD level, LPBYTE *buf
return status;
}
+struct wksta_info_100
+{
+ unsigned int wki100_platform_id;
+ const char *wki100_computername;
+ const char *wki100_langroup;
+ unsigned int wki100_ver_major;
+ unsigned int wki100_ver_minor;
+};
+
+static NET_API_STATUS wksta_info_100_from_samba( const unsigned char *buf, BYTE **bufptr )
+{
+ WKSTA_INFO_100 *ret;
+ struct wksta_info_100 *info = (struct wksta_info_100 *)buf;
+ DWORD len = 0;
+ WCHAR *ptr;
+
+ if (info->wki100_computername)
+ len += MultiByteToWideChar( CP_UNIXCP, 0, info->wki100_computername, -1, NULL, 0 );
+ if (info->wki100_langroup)
+ len += MultiByteToWideChar( CP_UNIXCP, 0, info->wki100_langroup, -1, NULL, 0 );
+ if (!(ret = HeapAlloc( GetProcessHeap(), 0, sizeof(*ret) + (len * sizeof(WCHAR) ))))
+ return ERROR_OUTOFMEMORY;
+
+ ptr = (WCHAR *)(ret + 1);
+ ret->wki100_platform_id = info->wki100_platform_id;
+ if (!info->wki100_computername) ret->wki100_computername = NULL;
+ else
+ {
+ ret->wki100_computername = ptr;
+ ptr += MultiByteToWideChar( CP_UNIXCP, 0, info->wki100_computername, -1, ptr, len );
+ }
+ if (!info->wki100_langroup) ret->wki100_langroup = NULL;
+ else
+ {
+ ret->wki100_langroup = ptr;
+ MultiByteToWideChar( CP_UNIXCP, 0, info->wki100_langroup, -1, ptr, len );
+ }
+ ret->wki100_ver_major = info->wki100_ver_major;
+ ret->wki100_ver_minor = info->wki100_ver_minor;
+ *bufptr = (BYTE *)ret;
+ return NERR_Success;
+}
+
+static NET_API_STATUS wksta_info_from_samba( DWORD level, const unsigned char *buf, BYTE **bufptr )
+{
+ switch (level)
+ {
+ case 100: return wksta_info_100_from_samba( buf, bufptr );
+ default:
+ FIXME( "level %u not supported\n", level );
+ return ERROR_NOT_SUPPORTED;
+ }
+}
+
+static NET_API_STATUS wksta_getinfo( LMSTR servername, DWORD level, LPBYTE *bufptr )
+{
+ NET_API_STATUS status;
+ char *wksta = NULL;
+ unsigned char *buf = NULL;
+
+ if (servername && !(wksta = strdup_unixcp( servername ))) return ERROR_OUTOFMEMORY;
+ status = pNetWkstaGetInfo( wksta, level, &buf );
+ HeapFree( GetProcessHeap(), 0, wksta );
+ if (!status)
+ {
+ status = wksta_info_from_samba( level, buf, bufptr );
+ pNetApiBufferFree( buf );
+ }
+ return status;
+}
+
#else
static BOOL libnetapi_init(void)
@@ -214,6 +287,11 @@ static NET_API_STATUS server_getinfo( LMSTR servername, DWORD level, LPBYTE *buf
ERR( "\n" );
return ERROR_NOT_SUPPORTED;
}
+static NET_API_STATUS wksta_getinfo( LMSTR servername, DWORD level, LPBYTE *bufptr )
+{
+ ERR( "\n" );
+ return ERROR_NOT_SUPPORTED;
+}
#endif /* SONAME_LIBNETAPI */
@@ -1015,15 +1093,15 @@ NET_API_STATUS WINAPI NetWkstaGetInfo( LMSTR servername, DWORD level,
LPBYTE* bufptr)
{
NET_API_STATUS ret;
+ BOOL local = NETAPI_IsLocalComputer( servername );
TRACE("%s %d %p\n", debugstr_w( servername ), level, bufptr );
- if (servername)
+
+ if (!local)
{
- if (!NETAPI_IsLocalComputer(servername))
- {
- FIXME("remote computers not supported\n");
- return ERROR_INVALID_LEVEL;
- }
+ if (libnetapi_init()) return wksta_getinfo( servername, level, bufptr );
+ FIXME( "remote computers not supported\n" );
+ return ERROR_INVALID_LEVEL;
}
if (!bufptr) return ERROR_INVALID_PARAMETER;
--
1.8.1.5
More information about the wine-patches
mailing list