https://git.reactos.org/?p=reactos.git;a=commitdiff;h=87a4624e20b21d310b2f9…
commit 87a4624e20b21d310b2f9adcdb94970eea914676
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sat Feb 13 23:19:29 2021 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sat Feb 13 23:19:29 2021 +0100
[WKSSVC][NETAPI32] Implement NetrWkstaGetInfo and get rid of the old NetWkstaGetInfo
implementation
---
base/services/wkssvc/rpcserver.c | 140 ++++++++++++++++++++++++++++++++++++-
dll/win32/netapi32/wksta.c | 84 ----------------------
dll/win32/netapi32/wksta_new.c | 4 +-
sdk/include/reactos/idl/wkssvc.idl | 16 ++++-
4 files changed, 153 insertions(+), 91 deletions(-)
diff --git a/base/services/wkssvc/rpcserver.c b/base/services/wkssvc/rpcserver.c
index 79a062c8ecc..f80461c0608 100644
--- a/base/services/wkssvc/rpcserver.c
+++ b/base/services/wkssvc/rpcserver.c
@@ -83,11 +83,145 @@ __stdcall
NetrWkstaGetInfo(
WKSSVC_IDENTIFY_HANDLE ServerName,
unsigned long Level,
- LPWKSTA_INFO WkstaInfo)
-{
+ LPWKSTA_INFO *WkstaInfo)
+{
+ WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
+ DWORD dwComputerNameLength;
+ LPCWSTR pszLanRoot = L"";
+ PWKSTA_INFO pWkstaInfo = NULL;
+ OSVERSIONINFOW VersionInfo;
+ LSA_OBJECT_ATTRIBUTES ObjectAttributes;
+ LSA_HANDLE PolicyHandle;
+ PPOLICY_PRIMARY_DOMAIN_INFO DomainInfo = NULL;
+ NTSTATUS NtStatus;
+ DWORD dwResult = NERR_Success;
+
TRACE("NetrWkstaGetInfo level %lu\n", Level);
- return 0;
+ dwComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
+ GetComputerNameW(szComputerName, &dwComputerNameLength);
+ dwComputerNameLength++; /* include NULL terminator */
+
+ VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
+ GetVersionExW(&VersionInfo);
+
+ ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
+ NtStatus = LsaOpenPolicy(NULL,
+ &ObjectAttributes,
+ POLICY_VIEW_LOCAL_INFORMATION,
+ &PolicyHandle);
+ if (NtStatus != STATUS_SUCCESS)
+ {
+ WARN("LsaOpenPolicy() failed (Status 0x%08lx)\n", NtStatus);
+ return LsaNtStatusToWinError(NtStatus);
+ }
+
+ NtStatus = LsaQueryInformationPolicy(PolicyHandle,
+ PolicyPrimaryDomainInformation,
+ (PVOID*)&DomainInfo);
+
+ LsaClose(PolicyHandle);
+
+ if (NtStatus != STATUS_SUCCESS)
+ {
+ WARN("LsaQueryInformationPolicy() failed (Status 0x%08lx)\n",
NtStatus);
+ return LsaNtStatusToWinError(NtStatus);
+ }
+
+ switch (Level)
+ {
+ case 100:
+ pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_100));
+ if (pWkstaInfo == NULL)
+ {
+ dwResult = ERROR_NOT_ENOUGH_MEMORY;
+ break;
+ }
+
+ pWkstaInfo->WkstaInfo100.wki100_platform_id = PLATFORM_ID_NT;
+
+ pWkstaInfo->WkstaInfo100.wki100_computername =
midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo100.wki100_computername != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo100.wki100_computername, szComputerName);
+
+ pWkstaInfo->WkstaInfo100.wki100_langroup =
midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo100.wki100_langroup != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo100.wki100_langroup,
DomainInfo->Name.Buffer);
+
+ pWkstaInfo->WkstaInfo100.wki100_ver_major = VersionInfo.dwMajorVersion;
+ pWkstaInfo->WkstaInfo100.wki100_ver_minor = VersionInfo.dwMinorVersion;
+
+ *WkstaInfo = pWkstaInfo;
+ break;
+
+ case 101:
+ pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_101));
+ if (pWkstaInfo == NULL)
+ {
+ dwResult = ERROR_NOT_ENOUGH_MEMORY;
+ break;
+ }
+
+ pWkstaInfo->WkstaInfo101.wki101_platform_id = PLATFORM_ID_NT;
+
+ pWkstaInfo->WkstaInfo101.wki101_computername =
midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo101.wki101_computername != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo101.wki101_computername, szComputerName);
+
+ pWkstaInfo->WkstaInfo101.wki101_langroup =
midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo101.wki101_langroup != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo101.wki101_langroup,
DomainInfo->Name.Buffer);
+
+ pWkstaInfo->WkstaInfo101.wki101_ver_major = VersionInfo.dwMajorVersion;
+ pWkstaInfo->WkstaInfo101.wki101_ver_minor = VersionInfo.dwMinorVersion;
+
+ pWkstaInfo->WkstaInfo101.wki101_lanroot =
midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo101.wki101_lanroot != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo101.wki101_lanroot, pszLanRoot);
+
+ *WkstaInfo = pWkstaInfo;
+ break;
+
+ case 102:
+ pWkstaInfo = midl_user_allocate(sizeof(WKSTA_INFO_102));
+ if (pWkstaInfo == NULL)
+ {
+ dwResult = ERROR_NOT_ENOUGH_MEMORY;
+ break;
+ }
+
+ pWkstaInfo->WkstaInfo102.wki102_platform_id = PLATFORM_ID_NT;
+
+ pWkstaInfo->WkstaInfo102.wki102_computername =
midl_user_allocate(dwComputerNameLength * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo102.wki102_computername != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo102.wki102_computername, szComputerName);
+
+ pWkstaInfo->WkstaInfo102.wki102_langroup =
midl_user_allocate((wcslen(DomainInfo->Name.Buffer) + 1) * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo102.wki102_langroup != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo102.wki102_langroup,
DomainInfo->Name.Buffer);
+
+ pWkstaInfo->WkstaInfo102.wki102_ver_major = VersionInfo.dwMajorVersion;
+ pWkstaInfo->WkstaInfo102.wki102_ver_minor = VersionInfo.dwMinorVersion;
+
+ pWkstaInfo->WkstaInfo102.wki102_lanroot =
midl_user_allocate((wcslen(pszLanRoot) + 1) * sizeof(WCHAR));
+ if (pWkstaInfo->WkstaInfo102.wki102_lanroot != NULL)
+ wcscpy(pWkstaInfo->WkstaInfo102.wki102_lanroot, pszLanRoot);
+
+ pWkstaInfo->WkstaInfo102.wki102_logged_on_users = 1; /* FIXME */
+
+ *WkstaInfo = pWkstaInfo;
+ break;
+
+ default:
+ FIXME("Level %d unimplemented\n", Level);
+ dwResult = ERROR_INVALID_LEVEL;
+ break;
+ }
+
+ if (DomainInfo != NULL)
+ LsaFreeMemory(DomainInfo);
+
+ return dwResult;
}
diff --git a/dll/win32/netapi32/wksta.c b/dll/win32/netapi32/wksta.c
index 9200b17aaa0..af835f20f3a 100644
--- a/dll/win32/netapi32/wksta.c
+++ b/dll/win32/netapi32/wksta.c
@@ -468,87 +468,3 @@ NET_API_STATUS WINAPI I_NetNameValidate(LPVOID p1, LPWSTR wkgrp,
LPVOID p3,
FIXME("(%p %s %p %p): stub\n", p1, debugstr_w(wkgrp), p3, p4);
return ERROR_INVALID_PARAMETER;
}
-
-NET_API_STATUS WINAPI NetWkstaGetInfo( LMSTR servername, DWORD level,
- LPBYTE* bufptr)
-{
- 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:
- case 102:
- {
- static const WCHAR lanroot[] =
{'c',':','\\','l','a','n','m','a','n',0};
/* FIXME */
- DWORD computerNameLen, domainNameLen, size;
- WCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
- LSA_OBJECT_ATTRIBUTES ObjectAttributes;
- LSA_HANDLE PolicyHandle;
- NTSTATUS NtStatus;
-
- computerNameLen = MAX_COMPUTERNAME_LENGTH + 1;
- GetComputerNameW(computerName, &computerNameLen);
- computerNameLen++; /* include NULL terminator */
-
- ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
- NtStatus = LsaOpenPolicy(NULL, &ObjectAttributes,
- POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle);
- if (NtStatus != STATUS_SUCCESS)
- ret = LsaNtStatusToWinError(NtStatus);
- else
- {
- PPOLICY_PRIMARY_DOMAIN_INFO DomainInfo;
-
- LsaQueryInformationPolicy(PolicyHandle,
- PolicyPrimaryDomainInformation, (PVOID*)&DomainInfo);
- domainNameLen = lstrlenW(DomainInfo->Name.Buffer) + 1;
- size = sizeof(WKSTA_INFO_102) + computerNameLen * sizeof(WCHAR)
- + domainNameLen * sizeof(WCHAR) + sizeof(lanroot);
- ret = NetApiBufferAllocate(size, (LPVOID *)bufptr);
- if (ret == NERR_Success)
- {
- /* INFO_100 and INFO_101 structures are subsets of INFO_102 */
- PWKSTA_INFO_102 info = (PWKSTA_INFO_102)*bufptr;
- OSVERSIONINFOW verInfo;
-
- info->wki102_platform_id = PLATFORM_ID_NT;
- info->wki102_computername = (LMSTR)(*bufptr +
- sizeof(WKSTA_INFO_102));
- memcpy(info->wki102_computername, computerName,
- computerNameLen * sizeof(WCHAR));
- info->wki102_langroup = info->wki102_computername +
computerNameLen;
- memcpy(info->wki102_langroup, DomainInfo->Name.Buffer,
- domainNameLen * sizeof(WCHAR));
- info->wki102_lanroot = info->wki102_langroup + domainNameLen;
- memcpy(info->wki102_lanroot, lanroot, sizeof(lanroot));
- memset(&verInfo, 0, sizeof(verInfo));
- verInfo.dwOSVersionInfoSize = sizeof(verInfo);
- GetVersionExW(&verInfo);
- info->wki102_ver_major = verInfo.dwMajorVersion;
- info->wki102_ver_minor = verInfo.dwMinorVersion;
- info->wki102_logged_on_users = 1;
- }
- LsaFreeMemory(DomainInfo);
- LsaClose(PolicyHandle);
- }
- break;
- }
-
- default:
- FIXME("level %d unimplemented\n", level);
- ret = ERROR_INVALID_LEVEL;
- }
- return ret;
-}
diff --git a/dll/win32/netapi32/wksta_new.c b/dll/win32/netapi32/wksta_new.c
index 4bc96d01dbd..0c84a23f20f 100644
--- a/dll/win32/netapi32/wksta_new.c
+++ b/dll/win32/netapi32/wksta_new.c
@@ -856,7 +856,6 @@ NetValidateName(
}
-#if 0
NET_API_STATUS
WINAPI
NetWkstaGetInfo(
@@ -878,7 +877,7 @@ NetWkstaGetInfo(
{
status = NetrWkstaGetInfo(servername,
level,
- (LPWKSTA_INFO)bufptr);
+ (LPWKSTA_INFO*)bufptr);
}
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
{
@@ -888,7 +887,6 @@ NetWkstaGetInfo(
return status;
}
-#endif
NET_API_STATUS
diff --git a/sdk/include/reactos/idl/wkssvc.idl b/sdk/include/reactos/idl/wkssvc.idl
index 3f960f63725..b4cac96edd3 100644
--- a/sdk/include/reactos/idl/wkssvc.idl
+++ b/sdk/include/reactos/idl/wkssvc.idl
@@ -198,6 +198,7 @@ typedef struct _WKSTA_TRANSPORT_INFO_0
unsigned long wkti0_wan_ish;
} WKSTA_TRANSPORT_INFO_0, *PWKSTA_TRANSPORT_INFO_0, *LPWKSTA_TRANSPORT_INFO_0;
+/*
typedef [switch_type(unsigned long)] union _WKSTA_INFO
{
[case(100)] LPWKSTA_INFO_100 WkstaInfo100;
@@ -209,6 +210,18 @@ typedef [switch_type(unsigned long)] union _WKSTA_INFO
[case(1046)] LPWKSTA_INFO_1046 WkstaInfo1046;
[default] ;
} WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO;
+*/
+typedef [switch_type(unsigned long)] union _WKSTA_INFO
+{
+ [case(100)] WKSTA_INFO_100 WkstaInfo100;
+ [case(101)] WKSTA_INFO_101 WkstaInfo101;
+ [case(102)] WKSTA_INFO_102 WkstaInfo102;
+ [case(502)] WKSTA_INFO_502 WkstaInfo502;
+ [case(1013)] WKSTA_INFO_1013 WkstaInfo1013;
+ [case(1018)] WKSTA_INFO_1018 WkstaInfo1018;
+ [case(1046)] WKSTA_INFO_1046 WkstaInfo1046;
+ [default] ;
+} WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO;
typedef struct _USE_INFO_0
{
@@ -366,7 +379,8 @@ interface wkssvc
NetrWkstaGetInfo(
[in, string, unique] WKSSVC_IDENTIFY_HANDLE ServerName,
[in] unsigned long Level,
- [out, switch_is(Level)] LPWKSTA_INFO WkstaInfo);
+ [out, switch_is(Level)] LPWKSTA_INFO *WkstaInfo);
+// [out, switch_is(Level)] LPWKSTA_INFO WkstaInfo);
/* Function 1 */
unsigned long