[NETAPI32] Implement parts of NetGetDCName and declare some parameters optional.
[reactos.git] / dll / win32 / netapi32 / netlogon.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: NetAPI DLL
4 * FILE: dll/win32/netapi32/netlogon.c
5 * PURPOSE: Netlogon service interface code
6 * PROGRAMMERS: Eric Kohl (eric.kohl@reactos.org)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "netapi32.h"
12 #include <winsock2.h>
13 #include <rpc.h>
14 #include <dsrole.h>
15 #include <dsgetdc.h>
16 #include "netlogon_c.h"
17
18 WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
19
20 DWORD
21 WINAPI
22 DsGetDcNameWithAccountA(
23 _In_opt_ LPCSTR ComputerName,
24 _In_opt_ LPCSTR AccountName,
25 _In_ ULONG AccountControlBits,
26 _In_ LPCSTR DomainName,
27 _In_ GUID *DomainGuid,
28 _In_ LPCSTR SiteName,
29 _In_ ULONG Flags,
30 _Out_ PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo);
31
32 DWORD
33 WINAPI
34 DsGetDcNameWithAccountW(
35 _In_opt_ LPCWSTR ComputerName,
36 _In_opt_ LPCWSTR AccountName,
37 _In_ ULONG AccountControlBits,
38 _In_ LPCWSTR DomainName,
39 _In_ GUID *DomainGuid,
40 _In_ LPCWSTR SiteName,
41 _In_ ULONG Flags,
42 _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo);
43
44 /* FUNCTIONS *****************************************************************/
45
46 handle_t
47 __RPC_USER
48 LOGONSRV_HANDLE_bind(
49 LOGONSRV_HANDLE pszSystemName)
50 {
51 handle_t hBinding = NULL;
52 LPWSTR pszStringBinding;
53 RPC_STATUS status;
54
55 TRACE("LOGONSRV_HANDLE_bind() called\n");
56
57 status = RpcStringBindingComposeW(NULL,
58 L"ncacn_np",
59 pszSystemName,
60 L"\\pipe\\netlogon",
61 NULL,
62 &pszStringBinding);
63 if (status)
64 {
65 TRACE("RpcStringBindingCompose returned 0x%x\n", status);
66 return NULL;
67 }
68
69 /* Set the binding handle that will be used to bind to the server. */
70 status = RpcBindingFromStringBindingW(pszStringBinding,
71 &hBinding);
72 if (status)
73 {
74 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status);
75 }
76
77 status = RpcStringFreeW(&pszStringBinding);
78 if (status)
79 {
80 // TRACE("RpcStringFree returned 0x%x\n", status);
81 }
82
83 return hBinding;
84 }
85
86
87 void
88 __RPC_USER
89 LOGONSRV_HANDLE_unbind(
90 LOGONSRV_HANDLE pszSystemName,
91 handle_t hBinding)
92 {
93 RPC_STATUS status;
94
95 TRACE("LOGONSRV_HANDLE_unbind() called\n");
96
97 status = RpcBindingFree(&hBinding);
98 if (status)
99 {
100 TRACE("RpcBindingFree returned 0x%x\n", status);
101 }
102 }
103
104
105 /* PUBLIC FUNCTIONS **********************************************************/
106
107 DWORD
108 WINAPI
109 DsAddressToSiteNamesA(
110 _In_opt_ LPCSTR ComputerName,
111 _In_ DWORD EntryCount,
112 _In_ PSOCKET_ADDRESS SocketAddresses,
113 _Out_ LPSTR **SiteNames)
114 {
115 FIXME("DsAddressToSiteNamesA(%s, %lu, %p, %p)\n",
116 debugstr_a(ComputerName), EntryCount, SocketAddresses, SiteNames);
117 return ERROR_CALL_NOT_IMPLEMENTED;
118 }
119
120
121 DWORD
122 WINAPI
123 DsAddressToSiteNamesW(
124 _In_opt_ LPCWSTR ComputerName,
125 _In_ DWORD EntryCount,
126 _In_ PSOCKET_ADDRESS SocketAddresses,
127 _Out_ LPWSTR **SiteNames)
128 {
129 PNL_SITE_NAME_ARRAY SiteNameArray = NULL;
130 PWSTR *SiteNamesBuffer = NULL, Ptr;
131 ULONG BufferSize, i;
132 NET_API_STATUS status;
133
134 TRACE("DsAddressToSiteNamesW(%s, %lu, %p, %p)\n",
135 debugstr_w(ComputerName), EntryCount, SocketAddresses, SiteNames);
136
137 if (EntryCount == 0)
138 return ERROR_INVALID_PARAMETER;
139
140 *SiteNames = NULL;
141
142 RpcTryExcept
143 {
144 status = DsrAddressToSiteNamesW((PWSTR)ComputerName,
145 EntryCount,
146 (PNL_SOCKET_ADDRESS)SocketAddresses,
147 &SiteNameArray);
148 if (status == NERR_Success)
149 {
150 if (SiteNameArray->EntryCount == 0)
151 {
152 status = ERROR_INVALID_PARAMETER;
153 }
154 else
155 {
156 BufferSize = SiteNameArray->EntryCount * sizeof(PWSTR);
157 for (i = 0; i < SiteNameArray->EntryCount; i++)
158 BufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR);
159
160 status = NetApiBufferAllocate(BufferSize, (PVOID*)&SiteNamesBuffer);
161 if (status == NERR_Success)
162 {
163 ZeroMemory(SiteNamesBuffer, BufferSize);
164
165 Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR));
166 for (i = 0; i < SiteNameArray->EntryCount; i++)
167 {
168 SiteNamesBuffer[i] = Ptr;
169 CopyMemory(Ptr,
170 SiteNameArray->SiteNames[i].Buffer,
171 SiteNameArray->SiteNames[i].Length);
172
173 Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR));
174 }
175
176 *SiteNames = SiteNamesBuffer;
177 }
178 }
179
180 MIDL_user_free(SiteNameArray);
181 }
182 }
183 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
184 {
185 status = I_RpcMapWin32Status(RpcExceptionCode());
186 }
187 RpcEndExcept;
188
189 return status;
190 }
191
192
193 DWORD
194 WINAPI
195 DsAddressToSiteNamesExA(
196 _In_opt_ LPCSTR ComputerName,
197 _In_ DWORD EntryCount,
198 _In_ PSOCKET_ADDRESS SocketAddresses,
199 _Out_ LPSTR **SiteNames,
200 _Out_ LPSTR **SubnetNames)
201 {
202 FIXME("DsAddressToSiteNamesExA(%s, %lu, %p, %p, %p)\n",
203 debugstr_a(ComputerName), EntryCount, SocketAddresses,
204 SiteNames, SubnetNames);
205 return ERROR_CALL_NOT_IMPLEMENTED;
206 }
207
208
209 DWORD
210 WINAPI
211 DsAddressToSiteNamesExW(
212 _In_opt_ LPCWSTR ComputerName,
213 _In_ DWORD EntryCount,
214 _In_ PSOCKET_ADDRESS SocketAddresses,
215 _Out_ LPWSTR **SiteNames,
216 _Out_ LPWSTR **SubnetNames)
217 {
218 PNL_SITE_NAME_EX_ARRAY SiteNameArray = NULL;
219 PWSTR *SiteNamesBuffer = NULL, *SubnetNamesBuffer = NULL, Ptr;
220 ULONG SiteNameBufferSize, SubnetNameBufferSize, i;
221 NET_API_STATUS status;
222
223 TRACE("DsAddressToSiteNamesExW(%s, %lu, %p, %p, %p)\n",
224 debugstr_w(ComputerName), EntryCount, SocketAddresses,
225 SiteNames, SubnetNames);
226
227 if (EntryCount == 0)
228 return ERROR_INVALID_PARAMETER;
229
230 *SiteNames = NULL;
231 *SubnetNames = NULL;
232
233 RpcTryExcept
234 {
235 status = DsrAddressToSiteNamesExW((PWSTR)ComputerName,
236 EntryCount,
237 (PNL_SOCKET_ADDRESS)SocketAddresses,
238 &SiteNameArray);
239 if (status == NERR_Success)
240 {
241 if (SiteNameArray->EntryCount == 0)
242 {
243 status = ERROR_INVALID_PARAMETER;
244 }
245 else
246 {
247 SiteNameBufferSize = SiteNameArray->EntryCount * sizeof(PWSTR);
248 SubnetNameBufferSize = SiteNameArray->EntryCount * sizeof(PWSTR);
249 for (i = 0; i < SiteNameArray->EntryCount; i++)
250 {
251 SiteNameBufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR);
252 SubnetNameBufferSize += SiteNameArray->SubnetNames[i].Length + sizeof(WCHAR);
253 }
254
255 status = NetApiBufferAllocate(SiteNameBufferSize, (PVOID*)&SiteNamesBuffer);
256 if (status == NERR_Success)
257 {
258 ZeroMemory(SiteNamesBuffer, SiteNameBufferSize);
259
260 Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR));
261 for (i = 0; i < SiteNameArray->EntryCount; i++)
262 {
263 SiteNamesBuffer[i] = Ptr;
264 CopyMemory(Ptr,
265 SiteNameArray->SiteNames[i].Buffer,
266 SiteNameArray->SiteNames[i].Length);
267
268 Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR));
269 }
270
271 *SiteNames = SiteNamesBuffer;
272 }
273
274 status = NetApiBufferAllocate(SubnetNameBufferSize, (PVOID*)&SubnetNamesBuffer);
275 if (status == NERR_Success)
276 {
277 ZeroMemory(SubnetNamesBuffer, SubnetNameBufferSize);
278
279 Ptr = (PWSTR)((ULONG_PTR)SubnetNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR));
280 for (i = 0; i < SiteNameArray->EntryCount; i++)
281 {
282 SubnetNamesBuffer[i] = Ptr;
283 CopyMemory(Ptr,
284 SiteNameArray->SubnetNames[i].Buffer,
285 SiteNameArray->SubnetNames[i].Length);
286
287 Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SubnetNames[i].Length + sizeof(WCHAR));
288 }
289
290 *SubnetNames = SubnetNamesBuffer;
291 }
292 }
293
294 MIDL_user_free(SiteNameArray);
295 }
296 }
297 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
298 {
299 status = I_RpcMapWin32Status(RpcExceptionCode());
300 }
301 RpcEndExcept;
302
303 return status;
304 }
305
306
307 DWORD
308 WINAPI
309 DsDeregisterDnsHostRecordsA(
310 _In_opt_ LPSTR ServerName,
311 _In_opt_ LPSTR DnsDomainName,
312 _In_opt_ GUID *DomainGuid,
313 _In_opt_ GUID *DsaGuid,
314 _In_ LPSTR DnsHostName)
315 {
316 FIXME("DsDeregisterDnsHostRecordsA(%s, %s, %p, %p, %s)\n",
317 debugstr_a(ServerName), debugstr_a(DnsDomainName),
318 DomainGuid, DsaGuid, debugstr_a(DnsHostName));
319 return ERROR_CALL_NOT_IMPLEMENTED;
320 }
321
322
323 DWORD
324 WINAPI
325 DsDeregisterDnsHostRecordsW(
326 _In_opt_ LPWSTR ServerName,
327 _In_opt_ LPWSTR DnsDomainName,
328 _In_opt_ GUID *DomainGuid,
329 _In_opt_ GUID *DsaGuid,
330 _In_ LPWSTR DnsHostName)
331 {
332 NET_API_STATUS status;
333
334 TRACE("DsDeregisterDnsHostRecordsW(%s, %s, %p, %p, %s)\n",
335 debugstr_w(ServerName), debugstr_w(DnsDomainName),
336 DomainGuid, DsaGuid, debugstr_w(DnsHostName));
337
338 RpcTryExcept
339 {
340 status = DsrDeregisterDnsHostRecords(ServerName,
341 DnsDomainName,
342 DomainGuid,
343 DsaGuid,
344 DnsHostName);
345 }
346 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
347 {
348 status = I_RpcMapWin32Status(RpcExceptionCode());
349 }
350 RpcEndExcept;
351
352 return status;
353 }
354
355
356 DWORD
357 WINAPI
358 DsEnumerateDomainTrustsA(
359 _In_opt_ LPSTR ServerName,
360 _In_ ULONG Flags,
361 _Out_ PDS_DOMAIN_TRUSTSA *Domains,
362 _Out_ PULONG DomainCount)
363 {
364 FIXME("DsEnumerateDomainTrustsA(%s, %x, %p, %p)\n",
365 debugstr_a(ServerName), Flags, Domains, DomainCount);
366 return ERROR_CALL_NOT_IMPLEMENTED;
367 }
368
369
370 DWORD
371 WINAPI
372 DsEnumerateDomainTrustsW(
373 _In_opt_ LPWSTR ServerName,
374 _In_ ULONG Flags,
375 _Out_ PDS_DOMAIN_TRUSTSW *Domains,
376 _Out_ PULONG DomainCount)
377 {
378 FIXME("DsEnumerateDomainTrustsW(%s, %x, %p, %p)\n",
379 debugstr_w(ServerName), Flags, Domains, DomainCount);
380 return ERROR_CALL_NOT_IMPLEMENTED;
381 }
382
383
384 DWORD
385 WINAPI
386 DsGetDcNameA(
387 _In_opt_ LPCSTR ComputerName,
388 _In_ LPCSTR DomainName,
389 _In_ GUID *DomainGuid,
390 _In_ LPCSTR SiteName,
391 _In_ ULONG Flags,
392 _Out_ PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo)
393 {
394 TRACE("DsGetDcNameA(%s, %s, %s, %s, %08lx, %p): stub\n",
395 debugstr_a(ComputerName), debugstr_a(DomainName), debugstr_guid(DomainGuid),
396 debugstr_a(SiteName), Flags, DomainControllerInfo);
397 return DsGetDcNameWithAccountA(ComputerName,
398 NULL,
399 0,
400 DomainName,
401 DomainGuid,
402 SiteName,
403 Flags,
404 DomainControllerInfo);
405 }
406
407
408 DWORD
409 WINAPI
410 DsGetDcNameW(
411 _In_opt_ LPCWSTR ComputerName,
412 _In_ LPCWSTR DomainName,
413 _In_ GUID *DomainGuid,
414 _In_ LPCWSTR SiteName,
415 _In_ ULONG Flags,
416 _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo)
417 {
418 TRACE("DsGetDcNameW(%s, %s, %s, %s, %08lx, %p)\n",
419 debugstr_w(ComputerName), debugstr_w(DomainName), debugstr_guid(DomainGuid),
420 debugstr_w(SiteName), Flags, DomainControllerInfo);
421 return DsGetDcNameWithAccountW(ComputerName,
422 NULL,
423 0,
424 DomainName,
425 DomainGuid,
426 SiteName,
427 Flags,
428 DomainControllerInfo);
429 }
430
431
432 DWORD
433 WINAPI
434 DsGetDcNameWithAccountA(
435 _In_opt_ LPCSTR ComputerName,
436 _In_opt_ LPCSTR AccountName,
437 _In_ ULONG AccountControlBits,
438 _In_ LPCSTR DomainName,
439 _In_ GUID *DomainGuid,
440 _In_ LPCSTR SiteName,
441 _In_ ULONG Flags,
442 _Out_ PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo)
443 {
444 FIXME("DsGetDcNameWithAccountA(%s, %s, %08lx, %s, %s, %s, %08lx, %p): stub\n",
445 debugstr_a(ComputerName), debugstr_a(AccountName), AccountControlBits,
446 debugstr_a(DomainName), debugstr_guid(DomainGuid),
447 debugstr_a(SiteName), Flags, DomainControllerInfo);
448 return ERROR_CALL_NOT_IMPLEMENTED;
449 }
450
451
452 DWORD
453 WINAPI
454 DsGetDcNameWithAccountW(
455 _In_opt_ LPCWSTR ComputerName,
456 _In_opt_ LPCWSTR AccountName,
457 _In_ ULONG AccountControlBits,
458 _In_ LPCWSTR DomainName,
459 _In_ GUID *DomainGuid,
460 _In_ LPCWSTR SiteName,
461 _In_ ULONG Flags,
462 _Out_ PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo)
463 {
464 NET_API_STATUS status;
465
466 FIXME("DsGetDcNameWithAccountW(%s, %s, %08lx, %s, %s, %s, %08lx, %p): stub\n",
467 debugstr_w(ComputerName), debugstr_w(AccountName), AccountControlBits,
468 debugstr_w(DomainName), debugstr_guid(DomainGuid),
469 debugstr_w(SiteName), Flags, DomainControllerInfo);
470
471 RpcTryExcept
472 {
473 status = DsrGetDcNameEx2((PWSTR)ComputerName,
474 (PWSTR)AccountName,
475 AccountControlBits,
476 (PWSTR)DomainName,
477 DomainGuid,
478 (PWSTR)SiteName,
479 Flags,
480 DomainControllerInfo);
481 }
482 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
483 {
484 status = I_RpcMapWin32Status(RpcExceptionCode());
485 }
486 RpcEndExcept;
487
488 return status;
489 }
490
491
492 DWORD
493 WINAPI
494 DsGetDcSiteCoverageA(
495 _In_opt_ LPCSTR ServerName,
496 _Out_ PULONG EntryCount,
497 _Out_ LPSTR **SiteNames)
498 {
499 FIXME("DsGetDcSiteCoverageA(%s, %p, %p)\n",
500 debugstr_a(ServerName), EntryCount, SiteNames);
501 return ERROR_CALL_NOT_IMPLEMENTED;
502 }
503
504
505 DWORD
506 WINAPI
507 DsGetDcSiteCoverageW(
508 _In_opt_ LPCWSTR ServerName,
509 _Out_ PULONG EntryCount,
510 _Out_ LPWSTR **SiteNames)
511 {
512 PNL_SITE_NAME_ARRAY SiteNameArray = NULL;
513 PWSTR *SiteNamesBuffer = NULL, Ptr;
514 ULONG BufferSize, i;
515 NET_API_STATUS status;
516
517 TRACE("DsGetDcSiteCoverageW(%s, %p, %p)\n",
518 debugstr_w(ServerName), EntryCount, SiteNames);
519
520 *EntryCount = 0;
521 *SiteNames = NULL;
522
523 RpcTryExcept
524 {
525 status = DsrGetDcSiteCoverageW((PWSTR)ServerName,
526 &SiteNameArray);
527 if (status == NERR_Success)
528 {
529 if (SiteNameArray->EntryCount == 0)
530 {
531 status = ERROR_INVALID_PARAMETER;
532 }
533 else
534 {
535 BufferSize = SiteNameArray->EntryCount * sizeof(PWSTR);
536 for (i = 0; i < SiteNameArray->EntryCount; i++)
537 BufferSize += SiteNameArray->SiteNames[i].Length + sizeof(WCHAR);
538
539 status = NetApiBufferAllocate(BufferSize, (PVOID*)&SiteNamesBuffer);
540 if (status == NERR_Success)
541 {
542 ZeroMemory(SiteNamesBuffer, BufferSize);
543
544 Ptr = (PWSTR)((ULONG_PTR)SiteNamesBuffer + SiteNameArray->EntryCount * sizeof(PWSTR));
545 for (i = 0; i < SiteNameArray->EntryCount; i++)
546 {
547 SiteNamesBuffer[i] = Ptr;
548 CopyMemory(Ptr,
549 SiteNameArray->SiteNames[i].Buffer,
550 SiteNameArray->SiteNames[i].Length);
551
552 Ptr = (PWSTR)((ULONG_PTR)Ptr + SiteNameArray->SiteNames[i].Length + sizeof(WCHAR));
553 }
554
555 *EntryCount = SiteNameArray->EntryCount;
556 *SiteNames = SiteNamesBuffer;
557 }
558 }
559
560 MIDL_user_free(SiteNameArray);
561 }
562 }
563 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
564 {
565 status = I_RpcMapWin32Status(RpcExceptionCode());
566 }
567 RpcEndExcept;
568
569 return status;
570 }
571
572
573 DWORD
574 WINAPI
575 DsGetForestTrustInformationW(
576 _In_opt_ LPCWSTR ServerName,
577 _In_opt_ LPCWSTR TrustedDomainName,
578 _In_ DWORD Flags,
579 _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo)
580 {
581 NET_API_STATUS status;
582
583 TRACE("DsGetForestTrustInformationW(%s, %s, 0x%08lx, %p)\n",
584 debugstr_w(ServerName), debugstr_w(TrustedDomainName),
585 Flags, ForestTrustInfo);
586
587 RpcTryExcept
588 {
589 status = DsrGetForestTrustInformation((PWSTR)ServerName,
590 (PWSTR)TrustedDomainName,
591 Flags,
592 ForestTrustInfo);
593 }
594 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
595 {
596 status = I_RpcMapWin32Status(RpcExceptionCode());
597 }
598 RpcEndExcept;
599
600 return status;
601 }
602
603
604 DWORD
605 WINAPI
606 DsGetSiteNameA(
607 _In_ LPCSTR ComputerName,
608 _Out_ LPSTR *SiteName)
609 {
610 FIXME("DsGetSiteNameA(%s, %p)\n",
611 debugstr_a(ComputerName), SiteName);
612 return ERROR_CALL_NOT_IMPLEMENTED;
613 }
614
615
616 DWORD
617 WINAPI
618 DsGetSiteNameW(
619 _In_ LPCWSTR ComputerName,
620 _Out_ LPWSTR *SiteName)
621 {
622 NET_API_STATUS status;
623
624 TRACE("DsGetSiteNameW(%s, %p)\n",
625 debugstr_w(ComputerName), SiteName);
626
627 RpcTryExcept
628 {
629 status = DsrGetSiteName((PWSTR)ComputerName,
630 SiteName);
631 }
632 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
633 {
634 status = I_RpcMapWin32Status(RpcExceptionCode());
635 }
636 RpcEndExcept;
637
638 return status;
639 }
640
641
642 DWORD
643 WINAPI
644 DsMergeForestTrustInformationW(
645 _In_ LPCWSTR DomainName,
646 _In_ PLSA_FOREST_TRUST_INFORMATION NewForestTrustInfo,
647 _In_opt_ PLSA_FOREST_TRUST_INFORMATION OldForestTrustInfo,
648 _Out_ PLSA_FOREST_TRUST_INFORMATION *ForestTrustInfo)
649 {
650 FIXME("DsMergeForestTrustInformationW(%s, %p, %p, %p)\n",
651 debugstr_w(DomainName), NewForestTrustInfo,
652 OldForestTrustInfo, ForestTrustInfo);
653 return ERROR_CALL_NOT_IMPLEMENTED;
654 }
655
656
657 DWORD
658 WINAPI
659 DsValidateSubnetNameA(
660 _In_ LPCSTR SubnetName)
661 {
662 FIXME("DsValidateSubnetNameA(%s)\n",
663 debugstr_a(SubnetName));
664 return ERROR_CALL_NOT_IMPLEMENTED;
665 }
666
667
668 DWORD
669 WINAPI
670 DsValidateSubnetNameW(
671 _In_ LPCWSTR SubnetName)
672 {
673 FIXME("DsValidateSubnetNameW(%s)\n",
674 debugstr_w(SubnetName));
675 return ERROR_CALL_NOT_IMPLEMENTED;
676 }
677
678
679 NTSTATUS
680 WINAPI
681 NetEnumerateTrustedDomains(
682 _In_ LPWSTR ServerName,
683 _Out_ LPWSTR *DomainNames)
684 {
685 DOMAIN_NAME_BUFFER DomainNameBuffer = {0, NULL};
686 NTSTATUS Status = 0;
687
688 TRACE("NetEnumerateTrustedDomains(%s, %p)\n",
689 debugstr_w(ServerName), DomainNames);
690
691 RpcTryExcept
692 {
693 Status = NetrEnumerateTrustedDomains(ServerName,
694 &DomainNameBuffer);
695 if (NT_SUCCESS(Status))
696 {
697 *DomainNames = (LPWSTR)DomainNameBuffer.DomainNames;
698 }
699 }
700 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
701 {
702 Status = I_RpcMapWin32Status(RpcExceptionCode());
703 } RpcEndExcept;
704
705 return Status;
706 }
707
708
709 NET_API_STATUS
710 WINAPI
711 NetGetAnyDCName(
712 _In_opt_ LPCWSTR ServerName,
713 _In_opt_ LPCWSTR DomainName,
714 _Out_ LPBYTE *BufPtr)
715 {
716 NET_API_STATUS Status;
717
718 TRACE("NetGetAnyDCName(%s, %s, %p)\n",
719 debugstr_w(ServerName), debugstr_w(DomainName), BufPtr);
720
721 *BufPtr = NULL;
722
723 RpcTryExcept
724 {
725 Status = NetrGetAnyDCName((PWSTR)ServerName,
726 (PWSTR)DomainName,
727 (PWSTR*)BufPtr);
728 }
729 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
730 {
731 Status = I_RpcMapWin32Status(RpcExceptionCode());
732 }
733 RpcEndExcept;
734
735 return Status;
736 }
737
738
739 NET_API_STATUS
740 WINAPI
741 NetGetDCName(
742 _In_opt_ LPCWSTR ServerName,
743 _In_opt_ LPCWSTR DomainName,
744 _Out_ LPBYTE *BufPtr)
745 {
746 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
747 NET_API_STATUS Status;
748
749 FIXME("NetGetDCName(%s, %s, %p)\n",
750 debugstr_w(ServerName), debugstr_w(DomainName), BufPtr);
751
752 if (ServerName == NULL || *ServerName == UNICODE_NULL)
753 {
754 Status = DsGetDcNameWithAccountW(NULL,
755 NULL,
756 0,
757 DomainName,
758 NULL,
759 NULL,
760 0, //???
761 &pDomainControllerInfo);
762 if (Status != NERR_Success)
763 goto done;
764
765 Status = NetApiBufferAllocate((wcslen(pDomainControllerInfo->DomainControllerName) + 1) * sizeof(WCHAR),
766 (PVOID*)BufPtr);
767 if (Status != NERR_Success)
768 goto done;
769
770 wcscpy((PWSTR)*BufPtr,
771 pDomainControllerInfo->DomainControllerName);
772 }
773 else
774 {
775 FIXME("Not implemented yet!\n");
776 Status = NERR_DCNotFound;
777 }
778
779 done:
780 if (pDomainControllerInfo != NULL)
781 NetApiBufferFree(pDomainControllerInfo);
782
783 return Status;
784 }
785
786
787 NET_API_STATUS
788 WINAPI
789 NetLogonGetTimeServiceParentDomain(
790 _In_ LPWSTR ServerName,
791 _Out_ LPWSTR *DomainName,
792 _Out_ LPBOOL PdcSameSite)
793 {
794 NET_API_STATUS Status;
795
796 TRACE("NetLogonGetTimeServiceParentDomain(%s, %p, %p)\n",
797 debugstr_w(ServerName), DomainName, PdcSameSite);
798
799 RpcTryExcept
800 {
801 Status = NetrLogonGetTimeServiceParentDomain(ServerName,
802 DomainName,
803 PdcSameSite);
804 }
805 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
806 {
807 Status = I_RpcMapWin32Status(RpcExceptionCode());
808 }
809 RpcEndExcept;
810
811 return Status;
812 }
813
814
815 NTSTATUS
816 WINAPI
817 NetLogonSetServiceBits(
818 _In_ LPWSTR ServerName,
819 _In_ DWORD ServiceBitsOfInterest,
820 _In_ DWORD ServiceBits)
821 {
822 NTSTATUS Status;
823
824 TRACE("NetLogonSetServiceBits(%s 0x%lx 0x%lx)\n",
825 debugstr_w(ServerName), ServiceBitsOfInterest, ServiceBits);
826
827 RpcTryExcept
828 {
829 Status = NetrLogonSetServiceBits(ServerName,
830 ServiceBitsOfInterest,
831 ServiceBits);
832 }
833 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
834 {
835 Status = RpcExceptionCode();
836 }
837 RpcEndExcept;
838
839 return Status;
840 }
841
842 /* EOF */