xref: /reactos/dll/win32/netapi32/netlogon.c (revision 792d0f6b)
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