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 { 499c2c66affSColin Finck FIXME("DsGetDcSiteCoverageA(%s, %p, %p)\n", 500c2c66affSColin Finck debugstr_a(ServerName), EntryCount, SiteNames); 501c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 502c2c66affSColin Finck } 503c2c66affSColin Finck 504c2c66affSColin Finck 505c2c66affSColin Finck DWORD 506c2c66affSColin Finck WINAPI 507c2c66affSColin Finck DsGetDcSiteCoverageW( 508c2c66affSColin Finck _In_opt_ LPCWSTR ServerName, 509c2c66affSColin Finck _Out_ PULONG EntryCount, 510c2c66affSColin Finck _Out_ LPWSTR **SiteNames) 511c2c66affSColin Finck { 512c2c66affSColin Finck PNL_SITE_NAME_ARRAY SiteNameArray = NULL; 513c2c66affSColin Finck PWSTR *SiteNamesBuffer = NULL, Ptr; 514c2c66affSColin Finck ULONG BufferSize, i; 515c2c66affSColin Finck NET_API_STATUS status; 516c2c66affSColin Finck 517c2c66affSColin Finck TRACE("DsGetDcSiteCoverageW(%s, %p, %p)\n", 518c2c66affSColin Finck debugstr_w(ServerName), EntryCount, SiteNames); 519c2c66affSColin Finck 520c2c66affSColin Finck *EntryCount = 0; 521c2c66affSColin Finck *SiteNames = NULL; 522c2c66affSColin Finck 523c2c66affSColin Finck RpcTryExcept 524c2c66affSColin Finck { 525c2c66affSColin Finck status = DsrGetDcSiteCoverageW((PWSTR)ServerName, 526c2c66affSColin Finck &SiteNameArray); 527c2c66affSColin Finck if (status == NERR_Success) 528c2c66affSColin Finck { 529c2c66affSColin Finck if (SiteNameArray->EntryCount == 0) 530c2c66affSColin Finck { 531c2c66affSColin Finck status = ERROR_INVALID_PARAMETER; 532c2c66affSColin Finck } 533c2c66affSColin Finck else 534c2c66affSColin Finck { 535c2c66affSColin Finck BufferSize = SiteNameArray->EntryCount * sizeof(PWSTR); 536c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 537c2c66affSColin Finck BufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR); 538c2c66affSColin Finck 539c2c66affSColin Finck status = NetApiBufferAllocate(BufferSize, (PVOID*)&SiteNamesBuffer); 540c2c66affSColin Finck if (status == NERR_Success) 541c2c66affSColin Finck { 542c2c66affSColin Finck ZeroMemory(SiteNamesBuffer, BufferSize); 543c2c66affSColin Finck 544c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR)); 545c2c66affSColin Finck for (i = 0; i < SiteNameArray->EntryCount; i++) 546c2c66affSColin Finck { 547c2c66affSColin Finck SiteNamesBuffer[i] = Ptr; 548c2c66affSColin Finck CopyMemory(Ptr, 549c2c66affSColin Finck SiteNameArray->SiteNames[i].Buffer, 550c2c66affSColin Finck SiteNameArray->SiteNames[i].Length); 551c2c66affSColin Finck 552c2c66affSColin Finck Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR)); 553c2c66affSColin Finck } 554c2c66affSColin Finck 555c2c66affSColin Finck *EntryCount = SiteNameArray->EntryCount; 556c2c66affSColin Finck *SiteNames = SiteNamesBuffer; 557c2c66affSColin Finck } 558c2c66affSColin Finck } 559c2c66affSColin Finck 560c2c66affSColin Finck MIDL_user_free(SiteNameArray); 561c2c66affSColin Finck } 562c2c66affSColin Finck } 563c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 564c2c66affSColin Finck { 565c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 566c2c66affSColin Finck } 567c2c66affSColin Finck RpcEndExcept; 568c2c66affSColin Finck 569c2c66affSColin Finck return status; 570c2c66affSColin Finck } 571c2c66affSColin Finck 572c2c66affSColin Finck 573c2c66affSColin Finck DWORD 574c2c66affSColin Finck WINAPI 575c2c66affSColin Finck DsGetForestTrustInformationW( 576c2c66affSColin Finck _In_opt_ LPCWSTR ServerName, 577c2c66affSColin Finck _In_opt_ LPCWSTR TrustedDomainName, 578c2c66affSColin Finck _In_ DWORD Flags, 579c2c66affSColin Finck _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo) 580c2c66affSColin Finck { 581c2c66affSColin Finck NET_API_STATUS status; 582c2c66affSColin Finck 583c2c66affSColin Finck TRACE("DsGetForestTrustInformationW(%s, %s, 0x%08lx, %p)\n", 584c2c66affSColin Finck debugstr_w(ServerName), debugstr_w(TrustedDomainName), 585c2c66affSColin Finck Flags, ForestTrustInfo); 586c2c66affSColin Finck 587c2c66affSColin Finck RpcTryExcept 588c2c66affSColin Finck { 589c2c66affSColin Finck status = DsrGetForestTrustInformation((PWSTR)ServerName, 590c2c66affSColin Finck (PWSTR)TrustedDomainName, 591c2c66affSColin Finck Flags, 592c2c66affSColin Finck ForestTrustInfo); 593c2c66affSColin Finck } 594c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 595c2c66affSColin Finck { 596c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 597c2c66affSColin Finck } 598c2c66affSColin Finck RpcEndExcept; 599c2c66affSColin Finck 600c2c66affSColin Finck return status; 601c2c66affSColin Finck } 602c2c66affSColin Finck 603c2c66affSColin Finck 604c2c66affSColin Finck DWORD 605c2c66affSColin Finck WINAPI 606c2c66affSColin Finck DsGetSiteNameA( 607*3d5c682cSEric Kohl _In_opt_ LPCSTR ComputerName, 608c2c66affSColin Finck _Out_ LPSTR *SiteName) 609c2c66affSColin Finck { 610*3d5c682cSEric Kohl PWSTR pComputerNameW = NULL; 611*3d5c682cSEric Kohl PWSTR pSiteNameW = NULL; 612*3d5c682cSEric Kohl DWORD dwError = ERROR_SUCCESS; 613*3d5c682cSEric Kohl 614*3d5c682cSEric Kohl TRACE("DsGetSiteNameA(%s, %p)\n", 615c2c66affSColin Finck debugstr_a(ComputerName), SiteName); 616*3d5c682cSEric Kohl 617*3d5c682cSEric Kohl if (ComputerName != NULL) 618*3d5c682cSEric Kohl { 619*3d5c682cSEric Kohl pComputerNameW = NetpAllocWStrFromAnsiStr((PSTR)ComputerName); 620*3d5c682cSEric Kohl if (pComputerNameW == NULL) 621*3d5c682cSEric Kohl { 622*3d5c682cSEric Kohl dwError = ERROR_NOT_ENOUGH_MEMORY; 623*3d5c682cSEric Kohl goto done; 624*3d5c682cSEric Kohl } 625*3d5c682cSEric Kohl } 626*3d5c682cSEric Kohl 627*3d5c682cSEric Kohl dwError = DsGetSiteNameW(pComputerNameW, 628*3d5c682cSEric Kohl &pSiteNameW); 629*3d5c682cSEric Kohl if (dwError != ERROR_SUCCESS) 630*3d5c682cSEric Kohl goto done; 631*3d5c682cSEric Kohl 632*3d5c682cSEric Kohl *SiteName = NetpAllocAnsiStrFromWStr(pSiteNameW); 633*3d5c682cSEric Kohl if (*SiteName == NULL) 634*3d5c682cSEric Kohl { 635*3d5c682cSEric Kohl dwError = ERROR_NOT_ENOUGH_MEMORY; 636*3d5c682cSEric Kohl } 637*3d5c682cSEric Kohl 638*3d5c682cSEric Kohl done: 639*3d5c682cSEric Kohl if (pSiteNameW != NULL) 640*3d5c682cSEric Kohl NetApiBufferFree(pSiteNameW); 641*3d5c682cSEric Kohl 642*3d5c682cSEric Kohl if (pComputerNameW != NULL) 643*3d5c682cSEric Kohl NetApiBufferFree(pComputerNameW); 644*3d5c682cSEric Kohl 645*3d5c682cSEric Kohl return dwError; 646c2c66affSColin Finck } 647c2c66affSColin Finck 648c2c66affSColin Finck 649c2c66affSColin Finck DWORD 650c2c66affSColin Finck WINAPI 651c2c66affSColin Finck DsGetSiteNameW( 652*3d5c682cSEric Kohl _In_opt_ LPCWSTR ComputerName, 653c2c66affSColin Finck _Out_ LPWSTR *SiteName) 654c2c66affSColin Finck { 655c2c66affSColin Finck NET_API_STATUS status; 656c2c66affSColin Finck 657c2c66affSColin Finck TRACE("DsGetSiteNameW(%s, %p)\n", 658c2c66affSColin Finck debugstr_w(ComputerName), SiteName); 659c2c66affSColin Finck 660c2c66affSColin Finck RpcTryExcept 661c2c66affSColin Finck { 662c2c66affSColin Finck status = DsrGetSiteName((PWSTR)ComputerName, 663c2c66affSColin Finck SiteName); 664c2c66affSColin Finck } 665c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 666c2c66affSColin Finck { 667c2c66affSColin Finck status = I_RpcMapWin32Status(RpcExceptionCode()); 668c2c66affSColin Finck } 669c2c66affSColin Finck RpcEndExcept; 670c2c66affSColin Finck 671c2c66affSColin Finck return status; 672c2c66affSColin Finck } 673c2c66affSColin Finck 674c2c66affSColin Finck 675c2c66affSColin Finck DWORD 676c2c66affSColin Finck WINAPI 677c2c66affSColin Finck DsMergeForestTrustInformationW( 678c2c66affSColin Finck _In_ LPCWSTR DomainName, 679c2c66affSColin Finck _In_ PLSA_FOREST_TRUST_INFORMATION NewForestTrustInfo, 680c2c66affSColin Finck _In_opt_ PLSA_FOREST_TRUST_INFORMATION OldForestTrustInfo, 681c2c66affSColin Finck _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo) 682c2c66affSColin Finck { 683c2c66affSColin Finck FIXME("DsMergeForestTrustInformationW(%s, %p, %p, %p)\n", 684c2c66affSColin Finck debugstr_w(DomainName), NewForestTrustInfo, 685c2c66affSColin Finck OldForestTrustInfo, ForestTrustInfo); 686c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 687c2c66affSColin Finck } 688c2c66affSColin Finck 689c2c66affSColin Finck 690c2c66affSColin Finck DWORD 691c2c66affSColin Finck WINAPI 692c2c66affSColin Finck DsValidateSubnetNameA( 693c2c66affSColin Finck _In_ LPCSTR SubnetName) 694c2c66affSColin Finck { 695c2c66affSColin Finck FIXME("DsValidateSubnetNameA(%s)\n", 696c2c66affSColin Finck debugstr_a(SubnetName)); 697c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 698c2c66affSColin Finck } 699c2c66affSColin Finck 700c2c66affSColin Finck 701c2c66affSColin Finck DWORD 702c2c66affSColin Finck WINAPI 703c2c66affSColin Finck DsValidateSubnetNameW( 704c2c66affSColin Finck _In_ LPCWSTR SubnetName) 705c2c66affSColin Finck { 706c2c66affSColin Finck FIXME("DsValidateSubnetNameW(%s)\n", 707c2c66affSColin Finck debugstr_w(SubnetName)); 708c2c66affSColin Finck return ERROR_CALL_NOT_IMPLEMENTED; 709c2c66affSColin Finck } 710c2c66affSColin Finck 711c2c66affSColin Finck 712c2c66affSColin Finck NTSTATUS 713c2c66affSColin Finck WINAPI 714c2c66affSColin Finck NetEnumerateTrustedDomains( 715c2c66affSColin Finck _In_ LPWSTR ServerName, 716c2c66affSColin Finck _Out_ LPWSTR *DomainNames) 717c2c66affSColin Finck { 718c2c66affSColin Finck DOMAIN_NAME_BUFFER DomainNameBuffer = {0, NULL}; 719c2c66affSColin Finck NTSTATUS Status = 0; 720c2c66affSColin Finck 721c2c66affSColin Finck TRACE("NetEnumerateTrustedDomains(%s, %p)\n", 722c2c66affSColin Finck debugstr_w(ServerName), DomainNames); 723c2c66affSColin Finck 724c2c66affSColin Finck RpcTryExcept 725c2c66affSColin Finck { 726c2c66affSColin Finck Status = NetrEnumerateTrustedDomains(ServerName, 727c2c66affSColin Finck &DomainNameBuffer); 728c2c66affSColin Finck if (NT_SUCCESS(Status)) 729c2c66affSColin Finck { 730c2c66affSColin Finck *DomainNames = (LPWSTR)DomainNameBuffer.DomainNames; 731c2c66affSColin Finck } 732c2c66affSColin Finck } 733c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 734c2c66affSColin Finck { 735c2c66affSColin Finck Status = I_RpcMapWin32Status(RpcExceptionCode()); 736c2c66affSColin Finck } RpcEndExcept; 737c2c66affSColin Finck 738c2c66affSColin Finck return Status; 739c2c66affSColin Finck } 740c2c66affSColin Finck 741c2c66affSColin Finck 742c2c66affSColin Finck NET_API_STATUS 743c2c66affSColin Finck WINAPI 744c2c66affSColin Finck NetGetAnyDCName( 745c2c66affSColin Finck _In_opt_ LPCWSTR ServerName, 746c2c66affSColin Finck _In_opt_ LPCWSTR DomainName, 747c2c66affSColin Finck _Out_ LPBYTE *BufPtr) 748c2c66affSColin Finck { 749adceb380SEric Kohl NET_API_STATUS Status; 750c2c66affSColin Finck 751c2c66affSColin Finck TRACE("NetGetAnyDCName(%s, %s, %p)\n", 752c2c66affSColin Finck debugstr_w(ServerName), debugstr_w(DomainName), BufPtr); 753c2c66affSColin Finck 754c2c66affSColin Finck *BufPtr = NULL; 755c2c66affSColin Finck 756c2c66affSColin Finck RpcTryExcept 757c2c66affSColin Finck { 758adceb380SEric Kohl Status = NetrGetAnyDCName((PWSTR)ServerName, 759c2c66affSColin Finck (PWSTR)DomainName, 760c2c66affSColin Finck (PWSTR*)BufPtr); 761c2c66affSColin Finck } 762c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 763c2c66affSColin Finck { 764adceb380SEric Kohl Status = I_RpcMapWin32Status(RpcExceptionCode()); 765c2c66affSColin Finck } 766c2c66affSColin Finck RpcEndExcept; 767c2c66affSColin Finck 768adceb380SEric Kohl return Status; 769c2c66affSColin Finck } 770c2c66affSColin Finck 771c2c66affSColin Finck 772c2c66affSColin Finck NET_API_STATUS 773c2c66affSColin Finck WINAPI 774c2c66affSColin Finck NetGetDCName( 775adceb380SEric Kohl _In_opt_ LPCWSTR ServerName, 776adceb380SEric Kohl _In_opt_ LPCWSTR DomainName, 777adceb380SEric Kohl _Out_ LPBYTE *BufPtr) 778c2c66affSColin Finck { 779adceb380SEric Kohl PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL; 780adceb380SEric Kohl NET_API_STATUS Status; 781c2c66affSColin Finck 782adceb380SEric Kohl FIXME("NetGetDCName(%s, %s, %p)\n", 783adceb380SEric Kohl debugstr_w(ServerName), debugstr_w(DomainName), BufPtr); 784adceb380SEric Kohl 785adceb380SEric Kohl if (ServerName == NULL || *ServerName == UNICODE_NULL) 786adceb380SEric Kohl { 787adceb380SEric Kohl Status = DsGetDcNameWithAccountW(NULL, 788adceb380SEric Kohl NULL, 789adceb380SEric Kohl 0, 790adceb380SEric Kohl DomainName, 791adceb380SEric Kohl NULL, 792adceb380SEric Kohl NULL, 793adceb380SEric Kohl 0, //??? 794adceb380SEric Kohl &pDomainControllerInfo); 795adceb380SEric Kohl if (Status != NERR_Success) 796adceb380SEric Kohl goto done; 797adceb380SEric Kohl 798adceb380SEric Kohl Status = NetApiBufferAllocate((wcslen(pDomainControllerInfo->DomainControllerName) + 1) * sizeof(WCHAR), 799adceb380SEric Kohl (PVOID*)BufPtr); 800adceb380SEric Kohl if (Status != NERR_Success) 801adceb380SEric Kohl goto done; 802adceb380SEric Kohl 803adceb380SEric Kohl wcscpy((PWSTR)*BufPtr, 804adceb380SEric Kohl pDomainControllerInfo->DomainControllerName); 805adceb380SEric Kohl } 806adceb380SEric Kohl else 807adceb380SEric Kohl { 808adceb380SEric Kohl FIXME("Not implemented yet!\n"); 809adceb380SEric Kohl Status = NERR_DCNotFound; 810adceb380SEric Kohl } 811adceb380SEric Kohl 812adceb380SEric Kohl done: 813adceb380SEric Kohl if (pDomainControllerInfo != NULL) 814adceb380SEric Kohl NetApiBufferFree(pDomainControllerInfo); 815adceb380SEric Kohl 816adceb380SEric Kohl return Status; 817c2c66affSColin Finck } 818c2c66affSColin Finck 819c2c66affSColin Finck 820e0b50500SEric Kohl NET_API_STATUS 821e0b50500SEric Kohl WINAPI 822e0b50500SEric Kohl NetLogonGetTimeServiceParentDomain( 823e0b50500SEric Kohl _In_ LPWSTR ServerName, 824e0b50500SEric Kohl _Out_ LPWSTR *DomainName, 825e0b50500SEric Kohl _Out_ LPBOOL PdcSameSite) 826e0b50500SEric Kohl { 827e0b50500SEric Kohl NET_API_STATUS Status; 828e0b50500SEric Kohl 829e0b50500SEric Kohl TRACE("NetLogonGetTimeServiceParentDomain(%s, %p, %p)\n", 830e0b50500SEric Kohl debugstr_w(ServerName), DomainName, PdcSameSite); 831e0b50500SEric Kohl 832e0b50500SEric Kohl RpcTryExcept 833e0b50500SEric Kohl { 834e0b50500SEric Kohl Status = NetrLogonGetTimeServiceParentDomain(ServerName, 835e0b50500SEric Kohl DomainName, 836e0b50500SEric Kohl PdcSameSite); 837e0b50500SEric Kohl } 838e0b50500SEric Kohl RpcExcept(EXCEPTION_EXECUTE_HANDLER) 839e0b50500SEric Kohl { 840e0b50500SEric Kohl Status = I_RpcMapWin32Status(RpcExceptionCode()); 841e0b50500SEric Kohl } 842e0b50500SEric Kohl RpcEndExcept; 843e0b50500SEric Kohl 844e0b50500SEric Kohl return Status; 845e0b50500SEric Kohl } 846e0b50500SEric Kohl 847e0b50500SEric Kohl 848c2c66affSColin Finck NTSTATUS 849c2c66affSColin Finck WINAPI 850c2c66affSColin Finck NetLogonSetServiceBits( 851c2c66affSColin Finck _In_ LPWSTR ServerName, 852c2c66affSColin Finck _In_ DWORD ServiceBitsOfInterest, 853c2c66affSColin Finck _In_ DWORD ServiceBits) 854c2c66affSColin Finck { 855c2c66affSColin Finck NTSTATUS Status; 856c2c66affSColin Finck 857c2c66affSColin Finck TRACE("NetLogonSetServiceBits(%s 0x%lx 0x%lx)\n", 858c2c66affSColin Finck debugstr_w(ServerName), ServiceBitsOfInterest, ServiceBits); 859c2c66affSColin Finck 860c2c66affSColin Finck RpcTryExcept 861c2c66affSColin Finck { 862c2c66affSColin Finck Status = NetrLogonSetServiceBits(ServerName, 863c2c66affSColin Finck ServiceBitsOfInterest, 864c2c66affSColin Finck ServiceBits); 865c2c66affSColin Finck } 866c2c66affSColin Finck RpcExcept(EXCEPTION_EXECUTE_HANDLER) 867c2c66affSColin Finck { 868c2c66affSColin Finck Status = RpcExceptionCode(); 869c2c66affSColin Finck } 870c2c66affSColin Finck RpcEndExcept; 871c2c66affSColin Finck 872c2c66affSColin Finck return Status; 873c2c66affSColin Finck } 874c2c66affSColin Finck 875c2c66affSColin Finck /* EOF */ 876