From 84eb2fc0189442a17576d0ff9b3b92fbfce6676c Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 2 Jul 2017 18:29:38 +0000 Subject: [PATCH] [NETAPI32] - Add DsAddressToSiteNamesA stub. - Implement DsAddressToSiteNamesW. [SDK/INCLUDE] Add DsAddressToSiteNamesA/W and DsAddressToSiteNamesExA/W prototypes to dsgetdc.h. svn path=/trunk/; revision=75268 --- reactos/dll/win32/netapi32/netapi32.spec | 4 +- reactos/dll/win32/netapi32/netlogon.c | 87 ++++++++++++++++++++++++ reactos/sdk/include/psdk/dsgetdc.h | 34 +++++++++ 3 files changed, 123 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/netapi32/netapi32.spec b/reactos/dll/win32/netapi32/netapi32.spec index 3f2e1082a9a..d15fb14f678 100644 --- a/reactos/dll/win32/netapi32/netapi32.spec +++ b/reactos/dll/win32/netapi32/netapi32.spec @@ -1,8 +1,8 @@ @ stub CredpValidateTargetName -@ stub DsAddressToSiteNamesA +@ stdcall DsAddressToSiteNamesA(str long ptr str) @ stub DsAddressToSiteNamesExA @ stub DsAddressToSiteNamesExW -@ stub DsAddressToSiteNamesW +@ stdcall DsAddressToSiteNamesW(wstr long ptr wstr) @ stub DsDeregisterDnsHostRecordsA @ stub DsDeregisterDnsHostRecordsW 8 stdcall DsEnumerateDomainTrustsA(wstr long ptr ptr) diff --git a/reactos/dll/win32/netapi32/netlogon.c b/reactos/dll/win32/netapi32/netlogon.c index d68f8ed2f6c..f74372dd091 100644 --- a/reactos/dll/win32/netapi32/netlogon.c +++ b/reactos/dll/win32/netapi32/netlogon.c @@ -9,6 +9,7 @@ /* INCLUDES ******************************************************************/ #include "netapi32.h" +#include #include #include #include @@ -73,6 +74,92 @@ LOGONSRV_HANDLE_unbind(LOGONSRV_HANDLE pszSystemName, } +DWORD +WINAPI +DsAddressToSiteNamesA( + _In_opt_ LPCSTR ComputerName, + _In_ DWORD EntryCount, + _In_ PSOCKET_ADDRESS SocketAddresses, + _Out_ LPSTR **SiteNames) +{ + FIXME("DsAddressToSiteNamesA(%s, %lu, %p, %p)\n", + debugstr_a(ComputerName), EntryCount, SocketAddresses, SiteNames); + return ERROR_NO_LOGON_SERVERS; +} + + +DWORD +WINAPI +DsAddressToSiteNamesW( + _In_opt_ LPCWSTR ComputerName, + _In_ DWORD EntryCount, + _In_ PSOCKET_ADDRESS SocketAddresses, + _Out_ LPWSTR **SiteNames) +{ + PNL_SITE_NAME_ARRAY SiteNameArray = NULL; + PWSTR *SiteNamesBuffer = NULL, Ptr; + ULONG BufferSize, i; + NET_API_STATUS status; + + TRACE("DsAddressToSiteNamesW(%s, %lu, %p, %p)\n", + debugstr_w(ComputerName), EntryCount, SocketAddresses, SiteNames); + + if (EntryCount == 0) + return ERROR_INVALID_PARAMETER; + + *SiteNames = NULL; + + RpcTryExcept + { + status = DsrAddressToSiteNamesW((PWSTR)ComputerName, + EntryCount, + (PNL_SOCKET_ADDRESS)SocketAddresses, + &SiteNameArray); + if (status == NERR_Success) + { + if (SiteNameArray->EntryCount == 0) + { + status = ERROR_INVALID_PARAMETER; + } + else + { + BufferSize = SiteNameArray->EntryCount * sizeof(PWSTR); + for (i = 0; i < SiteNameArray->EntryCount; i++) + BufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR); + + status = NetApiBufferAllocate(BufferSize, (PVOID*)&SiteNamesBuffer); + if (status == NERR_Success) + { + ZeroMemory(SiteNamesBuffer, BufferSize); + + Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR)); + for (i = 0; i < SiteNameArray->EntryCount; i++) + { + SiteNamesBuffer[i] = Ptr; + CopyMemory(Ptr, + SiteNameArray->SiteNames[i].Buffer, + SiteNameArray->SiteNames[i].Length); + + Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR)); + } + + *SiteNames = SiteNamesBuffer; + } + } + + MIDL_user_free(SiteNameArray); + } + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + return status; +} + + DWORD WINAPI DsEnumerateDomainTrustsA( diff --git a/reactos/sdk/include/psdk/dsgetdc.h b/reactos/sdk/include/psdk/dsgetdc.h index 496b47110b2..9b4719ad20f 100644 --- a/reactos/sdk/include/psdk/dsgetdc.h +++ b/reactos/sdk/include/psdk/dsgetdc.h @@ -62,6 +62,36 @@ typedef struct _DS_DOMAIN_TRUSTSW GUID DomainGuid; } DS_DOMAIN_TRUSTSW, *PDS_DOMAIN_TRUSTSW; +DWORD WINAPI +DsAddressToSiteNamesA( + LPCSTR ComputerName, + DWORD EntryCount, + PSOCKET_ADDRESS SocketAddresses, + LPSTR **SiteNames); + +DWORD WINAPI +DsAddressToSiteNamesW( + LPCWSTR ComputerName, + DWORD EntryCount, + PSOCKET_ADDRESS SocketAddresses, + LPWSTR **SiteNames); + +DWORD WINAPI +DsAddressToSiteNamesExA( + LPCSTR ComputerName, + DWORD EntryCount, + PSOCKET_ADDRESS SocketAddresses, + LPSTR **SiteNames, + LPSTR **SubnetNames); + +DWORD WINAPI +DsAddressToSiteNamesExW( + LPCWSTR ComputerName, + DWORD EntryCount, + PSOCKET_ADDRESS SocketAddresses, + LPWSTR **SiteNames, + LPWSTR **SubnetNames); + DWORD WINAPI DsEnumerateDomainTrustsA( LPSTR ServerName, @@ -97,11 +127,15 @@ DsGetDcNameW( #ifdef UNICODE typedef DOMAIN_CONTROLLER_INFOW DOMAIN_CONTROLLER_INFO, *PDOMAIN_CONTROLLER_INFO; typedef DS_DOMAIN_TRUSTSW DS_DOMAIN_TRUSTS, *PDS_DOMAIN_TRUSTS; +#define DsAddressToSiteNames DsAddressToSiteNamesW +#define DsAddressToSiteNamesEx DsAddressToSiteNamesExW #define DsEnumerateDomainTrusts DsEnumerateDomainTrustsW #define DsGetDcName DsGetDcNameW #else typedef DOMAIN_CONTROLLER_INFOA DOMAIN_CONTROLLER_INFO, *PDOMAIN_CONTROLLER_INFO; typedef DS_DOMAIN_TRUSTSA DS_DOMAIN_TRUSTS, *PDS_DOMAIN_TRUSTS; +#define DsAddressToSiteNames DsAddressToSiteNamesA +#define DsAddressToSiteNamesEx DsAddressToSiteNamesExA #define DsEnumerateDomainTrusts DsEnumerateDomainTrustsA #define DsGetDcName DsGetDcNameA #endif -- 2.17.1