https://git.reactos.org/?p=reactos.git;a=commitdiff;h=87a4624e20b21d310b2f9a...
commit 87a4624e20b21d310b2f9adcdb94970eea914676 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sat Feb 13 23:19:29 2021 +0100 Commit: Eric Kohl eric.kohl@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