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