[PATCH] netapi31: Add basic support for NetServerGetInfo

Jason Edmeades jason.edmeades at googlemail.com
Sun Jan 17 15:46:49 CST 2010


Based on code from NetWkstaGetInfo, and retrieves the basic system
information. Note the 'type' field is a little generic as there is
currently no concept of domain controllers, servers or workstation
so I used the most accurate value I could.

Jason
-------------- next part --------------
From 0282d84143017e34a9af289583963e8ba66fcf31 Mon Sep 17 00:00:00 2001
From: Jason Edmeades <jason.edmeades at googlemail.com>
Date: Sat, 16 Jan 2010 14:55:20 -0800
Subject: [PATCH] netapi31: Add basic support for NetServerGetInfo

Based on code from NetWkstaGetInfo, and retrieves the basic system
information. Note the 'type' field is a little generic as there is
currently no concept of domain controllers, servers or workstation
so I used the most accurate value I could.
---
 dlls/netapi32/netapi32.c |   57 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c
index 12218fc..6eeb794 100644
--- a/dlls/netapi32/netapi32.c
+++ b/dlls/netapi32/netapi32.c
@@ -26,6 +26,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(netbios);
 
 static HMODULE NETAPI32_hModule;
 
+BOOL NETAPI_IsLocalComputer(LMCSTR ServerName);
+
 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
     TRACE("%p,%x,%p\n", hinstDLL, fdwReason, lpvReserved);
@@ -97,8 +99,59 @@ NET_API_STATUS WINAPI NetServerEnumEx(
  */
 NET_API_STATUS WINAPI NetServerGetInfo(LMSTR servername, DWORD level, LPBYTE* bufptr)
 {
-    FIXME("stub (%s, %d, %p)\n", debugstr_w(servername), level, bufptr);
-    return ERROR_ACCESS_DENIED;
+    NET_API_STATUS ret;
+
+    TRACE("%s %d %p\n", debugstr_w( servername ), level, bufptr );
+    if (servername)
+    {
+        if (!NETAPI_IsLocalComputer(servername))
+        {
+            FIXME("remote computers not supported\n");
+            return ERROR_INVALID_LEVEL;
+        }
+    }
+    if (!bufptr) return ERROR_INVALID_PARAMETER;
+
+    switch (level)
+    {
+        case 100:
+        case 101:
+        {
+            DWORD computerNameLen, size;
+            WCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
+           
+            computerNameLen = MAX_COMPUTERNAME_LENGTH + 1;
+            GetComputerNameW(computerName, &computerNameLen);
+            computerNameLen++; /* include NULL terminator */
+
+            size = sizeof(SERVER_INFO_101) + computerNameLen * sizeof(WCHAR);
+            ret = NetApiBufferAllocate(size, (LPVOID *)bufptr);
+            if (ret == NERR_Success)
+            {
+                /* INFO_100 structure is a subset of INFO_101 */
+                PSERVER_INFO_101 info = (PSERVER_INFO_101)*bufptr;
+                OSVERSIONINFOW verInfo;
+
+                info->sv101_platform_id = PLATFORM_ID_NT;
+                info->sv101_name = (LMSTR)(*bufptr + sizeof(SERVER_INFO_101));
+                memcpy(info->sv101_name, computerName,
+                       computerNameLen * sizeof(WCHAR));
+                verInfo.dwOSVersionInfoSize = sizeof(verInfo);
+                GetVersionExW(&verInfo);
+                info->sv101_version_major = verInfo.dwMajorVersion;
+                info->sv101_version_minor = verInfo.dwMinorVersion;
+                 /* Use generic type as no wine equivalent of DC / Server */
+                info->sv101_type = SV_TYPE_NT;
+                info->sv101_comment = NULL;
+            }
+            break;
+        }
+
+        default:
+            FIXME("level %d unimplemented\n", level);
+            ret = ERROR_INVALID_LEVEL;
+    }
+    return ret;
 }
 
 
-- 
1.6.0.4


More information about the wine-patches mailing list