1c2c66affSColin Finck /* 2c2c66affSColin Finck * COPYRIGHT: See COPYING in the top level directory 3c2c66affSColin Finck * PROJECT: NetAPI DLL 4c2c66affSColin Finck * FILE: dll/win32/netapi32/netlogon.c 5c2c66affSColin Finck * PURPOSE: Netlogon service interface code 6c2c66affSColin Finck * PROGRAMMERS: Eric Kohl (eric.kohl@reactos.org) 7c2c66affSColin Finck */ 8c2c66affSColin Finck 9c2c66affSColin Finck /* INCLUDES ******************************************************************/ 10c2c66affSColin Finck 11c2c66affSColin Finck #include "netapi32.h" 12c2c66affSColin Finck #include <winsock2.h> 13c2c66affSColin Finck #include <rpc.h> 14c2c66affSColin Finck #include <dsrole.h> 15c2c66affSColin Finck #include <dsgetdc.h> 16c2c66affSColin Finck #include "netlogon_c.h" 17c2c66affSColin Finck 18c2c66affSColin Finck WINE_DEFAULT_DEBUG_CHANNEL(netapi32); 19c2c66affSColin Finck 2057d48a7fSEric Kohl DWORD 2157d48a7fSEric Kohl WINAPI 2257d48a7fSEric Kohl DsGetDcNameWithAccountA( 2357d48a7fSEric Kohl _In_opt_ LPCSTR ComputerName, 2457d48a7fSEric Kohl _In_opt_ LPCSTR AccountName, 2557d48a7fSEric Kohl _In_ ULONG AccountControlBits, 2657d48a7fSEric Kohl _In_ LPCSTR DomainName, 2757d48a7fSEric Kohl _In_ GUID *DomainGuid, 2857d48a7fSEric Kohl _In_ LPCSTR SiteName, 2957d48a7fSEric Kohl _In_ ULONG Flags, 3057d48a7fSEric Kohl _Out_ PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo); 3157d48a7fSEric Kohl 3257d48a7fSEric Kohl DWORD 3357d48a7fSEric Kohl WINAPI 3457d48a7fSEric Kohl DsGetDcNameWithAccountW( 35adceb380SEric Kohl _In_opt_ LPCWSTR ComputerName, 3657d48a7fSEric Kohl _In_opt_ LPCWSTR AccountName, 3757d48a7fSEric Kohl _In_ ULONG AccountControlBits, 3857d48a7fSEric Kohl _In_ LPCWSTR DomainName, 3957d48a7fSEric Kohl _In_ GUID *DomainGuid, 4057d48a7fSEric Kohl _In_ LPCWSTR SiteName, 4157d48a7fSEric Kohl _In_ ULONG Flags, 4257d48a7fSEric Kohl _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo); 4357d48a7fSEric Kohl 44c2c66affSColin Finck /* FUNCTIONS *****************************************************************/ 45c2c66affSColin Finck 46c2c66affSColin Finck handle_t 47c2c66affSColin Finck __RPC_USER 48c2c66affSColin Finck LOGONSRV_HANDLE_bind( 49c2c66affSColin Finck LOGONSRV_HANDLE pszSystemName) 50c2c66affSColin Finck { 51c2c66affSColin Finck handle_t hBinding = NULL; 52c2c66affSColin Finck LPWSTR pszStringBinding; 53c2c66affSColin Finck RPC_STATUS status; 54c2c66affSColin Finck 55c2c66affSColin Finck TRACE("LOGONSRV_HANDLE_bind() called\n"); 56c2c66affSColin Finck 57c2c66affSColin Finck status = RpcStringBindingComposeW(NULL, 58c2c66affSColin Finck L"ncacn_np", 59c2c66affSColin Finck pszSystemName, 60c2c66affSColin Finck L"\\pipe\\netlogon", 61c2c66affSColin Finck NULL, 62c2c66affSColin Finck &pszStringBinding); 63c2c66affSColin Finck if (status) 64c2c66affSColin Finck { 65c2c66affSColin Finck TRACE("RpcStringBindingCompose returned 0x%x\n", status); 66c2c66affSColin Finck return NULL; 67c2c66affSColin Finck } 68c2c66affSColin Finck 69c2c66affSColin Finck /* Set the binding handle that will be used to bind to the server. */ 70c2c66affSColin Finck status = RpcBindingFromStringBindingW(pszStringBinding, 71c2c66affSColin Finck &hBinding); 72c2c66affSColin Finck if (status) 73c2c66affSColin Finck { 74c2c66affSColin Finck TRACE("RpcBindingFromStringBinding returned 0x%x\n", status); 75c2c66affSColin Finck } 76c2c66affSColin Finck 77c2c66affSColin Finck status = RpcStringFreeW(&pszStringBinding); 78c2c66affSColin Finck if (status) 79c2c66affSColin Finck { 80c2c66affSColin Finck // TRACE("RpcStringFree returned 0x%x\n", status); 81c2c66affSColin Finck } 82c2c66affSColin Finck 83c2c66affSColin Finck return hBinding; 84c2c66affSColin Finck } 85c2c66affSColin Finck 86c2c66affSColin Finck 87c2c66affSColin Finck void 88c2c66affSColin Finck __RPC_USER 89c2c66affSColin Finck LOGONSRV_HANDLE_unbind( 90c2c66affSColin Finck LOGONSRV_HANDLE pszSystemName, 91c2c66affSColin Finck handle_t hBinding) 92c2c66affSColin Finck { 93c2c66affSColin Finck RPC_STATUS status; 94c2c66affSColin Finck 95c2c66affSColin Finck TRACE("LOGONSRV_HANDLE_unbind() called\n"); 96c2c66affSColin Finck 97c2c66affSColin Finck status = RpcBindingFree(&hBinding); 98c2c66affSColin Finck if (status) 99c2c66affSColin Finck { 100c2c66affSColin Finck TRACE("RpcBindingFree returned 0x%x\n", status); 101c2c66affSColin Finck } 102c2c66affSColin Finck } 103c2c66affSColin Finck 104c2c66affSColin Finck 105c2c66affSColin Finck /* PUBLIC FUNCTIONS **********************************************************/ 106c2c66affSColin Finck 107c2c66affSColin Finck DWORD 108c2c66affSColin Finck WINAPI 109c2c66affSColin Finck DsAddressToSiteNamesA( 110c2c66affSColin Finck _In_opt_ LPCSTR ComputerName, 111c2c66affSColin Finck _In_ DWORD EntryCount, 112c2c66affSColin Finck _In_ PSOCKET_ADDRESS SocketAddresses, 113c2c66affSColin Finck _Out_ LPSTR **SiteNames) 114c2c66affSColin Finck { 115c2c66affSColin Finck FIXME("DsAddressToSiteNamesA(%s, %lu, %p, %p)\n", 116c2c66affSColin Finck debugstr_a(ComputerName), EntryCount, SocketAddresses, SiteNames); 117c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 118c2c66affSColin Finck } 119c2c66affSColin Finck 120c2c66affSColin Finck 121c2c66affSColin Finck DWORD 122c2c66affSColin Finck WINAPI 123c2c66affSColin Finck DsAddressToSiteNamesW( 124c2c66affSColin Finck _In_opt_ LPCWSTR ComputerName, 125c2c66affSColin Finck _In_ DWORD EntryCount, 126c2c66affSColin Finck _In_ PSOCKET_ADDRESS SocketAddresses, 127c2c66affSColin Finck _Out_ LPWSTR **SiteNames) 128c2c66affSColin Finck { 129c2c66affSColin Finck PNL_SITE_NAME_ARRAY SiteNameArray = NULL; 130c2c66affSColin Finck PWSTR *SiteNamesBuffer = NULL, Ptr; 131c2c66affSColin Finck ULONG BufferSize, i; 132c2c66affSColin Finck NET_API_STATUS status; 133c2c66affSColin Finck 134c2c66affSColin Finck TRACE("DsAddressToSiteNamesW(%s, %lu, %p, %p)\n", 135c2c66affSColin Finck debugstr_w(ComputerName), EntryCount, SocketAddresses, SiteNames); 136c2c66affSColin Finck 137c2c66affSColin Finck if (EntryCount == 0) 138c2c66affSColin Finck return ERROR_INVALID_PARAMETER; 139c2c66affSColin Finck 140c2c66affSColin Finck *SiteNames = NULL; 141c2c66affSColin Finck 142c2c66affSColin Finck RpcTryExcept 143c2c66affSColin Finck { 144c2c66affSColin Finck status = DsrAddressToSiteNamesW((PWSTR)ComputerName, 145c2c66affSColin Finck EntryCount, 146c2c66affSColin Finck (PNL_SOCKET_ADDRESS)SocketAddresses, 147c2c66affSColin Finck &SiteNameArray); 148c2c66affSColin Finck if (status == NERR_Success) 149c2c66affSColin Finck { 150c2c66affSColin Finck if (SiteNameArray->EntryCount == 0) 151c2c66affSColin Finck { 152c2c66affSColin Finck status = ERROR_INVALID_PARAMETER; 153c2c66affSColin Finck } 154c2c66affSColin Finck else 155c2c66affSColin Finck { 156c2c66affSColin Finck BufferSize = SiteNameArray->EntryCount * sizeof(PWSTR); 157c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 158c2c66affSColin Finck BufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR); 159c2c66affSColin Finck 160c2c66affSColin Finck status = NetApiBufferAllocate(BufferSize, (PVOID*)&SiteNamesBuffer); 161c2c66affSColin Finck if (status == NERR_Success) 162c2c66affSColin Finck { 163c2c66affSColin Finck ZeroMemory(SiteNamesBuffer, BufferSize); 164c2c66affSColin Finck 165c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR)); 166c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 167c2c66affSColin Finck { 168c2c66affSColin Finck SiteNamesBuffer[i] = Ptr; 169c2c66affSColin Finck CopyMemory(Ptr, 170c2c66affSColin Finck SiteNameArray->SiteNames[i].Buffer, 171c2c66affSColin Finck SiteNameArray->SiteNames[i].Length); 172c2c66affSColin Finck 173c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR)); 174c2c66affSColin Finck } 175c2c66affSColin Finck 176c2c66affSColin Finck *SiteNames = SiteNamesBuffer; 177c2c66affSColin Finck } 178c2c66affSColin Finck } 179c2c66affSColin Finck 180c2c66affSColin Finck MIDL_user_free(SiteNameArray); 181c2c66affSColin Finck } 182c2c66affSColin Finck } 183c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 184c2c66affSColin Finck { 185c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 186c2c66affSColin Finck } 187c2c66affSColin Finck RpcEndExcept; 188c2c66affSColin Finck 189c2c66affSColin Finck return status; 190c2c66affSColin Finck } 191c2c66affSColin Finck 192c2c66affSColin Finck 193c2c66affSColin Finck DWORD 194c2c66affSColin Finck WINAPI 195c2c66affSColin Finck DsAddressToSiteNamesExA( 196c2c66affSColin Finck _In_opt_ LPCSTR ComputerName, 197c2c66affSColin Finck _In_ DWORD EntryCount, 198c2c66affSColin Finck _In_ PSOCKET_ADDRESS SocketAddresses, 199c2c66affSColin Finck _Out_ LPSTR **SiteNames, 200c2c66affSColin Finck _Out_ LPSTR **SubnetNames) 201c2c66affSColin Finck { 202c2c66affSColin Finck FIXME("DsAddressToSiteNamesExA(%s, %lu, %p, %p, %p)\n", 203c2c66affSColin Finck debugstr_a(ComputerName), EntryCount, SocketAddresses, 204c2c66affSColin Finck SiteNames, SubnetNames); 205c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 206c2c66affSColin Finck } 207c2c66affSColin Finck 208c2c66affSColin Finck 209c2c66affSColin Finck DWORD 210c2c66affSColin Finck WINAPI 211c2c66affSColin Finck DsAddressToSiteNamesExW( 212c2c66affSColin Finck _In_opt_ LPCWSTR ComputerName, 213c2c66affSColin Finck _In_ DWORD EntryCount, 214c2c66affSColin Finck _In_ PSOCKET_ADDRESS SocketAddresses, 215c2c66affSColin Finck _Out_ LPWSTR **SiteNames, 216c2c66affSColin Finck _Out_ LPWSTR **SubnetNames) 217c2c66affSColin Finck { 218c2c66affSColin Finck PNL_SITE_NAME_EX_ARRAY SiteNameArray = NULL; 219c2c66affSColin Finck PWSTR *SiteNamesBuffer = NULL, *SubnetNamesBuffer = NULL, Ptr; 220c2c66affSColin Finck ULONG SiteNameBufferSize, SubnetNameBufferSize, i; 221c2c66affSColin Finck NET_API_STATUS status; 222c2c66affSColin Finck 223c2c66affSColin Finck TRACE("DsAddressToSiteNamesExW(%s, %lu, %p, %p, %p)\n", 224c2c66affSColin Finck debugstr_w(ComputerName), EntryCount, SocketAddresses, 225c2c66affSColin Finck SiteNames, SubnetNames); 226c2c66affSColin Finck 227c2c66affSColin Finck if (EntryCount == 0) 228c2c66affSColin Finck return ERROR_INVALID_PARAMETER; 229c2c66affSColin Finck 230c2c66affSColin Finck *SiteNames = NULL; 231c2c66affSColin Finck *SubnetNames = NULL; 232c2c66affSColin Finck 233c2c66affSColin Finck RpcTryExcept 234c2c66affSColin Finck { 235c2c66affSColin Finck status = DsrAddressToSiteNamesExW((PWSTR)ComputerName, 236c2c66affSColin Finck EntryCount, 237c2c66affSColin Finck (PNL_SOCKET_ADDRESS)SocketAddresses, 238c2c66affSColin Finck &SiteNameArray); 239c2c66affSColin Finck if (status == NERR_Success) 240c2c66affSColin Finck { 241c2c66affSColin Finck if (SiteNameArray->EntryCount == 0) 242c2c66affSColin Finck { 243c2c66affSColin Finck status = ERROR_INVALID_PARAMETER; 244c2c66affSColin Finck } 245c2c66affSColin Finck else 246c2c66affSColin Finck { 247c2c66affSColin Finck SiteNameBufferSize = SiteNameArray->EntryCount * sizeof(PWSTR); 248c2c66affSColin Finck SubnetNameBufferSize = SiteNameArray->EntryCount * sizeof(PWSTR); 249c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 250c2c66affSColin Finck { 251c2c66affSColin Finck SiteNameBufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR); 252c2c66affSColin Finck SubnetNameBufferSize += SiteNameArray->SubnetNames[i].Length + sizeof(WCHAR); 253c2c66affSColin Finck } 254c2c66affSColin Finck 255c2c66affSColin Finck status = NetApiBufferAllocate(SiteNameBufferSize, (PVOID*)&SiteNamesBuffer); 256c2c66affSColin Finck if (status == NERR_Success) 257c2c66affSColin Finck { 258c2c66affSColin Finck ZeroMemory(SiteNamesBuffer, SiteNameBufferSize); 259c2c66affSColin Finck 260c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR)); 261c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 262c2c66affSColin Finck { 263c2c66affSColin Finck SiteNamesBuffer[i] = Ptr; 264c2c66affSColin Finck CopyMemory(Ptr, 265c2c66affSColin Finck SiteNameArray->SiteNames[i].Buffer, 266c2c66affSColin Finck SiteNameArray->SiteNames[i].Length); 267c2c66affSColin Finck 268c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR)); 269c2c66affSColin Finck } 270c2c66affSColin Finck 271c2c66affSColin Finck *SiteNames = SiteNamesBuffer; 272c2c66affSColin Finck } 273c2c66affSColin Finck 274c2c66affSColin Finck status = NetApiBufferAllocate(SubnetNameBufferSize, (PVOID*)&SubnetNamesBuffer); 275c2c66affSColin Finck if (status == NERR_Success) 276c2c66affSColin Finck { 277c2c66affSColin Finck ZeroMemory(SubnetNamesBuffer, SubnetNameBufferSize); 278c2c66affSColin Finck 279c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)SubnetNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR)); 280c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 281c2c66affSColin Finck { 282c2c66affSColin Finck SubnetNamesBuffer[i] = Ptr; 283c2c66affSColin Finck CopyMemory(Ptr, 284c2c66affSColin Finck SiteNameArray->SubnetNames[i].Buffer, 285c2c66affSColin Finck SiteNameArray->SubnetNames[i].Length); 286c2c66affSColin Finck 287c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SubnetNames[i].Length + sizeof(WCHAR)); 288c2c66affSColin Finck } 289c2c66affSColin Finck 290c2c66affSColin Finck *SubnetNames = SubnetNamesBuffer; 291c2c66affSColin Finck } 292c2c66affSColin Finck } 293c2c66affSColin Finck 294c2c66affSColin Finck MIDL_user_free(SiteNameArray); 295c2c66affSColin Finck } 296c2c66affSColin Finck } 297c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 298c2c66affSColin Finck { 299c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 300c2c66affSColin Finck } 301c2c66affSColin Finck RpcEndExcept; 302c2c66affSColin Finck 303c2c66affSColin Finck return status; 304c2c66affSColin Finck } 305c2c66affSColin Finck 306c2c66affSColin Finck 307c2c66affSColin Finck DWORD 308c2c66affSColin Finck WINAPI 309c2c66affSColin Finck DsDeregisterDnsHostRecordsA( 310c2c66affSColin Finck _In_opt_ LPSTR ServerName, 311c2c66affSColin Finck _In_opt_ LPSTR DnsDomainName, 312c2c66affSColin Finck _In_opt_ GUID *DomainGuid, 313c2c66affSColin Finck _In_opt_ GUID *DsaGuid, 314c2c66affSColin Finck _In_ LPSTR DnsHostName) 315c2c66affSColin Finck { 316c2c66affSColin Finck FIXME("DsDeregisterDnsHostRecordsA(%s, %s, %p, %p, %s)\n", 317c2c66affSColin Finck debugstr_a(ServerName), debugstr_a(DnsDomainName), 318c2c66affSColin Finck DomainGuid, DsaGuid, debugstr_a(DnsHostName)); 319c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 320c2c66affSColin Finck } 321c2c66affSColin Finck 322c2c66affSColin Finck 323c2c66affSColin Finck DWORD 324c2c66affSColin Finck WINAPI 325c2c66affSColin Finck DsDeregisterDnsHostRecordsW( 326c2c66affSColin Finck _In_opt_ LPWSTR ServerName, 327c2c66affSColin Finck _In_opt_ LPWSTR DnsDomainName, 328c2c66affSColin Finck _In_opt_ GUID *DomainGuid, 329c2c66affSColin Finck _In_opt_ GUID *DsaGuid, 330c2c66affSColin Finck _In_ LPWSTR DnsHostName) 331c2c66affSColin Finck { 332c2c66affSColin Finck NET_API_STATUS status; 333c2c66affSColin Finck 334c2c66affSColin Finck TRACE("DsDeregisterDnsHostRecordsW(%s, %s, %p, %p, %s)\n", 335c2c66affSColin Finck debugstr_w(ServerName), debugstr_w(DnsDomainName), 336c2c66affSColin Finck DomainGuid, DsaGuid, debugstr_w(DnsHostName)); 337c2c66affSColin Finck 338c2c66affSColin Finck RpcTryExcept 339c2c66affSColin Finck { 340c2c66affSColin Finck status = DsrDeregisterDnsHostRecords(ServerName, 341c2c66affSColin Finck DnsDomainName, 342c2c66affSColin Finck DomainGuid, 343c2c66affSColin Finck DsaGuid, 344c2c66affSColin Finck DnsHostName); 345c2c66affSColin Finck } 346c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 347c2c66affSColin Finck { 348c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 349c2c66affSColin Finck } 350c2c66affSColin Finck RpcEndExcept; 351c2c66affSColin Finck 352c2c66affSColin Finck return status; 353c2c66affSColin Finck } 354c2c66affSColin Finck 355c2c66affSColin Finck 356c2c66affSColin Finck DWORD 357c2c66affSColin Finck WINAPI 358c2c66affSColin Finck DsEnumerateDomainTrustsA( 359c2c66affSColin Finck _In_opt_ LPSTR ServerName, 360c2c66affSColin Finck _In_ ULONG Flags, 361c2c66affSColin Finck _Out_ PDS_DOMAIN_TRUSTSA *Domains, 362c2c66affSColin Finck _Out_ PULONG DomainCount) 363c2c66affSColin Finck { 364c2c66affSColin Finck FIXME("DsEnumerateDomainTrustsA(%s, %x, %p, %p)\n", 365c2c66affSColin Finck debugstr_a(ServerName), Flags, Domains, DomainCount); 366c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 367c2c66affSColin Finck } 368c2c66affSColin Finck 369c2c66affSColin Finck 370c2c66affSColin Finck DWORD 371c2c66affSColin Finck WINAPI 372c2c66affSColin Finck DsEnumerateDomainTrustsW( 373c2c66affSColin Finck _In_opt_ LPWSTR ServerName, 374c2c66affSColin Finck _In_ ULONG Flags, 375c2c66affSColin Finck _Out_ PDS_DOMAIN_TRUSTSW *Domains, 376c2c66affSColin Finck _Out_ PULONG DomainCount) 377c2c66affSColin Finck { 378c2c66affSColin Finck FIXME("DsEnumerateDomainTrustsW(%s, %x, %p, %p)\n", 379c2c66affSColin Finck debugstr_w(ServerName), Flags, Domains, DomainCount); 380c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 381c2c66affSColin Finck } 382c2c66affSColin Finck 383c2c66affSColin Finck 384c2c66affSColin Finck DWORD 385c2c66affSColin Finck WINAPI 386c2c66affSColin Finck DsGetDcNameA( 38757d48a7fSEric Kohl _In_opt_ LPCSTR ComputerName, 388c2c66affSColin Finck _In_ LPCSTR DomainName, 389c2c66affSColin Finck _In_ GUID *DomainGuid, 390c2c66affSColin Finck _In_ LPCSTR SiteName, 391c2c66affSColin Finck _In_ ULONG Flags, 392c2c66affSColin Finck _Out_ PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo) 393c2c66affSColin Finck { 39457d48a7fSEric Kohl TRACE("DsGetDcNameA(%s, %s, %s, %s, %08lx, %p): stub\n", 395c2c66affSColin Finck debugstr_a(ComputerName), debugstr_a(DomainName), debugstr_guid(DomainGuid), 396c2c66affSColin Finck debugstr_a(SiteName), Flags, DomainControllerInfo); 39757d48a7fSEric Kohl return DsGetDcNameWithAccountA(ComputerName, 39857d48a7fSEric Kohl NULL, 39957d48a7fSEric Kohl 0, 40057d48a7fSEric Kohl DomainName, 40157d48a7fSEric Kohl DomainGuid, 40257d48a7fSEric Kohl SiteName, 40357d48a7fSEric Kohl Flags, 40457d48a7fSEric Kohl DomainControllerInfo); 40557d48a7fSEric Kohl } 40657d48a7fSEric Kohl 40757d48a7fSEric Kohl 40857d48a7fSEric Kohl DWORD 40957d48a7fSEric Kohl WINAPI 41057d48a7fSEric Kohl DsGetDcNameW( 41157d48a7fSEric Kohl _In_opt_ LPCWSTR ComputerName, 41257d48a7fSEric Kohl _In_ LPCWSTR DomainName, 41357d48a7fSEric Kohl _In_ GUID *DomainGuid, 41457d48a7fSEric Kohl _In_ LPCWSTR SiteName, 41557d48a7fSEric Kohl _In_ ULONG Flags, 41657d48a7fSEric Kohl _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo) 41757d48a7fSEric Kohl { 41857d48a7fSEric Kohl TRACE("DsGetDcNameW(%s, %s, %s, %s, %08lx, %p)\n", 41957d48a7fSEric Kohl debugstr_w(ComputerName), debugstr_w(DomainName), debugstr_guid(DomainGuid), 42057d48a7fSEric Kohl debugstr_w(SiteName), Flags, DomainControllerInfo); 42157d48a7fSEric Kohl return DsGetDcNameWithAccountW(ComputerName, 42257d48a7fSEric Kohl NULL, 42357d48a7fSEric Kohl 0, 42457d48a7fSEric Kohl DomainName, 42557d48a7fSEric Kohl DomainGuid, 42657d48a7fSEric Kohl SiteName, 42757d48a7fSEric Kohl Flags, 42857d48a7fSEric Kohl DomainControllerInfo); 42957d48a7fSEric Kohl } 43057d48a7fSEric Kohl 43157d48a7fSEric Kohl 43257d48a7fSEric Kohl DWORD 43357d48a7fSEric Kohl WINAPI 43457d48a7fSEric Kohl DsGetDcNameWithAccountA( 43557d48a7fSEric Kohl _In_opt_ LPCSTR ComputerName, 43657d48a7fSEric Kohl _In_opt_ LPCSTR AccountName, 43757d48a7fSEric Kohl _In_ ULONG AccountControlBits, 43857d48a7fSEric Kohl _In_ LPCSTR DomainName, 43957d48a7fSEric Kohl _In_ GUID *DomainGuid, 44057d48a7fSEric Kohl _In_ LPCSTR SiteName, 44157d48a7fSEric Kohl _In_ ULONG Flags, 44257d48a7fSEric Kohl _Out_ PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo) 44357d48a7fSEric Kohl { 44457d48a7fSEric Kohl FIXME("DsGetDcNameWithAccountA(%s, %s, %08lx, %s, %s, %s, %08lx, %p): stub\n", 44557d48a7fSEric Kohl debugstr_a(ComputerName), debugstr_a(AccountName), AccountControlBits, 44657d48a7fSEric Kohl debugstr_a(DomainName), debugstr_guid(DomainGuid), 44757d48a7fSEric Kohl debugstr_a(SiteName), Flags, DomainControllerInfo); 448c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 449c2c66affSColin Finck } 450c2c66affSColin Finck 451c2c66affSColin Finck 452c2c66affSColin Finck DWORD 453c2c66affSColin Finck WINAPI 45457d48a7fSEric Kohl DsGetDcNameWithAccountW( 45557d48a7fSEric Kohl _In_opt_ LPCWSTR ComputerName, 45657d48a7fSEric Kohl _In_opt_ LPCWSTR AccountName, 45757d48a7fSEric Kohl _In_ ULONG AccountControlBits, 458c2c66affSColin Finck _In_ LPCWSTR DomainName, 459c2c66affSColin Finck _In_ GUID *DomainGuid, 460c2c66affSColin Finck _In_ LPCWSTR SiteName, 461c2c66affSColin Finck _In_ ULONG Flags, 462c2c66affSColin Finck _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo) 463c2c66affSColin Finck { 46457d48a7fSEric Kohl NET_API_STATUS status; 46557d48a7fSEric Kohl 46657d48a7fSEric Kohl FIXME("DsGetDcNameWithAccountW(%s, %s, %08lx, %s, %s, %s, %08lx, %p): stub\n", 46757d48a7fSEric Kohl debugstr_w(ComputerName), debugstr_w(AccountName), AccountControlBits, 46857d48a7fSEric Kohl debugstr_w(DomainName), debugstr_guid(DomainGuid), 469c2c66affSColin Finck debugstr_w(SiteName), Flags, DomainControllerInfo); 47057d48a7fSEric Kohl 47157d48a7fSEric Kohl RpcTryExcept 47257d48a7fSEric Kohl { 47357d48a7fSEric Kohl status = DsrGetDcNameEx2((PWSTR)ComputerName, 47457d48a7fSEric Kohl (PWSTR)AccountName, 47557d48a7fSEric Kohl AccountControlBits, 47657d48a7fSEric Kohl (PWSTR)DomainName, 47757d48a7fSEric Kohl DomainGuid, 47857d48a7fSEric Kohl (PWSTR)SiteName, 47957d48a7fSEric Kohl Flags, 48057d48a7fSEric Kohl DomainControllerInfo); 48157d48a7fSEric Kohl } 48257d48a7fSEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER) 48357d48a7fSEric Kohl { 48457d48a7fSEric Kohl status = I_RpcMapWin32Status(RpcExceptionCode()); 48557d48a7fSEric Kohl } 48657d48a7fSEric Kohl RpcEndExcept; 48757d48a7fSEric Kohl 48857d48a7fSEric Kohl return status; 489c2c66affSColin Finck } 490c2c66affSColin Finck 491c2c66affSColin Finck 492c2c66affSColin Finck DWORD 493c2c66affSColin Finck WINAPI 494c2c66affSColin Finck DsGetDcSiteCoverageA( 495c2c66affSColin Finck _In_opt_ LPCSTR ServerName, 496c2c66affSColin Finck _Out_ PULONG EntryCount, 497c2c66affSColin Finck _Out_ LPSTR **SiteNames) 498c2c66affSColin Finck { 499*792d0f6bSEric Kohl PWSTR pServerNameW = NULL; 500*792d0f6bSEric Kohl PWSTR *pSiteNamesW = NULL; 501*792d0f6bSEric Kohl PSTR *pSiteNamesA = NULL; 502*792d0f6bSEric Kohl UNICODE_STRING UnicodeString; 503*792d0f6bSEric Kohl ANSI_STRING AnsiString; 504*792d0f6bSEric Kohl PSTR Ptr; 505*792d0f6bSEric Kohl ULONG BufferSize, i; 506*792d0f6bSEric Kohl NTSTATUS Status; 507*792d0f6bSEric Kohl NET_API_STATUS status = ERROR_SUCCESS; 508*792d0f6bSEric Kohl 509*792d0f6bSEric Kohl TRACE("DsGetDcSiteCoverageA(%s, %p, %p)\n", 510c2c66affSColin Finck debugstr_a(ServerName), EntryCount, SiteNames); 511*792d0f6bSEric Kohl 512*792d0f6bSEric Kohl if (ServerName != NULL) 513*792d0f6bSEric Kohl { 514*792d0f6bSEric Kohl pServerNameW = NetpAllocWStrFromAnsiStr((PSTR)ServerName); 515*792d0f6bSEric Kohl if (pServerNameW == NULL) 516*792d0f6bSEric Kohl { 517*792d0f6bSEric Kohl status = ERROR_NOT_ENOUGH_MEMORY; 518*792d0f6bSEric Kohl goto done; 519*792d0f6bSEric Kohl } 520*792d0f6bSEric Kohl } 521*792d0f6bSEric Kohl 522*792d0f6bSEric Kohl status = DsGetDcSiteCoverageW(pServerNameW, 523*792d0f6bSEric Kohl EntryCount, 524*792d0f6bSEric Kohl &pSiteNamesW); 525*792d0f6bSEric Kohl if (status != ERROR_SUCCESS) 526*792d0f6bSEric Kohl goto done; 527*792d0f6bSEric Kohl 528*792d0f6bSEric Kohl BufferSize = *EntryCount * sizeof(PSTR); 529*792d0f6bSEric Kohl for (i = 0; i < *EntryCount; i++) 530*792d0f6bSEric Kohl { 531*792d0f6bSEric Kohl RtlInitUnicodeString(&UnicodeString, pSiteNamesW[i]); 532*792d0f6bSEric Kohl BufferSize += RtlUnicodeStringToAnsiSize(&UnicodeString); 533*792d0f6bSEric Kohl } 534*792d0f6bSEric Kohl 535*792d0f6bSEric Kohl status = NetApiBufferAllocate(BufferSize, (PVOID*)&pSiteNamesA); 536*792d0f6bSEric Kohl if (status != NERR_Success) 537*792d0f6bSEric Kohl goto done; 538*792d0f6bSEric Kohl 539*792d0f6bSEric Kohl ZeroMemory(pSiteNamesA, BufferSize); 540*792d0f6bSEric Kohl 541*792d0f6bSEric Kohl Ptr = (PSTR)((ULONG_PTR)pSiteNamesA + *EntryCount * sizeof(PSTR)); 542*792d0f6bSEric Kohl for (i = 0; i < *EntryCount; i++) 543*792d0f6bSEric Kohl { 544*792d0f6bSEric Kohl pSiteNamesA[i] = Ptr; 545*792d0f6bSEric Kohl 546*792d0f6bSEric Kohl RtlInitUnicodeString(&UnicodeString, pSiteNamesW[i]); 547*792d0f6bSEric Kohl 548*792d0f6bSEric Kohl AnsiString.Length = 0; 549*792d0f6bSEric Kohl AnsiString.MaximumLength = BufferSize; 550*792d0f6bSEric Kohl AnsiString.Buffer = Ptr; 551*792d0f6bSEric Kohl 552*792d0f6bSEric Kohl Status = RtlUnicodeStringToAnsiString(&AnsiString, 553*792d0f6bSEric Kohl &UnicodeString, 554*792d0f6bSEric Kohl FALSE); 555*792d0f6bSEric Kohl if (!NT_SUCCESS(Status)) 556*792d0f6bSEric Kohl { 557*792d0f6bSEric Kohl status = RtlNtStatusToDosError(Status); 558*792d0f6bSEric Kohl goto done; 559*792d0f6bSEric Kohl } 560*792d0f6bSEric Kohl 561*792d0f6bSEric Kohl Ptr = (PSTR)((ULONG_PTR)Ptr + AnsiString.Length + sizeof(CHAR)); 562*792d0f6bSEric Kohl BufferSize -= (AnsiString.Length + sizeof(CHAR)); 563*792d0f6bSEric Kohl } 564*792d0f6bSEric Kohl 565*792d0f6bSEric Kohl *SiteNames = pSiteNamesA; 566*792d0f6bSEric Kohl pSiteNamesA = NULL; 567*792d0f6bSEric Kohl 568*792d0f6bSEric Kohl done: 569*792d0f6bSEric Kohl if (status != NERR_Success && pSiteNamesA != NULL) 570*792d0f6bSEric Kohl NetApiBufferFree(pSiteNamesA); 571*792d0f6bSEric Kohl 572*792d0f6bSEric Kohl if (pSiteNamesW != NULL) 573*792d0f6bSEric Kohl NetApiBufferFree(pSiteNamesW); 574*792d0f6bSEric Kohl 575*792d0f6bSEric Kohl if (pServerNameW != NULL) 576*792d0f6bSEric Kohl NetApiBufferFree(pServerNameW); 577*792d0f6bSEric Kohl 578*792d0f6bSEric Kohl return status; 579c2c66affSColin Finck } 580c2c66affSColin Finck 581c2c66affSColin Finck 582c2c66affSColin Finck DWORD 583c2c66affSColin Finck WINAPI 584c2c66affSColin Finck DsGetDcSiteCoverageW( 585c2c66affSColin Finck _In_opt_ LPCWSTR ServerName, 586c2c66affSColin Finck _Out_ PULONG EntryCount, 587c2c66affSColin Finck _Out_ LPWSTR **SiteNames) 588c2c66affSColin Finck { 589c2c66affSColin Finck PNL_SITE_NAME_ARRAY SiteNameArray = NULL; 590c2c66affSColin Finck PWSTR *SiteNamesBuffer = NULL, Ptr; 591c2c66affSColin Finck ULONG BufferSize, i; 592c2c66affSColin Finck NET_API_STATUS status; 593c2c66affSColin Finck 594c2c66affSColin Finck TRACE("DsGetDcSiteCoverageW(%s, %p, %p)\n", 595c2c66affSColin Finck debugstr_w(ServerName), EntryCount, SiteNames); 596c2c66affSColin Finck 597c2c66affSColin Finck *EntryCount = 0; 598c2c66affSColin Finck *SiteNames = NULL; 599c2c66affSColin Finck 600c2c66affSColin Finck RpcTryExcept 601c2c66affSColin Finck { 602c2c66affSColin Finck status = DsrGetDcSiteCoverageW((PWSTR)ServerName, 603c2c66affSColin Finck &SiteNameArray); 604c2c66affSColin Finck if (status == NERR_Success) 605c2c66affSColin Finck { 606c2c66affSColin Finck if (SiteNameArray->EntryCount == 0) 607c2c66affSColin Finck { 608c2c66affSColin Finck status = ERROR_INVALID_PARAMETER; 609c2c66affSColin Finck } 610c2c66affSColin Finck else 611c2c66affSColin Finck { 612c2c66affSColin Finck BufferSize = SiteNameArray->EntryCount * sizeof(PWSTR); 613c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 614c2c66affSColin Finck BufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR); 615c2c66affSColin Finck 616c2c66affSColin Finck status = NetApiBufferAllocate(BufferSize, (PVOID*)&SiteNamesBuffer); 617c2c66affSColin Finck if (status == NERR_Success) 618c2c66affSColin Finck { 619c2c66affSColin Finck ZeroMemory(SiteNamesBuffer, BufferSize); 620c2c66affSColin Finck 621c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR)); 622c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 623c2c66affSColin Finck { 624c2c66affSColin Finck SiteNamesBuffer[i] = Ptr; 625c2c66affSColin Finck CopyMemory(Ptr, 626c2c66affSColin Finck SiteNameArray->SiteNames[i].Buffer, 627c2c66affSColin Finck SiteNameArray->SiteNames[i].Length); 628c2c66affSColin Finck 629c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR)); 630c2c66affSColin Finck } 631c2c66affSColin Finck 632c2c66affSColin Finck *EntryCount = SiteNameArray->EntryCount; 633c2c66affSColin Finck *SiteNames = SiteNamesBuffer; 634c2c66affSColin Finck } 635c2c66affSColin Finck } 636c2c66affSColin Finck 637c2c66affSColin Finck MIDL_user_free(SiteNameArray); 638c2c66affSColin Finck } 639c2c66affSColin Finck } 640c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 641c2c66affSColin Finck { 642c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 643c2c66affSColin Finck } 644c2c66affSColin Finck RpcEndExcept; 645c2c66affSColin Finck 646c2c66affSColin Finck return status; 647c2c66affSColin Finck } 648c2c66affSColin Finck 649c2c66affSColin Finck 650c2c66affSColin Finck DWORD 651c2c66affSColin Finck WINAPI 652c2c66affSColin Finck DsGetForestTrustInformationW( 653c2c66affSColin Finck _In_opt_ LPCWSTR ServerName, 654c2c66affSColin Finck _In_opt_ LPCWSTR TrustedDomainName, 655c2c66affSColin Finck _In_ DWORD Flags, 656c2c66affSColin Finck _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo) 657c2c66affSColin Finck { 658c2c66affSColin Finck NET_API_STATUS status; 659c2c66affSColin Finck 660c2c66affSColin Finck TRACE("DsGetForestTrustInformationW(%s, %s, 0x%08lx, %p)\n", 661c2c66affSColin Finck debugstr_w(ServerName), debugstr_w(TrustedDomainName), 662c2c66affSColin Finck Flags, ForestTrustInfo); 663c2c66affSColin Finck 664c2c66affSColin Finck RpcTryExcept 665c2c66affSColin Finck { 666c2c66affSColin Finck status = DsrGetForestTrustInformation((PWSTR)ServerName, 667c2c66affSColin Finck (PWSTR)TrustedDomainName, 668c2c66affSColin Finck Flags, 669c2c66affSColin Finck ForestTrustInfo); 670c2c66affSColin Finck } 671c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 672c2c66affSColin Finck { 673c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 674c2c66affSColin Finck } 675c2c66affSColin Finck RpcEndExcept; 676c2c66affSColin Finck 677c2c66affSColin Finck return status; 678c2c66affSColin Finck } 679c2c66affSColin Finck 680c2c66affSColin Finck 681c2c66affSColin Finck DWORD 682c2c66affSColin Finck WINAPI 683c2c66affSColin Finck DsGetSiteNameA( 6843d5c682cSEric Kohl _In_opt_ LPCSTR ComputerName, 685c2c66affSColin Finck _Out_ LPSTR *SiteName) 686c2c66affSColin Finck { 6873d5c682cSEric Kohl PWSTR pComputerNameW = NULL; 6883d5c682cSEric Kohl PWSTR pSiteNameW = NULL; 689*792d0f6bSEric Kohl NET_API_STATUS status = ERROR_SUCCESS; 6903d5c682cSEric Kohl 6913d5c682cSEric Kohl TRACE("DsGetSiteNameA(%s, %p)\n", 692c2c66affSColin Finck debugstr_a(ComputerName), SiteName); 6933d5c682cSEric Kohl 6943d5c682cSEric Kohl if (ComputerName != NULL) 6953d5c682cSEric Kohl { 6963d5c682cSEric Kohl pComputerNameW = NetpAllocWStrFromAnsiStr((PSTR)ComputerName); 6973d5c682cSEric Kohl if (pComputerNameW == NULL) 6983d5c682cSEric Kohl { 699*792d0f6bSEric Kohl status = ERROR_NOT_ENOUGH_MEMORY; 7003d5c682cSEric Kohl goto done; 7013d5c682cSEric Kohl } 7023d5c682cSEric Kohl } 7033d5c682cSEric Kohl 704*792d0f6bSEric Kohl status = DsGetSiteNameW(pComputerNameW, 7053d5c682cSEric Kohl &pSiteNameW); 706*792d0f6bSEric Kohl if (status != ERROR_SUCCESS) 7073d5c682cSEric Kohl goto done; 7083d5c682cSEric Kohl 7093d5c682cSEric Kohl *SiteName = NetpAllocAnsiStrFromWStr(pSiteNameW); 7103d5c682cSEric Kohl if (*SiteName == NULL) 7113d5c682cSEric Kohl { 712*792d0f6bSEric Kohl status = ERROR_NOT_ENOUGH_MEMORY; 7133d5c682cSEric Kohl } 7143d5c682cSEric Kohl 7153d5c682cSEric Kohl done: 7163d5c682cSEric Kohl if (pSiteNameW != NULL) 7173d5c682cSEric Kohl NetApiBufferFree(pSiteNameW); 7183d5c682cSEric Kohl 7193d5c682cSEric Kohl if (pComputerNameW != NULL) 7203d5c682cSEric Kohl NetApiBufferFree(pComputerNameW); 7213d5c682cSEric Kohl 722*792d0f6bSEric Kohl return status; 723c2c66affSColin Finck } 724c2c66affSColin Finck 725c2c66affSColin Finck 726c2c66affSColin Finck DWORD 727c2c66affSColin Finck WINAPI 728c2c66affSColin Finck DsGetSiteNameW( 7293d5c682cSEric Kohl _In_opt_ LPCWSTR ComputerName, 730c2c66affSColin Finck _Out_ LPWSTR *SiteName) 731c2c66affSColin Finck { 732c2c66affSColin Finck NET_API_STATUS status; 733c2c66affSColin Finck 734c2c66affSColin Finck TRACE("DsGetSiteNameW(%s, %p)\n", 735c2c66affSColin Finck debugstr_w(ComputerName), SiteName); 736c2c66affSColin Finck 737c2c66affSColin Finck RpcTryExcept 738c2c66affSColin Finck { 739c2c66affSColin Finck status = DsrGetSiteName((PWSTR)ComputerName, 740c2c66affSColin Finck SiteName); 741c2c66affSColin Finck } 742c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 743c2c66affSColin Finck { 744c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 745c2c66affSColin Finck } 746c2c66affSColin Finck RpcEndExcept; 747c2c66affSColin Finck 748c2c66affSColin Finck return status; 749c2c66affSColin Finck } 750c2c66affSColin Finck 751c2c66affSColin Finck 752c2c66affSColin Finck DWORD 753c2c66affSColin Finck WINAPI 754c2c66affSColin Finck DsMergeForestTrustInformationW( 755c2c66affSColin Finck _In_ LPCWSTR DomainName, 756c2c66affSColin Finck _In_ PLSA_FOREST_TRUST_INFORMATION NewForestTrustInfo, 757c2c66affSColin Finck _In_opt_ PLSA_FOREST_TRUST_INFORMATION OldForestTrustInfo, 758c2c66affSColin Finck _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo) 759c2c66affSColin Finck { 760c2c66affSColin Finck FIXME("DsMergeForestTrustInformationW(%s, %p, %p, %p)\n", 761c2c66affSColin Finck debugstr_w(DomainName), NewForestTrustInfo, 762c2c66affSColin Finck OldForestTrustInfo, ForestTrustInfo); 763c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 764c2c66affSColin Finck } 765c2c66affSColin Finck 766c2c66affSColin Finck 767c2c66affSColin Finck DWORD 768c2c66affSColin Finck WINAPI 769c2c66affSColin Finck DsValidateSubnetNameA( 770c2c66affSColin Finck _In_ LPCSTR SubnetName) 771c2c66affSColin Finck { 772c2c66affSColin Finck FIXME("DsValidateSubnetNameA(%s)\n", 773c2c66affSColin Finck debugstr_a(SubnetName)); 774c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 775c2c66affSColin Finck } 776c2c66affSColin Finck 777c2c66affSColin Finck 778c2c66affSColin Finck DWORD 779c2c66affSColin Finck WINAPI 780c2c66affSColin Finck DsValidateSubnetNameW( 781c2c66affSColin Finck _In_ LPCWSTR SubnetName) 782c2c66affSColin Finck { 783c2c66affSColin Finck FIXME("DsValidateSubnetNameW(%s)\n", 784c2c66affSColin Finck debugstr_w(SubnetName)); 785c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 786c2c66affSColin Finck } 787c2c66affSColin Finck 788c2c66affSColin Finck 789c2c66affSColin Finck NTSTATUS 790c2c66affSColin Finck WINAPI 791c2c66affSColin Finck NetEnumerateTrustedDomains( 792c2c66affSColin Finck _In_ LPWSTR ServerName, 793c2c66affSColin Finck _Out_ LPWSTR *DomainNames) 794c2c66affSColin Finck { 795c2c66affSColin Finck DOMAIN_NAME_BUFFER DomainNameBuffer = {0, NULL}; 796c2c66affSColin Finck NTSTATUS Status = 0; 797c2c66affSColin Finck 798c2c66affSColin Finck TRACE("NetEnumerateTrustedDomains(%s, %p)\n", 799c2c66affSColin Finck debugstr_w(ServerName), DomainNames); 800c2c66affSColin Finck 801c2c66affSColin Finck RpcTryExcept 802c2c66affSColin Finck { 803c2c66affSColin Finck Status = NetrEnumerateTrustedDomains(ServerName, 804c2c66affSColin Finck &DomainNameBuffer); 805c2c66affSColin Finck if (NT_SUCCESS(Status)) 806c2c66affSColin Finck { 807c2c66affSColin Finck *DomainNames = (LPWSTR)DomainNameBuffer.DomainNames; 808c2c66affSColin Finck } 809c2c66affSColin Finck } 810c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 811c2c66affSColin Finck { 812c2c66affSColin Finck Status = I_RpcMapWin32Status(RpcExceptionCode()); 813c2c66affSColin Finck } RpcEndExcept; 814c2c66affSColin Finck 815c2c66affSColin Finck return Status; 816c2c66affSColin Finck } 817c2c66affSColin Finck 818c2c66affSColin Finck 819c2c66affSColin Finck NET_API_STATUS 820c2c66affSColin Finck WINAPI 821c2c66affSColin Finck NetGetAnyDCName( 822c2c66affSColin Finck _In_opt_ LPCWSTR ServerName, 823c2c66affSColin Finck _In_opt_ LPCWSTR DomainName, 824c2c66affSColin Finck _Out_ LPBYTE *BufPtr) 825c2c66affSColin Finck { 826adceb380SEric Kohl NET_API_STATUS Status; 827c2c66affSColin Finck 828c2c66affSColin Finck TRACE("NetGetAnyDCName(%s, %s, %p)\n", 829c2c66affSColin Finck debugstr_w(ServerName), debugstr_w(DomainName), BufPtr); 830c2c66affSColin Finck 831c2c66affSColin Finck *BufPtr = NULL; 832c2c66affSColin Finck 833c2c66affSColin Finck RpcTryExcept 834c2c66affSColin Finck { 835adceb380SEric Kohl Status = NetrGetAnyDCName((PWSTR)ServerName, 836c2c66affSColin Finck (PWSTR)DomainName, 837c2c66affSColin Finck (PWSTR*)BufPtr); 838c2c66affSColin Finck } 839c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 840c2c66affSColin Finck { 841adceb380SEric Kohl Status = I_RpcMapWin32Status(RpcExceptionCode()); 842c2c66affSColin Finck } 843c2c66affSColin Finck RpcEndExcept; 844c2c66affSColin Finck 845adceb380SEric Kohl return Status; 846c2c66affSColin Finck } 847c2c66affSColin Finck 848c2c66affSColin Finck 849c2c66affSColin Finck NET_API_STATUS 850c2c66affSColin Finck WINAPI 851c2c66affSColin Finck NetGetDCName( 852adceb380SEric Kohl _In_opt_ LPCWSTR ServerName, 853adceb380SEric Kohl _In_opt_ LPCWSTR DomainName, 854adceb380SEric Kohl _Out_ LPBYTE *BufPtr) 855c2c66affSColin Finck { 856adceb380SEric Kohl PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL; 857adceb380SEric Kohl NET_API_STATUS Status; 858c2c66affSColin Finck 859adceb380SEric Kohl FIXME("NetGetDCName(%s, %s, %p)\n", 860adceb380SEric Kohl debugstr_w(ServerName), debugstr_w(DomainName), BufPtr); 861adceb380SEric Kohl 862adceb380SEric Kohl if (ServerName == NULL || *ServerName == UNICODE_NULL) 863adceb380SEric Kohl { 864adceb380SEric Kohl Status = DsGetDcNameWithAccountW(NULL, 865adceb380SEric Kohl NULL, 866adceb380SEric Kohl 0, 867adceb380SEric Kohl DomainName, 868adceb380SEric Kohl NULL, 869adceb380SEric Kohl NULL, 870adceb380SEric Kohl 0, //??? 871adceb380SEric Kohl &pDomainControllerInfo); 872adceb380SEric Kohl if (Status != NERR_Success) 873adceb380SEric Kohl goto done; 874adceb380SEric Kohl 875adceb380SEric Kohl Status = NetApiBufferAllocate((wcslen(pDomainControllerInfo->DomainControllerName) + 1) * sizeof(WCHAR), 876adceb380SEric Kohl (PVOID*)BufPtr); 877adceb380SEric Kohl if (Status != NERR_Success) 878adceb380SEric Kohl goto done; 879adceb380SEric Kohl 880adceb380SEric Kohl wcscpy((PWSTR)*BufPtr, 881adceb380SEric Kohl pDomainControllerInfo->DomainControllerName); 882adceb380SEric Kohl } 883adceb380SEric Kohl else 884adceb380SEric Kohl { 885adceb380SEric Kohl FIXME("Not implemented yet!\n"); 886adceb380SEric Kohl Status = NERR_DCNotFound; 887adceb380SEric Kohl } 888adceb380SEric Kohl 889adceb380SEric Kohl done: 890adceb380SEric Kohl if (pDomainControllerInfo != NULL) 891adceb380SEric Kohl NetApiBufferFree(pDomainControllerInfo); 892adceb380SEric Kohl 893adceb380SEric Kohl return Status; 894c2c66affSColin Finck } 895c2c66affSColin Finck 896c2c66affSColin Finck 897e0b50500SEric Kohl NET_API_STATUS 898e0b50500SEric Kohl WINAPI 899e0b50500SEric Kohl NetLogonGetTimeServiceParentDomain( 900e0b50500SEric Kohl _In_ LPWSTR ServerName, 901e0b50500SEric Kohl _Out_ LPWSTR *DomainName, 902e0b50500SEric Kohl _Out_ LPBOOL PdcSameSite) 903e0b50500SEric Kohl { 904e0b50500SEric Kohl NET_API_STATUS Status; 905e0b50500SEric Kohl 906e0b50500SEric Kohl TRACE("NetLogonGetTimeServiceParentDomain(%s, %p, %p)\n", 907e0b50500SEric Kohl debugstr_w(ServerName), DomainName, PdcSameSite); 908e0b50500SEric Kohl 909e0b50500SEric Kohl RpcTryExcept 910e0b50500SEric Kohl { 911e0b50500SEric Kohl Status = NetrLogonGetTimeServiceParentDomain(ServerName, 912e0b50500SEric Kohl DomainName, 913e0b50500SEric Kohl PdcSameSite); 914e0b50500SEric Kohl } 915e0b50500SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER) 916e0b50500SEric Kohl { 917e0b50500SEric Kohl Status = I_RpcMapWin32Status(RpcExceptionCode()); 918e0b50500SEric Kohl } 919e0b50500SEric Kohl RpcEndExcept; 920e0b50500SEric Kohl 921e0b50500SEric Kohl return Status; 922e0b50500SEric Kohl } 923e0b50500SEric Kohl 924e0b50500SEric Kohl 925c2c66affSColin Finck NTSTATUS 926c2c66affSColin Finck WINAPI 927c2c66affSColin Finck NetLogonSetServiceBits( 928c2c66affSColin Finck _In_ LPWSTR ServerName, 929c2c66affSColin Finck _In_ DWORD ServiceBitsOfInterest, 930c2c66affSColin Finck _In_ DWORD ServiceBits) 931c2c66affSColin Finck { 932c2c66affSColin Finck NTSTATUS Status; 933c2c66affSColin Finck 934c2c66affSColin Finck TRACE("NetLogonSetServiceBits(%s 0x%lx 0x%lx)\n", 935c2c66affSColin Finck debugstr_w(ServerName), ServiceBitsOfInterest, ServiceBits); 936c2c66affSColin Finck 937c2c66affSColin Finck RpcTryExcept 938c2c66affSColin Finck { 939c2c66affSColin Finck Status = NetrLogonSetServiceBits(ServerName, 940c2c66affSColin Finck ServiceBitsOfInterest, 941c2c66affSColin Finck ServiceBits); 942c2c66affSColin Finck } 943c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 944c2c66affSColin Finck { 945c2c66affSColin Finck Status = RpcExceptionCode(); 946c2c66affSColin Finck } 947c2c66affSColin Finck RpcEndExcept; 948c2c66affSColin Finck 949c2c66affSColin Finck return Status; 950c2c66affSColin Finck } 951c2c66affSColin Finck 952c2c66affSColin Finck /* EOF */ 953