2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: dll/win32/netapi32/netlogon.c
5 * PURPOSE: Netlogon service interface code
6 * PROGRAMMERS: Eric Kohl (eric.kohl@reactos.org)
9 /* INCLUDES ******************************************************************/
16 #include "netlogon_c.h"
18 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
22 DsGetDcNameWithAccountA(
23 _In_opt_ LPCSTR ComputerName
,
24 _In_opt_ LPCSTR AccountName
,
25 _In_ ULONG AccountControlBits
,
26 _In_ LPCSTR DomainName
,
27 _In_ GUID
*DomainGuid
,
30 _Out_ PDOMAIN_CONTROLLER_INFOA
*DomainControllerInfo
);
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
,
42 _Out_ PDOMAIN_CONTROLLER_INFOW
*DomainControllerInfo
);
44 /* FUNCTIONS *****************************************************************/
49 LOGONSRV_HANDLE pszSystemName
)
51 handle_t hBinding
= NULL
;
52 LPWSTR pszStringBinding
;
55 TRACE("LOGONSRV_HANDLE_bind() called\n");
57 status
= RpcStringBindingComposeW(NULL
,
65 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
69 /* Set the binding handle that will be used to bind to the server. */
70 status
= RpcBindingFromStringBindingW(pszStringBinding
,
74 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
77 status
= RpcStringFreeW(&pszStringBinding
);
80 // TRACE("RpcStringFree returned 0x%x\n", status);
89 LOGONSRV_HANDLE_unbind(
90 LOGONSRV_HANDLE pszSystemName
,
95 TRACE("LOGONSRV_HANDLE_unbind() called\n");
97 status
= RpcBindingFree(&hBinding
);
100 TRACE("RpcBindingFree returned 0x%x\n", status
);
105 /* PUBLIC FUNCTIONS **********************************************************/
109 DsAddressToSiteNamesA(
110 _In_opt_ LPCSTR ComputerName
,
111 _In_ DWORD EntryCount
,
112 _In_ PSOCKET_ADDRESS SocketAddresses
,
113 _Out_ LPSTR
**SiteNames
)
115 FIXME("DsAddressToSiteNamesA(%s, %lu, %p, %p)\n",
116 debugstr_a(ComputerName
), EntryCount
, SocketAddresses
, SiteNames
);
117 return ERROR_CALL_NOT_IMPLEMENTED
;
123 DsAddressToSiteNamesW(
124 _In_opt_ LPCWSTR ComputerName
,
125 _In_ DWORD EntryCount
,
126 _In_ PSOCKET_ADDRESS SocketAddresses
,
127 _Out_ LPWSTR
**SiteNames
)
129 PNL_SITE_NAME_ARRAY SiteNameArray
= NULL
;
130 PWSTR
*SiteNamesBuffer
= NULL
, Ptr
;
132 NET_API_STATUS status
;
134 TRACE("DsAddressToSiteNamesW(%s, %lu, %p, %p)\n",
135 debugstr_w(ComputerName
), EntryCount
, SocketAddresses
, SiteNames
);
138 return ERROR_INVALID_PARAMETER
;
144 status
= DsrAddressToSiteNamesW((PWSTR
)ComputerName
,
146 (PNL_SOCKET_ADDRESS
)SocketAddresses
,
148 if (status
== NERR_Success
)
150 if (SiteNameArray
->EntryCount
== 0)
152 status
= ERROR_INVALID_PARAMETER
;
156 BufferSize
= SiteNameArray
->EntryCount
* sizeof(PWSTR
);
157 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
158 BufferSize
+= SiteNameArray
->SiteNames
[i
].Length
+ sizeof(WCHAR
);
160 status
= NetApiBufferAllocate(BufferSize
, (PVOID
*)&SiteNamesBuffer
);
161 if (status
== NERR_Success
)
163 ZeroMemory(SiteNamesBuffer
, BufferSize
);
165 Ptr
= (PWSTR
)((ULONG_PTR
)SiteNamesBuffer
+ SiteNameArray
->EntryCount
* sizeof(PWSTR
));
166 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
168 SiteNamesBuffer
[i
] = Ptr
;
170 SiteNameArray
->SiteNames
[i
].Buffer
,
171 SiteNameArray
->SiteNames
[i
].Length
);
173 Ptr
= (PWSTR
)((ULONG_PTR
)Ptr
+ SiteNameArray
->SiteNames
[i
].Length
+ sizeof(WCHAR
));
176 *SiteNames
= SiteNamesBuffer
;
180 MIDL_user_free(SiteNameArray
);
183 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
185 status
= I_RpcMapWin32Status(RpcExceptionCode());
195 DsAddressToSiteNamesExA(
196 _In_opt_ LPCSTR ComputerName
,
197 _In_ DWORD EntryCount
,
198 _In_ PSOCKET_ADDRESS SocketAddresses
,
199 _Out_ LPSTR
**SiteNames
,
200 _Out_ LPSTR
**SubnetNames
)
202 FIXME("DsAddressToSiteNamesExA(%s, %lu, %p, %p, %p)\n",
203 debugstr_a(ComputerName
), EntryCount
, SocketAddresses
,
204 SiteNames
, SubnetNames
);
205 return ERROR_CALL_NOT_IMPLEMENTED
;
211 DsAddressToSiteNamesExW(
212 _In_opt_ LPCWSTR ComputerName
,
213 _In_ DWORD EntryCount
,
214 _In_ PSOCKET_ADDRESS SocketAddresses
,
215 _Out_ LPWSTR
**SiteNames
,
216 _Out_ LPWSTR
**SubnetNames
)
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
;
223 TRACE("DsAddressToSiteNamesExW(%s, %lu, %p, %p, %p)\n",
224 debugstr_w(ComputerName
), EntryCount
, SocketAddresses
,
225 SiteNames
, SubnetNames
);
228 return ERROR_INVALID_PARAMETER
;
235 status
= DsrAddressToSiteNamesExW((PWSTR
)ComputerName
,
237 (PNL_SOCKET_ADDRESS
)SocketAddresses
,
239 if (status
== NERR_Success
)
241 if (SiteNameArray
->EntryCount
== 0)
243 status
= ERROR_INVALID_PARAMETER
;
247 SiteNameBufferSize
= SiteNameArray
->EntryCount
* sizeof(PWSTR
);
248 SubnetNameBufferSize
= SiteNameArray
->EntryCount
* sizeof(PWSTR
);
249 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
251 SiteNameBufferSize
+= SiteNameArray
->SiteNames
[i
].Length
+ sizeof(WCHAR
);
252 SubnetNameBufferSize
+= SiteNameArray
->SubnetNames
[i
].Length
+ sizeof(WCHAR
);
255 status
= NetApiBufferAllocate(SiteNameBufferSize
, (PVOID
*)&SiteNamesBuffer
);
256 if (status
== NERR_Success
)
258 ZeroMemory(SiteNamesBuffer
, SiteNameBufferSize
);
260 Ptr
= (PWSTR
)((ULONG_PTR
)SiteNamesBuffer
+ SiteNameArray
->EntryCount
* sizeof(PWSTR
));
261 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
263 SiteNamesBuffer
[i
] = Ptr
;
265 SiteNameArray
->SiteNames
[i
].Buffer
,
266 SiteNameArray
->SiteNames
[i
].Length
);
268 Ptr
= (PWSTR
)((ULONG_PTR
)Ptr
+ SiteNameArray
->SiteNames
[i
].Length
+ sizeof(WCHAR
));
271 *SiteNames
= SiteNamesBuffer
;
274 status
= NetApiBufferAllocate(SubnetNameBufferSize
, (PVOID
*)&SubnetNamesBuffer
);
275 if (status
== NERR_Success
)
277 ZeroMemory(SubnetNamesBuffer
, SubnetNameBufferSize
);
279 Ptr
= (PWSTR
)((ULONG_PTR
)SubnetNamesBuffer
+ SiteNameArray
->EntryCount
* sizeof(PWSTR
));
280 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
282 SubnetNamesBuffer
[i
] = Ptr
;
284 SiteNameArray
->SubnetNames
[i
].Buffer
,
285 SiteNameArray
->SubnetNames
[i
].Length
);
287 Ptr
= (PWSTR
)((ULONG_PTR
)Ptr
+ SiteNameArray
->SubnetNames
[i
].Length
+ sizeof(WCHAR
));
290 *SubnetNames
= SubnetNamesBuffer
;
294 MIDL_user_free(SiteNameArray
);
297 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
299 status
= I_RpcMapWin32Status(RpcExceptionCode());
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
)
316 PWSTR pServerNameW
= NULL
, pDnsDomainNameW
= NULL
;
317 PWSTR pDnsHostNameW
= NULL
;
318 NET_API_STATUS status
= NERR_Success
;
320 TRACE("DsDeregisterDnsHostRecordsA(%s, %s, %p, %p, %s)\n",
321 debugstr_a(ServerName
), debugstr_a(DnsDomainName
),
322 DomainGuid
, DsaGuid
, debugstr_a(DnsHostName
));
324 if (ServerName
!= NULL
)
326 pServerNameW
= NetpAllocWStrFromAnsiStr((PSTR
)ServerName
);
327 if (pServerNameW
== NULL
)
329 status
= ERROR_NOT_ENOUGH_MEMORY
;
334 if (DnsDomainName
!= NULL
)
336 pDnsDomainNameW
= NetpAllocWStrFromAnsiStr((PSTR
)DnsDomainName
);
337 if (pDnsDomainNameW
== NULL
)
339 status
= ERROR_NOT_ENOUGH_MEMORY
;
344 pDnsHostNameW
= NetpAllocWStrFromAnsiStr((PSTR
)DnsDomainName
);
345 if (pDnsHostNameW
== NULL
)
347 status
= ERROR_NOT_ENOUGH_MEMORY
;
351 status
= DsDeregisterDnsHostRecordsW(pServerNameW
,
358 if (pDnsHostNameW
!= NULL
)
359 NetApiBufferFree(pDnsHostNameW
);
361 if (pDnsDomainNameW
!= NULL
)
362 NetApiBufferFree(pDnsDomainNameW
);
364 if (pServerNameW
!= NULL
)
365 NetApiBufferFree(pServerNameW
);
373 DsDeregisterDnsHostRecordsW(
374 _In_opt_ LPWSTR ServerName
,
375 _In_opt_ LPWSTR DnsDomainName
,
376 _In_opt_ GUID
*DomainGuid
,
377 _In_opt_ GUID
*DsaGuid
,
378 _In_ LPWSTR DnsHostName
)
380 NET_API_STATUS status
;
382 TRACE("DsDeregisterDnsHostRecordsW(%s, %s, %p, %p, %s)\n",
383 debugstr_w(ServerName
), debugstr_w(DnsDomainName
),
384 DomainGuid
, DsaGuid
, debugstr_w(DnsHostName
));
388 status
= DsrDeregisterDnsHostRecords(ServerName
,
394 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
396 status
= I_RpcMapWin32Status(RpcExceptionCode());
406 DsEnumerateDomainTrustsA(
407 _In_opt_ LPSTR ServerName
,
409 _Out_ PDS_DOMAIN_TRUSTSA
*Domains
,
410 _Out_ PULONG DomainCount
)
412 FIXME("DsEnumerateDomainTrustsA(%s, %x, %p, %p)\n",
413 debugstr_a(ServerName
), Flags
, Domains
, DomainCount
);
414 return ERROR_CALL_NOT_IMPLEMENTED
;
420 DsEnumerateDomainTrustsW(
421 _In_opt_ LPWSTR ServerName
,
423 _Out_ PDS_DOMAIN_TRUSTSW
*Domains
,
424 _Out_ PULONG DomainCount
)
426 FIXME("DsEnumerateDomainTrustsW(%s, %x, %p, %p)\n",
427 debugstr_w(ServerName
), Flags
, Domains
, DomainCount
);
428 return ERROR_CALL_NOT_IMPLEMENTED
;
435 _In_opt_ LPCSTR ComputerName
,
436 _In_ LPCSTR DomainName
,
437 _In_ GUID
*DomainGuid
,
438 _In_ LPCSTR SiteName
,
440 _Out_ PDOMAIN_CONTROLLER_INFOA
*DomainControllerInfo
)
442 TRACE("DsGetDcNameA(%s, %s, %s, %s, %08lx, %p): stub\n",
443 debugstr_a(ComputerName
), debugstr_a(DomainName
), debugstr_guid(DomainGuid
),
444 debugstr_a(SiteName
), Flags
, DomainControllerInfo
);
445 return DsGetDcNameWithAccountA(ComputerName
,
452 DomainControllerInfo
);
459 _In_opt_ LPCWSTR ComputerName
,
460 _In_ LPCWSTR DomainName
,
461 _In_ GUID
*DomainGuid
,
462 _In_ LPCWSTR SiteName
,
464 _Out_ PDOMAIN_CONTROLLER_INFOW
*DomainControllerInfo
)
466 TRACE("DsGetDcNameW(%s, %s, %s, %s, %08lx, %p)\n",
467 debugstr_w(ComputerName
), debugstr_w(DomainName
), debugstr_guid(DomainGuid
),
468 debugstr_w(SiteName
), Flags
, DomainControllerInfo
);
469 return DsGetDcNameWithAccountW(ComputerName
,
476 DomainControllerInfo
);
482 DsGetDcNameWithAccountA(
483 _In_opt_ LPCSTR ComputerName
,
484 _In_opt_ LPCSTR AccountName
,
485 _In_ ULONG AccountControlBits
,
486 _In_ LPCSTR DomainName
,
487 _In_ GUID
*DomainGuid
,
488 _In_ LPCSTR SiteName
,
490 _Out_ PDOMAIN_CONTROLLER_INFOA
*DomainControllerInfo
)
492 PWSTR pComputerNameW
= NULL
, pAccountNameW
= NULL
;
493 PWSTR pDomainNameW
= NULL
, pSiteNameW
= NULL
;
494 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfoW
= NULL
;
495 PDOMAIN_CONTROLLER_INFOA pDomainControllerInfoA
= NULL
;
496 UNICODE_STRING UnicodeString
;
497 ANSI_STRING AnsiString
;
501 NET_API_STATUS status
= NERR_Success
;
503 TRACE("DsGetDcNameWithAccountA(%s, %s, %08lx, %s, %s, %s, %08lx, %p): stub\n",
504 debugstr_a(ComputerName
), debugstr_a(AccountName
), AccountControlBits
,
505 debugstr_a(DomainName
), debugstr_guid(DomainGuid
),
506 debugstr_a(SiteName
), Flags
, DomainControllerInfo
);
508 if (ComputerName
!= NULL
)
510 pComputerNameW
= NetpAllocWStrFromAnsiStr((PSTR
)ComputerName
);
511 if (pComputerNameW
== NULL
)
513 status
= ERROR_NOT_ENOUGH_MEMORY
;
518 if (AccountName
!= NULL
)
520 pAccountNameW
= NetpAllocWStrFromAnsiStr((PSTR
)AccountName
);
521 if (pAccountNameW
== NULL
)
523 status
= ERROR_NOT_ENOUGH_MEMORY
;
528 pDomainNameW
= NetpAllocWStrFromAnsiStr((PSTR
)DomainName
);
529 if (pDomainNameW
== NULL
)
531 status
= ERROR_NOT_ENOUGH_MEMORY
;
535 pSiteNameW
= NetpAllocWStrFromAnsiStr((PSTR
)SiteName
);
536 if (pSiteNameW
== NULL
)
538 status
= ERROR_NOT_ENOUGH_MEMORY
;
542 status
= DsGetDcNameWithAccountW(pComputerNameW
,
549 &pDomainControllerInfoW
);
550 if (status
!= NERR_Success
)
553 BufferSize
= sizeof(DOMAIN_CONTROLLER_INFOA
);
555 RtlInitUnicodeString(&UnicodeString
,
556 pDomainControllerInfoW
->DomainControllerName
);
557 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
559 RtlInitUnicodeString(&UnicodeString
,
560 pDomainControllerInfoW
->DomainControllerAddress
);
561 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
563 RtlInitUnicodeString(&UnicodeString
,
564 pDomainControllerInfoW
->DomainName
);
565 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
567 RtlInitUnicodeString(&UnicodeString
,
568 pDomainControllerInfoW
->DnsForestName
);
569 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
571 if (pDomainControllerInfoW
->DcSiteName
!= NULL
)
573 RtlInitUnicodeString(&UnicodeString
,
574 pDomainControllerInfoW
->DcSiteName
);
575 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
578 if (pDomainControllerInfoW
->ClientSiteName
!= NULL
)
580 RtlInitUnicodeString(&UnicodeString
,
581 pDomainControllerInfoW
->ClientSiteName
);
582 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
585 /* Allocate the ANSI buffer */
586 status
= NetApiBufferAllocate(BufferSize
, (PVOID
*)&pDomainControllerInfoA
);
587 if (status
!= NERR_Success
)
590 pDomainControllerInfoA
->DomainControllerAddressType
=
591 pDomainControllerInfoW
->DomainControllerAddressType
;
593 pDomainControllerInfoA
->Flags
= pDomainControllerInfoW
->Flags
;
595 CopyMemory(&pDomainControllerInfoA
->DomainGuid
,
596 &pDomainControllerInfoW
->DomainGuid
,
599 Ptr
= (PSTR
)((ULONG_PTR
)pDomainControllerInfoA
+ sizeof(DOMAIN_CONTROLLER_INFOA
));
600 BufferSize
-= sizeof(DOMAIN_CONTROLLER_INFOA
);
602 pDomainControllerInfoA
->DomainControllerName
= Ptr
;
603 RtlInitUnicodeString(&UnicodeString
,
604 pDomainControllerInfoW
->DomainControllerName
);
605 AnsiString
.Length
= 0;
606 AnsiString
.MaximumLength
= BufferSize
;
607 AnsiString
.Buffer
= Ptr
;
609 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
612 if (!NT_SUCCESS(Status
))
614 status
= RtlNtStatusToDosError(Status
);
618 Ptr
= (PSTR
)((ULONG_PTR
)Ptr
+ AnsiString
.Length
+ sizeof(CHAR
));
619 BufferSize
-= AnsiString
.Length
+ sizeof(CHAR
);
621 pDomainControllerInfoA
->DomainControllerAddress
= Ptr
;
622 RtlInitUnicodeString(&UnicodeString
,
623 pDomainControllerInfoW
->DomainControllerAddress
);
624 AnsiString
.Length
= 0;
625 AnsiString
.MaximumLength
= BufferSize
;
626 AnsiString
.Buffer
= Ptr
;
628 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
631 if (!NT_SUCCESS(Status
))
633 status
= RtlNtStatusToDosError(Status
);
637 Ptr
= (PSTR
)((ULONG_PTR
)Ptr
+ AnsiString
.Length
+ sizeof(CHAR
));
638 BufferSize
-= AnsiString
.Length
+ sizeof(CHAR
);
640 pDomainControllerInfoA
->DomainName
= Ptr
;
641 RtlInitUnicodeString(&UnicodeString
,
642 pDomainControllerInfoW
->DomainName
);
643 AnsiString
.Length
= 0;
644 AnsiString
.MaximumLength
= BufferSize
;
645 AnsiString
.Buffer
= Ptr
;
647 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
650 if (!NT_SUCCESS(Status
))
652 status
= RtlNtStatusToDosError(Status
);
656 Ptr
= (PSTR
)((ULONG_PTR
)Ptr
+ AnsiString
.Length
+ sizeof(CHAR
));
657 BufferSize
-= AnsiString
.Length
+ sizeof(CHAR
);
659 pDomainControllerInfoA
->DnsForestName
= Ptr
;
660 RtlInitUnicodeString(&UnicodeString
,
661 pDomainControllerInfoW
->DnsForestName
);
662 AnsiString
.Length
= 0;
663 AnsiString
.MaximumLength
= BufferSize
;
664 AnsiString
.Buffer
= Ptr
;
666 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
669 if (!NT_SUCCESS(Status
))
671 status
= RtlNtStatusToDosError(Status
);
675 Ptr
= (PSTR
)((ULONG_PTR
)Ptr
+ AnsiString
.Length
+ sizeof(CHAR
));
676 BufferSize
-= AnsiString
.Length
+ sizeof(CHAR
);
678 if (pDomainControllerInfoW
->DcSiteName
!= NULL
)
680 pDomainControllerInfoA
->DcSiteName
= Ptr
;
681 RtlInitUnicodeString(&UnicodeString
,
682 pDomainControllerInfoW
->DcSiteName
);
683 AnsiString
.Length
= 0;
684 AnsiString
.MaximumLength
= BufferSize
;
685 AnsiString
.Buffer
= Ptr
;
687 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
690 if (!NT_SUCCESS(Status
))
692 status
= RtlNtStatusToDosError(Status
);
696 Ptr
= (PSTR
)((ULONG_PTR
)Ptr
+ AnsiString
.Length
+ sizeof(CHAR
));
697 BufferSize
-= AnsiString
.Length
+ sizeof(CHAR
);
700 if (pDomainControllerInfoW
->ClientSiteName
!= NULL
)
702 pDomainControllerInfoA
->ClientSiteName
= Ptr
;
703 RtlInitUnicodeString(&UnicodeString
,
704 pDomainControllerInfoW
->ClientSiteName
);
705 AnsiString
.Length
= 0;
706 AnsiString
.MaximumLength
= BufferSize
;
707 AnsiString
.Buffer
= Ptr
;
709 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
712 if (!NT_SUCCESS(Status
))
714 status
= RtlNtStatusToDosError(Status
);
719 *DomainControllerInfo
= pDomainControllerInfoA
;
720 pDomainControllerInfoA
= NULL
;
723 if (pDomainControllerInfoA
!= NULL
)
724 NetApiBufferFree(pDomainControllerInfoA
);
726 if (pDomainControllerInfoW
!= NULL
)
727 NetApiBufferFree(pDomainControllerInfoW
);
729 if (pSiteNameW
!= NULL
)
730 NetApiBufferFree(pSiteNameW
);
732 if (pDomainNameW
!= NULL
)
733 NetApiBufferFree(pDomainNameW
);
735 if (pAccountNameW
!= NULL
)
736 NetApiBufferFree(pAccountNameW
);
738 if (pComputerNameW
!= NULL
)
739 NetApiBufferFree(pComputerNameW
);
747 DsGetDcNameWithAccountW(
748 _In_opt_ LPCWSTR ComputerName
,
749 _In_opt_ LPCWSTR AccountName
,
750 _In_ ULONG AccountControlBits
,
751 _In_ LPCWSTR DomainName
,
752 _In_ GUID
*DomainGuid
,
753 _In_ LPCWSTR SiteName
,
755 _Out_ PDOMAIN_CONTROLLER_INFOW
*DomainControllerInfo
)
757 NET_API_STATUS status
;
759 TRACE("DsGetDcNameWithAccountW(%s, %s, %08lx, %s, %s, %s, %08lx, %p): stub\n",
760 debugstr_w(ComputerName
), debugstr_w(AccountName
), AccountControlBits
,
761 debugstr_w(DomainName
), debugstr_guid(DomainGuid
),
762 debugstr_w(SiteName
), Flags
, DomainControllerInfo
);
766 status
= DsrGetDcNameEx2((PWSTR
)ComputerName
,
773 DomainControllerInfo
);
775 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
777 status
= I_RpcMapWin32Status(RpcExceptionCode());
787 DsGetDcSiteCoverageA(
788 _In_opt_ LPCSTR ServerName
,
789 _Out_ PULONG EntryCount
,
790 _Out_ LPSTR
**SiteNames
)
792 PWSTR pServerNameW
= NULL
;
793 PWSTR
*pSiteNamesW
= NULL
;
794 PSTR
*pSiteNamesA
= NULL
;
795 UNICODE_STRING UnicodeString
;
796 ANSI_STRING AnsiString
;
800 NET_API_STATUS status
= NERR_Success
;
802 TRACE("DsGetDcSiteCoverageA(%s, %p, %p)\n",
803 debugstr_a(ServerName
), EntryCount
, SiteNames
);
805 if (ServerName
!= NULL
)
807 pServerNameW
= NetpAllocWStrFromAnsiStr((PSTR
)ServerName
);
808 if (pServerNameW
== NULL
)
810 status
= ERROR_NOT_ENOUGH_MEMORY
;
815 status
= DsGetDcSiteCoverageW(pServerNameW
,
818 if (status
!= ERROR_SUCCESS
)
821 BufferSize
= *EntryCount
* sizeof(PSTR
);
822 for (i
= 0; i
< *EntryCount
; i
++)
824 RtlInitUnicodeString(&UnicodeString
, pSiteNamesW
[i
]);
825 BufferSize
+= RtlUnicodeStringToAnsiSize(&UnicodeString
);
828 status
= NetApiBufferAllocate(BufferSize
, (PVOID
*)&pSiteNamesA
);
829 if (status
!= NERR_Success
)
832 ZeroMemory(pSiteNamesA
, BufferSize
);
834 Ptr
= (PSTR
)((ULONG_PTR
)pSiteNamesA
+ *EntryCount
* sizeof(PSTR
));
835 for (i
= 0; i
< *EntryCount
; i
++)
837 pSiteNamesA
[i
] = Ptr
;
839 RtlInitUnicodeString(&UnicodeString
, pSiteNamesW
[i
]);
841 AnsiString
.Length
= 0;
842 AnsiString
.MaximumLength
= BufferSize
;
843 AnsiString
.Buffer
= Ptr
;
845 Status
= RtlUnicodeStringToAnsiString(&AnsiString
,
848 if (!NT_SUCCESS(Status
))
850 status
= RtlNtStatusToDosError(Status
);
854 Ptr
= (PSTR
)((ULONG_PTR
)Ptr
+ AnsiString
.Length
+ sizeof(CHAR
));
855 BufferSize
-= (AnsiString
.Length
+ sizeof(CHAR
));
858 *SiteNames
= pSiteNamesA
;
862 if (status
!= NERR_Success
&& pSiteNamesA
!= NULL
)
863 NetApiBufferFree(pSiteNamesA
);
865 if (pSiteNamesW
!= NULL
)
866 NetApiBufferFree(pSiteNamesW
);
868 if (pServerNameW
!= NULL
)
869 NetApiBufferFree(pServerNameW
);
877 DsGetDcSiteCoverageW(
878 _In_opt_ LPCWSTR ServerName
,
879 _Out_ PULONG EntryCount
,
880 _Out_ LPWSTR
**SiteNames
)
882 PNL_SITE_NAME_ARRAY SiteNameArray
= NULL
;
883 PWSTR
*SiteNamesBuffer
= NULL
, Ptr
;
885 NET_API_STATUS status
;
887 TRACE("DsGetDcSiteCoverageW(%s, %p, %p)\n",
888 debugstr_w(ServerName
), EntryCount
, SiteNames
);
895 status
= DsrGetDcSiteCoverageW((PWSTR
)ServerName
,
897 if (status
== NERR_Success
)
899 if (SiteNameArray
->EntryCount
== 0)
901 status
= ERROR_INVALID_PARAMETER
;
905 BufferSize
= SiteNameArray
->EntryCount
* sizeof(PWSTR
);
906 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
907 BufferSize
+= SiteNameArray
->SiteNames
[i
].Length
+ sizeof(WCHAR
);
909 status
= NetApiBufferAllocate(BufferSize
, (PVOID
*)&SiteNamesBuffer
);
910 if (status
== NERR_Success
)
912 ZeroMemory(SiteNamesBuffer
, BufferSize
);
914 Ptr
= (PWSTR
)((ULONG_PTR
)SiteNamesBuffer
+ SiteNameArray
->EntryCount
* sizeof(PWSTR
));
915 for (i
= 0; i
< SiteNameArray
->EntryCount
; i
++)
917 SiteNamesBuffer
[i
] = Ptr
;
919 SiteNameArray
->SiteNames
[i
].Buffer
,
920 SiteNameArray
->SiteNames
[i
].Length
);
922 Ptr
= (PWSTR
)((ULONG_PTR
)Ptr
+ SiteNameArray
->SiteNames
[i
].Length
+ sizeof(WCHAR
));
925 *EntryCount
= SiteNameArray
->EntryCount
;
926 *SiteNames
= SiteNamesBuffer
;
930 MIDL_user_free(SiteNameArray
);
933 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
935 status
= I_RpcMapWin32Status(RpcExceptionCode());
945 DsGetForestTrustInformationW(
946 _In_opt_ LPCWSTR ServerName
,
947 _In_opt_ LPCWSTR TrustedDomainName
,
949 _Out_ PLSA_FOREST_TRUST_INFORMATION
*ForestTrustInfo
)
951 NET_API_STATUS status
;
953 TRACE("DsGetForestTrustInformationW(%s, %s, 0x%08lx, %p)\n",
954 debugstr_w(ServerName
), debugstr_w(TrustedDomainName
),
955 Flags
, ForestTrustInfo
);
959 status
= DsrGetForestTrustInformation((PWSTR
)ServerName
,
960 (PWSTR
)TrustedDomainName
,
964 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
966 status
= I_RpcMapWin32Status(RpcExceptionCode());
977 _In_opt_ LPCSTR ComputerName
,
978 _Out_ LPSTR
*SiteName
)
980 PWSTR pComputerNameW
= NULL
;
981 PWSTR pSiteNameW
= NULL
;
982 NET_API_STATUS status
= ERROR_SUCCESS
;
984 TRACE("DsGetSiteNameA(%s, %p)\n",
985 debugstr_a(ComputerName
), SiteName
);
987 if (ComputerName
!= NULL
)
989 pComputerNameW
= NetpAllocWStrFromAnsiStr((PSTR
)ComputerName
);
990 if (pComputerNameW
== NULL
)
992 status
= ERROR_NOT_ENOUGH_MEMORY
;
997 status
= DsGetSiteNameW(pComputerNameW
,
999 if (status
!= ERROR_SUCCESS
)
1002 *SiteName
= NetpAllocAnsiStrFromWStr(pSiteNameW
);
1003 if (*SiteName
== NULL
)
1005 status
= ERROR_NOT_ENOUGH_MEMORY
;
1009 if (pSiteNameW
!= NULL
)
1010 NetApiBufferFree(pSiteNameW
);
1012 if (pComputerNameW
!= NULL
)
1013 NetApiBufferFree(pComputerNameW
);
1022 _In_opt_ LPCWSTR ComputerName
,
1023 _Out_ LPWSTR
*SiteName
)
1025 NET_API_STATUS status
;
1027 TRACE("DsGetSiteNameW(%s, %p)\n",
1028 debugstr_w(ComputerName
), SiteName
);
1032 status
= DsrGetSiteName((PWSTR
)ComputerName
,
1035 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1037 status
= I_RpcMapWin32Status(RpcExceptionCode());
1047 DsMergeForestTrustInformationW(
1048 _In_ LPCWSTR DomainName
,
1049 _In_ PLSA_FOREST_TRUST_INFORMATION NewForestTrustInfo
,
1050 _In_opt_ PLSA_FOREST_TRUST_INFORMATION OldForestTrustInfo
,
1051 _Out_ PLSA_FOREST_TRUST_INFORMATION
*ForestTrustInfo
)
1053 FIXME("DsMergeForestTrustInformationW(%s, %p, %p, %p)\n",
1054 debugstr_w(DomainName
), NewForestTrustInfo
,
1055 OldForestTrustInfo
, ForestTrustInfo
);
1056 return ERROR_CALL_NOT_IMPLEMENTED
;
1062 DsValidateSubnetNameA(
1063 _In_ LPCSTR SubnetName
)
1065 FIXME("DsValidateSubnetNameA(%s)\n",
1066 debugstr_a(SubnetName
));
1067 return ERROR_CALL_NOT_IMPLEMENTED
;
1073 DsValidateSubnetNameW(
1074 _In_ LPCWSTR SubnetName
)
1076 FIXME("DsValidateSubnetNameW(%s)\n",
1077 debugstr_w(SubnetName
));
1078 return ERROR_CALL_NOT_IMPLEMENTED
;
1084 NetEnumerateTrustedDomains(
1085 _In_ LPWSTR ServerName
,
1086 _Out_ LPWSTR
*DomainNames
)
1088 DOMAIN_NAME_BUFFER DomainNameBuffer
= {0, NULL
};
1089 NTSTATUS Status
= 0;
1091 TRACE("NetEnumerateTrustedDomains(%s, %p)\n",
1092 debugstr_w(ServerName
), DomainNames
);
1096 Status
= NetrEnumerateTrustedDomains(ServerName
,
1098 if (NT_SUCCESS(Status
))
1100 *DomainNames
= (LPWSTR
)DomainNameBuffer
.DomainNames
;
1103 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1105 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1115 _In_opt_ LPCWSTR ServerName
,
1116 _In_opt_ LPCWSTR DomainName
,
1117 _Out_ LPBYTE
*BufPtr
)
1119 NET_API_STATUS Status
;
1121 TRACE("NetGetAnyDCName(%s, %s, %p)\n",
1122 debugstr_w(ServerName
), debugstr_w(DomainName
), BufPtr
);
1128 Status
= NetrGetAnyDCName((PWSTR
)ServerName
,
1132 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1134 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1145 _In_opt_ LPCWSTR ServerName
,
1146 _In_opt_ LPCWSTR DomainName
,
1147 _Out_ LPBYTE
*BufPtr
)
1149 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo
= NULL
;
1150 NET_API_STATUS Status
;
1152 FIXME("NetGetDCName(%s, %s, %p)\n",
1153 debugstr_w(ServerName
), debugstr_w(DomainName
), BufPtr
);
1155 if (ServerName
== NULL
|| *ServerName
== UNICODE_NULL
)
1157 Status
= DsGetDcNameWithAccountW(NULL
,
1164 &pDomainControllerInfo
);
1165 if (Status
!= NERR_Success
)
1168 Status
= NetApiBufferAllocate((wcslen(pDomainControllerInfo
->DomainControllerName
) + 1) * sizeof(WCHAR
),
1170 if (Status
!= NERR_Success
)
1173 wcscpy((PWSTR
)*BufPtr
,
1174 pDomainControllerInfo
->DomainControllerName
);
1178 FIXME("Not implemented yet!\n");
1179 Status
= NERR_DCNotFound
;
1183 if (pDomainControllerInfo
!= NULL
)
1184 NetApiBufferFree(pDomainControllerInfo
);
1192 NetLogonGetTimeServiceParentDomain(
1193 _In_ LPWSTR ServerName
,
1194 _Out_ LPWSTR
*DomainName
,
1195 _Out_ LPBOOL PdcSameSite
)
1197 NET_API_STATUS Status
;
1199 TRACE("NetLogonGetTimeServiceParentDomain(%s, %p, %p)\n",
1200 debugstr_w(ServerName
), DomainName
, PdcSameSite
);
1204 Status
= NetrLogonGetTimeServiceParentDomain(ServerName
,
1208 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1210 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1220 NetLogonSetServiceBits(
1221 _In_ LPWSTR ServerName
,
1222 _In_ DWORD ServiceBitsOfInterest
,
1223 _In_ DWORD ServiceBits
)
1227 TRACE("NetLogonSetServiceBits(%s 0x%lx 0x%lx)\n",
1228 debugstr_w(ServerName
), ServiceBitsOfInterest
, ServiceBits
);
1232 Status
= NetrLogonSetServiceBits(ServerName
,
1233 ServiceBitsOfInterest
,
1236 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1238 Status
= RpcExceptionCode();