2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Local Security Authority (LSA) Server
4 * FILE: reactos/dll/win32/lsasrv/lookup.c
5 * PURPOSE: Sid / Name lookup functions
7 * PROGRAMMERS: Eric Kohl
12 #include "resources.h"
14 /* GLOBALS *****************************************************************/
16 typedef wchar_t *PSAMPR_SERVER_NAME
;
17 typedef void *SAMPR_HANDLE
;
19 typedef struct _SAMPR_RETURNED_USTRING_ARRAY
22 PRPC_UNICODE_STRING Element
;
23 } SAMPR_RETURNED_USTRING_ARRAY
, *PSAMPR_RETURNED_USTRING_ARRAY
;
27 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr
);
31 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr
);
35 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
36 OUT SAMPR_HANDLE
*ServerHandle
,
37 IN ACCESS_MASK DesiredAccess
);
41 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
);
45 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
46 IN ACCESS_MASK DesiredAccess
,
48 OUT SAMPR_HANDLE
*DomainHandle
);
52 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
54 IN ULONG
*RelativeIds
,
55 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
56 OUT PSAMPR_ULONG_ARRAY Use
);
60 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
62 IN RPC_UNICODE_STRING Names
[],
63 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
64 OUT PSAMPR_ULONG_ARRAY Use
);
67 typedef struct _WELL_KNOWN_SID
71 UNICODE_STRING AccountName
;
72 UNICODE_STRING DomainName
;
74 } WELL_KNOWN_SID
, *PWELL_KNOWN_SID
;
77 LIST_ENTRY WellKnownSidListHead
;
78 PSID LsapWorldSid
= NULL
;
79 PSID LsapNetworkSid
= NULL
;
80 PSID LsapBatchSid
= NULL
;
81 PSID LsapInteractiveSid
= NULL
;
82 PSID LsapServiceSid
= NULL
;
83 PSID LsapLocalSystemSid
= NULL
;
84 PSID LsapAdministratorsSid
= NULL
;
87 /* FUNCTIONS ***************************************************************/
90 LsapCreateSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
91 UCHAR SubAuthorityCount
,
92 PULONG SubAuthorities
,
98 PWELL_KNOWN_SID SidEntry
;
102 SidEntry
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WELL_KNOWN_SID
));
103 if (SidEntry
== NULL
)
106 InitializeListHead(&SidEntry
->ListEntry
);
108 SidEntry
->Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
110 RtlLengthRequiredSid(SubAuthorityCount
));
111 if (SidEntry
->Sid
== NULL
)
113 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
117 RtlInitializeSid(SidEntry
->Sid
,
121 for (i
= 0; i
< (ULONG
)SubAuthorityCount
; i
++)
123 p
= RtlSubAuthoritySid(SidEntry
->Sid
, i
);
124 *p
= SubAuthorities
[i
];
127 // RtlInitUnicodeString(&SidEntry->AccountName,
129 SidEntry
->AccountName
.Length
= wcslen(AccountName
) * sizeof(WCHAR
);
130 SidEntry
->AccountName
.MaximumLength
= SidEntry
->AccountName
.Length
+ sizeof(WCHAR
);
131 SidEntry
->AccountName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
132 SidEntry
->AccountName
.MaximumLength
);
133 if (SidEntry
->AccountName
.Buffer
== NULL
)
135 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
136 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
140 wcscpy(SidEntry
->AccountName
.Buffer
,
143 // RtlInitUnicodeString(&SidEntry->DomainName,
145 SidEntry
->DomainName
.Length
= wcslen(DomainName
) * sizeof(WCHAR
);
146 SidEntry
->DomainName
.MaximumLength
= SidEntry
->DomainName
.Length
+ sizeof(WCHAR
);
147 SidEntry
->DomainName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
148 SidEntry
->DomainName
.MaximumLength
);
149 if (SidEntry
->DomainName
.Buffer
== NULL
)
151 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->AccountName
.Buffer
);
152 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
153 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
157 wcscpy(SidEntry
->DomainName
.Buffer
,
162 InsertTailList(&WellKnownSidListHead
,
163 &SidEntry
->ListEntry
);
166 *SidPtr
= SidEntry
->Sid
;
175 WCHAR szAccountName
[80];
176 WCHAR szDomainName
[80];
177 ULONG SubAuthorities
[8];
180 InitializeListHead(&WellKnownSidListHead
);
182 hInstance
= GetModuleHandleW(L
"lsasrv.dll");
185 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szAccountName
, ARRAYSIZE(szAccountName
));
186 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, ARRAYSIZE(szDomainName
));
187 LsapCreateSid(&NtAuthority
,
196 LsapLoadString(hInstance
, IDS_NULL_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
198 SubAuthorities
[0] = SECURITY_NULL_RID
;
199 LsapCreateSid(&NullSidAuthority
,
204 SidTypeWellKnownGroup
,
208 LsapLoadString(hInstance
, IDS_WORLD_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
210 SubAuthorities
[0] = SECURITY_WORLD_RID
;
211 LsapCreateSid(&WorldSidAuthority
,
216 SidTypeWellKnownGroup
,
220 LsapLoadString(hInstance
, IDS_LOCAL_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
222 SubAuthorities
[0] = SECURITY_LOCAL_RID
;
223 LsapCreateSid(&LocalSidAuthority
,
228 SidTypeWellKnownGroup
,
231 /* Creator Owner Sid */
232 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
234 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_RID
;
235 LsapCreateSid(&CreatorSidAuthority
,
240 SidTypeWellKnownGroup
,
243 /* Creator Group Sid */
244 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
246 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_RID
;
247 LsapCreateSid(&CreatorSidAuthority
,
252 SidTypeWellKnownGroup
,
255 /* Creator Owner Server Sid */
256 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
258 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_SERVER_RID
;
259 LsapCreateSid(&CreatorSidAuthority
,
264 SidTypeWellKnownGroup
,
267 /* Creator Group Server Sid */
268 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
270 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_SERVER_RID
;
271 LsapCreateSid(&CreatorSidAuthority
,
276 SidTypeWellKnownGroup
,
280 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
281 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, ARRAYSIZE(szDomainName
));
283 SubAuthorities
[0] = SECURITY_DIALUP_RID
;
284 LsapCreateSid(&NtAuthority
,
289 SidTypeWellKnownGroup
,
293 LsapLoadString(hInstance
, IDS_NETWORK_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
295 SubAuthorities
[0] = SECURITY_NETWORK_RID
;
296 LsapCreateSid(&NtAuthority
,
301 SidTypeWellKnownGroup
,
305 LsapLoadString(hInstance
, IDS_BATCH_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
307 SubAuthorities
[0] = SECURITY_BATCH_RID
;
308 LsapCreateSid(&NtAuthority
,
313 SidTypeWellKnownGroup
,
316 /* Interactive Sid */
317 LsapLoadString(hInstance
, IDS_INTERACTIVE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
319 SubAuthorities
[0] = SECURITY_INTERACTIVE_RID
;
320 LsapCreateSid(&NtAuthority
,
325 SidTypeWellKnownGroup
,
326 &LsapInteractiveSid
);
329 LsapLoadString(hInstance
, IDS_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
331 SubAuthorities
[0] = SECURITY_SERVICE_RID
;
332 LsapCreateSid(&NtAuthority
,
337 SidTypeWellKnownGroup
,
340 /* Anonymous Logon Sid */
341 LsapLoadString(hInstance
, IDS_ANONYMOUS_LOGON_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
343 SubAuthorities
[0] = SECURITY_ANONYMOUS_LOGON_RID
;
344 LsapCreateSid(&NtAuthority
,
349 SidTypeWellKnownGroup
,
353 LsapLoadString(hInstance
, IDS_PROXY_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
355 SubAuthorities
[0] = SECURITY_PROXY_RID
;
356 LsapCreateSid(&NtAuthority
,
361 SidTypeWellKnownGroup
,
364 /* Enterprise Controllers Sid */
365 LsapLoadString(hInstance
, IDS_ENTERPRISE_CONTROLLERS_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
367 SubAuthorities
[0] = SECURITY_ENTERPRISE_CONTROLLERS_RID
;
368 LsapCreateSid(&NtAuthority
,
373 SidTypeWellKnownGroup
,
376 /* Principal Self Sid */
377 LsapLoadString(hInstance
, IDS_PRINCIPAL_SELF_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
379 SubAuthorities
[0] = SECURITY_PRINCIPAL_SELF_RID
;
380 LsapCreateSid(&NtAuthority
,
385 SidTypeWellKnownGroup
,
388 /* Authenticated Users Sid */
389 LsapLoadString(hInstance
, IDS_AUTHENTICATED_USER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
391 SubAuthorities
[0] = SECURITY_AUTHENTICATED_USER_RID
;
392 LsapCreateSid(&NtAuthority
,
397 SidTypeWellKnownGroup
,
400 /* Restricted Code Sid */
401 LsapLoadString(hInstance
, IDS_RESTRICTED_CODE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
403 SubAuthorities
[0] = SECURITY_RESTRICTED_CODE_RID
;
404 LsapCreateSid(&NtAuthority
,
409 SidTypeWellKnownGroup
,
412 /* Terminal Server Sid */
413 LsapLoadString(hInstance
, IDS_TERMINAL_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
415 SubAuthorities
[0] = SECURITY_TERMINAL_SERVER_RID
;
416 LsapCreateSid(&NtAuthority
,
421 SidTypeWellKnownGroup
,
424 /* Remote Logon Sid */
425 LsapLoadString(hInstance
, IDS_REMOTE_LOGON_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
427 SubAuthorities
[0] = SECURITY_REMOTE_LOGON_RID
;
428 LsapCreateSid(&NtAuthority
,
433 SidTypeWellKnownGroup
,
436 /* This Organization Sid */
437 LsapLoadString(hInstance
, IDS_THIS_ORGANIZATION_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
439 SubAuthorities
[0] = SECURITY_THIS_ORGANIZATION_RID
;
440 LsapCreateSid(&NtAuthority
,
445 SidTypeWellKnownGroup
,
448 /* Local System Sid */
449 LsapLoadString(hInstance
, IDS_LOCAL_SYSTEM_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
451 SubAuthorities
[0] = SECURITY_LOCAL_SYSTEM_RID
;
452 LsapCreateSid(&NtAuthority
,
457 SidTypeWellKnownGroup
,
458 &LsapLocalSystemSid
);
460 /* Local Service Sid */
461 LsapLoadString(hInstance
, IDS_LOCAL_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
463 SubAuthorities
[0] = SECURITY_LOCAL_SERVICE_RID
;
464 LsapCreateSid(&NtAuthority
,
469 SidTypeWellKnownGroup
,
472 LsapCreateSid(&NtAuthority
,
477 SidTypeWellKnownGroup
,
480 /* Network Service Sid */
481 LsapLoadString(hInstance
, IDS_NETWORK_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
483 SubAuthorities
[0] = SECURITY_NETWORK_SERVICE_RID
;
484 LsapCreateSid(&NtAuthority
,
489 SidTypeWellKnownGroup
,
492 LsapCreateSid(&NtAuthority
,
497 SidTypeWellKnownGroup
,
500 /* Builtin Domain Sid */
501 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
502 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szDomainName
, ARRAYSIZE(szDomainName
));
504 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
505 LsapCreateSid(&NtAuthority
,
513 /* Administrators Alias Sid */
514 LsapLoadString(hInstance
, IDS_ALIAS_RID_ADMINS
, szAccountName
, ARRAYSIZE(szAccountName
));
516 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
517 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ADMINS
;
518 LsapCreateSid(&NtAuthority
,
524 &LsapAdministratorsSid
);
526 /* Users Alias Sid */
527 LsapLoadString(hInstance
, IDS_ALIAS_RID_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
529 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
530 SubAuthorities
[1] = DOMAIN_ALIAS_RID_USERS
;
531 LsapCreateSid(&NtAuthority
,
539 /* Guests Alias Sid */
540 LsapLoadString(hInstance
, IDS_ALIAS_RID_GUESTS
, szAccountName
, ARRAYSIZE(szAccountName
));
542 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
543 SubAuthorities
[1] = DOMAIN_ALIAS_RID_GUESTS
;
544 LsapCreateSid(&NtAuthority
,
552 /* Power User Alias Sid */
553 LsapLoadString(hInstance
, IDS_ALIAS_RID_POWER_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
555 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
556 SubAuthorities
[1] = DOMAIN_ALIAS_RID_POWER_USERS
;
557 LsapCreateSid(&NtAuthority
,
565 /* Account Operators Alias Sid */
566 LsapLoadString(hInstance
, IDS_ALIAS_RID_ACCOUNT_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
568 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
569 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ACCOUNT_OPS
;
570 LsapCreateSid(&NtAuthority
,
578 /* System Operators Alias Sid */
579 LsapLoadString(hInstance
, IDS_ALIAS_RID_SYSTEM_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
581 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
582 SubAuthorities
[1] = DOMAIN_ALIAS_RID_SYSTEM_OPS
;
583 LsapCreateSid(&NtAuthority
,
591 /* Print Operators Alias Sid */
592 LsapLoadString(hInstance
, IDS_ALIAS_RID_PRINT_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
594 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
595 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PRINT_OPS
;
596 LsapCreateSid(&NtAuthority
,
604 /* Backup Operators Alias Sid */
605 LsapLoadString(hInstance
, IDS_ALIAS_RID_BACKUP_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
607 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
608 SubAuthorities
[1] = DOMAIN_ALIAS_RID_BACKUP_OPS
;
609 LsapCreateSid(&NtAuthority
,
617 /* Replicators Alias Sid */
618 LsapLoadString(hInstance
, IDS_ALIAS_RID_REPLICATOR
, szAccountName
, ARRAYSIZE(szAccountName
));
620 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
621 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REPLICATOR
;
622 LsapCreateSid(&NtAuthority
,
630 /* RAS Servers Alias Sid */
631 LsapLoadString(hInstance
, IDS_ALIAS_RID_RAS_SERVERS
, szAccountName
, ARRAYSIZE(szAccountName
));
633 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
634 SubAuthorities
[1] = DOMAIN_ALIAS_RID_RAS_SERVERS
;
635 LsapCreateSid(&NtAuthority
,
643 /* Pre-Windows 2000 Compatible Access Alias Sid */
644 LsapLoadString(hInstance
, IDS_ALIAS_RID_PREW2KCOMPACCESS
, szAccountName
, ARRAYSIZE(szAccountName
));
646 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
647 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
;
648 LsapCreateSid(&NtAuthority
,
656 /* Remote Desktop Users Alias Sid */
657 LsapLoadString(hInstance
, IDS_ALIAS_RID_REMOTE_DESKTOP_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
659 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
660 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
;
661 LsapCreateSid(&NtAuthority
,
669 /* Network Configuration Operators Alias Sid */
670 LsapLoadString(hInstance
, IDS_ALIAS_RID_NETWORK_CONFIGURATION_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
672 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
673 SubAuthorities
[1] = DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
;
674 LsapCreateSid(&NtAuthority
,
682 /* FIXME: Add more well known sids */
684 return STATUS_SUCCESS
;
689 LsapLookupWellKnownSid(PSID Sid
)
691 PLIST_ENTRY ListEntry
;
694 ListEntry
= WellKnownSidListHead
.Flink
;
695 while (ListEntry
!= &WellKnownSidListHead
)
697 Ptr
= CONTAINING_RECORD(ListEntry
,
700 if (RtlEqualSid(Sid
, Ptr
->Sid
))
705 ListEntry
= ListEntry
->Flink
;
713 LsapLookupIsolatedWellKnownName(PUNICODE_STRING AccountName
)
715 PLIST_ENTRY ListEntry
;
718 ListEntry
= WellKnownSidListHead
.Flink
;
719 while (ListEntry
!= &WellKnownSidListHead
)
721 Ptr
= CONTAINING_RECORD(ListEntry
,
724 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
))
729 ListEntry
= ListEntry
->Flink
;
737 LsapLookupFullyQualifiedWellKnownName(PUNICODE_STRING AccountName
,
738 PUNICODE_STRING DomainName
)
740 PLIST_ENTRY ListEntry
;
743 ListEntry
= WellKnownSidListHead
.Flink
;
744 while (ListEntry
!= &WellKnownSidListHead
)
746 Ptr
= CONTAINING_RECORD(ListEntry
,
749 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
) &&
750 RtlEqualUnicodeString(DomainName
, &Ptr
->DomainName
, TRUE
))
755 ListEntry
= ListEntry
->Flink
;
764 LsapSplitNames(DWORD Count
,
765 PRPC_UNICODE_STRING Names
,
766 PRPC_UNICODE_STRING
*DomainNames
,
767 PRPC_UNICODE_STRING
*AccountNames
)
769 PRPC_UNICODE_STRING DomainsBuffer
= NULL
;
770 PRPC_UNICODE_STRING AccountsBuffer
= NULL
;
775 NTSTATUS Status
= STATUS_SUCCESS
;
777 DomainsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
778 if (DomainsBuffer
== NULL
)
780 Status
= STATUS_INSUFFICIENT_RESOURCES
;
784 AccountsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
785 if (AccountsBuffer
== NULL
)
787 Status
= STATUS_INSUFFICIENT_RESOURCES
;
791 for (i
= 0; i
< Count
; i
++)
793 //TRACE("Name: %wZ\n", &Names[i]);
795 Ptr
= wcschr(Names
[i
].Buffer
, L
'\\');
798 AccountLength
= Names
[i
].Length
/ sizeof(WCHAR
);
800 AccountsBuffer
[i
].Length
= Names
[i
].Length
;
801 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
802 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
803 if (AccountsBuffer
[i
].Buffer
== NULL
)
805 Status
= STATUS_INSUFFICIENT_RESOURCES
;
809 CopyMemory(AccountsBuffer
[i
].Buffer
,
811 AccountsBuffer
[i
].Length
);
812 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
814 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
818 DomainLength
= (ULONG
)(ULONG_PTR
)(Ptr
- Names
[i
].Buffer
);
819 AccountLength
= (Names
[i
].Length
/ sizeof(WCHAR
)) - DomainLength
- 1;
820 //TRACE("DomainLength: %u\n", DomainLength);
821 //TRACE("AccountLength: %u\n", AccountLength);
823 if (DomainLength
> 0)
825 DomainsBuffer
[i
].Length
= (USHORT
)DomainLength
* sizeof(WCHAR
);
826 DomainsBuffer
[i
].MaximumLength
= DomainsBuffer
[i
].Length
+ sizeof(WCHAR
);
827 DomainsBuffer
[i
].Buffer
= MIDL_user_allocate(DomainsBuffer
[i
].MaximumLength
);
828 if (DomainsBuffer
[i
].Buffer
== NULL
)
830 Status
= STATUS_INSUFFICIENT_RESOURCES
;
834 CopyMemory(DomainsBuffer
[i
].Buffer
,
836 DomainsBuffer
[i
].Length
);
837 DomainsBuffer
[i
].Buffer
[DomainLength
] = UNICODE_NULL
;
839 //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
842 AccountsBuffer
[i
].Length
= (USHORT
)AccountLength
* sizeof(WCHAR
);
843 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
844 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
845 if (AccountsBuffer
[i
].Buffer
== NULL
)
847 Status
= STATUS_INSUFFICIENT_RESOURCES
;
851 CopyMemory(AccountsBuffer
[i
].Buffer
,
852 &(Names
[i
].Buffer
[DomainLength
+ 1]),
853 AccountsBuffer
[i
].Length
);
854 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
856 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
861 if (!NT_SUCCESS(Status
))
863 if (AccountsBuffer
!= NULL
)
865 for (i
= 0; i
< Count
; i
++)
867 if (AccountsBuffer
[i
].Buffer
!= NULL
)
868 MIDL_user_free(AccountsBuffer
[i
].Buffer
);
871 MIDL_user_free(AccountsBuffer
);
874 if (DomainsBuffer
!= NULL
)
876 for (i
= 0; i
< Count
; i
++)
878 if (DomainsBuffer
[i
].Buffer
!= NULL
)
879 MIDL_user_free(DomainsBuffer
[i
].Buffer
);
882 MIDL_user_free(DomainsBuffer
);
887 *DomainNames
= DomainsBuffer
;
888 *AccountNames
= AccountsBuffer
;
896 LsapAddDomainToDomainsList(PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
897 PUNICODE_STRING Name
,
904 while (i
< ReferencedDomains
->Entries
&&
905 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
907 if (RtlEqualSid(Sid
, ReferencedDomains
->Domains
[i
].Sid
))
910 return STATUS_SUCCESS
;
916 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(Sid
));
917 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
918 return STATUS_INSUFFICIENT_RESOURCES
;
920 RtlCopySid(RtlLengthSid(Sid
), ReferencedDomains
->Domains
[i
].Sid
, Sid
);
922 ReferencedDomains
->Domains
[i
].Name
.Length
= Name
->Length
;
923 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= Name
->MaximumLength
;
924 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(Name
->MaximumLength
);
925 if (ReferencedDomains
->Domains
[i
].Name
.Buffer
== NULL
)
927 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
928 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
929 return STATUS_INSUFFICIENT_RESOURCES
;
932 RtlCopyMemory(ReferencedDomains
->Domains
[i
].Name
.Buffer
,
934 Name
->MaximumLength
);
936 ReferencedDomains
->Entries
++;
939 return STATUS_SUCCESS
;
944 LsapIsPrefixSid(IN PSID PrefixSid
,
947 PISID Sid1
= PrefixSid
, Sid2
= Sid
;
950 if (Sid1
->Revision
!= Sid2
->Revision
)
953 if ((Sid1
->IdentifierAuthority
.Value
[0] != Sid2
->IdentifierAuthority
.Value
[0]) ||
954 (Sid1
->IdentifierAuthority
.Value
[1] != Sid2
->IdentifierAuthority
.Value
[1]) ||
955 (Sid1
->IdentifierAuthority
.Value
[2] != Sid2
->IdentifierAuthority
.Value
[2]) ||
956 (Sid1
->IdentifierAuthority
.Value
[3] != Sid2
->IdentifierAuthority
.Value
[3]) ||
957 (Sid1
->IdentifierAuthority
.Value
[4] != Sid2
->IdentifierAuthority
.Value
[4]) ||
958 (Sid1
->IdentifierAuthority
.Value
[5] != Sid2
->IdentifierAuthority
.Value
[5]))
961 if (Sid1
->SubAuthorityCount
>= Sid2
->SubAuthorityCount
)
964 if (Sid1
->SubAuthorityCount
== 0)
967 for (i
= 0; i
< Sid1
->SubAuthorityCount
; i
++)
969 if (Sid1
->SubAuthority
[i
] != Sid2
->SubAuthority
[i
])
978 LsapGetRelativeIdFromSid(PSID Sid_
)
982 if (Sid
->SubAuthorityCount
!= 0)
983 return Sid
->SubAuthority
[Sid
->SubAuthorityCount
- 1];
990 CreateSidFromSidAndRid(PSID SrcSid
,
999 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1003 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
1005 DstSid
= MIDL_user_allocate(DstSidSize
);
1009 RtlInitializeSid(DstSid
,
1010 RtlIdentifierAuthoritySid(SrcSid
),
1013 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1015 p
= RtlSubAuthoritySid(SrcSid
, i
);
1016 q
= RtlSubAuthoritySid(DstSid
, i
);
1020 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);
1028 CreateDomainSidFromAccountSid(PSID AccountSid
)
1036 RidCount
= *RtlSubAuthorityCountSid(AccountSid
);
1040 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1042 DomainSid
= MIDL_user_allocate(DstSidSize
);
1043 if (DomainSid
== NULL
)
1046 RtlInitializeSid(DomainSid
,
1047 RtlIdentifierAuthoritySid(AccountSid
),
1050 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1052 p
= RtlSubAuthoritySid(AccountSid
, i
);
1053 q
= RtlSubAuthoritySid(DomainSid
, i
);
1062 LsapCopySid(PSID SrcSid
)
1070 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1071 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1073 DstSid
= MIDL_user_allocate(DstSidSize
);
1077 RtlInitializeSid(DstSid
,
1078 RtlIdentifierAuthoritySid(SrcSid
),
1081 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1083 p
= RtlSubAuthoritySid(SrcSid
, i
);
1084 q
= RtlSubAuthoritySid(DstSid
, i
);
1094 LsapLookupIsolatedNames(DWORD Count
,
1095 PRPC_UNICODE_STRING DomainNames
,
1096 PRPC_UNICODE_STRING AccountNames
,
1097 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1098 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1101 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1102 PWELL_KNOWN_SID ptr
, ptr2
;
1106 NTSTATUS Status
= STATUS_SUCCESS
;
1108 for (i
= 0; i
< Count
; i
++)
1110 /* Ignore names which were already mapped */
1111 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1114 /* Ignore fully qualified account names */
1115 if (DomainNames
[i
].Length
!= 0)
1118 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1120 /* Look-up all well-known names */
1121 ptr
= LsapLookupIsolatedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
]);
1124 SidsBuffer
[i
].Use
= ptr
->Use
;
1125 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1126 if (SidsBuffer
[i
].Sid
== NULL
)
1128 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1132 SidsBuffer
[i
].DomainIndex
= -1;
1133 SidsBuffer
[i
].Flags
= 0;
1135 if (ptr
->Use
== SidTypeDomain
)
1137 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1141 if (!NT_SUCCESS(Status
))
1144 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1148 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1151 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1155 if (!NT_SUCCESS(Status
))
1158 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1162 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1163 if (DomainSid
== NULL
)
1165 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1169 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1174 if (DomainSid
!= NULL
)
1176 MIDL_user_free(DomainSid
);
1180 if (!NT_SUCCESS(Status
))
1183 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1191 /* Look-up the built-in domain */
1192 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &BuiltinDomainName
, TRUE
))
1194 SidsBuffer
[i
].Use
= SidTypeDomain
;
1195 SidsBuffer
[i
].Sid
= LsapCopySid(BuiltinDomainSid
);
1196 if (SidsBuffer
[i
].Sid
== NULL
)
1198 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1202 SidsBuffer
[i
].DomainIndex
= -1;
1203 SidsBuffer
[i
].Flags
= 0;
1205 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1209 if (!NT_SUCCESS(Status
))
1212 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1218 /* Look-up the account domain */
1219 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &AccountDomainName
, TRUE
))
1221 SidsBuffer
[i
].Use
= SidTypeDomain
;
1222 SidsBuffer
[i
].Sid
= LsapCopySid(AccountDomainSid
);
1223 if (SidsBuffer
[i
].Sid
== NULL
)
1225 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1228 SidsBuffer
[i
].DomainIndex
= -1;
1229 SidsBuffer
[i
].Flags
= 0;
1231 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1235 if (!NT_SUCCESS(Status
))
1238 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1244 /* FIXME: Look-up the primary domain */
1246 /* FIXME: Look-up the trusted domains */
1258 LsapLookupIsolatedBuiltinNames(DWORD Count
,
1259 PRPC_UNICODE_STRING DomainNames
,
1260 PRPC_UNICODE_STRING AccountNames
,
1261 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1262 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1265 SAMPR_HANDLE ServerHandle
= NULL
;
1266 SAMPR_HANDLE DomainHandle
= NULL
;
1267 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1268 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1271 NTSTATUS Status
= STATUS_SUCCESS
;
1273 Status
= SamrConnect(NULL
,
1275 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1276 if (!NT_SUCCESS(Status
))
1278 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1282 Status
= SamrOpenDomain(ServerHandle
,
1286 if (!NT_SUCCESS(Status
))
1288 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1292 for (i
= 0; i
< Count
; i
++)
1294 /* Ignore names which were already mapped */
1295 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1298 /* Ignore fully qualified account names */
1299 if (DomainNames
[i
].Length
!= 0)
1302 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1304 Status
= SamrLookupNamesInDomain(DomainHandle
,
1309 if (NT_SUCCESS(Status
))
1311 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1313 SidsBuffer
[i
].Use
= Use
.Element
[0];
1314 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1315 RelativeIds
.Element
[0]);
1316 if (SidsBuffer
[i
].Sid
== NULL
)
1318 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1322 SidsBuffer
[i
].DomainIndex
= -1;
1323 SidsBuffer
[i
].Flags
= 0;
1325 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1329 if (!NT_SUCCESS(Status
))
1332 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1337 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1338 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1342 if (DomainHandle
!= NULL
)
1343 SamrCloseHandle(&DomainHandle
);
1345 if (ServerHandle
!= NULL
)
1346 SamrCloseHandle(&ServerHandle
);
1354 LsapLookupIsolatedAccountNames(DWORD Count
,
1355 PRPC_UNICODE_STRING DomainNames
,
1356 PRPC_UNICODE_STRING AccountNames
,
1357 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1358 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1361 SAMPR_HANDLE ServerHandle
= NULL
;
1362 SAMPR_HANDLE DomainHandle
= NULL
;
1363 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1364 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1367 NTSTATUS Status
= STATUS_SUCCESS
;
1371 Status
= SamrConnect(NULL
,
1373 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1374 if (!NT_SUCCESS(Status
))
1376 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1380 Status
= SamrOpenDomain(ServerHandle
,
1384 if (!NT_SUCCESS(Status
))
1386 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1390 for (i
= 0; i
< Count
; i
++)
1392 /* Ignore names which were already mapped */
1393 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1396 /* Ignore fully qualified account names */
1397 if (DomainNames
[i
].Length
!= 0)
1400 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1402 Status
= SamrLookupNamesInDomain(DomainHandle
,
1407 if (NT_SUCCESS(Status
))
1409 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1411 SidsBuffer
[i
].Use
= Use
.Element
[0];
1412 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1413 RelativeIds
.Element
[0]);
1414 if (SidsBuffer
[i
].Sid
== NULL
)
1416 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1420 SidsBuffer
[i
].DomainIndex
= -1;
1421 SidsBuffer
[i
].Flags
= 0;
1423 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1427 if (!NT_SUCCESS(Status
))
1430 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1435 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1436 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1440 if (DomainHandle
!= NULL
)
1441 SamrCloseHandle(&DomainHandle
);
1443 if (ServerHandle
!= NULL
)
1444 SamrCloseHandle(&ServerHandle
);
1452 LsapLookupFullyQualifiedWellKnownNames(DWORD Count
,
1453 PRPC_UNICODE_STRING DomainNames
,
1454 PRPC_UNICODE_STRING AccountNames
,
1455 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1456 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1459 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1460 PWELL_KNOWN_SID ptr
, ptr2
;
1464 NTSTATUS Status
= STATUS_SUCCESS
;
1466 for (i
= 0; i
< Count
; i
++)
1468 /* Ignore names which were already mapped */
1469 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1472 /* Ignore isolated account names */
1473 if (DomainNames
[i
].Length
== 0)
1476 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1478 /* Look-up all well-known names */
1479 ptr
= LsapLookupFullyQualifiedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
],
1480 (PUNICODE_STRING
)&DomainNames
[i
]);
1483 TRACE("Found it! (%wZ\\%wZ)\n", &ptr
->DomainName
, &ptr
->AccountName
);
1485 SidsBuffer
[i
].Use
= ptr
->Use
;
1486 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1487 if (SidsBuffer
[i
].Sid
== NULL
)
1489 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1493 SidsBuffer
[i
].DomainIndex
= -1;
1494 SidsBuffer
[i
].Flags
= 0;
1496 if (ptr
->Use
== SidTypeDomain
)
1498 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1502 if (!NT_SUCCESS(Status
))
1505 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1509 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1512 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1516 if (!NT_SUCCESS(Status
))
1519 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1523 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1524 if (DomainSid
== NULL
)
1526 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1530 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1535 if (DomainSid
!= NULL
)
1537 MIDL_user_free(DomainSid
);
1541 if (!NT_SUCCESS(Status
))
1544 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1560 LsapLookupBuiltinNames(DWORD Count
,
1561 PRPC_UNICODE_STRING DomainNames
,
1562 PRPC_UNICODE_STRING AccountNames
,
1563 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1564 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1567 SAMPR_HANDLE ServerHandle
= NULL
;
1568 SAMPR_HANDLE DomainHandle
= NULL
;
1569 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1570 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1573 NTSTATUS Status
= STATUS_SUCCESS
;
1575 Status
= SamrConnect(NULL
,
1577 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1578 if (!NT_SUCCESS(Status
))
1580 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1584 Status
= SamrOpenDomain(ServerHandle
,
1588 if (!NT_SUCCESS(Status
))
1590 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1594 for (i
= 0; i
< Count
; i
++)
1596 /* Ignore names which were already mapped */
1597 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1600 /* Ignore isolated account names */
1601 if (DomainNames
[i
].Length
== 0)
1604 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &BuiltinDomainName
, TRUE
))
1607 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1609 Status
= SamrLookupNamesInDomain(DomainHandle
,
1614 if (NT_SUCCESS(Status
))
1616 SidsBuffer
[i
].Use
= Use
.Element
[0];
1617 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1618 RelativeIds
.Element
[0]);
1619 if (SidsBuffer
[i
].Sid
== NULL
)
1621 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1625 SidsBuffer
[i
].DomainIndex
= -1;
1626 SidsBuffer
[i
].Flags
= 0;
1628 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1632 if (!NT_SUCCESS(Status
))
1635 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1640 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1641 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1645 if (DomainHandle
!= NULL
)
1646 SamrCloseHandle(&DomainHandle
);
1648 if (ServerHandle
!= NULL
)
1649 SamrCloseHandle(&ServerHandle
);
1657 LsapLookupAccountNames(DWORD Count
,
1658 PRPC_UNICODE_STRING DomainNames
,
1659 PRPC_UNICODE_STRING AccountNames
,
1660 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1661 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1664 SAMPR_HANDLE ServerHandle
= NULL
;
1665 SAMPR_HANDLE DomainHandle
= NULL
;
1666 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1667 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1670 NTSTATUS Status
= STATUS_SUCCESS
;
1672 Status
= SamrConnect(NULL
,
1674 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1675 if (!NT_SUCCESS(Status
))
1677 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1681 Status
= SamrOpenDomain(ServerHandle
,
1685 if (!NT_SUCCESS(Status
))
1687 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1691 for (i
= 0; i
< Count
; i
++)
1693 /* Ignore names which were already mapped */
1694 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1697 /* Ignore isolated account names */
1698 if (DomainNames
[i
].Length
== 0)
1701 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &AccountDomainName
, TRUE
))
1704 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1706 Status
= SamrLookupNamesInDomain(DomainHandle
,
1711 if (NT_SUCCESS(Status
))
1713 SidsBuffer
[i
].Use
= Use
.Element
[0];
1714 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1715 RelativeIds
.Element
[0]);
1716 if (SidsBuffer
[i
].Sid
== NULL
)
1718 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1722 SidsBuffer
[i
].DomainIndex
= -1;
1723 SidsBuffer
[i
].Flags
= 0;
1725 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1729 if (!NT_SUCCESS(Status
))
1732 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1737 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1738 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1742 if (DomainHandle
!= NULL
)
1743 SamrCloseHandle(&DomainHandle
);
1745 if (ServerHandle
!= NULL
)
1746 SamrCloseHandle(&ServerHandle
);
1753 LsapLookupNames(DWORD Count
,
1754 PRPC_UNICODE_STRING Names
,
1755 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
1756 PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids
,
1757 LSAP_LOOKUP_LEVEL LookupLevel
,
1759 DWORD LookupOptions
,
1760 DWORD ClientRevision
)
1762 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
1763 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
= NULL
;
1764 PRPC_UNICODE_STRING DomainNames
= NULL
;
1765 PRPC_UNICODE_STRING AccountNames
= NULL
;
1766 ULONG SidsBufferLength
;
1769 NTSTATUS Status
= STATUS_SUCCESS
;
1773 TranslatedSids
->Entries
= 0;
1774 TranslatedSids
->Sids
= NULL
;
1775 *ReferencedDomains
= NULL
;
1777 SidsBufferLength
= Count
* sizeof(LSAPR_TRANSLATED_SID_EX2
);
1778 SidsBuffer
= MIDL_user_allocate(SidsBufferLength
);
1779 if (SidsBuffer
== NULL
)
1782 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1786 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
1787 if (DomainsBuffer
== NULL
)
1790 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1794 DomainsBuffer
->Domains
= MIDL_user_allocate(Count
* sizeof(LSA_TRUST_INFORMATION
));
1795 if (DomainsBuffer
->Domains
== NULL
)
1798 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1801 DomainsBuffer
->Entries
= 0;
1802 DomainsBuffer
->MaxEntries
= Count
;
1804 for (i
= 0; i
< Count
; i
++)
1806 SidsBuffer
[i
].Use
= SidTypeUnknown
;
1807 SidsBuffer
[i
].Sid
= NULL
;
1808 SidsBuffer
[i
].DomainIndex
= -1;
1809 SidsBuffer
[i
].Flags
= 0;
1812 Status
= LsapSplitNames(Count
,
1816 if (!NT_SUCCESS(Status
))
1818 TRACE("LsapSplitNames failed! (Status %lx)\n", Status
);
1823 Status
= LsapLookupIsolatedNames(Count
,
1829 if (!NT_SUCCESS(Status
) &&
1830 Status
!= STATUS_NONE_MAPPED
&&
1831 Status
!= STATUS_SOME_NOT_MAPPED
)
1833 TRACE("LsapLookupIsolatedNames failed! (Status %lx)\n", Status
);
1837 if (Mapped
== Count
)
1841 Status
= LsapLookupIsolatedBuiltinNames(Count
,
1847 if (!NT_SUCCESS(Status
) &&
1848 Status
!= STATUS_NONE_MAPPED
&&
1849 Status
!= STATUS_SOME_NOT_MAPPED
)
1851 TRACE("LsapLookupIsolatedBuiltinNames failed! (Status %lx)\n", Status
);
1855 if (Mapped
== Count
)
1859 Status
= LsapLookupIsolatedAccountNames(Count
,
1865 if (!NT_SUCCESS(Status
) &&
1866 Status
!= STATUS_NONE_MAPPED
&&
1867 Status
!= STATUS_SOME_NOT_MAPPED
)
1869 TRACE("LsapLookupIsolatedAccountNames failed! (Status %lx)\n", Status
);
1873 if (Mapped
== Count
)
1876 Status
= LsapLookupFullyQualifiedWellKnownNames(Count
,
1882 if (!NT_SUCCESS(Status
) &&
1883 Status
!= STATUS_NONE_MAPPED
&&
1884 Status
!= STATUS_SOME_NOT_MAPPED
)
1886 TRACE("LsapLookupFullyQualifiedWellKnownNames failed! (Status %lx)\n", Status
);
1890 if (Mapped
== Count
)
1893 Status
= LsapLookupBuiltinNames(Count
,
1899 if (!NT_SUCCESS(Status
) &&
1900 Status
!= STATUS_NONE_MAPPED
&&
1901 Status
!= STATUS_SOME_NOT_MAPPED
)
1903 TRACE("LsapLookupBuiltinNames failed! (Status %lx)\n", Status
);
1907 if (Mapped
== Count
)
1911 Status
= LsapLookupAccountNames(Count
,
1917 if (!NT_SUCCESS(Status
) &&
1918 Status
!= STATUS_NONE_MAPPED
&&
1919 Status
!= STATUS_SOME_NOT_MAPPED
)
1921 TRACE("LsapLookupAccountNames failed! (Status %lx)\n", Status
);
1925 if (Mapped
== Count
)
1929 // TRACE("done: Status %lx\n", Status);
1931 if (DomainNames
!= NULL
)
1933 //TRACE("Free DomainNames\n");
1934 for (i
= 0; i
< Count
; i
++)
1936 if (DomainNames
[i
].Buffer
!= NULL
)
1937 MIDL_user_free(DomainNames
[i
].Buffer
);
1940 MIDL_user_free(DomainNames
);
1943 if (AccountNames
!= NULL
)
1945 //TRACE("Free AccountNames\n");
1946 for (i
= 0; i
< Count
; i
++)
1948 //TRACE("i: %lu\n", i);
1949 if (AccountNames
[i
].Buffer
!= NULL
)
1951 MIDL_user_free(AccountNames
[i
].Buffer
);
1955 MIDL_user_free(AccountNames
);
1958 if (!NT_SUCCESS(Status
))
1960 //TRACE("Failure!\n");
1962 //TRACE("Free DomainsBuffer\n");
1963 if (DomainsBuffer
!= NULL
)
1965 if (DomainsBuffer
->Domains
!= NULL
)
1966 MIDL_user_free(DomainsBuffer
->Domains
);
1968 MIDL_user_free(DomainsBuffer
);
1971 //TRACE("Free SidsBuffer\n");
1972 if (SidsBuffer
!= NULL
)
1973 MIDL_user_free(SidsBuffer
);
1977 //TRACE("Success!\n");
1979 *ReferencedDomains
= DomainsBuffer
;
1980 TranslatedSids
->Entries
= Count
;
1981 TranslatedSids
->Sids
= SidsBuffer
;
1982 *MappedCount
= Mapped
;
1985 Status
= STATUS_NONE_MAPPED
;
1986 else if (Mapped
< Count
)
1987 Status
= STATUS_SOME_NOT_MAPPED
;
1990 // TRACE("done: Status %lx\n", Status);
1997 LsapLookupWellKnownSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
1998 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
1999 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2002 PWELL_KNOWN_SID ptr
, ptr2
;
2003 LPWSTR SidString
= NULL
;
2006 NTSTATUS Status
= STATUS_SUCCESS
;
2008 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2010 /* Ignore SIDs which are already mapped */
2011 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2014 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2015 TRACE("Mapping SID: %S\n", SidString
);
2016 LocalFree(SidString
);
2019 ptr
= LsapLookupWellKnownSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2022 NamesBuffer
[i
].Use
= ptr
->Use
;
2023 NamesBuffer
[i
].Flags
= 0;
2025 NamesBuffer
[i
].Name
.Length
= ptr
->AccountName
.Length
;
2026 NamesBuffer
[i
].Name
.MaximumLength
= ptr
->AccountName
.MaximumLength
;
2027 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(ptr
->AccountName
.MaximumLength
);
2028 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2030 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2034 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, ptr
->AccountName
.Buffer
, ptr
->AccountName
.MaximumLength
);
2036 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
2039 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2043 if (!NT_SUCCESS(Status
))
2046 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2049 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2061 LsapLookupBuiltinDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2062 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2063 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2066 SAMPR_HANDLE ServerHandle
= NULL
;
2067 SAMPR_HANDLE DomainHandle
= NULL
;
2068 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2069 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2070 LPWSTR SidString
= NULL
;
2072 ULONG RelativeIds
[1];
2074 NTSTATUS Status
= STATUS_SUCCESS
;
2076 Status
= SamrConnect(NULL
,
2078 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2079 if (!NT_SUCCESS(Status
))
2081 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2085 Status
= SamrOpenDomain(ServerHandle
,
2089 if (!NT_SUCCESS(Status
))
2091 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2095 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2097 /* Ignore SIDs which are already mapped */
2098 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2101 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2102 TRACE("Mapping SID: %S\n", SidString
);
2103 LocalFree(SidString
);
2106 if (RtlEqualSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2108 TRACE("Found builtin domain!\n");
2110 NamesBuffer
[i
].Use
= SidTypeDomain
;
2111 NamesBuffer
[i
].Flags
= 0;
2113 NamesBuffer
[i
].Name
.Length
= BuiltinDomainName
.Length
;
2114 NamesBuffer
[i
].Name
.MaximumLength
= BuiltinDomainName
.MaximumLength
;
2115 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(BuiltinDomainName
.MaximumLength
);
2116 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2118 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2122 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, BuiltinDomainName
.Buffer
, BuiltinDomainName
.MaximumLength
);
2124 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2128 if (!NT_SUCCESS(Status
))
2131 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2133 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2137 else if (LsapIsPrefixSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2139 TRACE("Found builtin domain account!\n");
2141 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2143 Status
= SamrLookupIdsInDomain(DomainHandle
,
2148 if (NT_SUCCESS(Status
))
2150 NamesBuffer
[i
].Use
= Use
.Element
[0];
2151 NamesBuffer
[i
].Flags
= 0;
2153 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2154 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2155 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2156 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2158 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2159 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2161 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2165 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2166 Names
.Element
[0].Buffer
,
2167 Names
.Element
[0].MaximumLength
);
2169 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2170 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2172 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2176 if (!NT_SUCCESS(Status
))
2179 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2181 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2189 if (DomainHandle
!= NULL
)
2190 SamrCloseHandle(&DomainHandle
);
2192 if (ServerHandle
!= NULL
)
2193 SamrCloseHandle(&ServerHandle
);
2200 LsapLookupAccountDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2201 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2202 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2205 SAMPR_HANDLE ServerHandle
= NULL
;
2206 SAMPR_HANDLE DomainHandle
= NULL
;
2207 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2208 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2209 LPWSTR SidString
= NULL
;
2211 ULONG RelativeIds
[1];
2213 NTSTATUS Status
= STATUS_SUCCESS
;
2215 Status
= SamrConnect(NULL
,
2217 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2218 if (!NT_SUCCESS(Status
))
2220 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2224 Status
= SamrOpenDomain(ServerHandle
,
2228 if (!NT_SUCCESS(Status
))
2230 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2234 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2236 /* Ignore SIDs which are already mapped */
2237 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2240 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2241 TRACE("Mapping SID: %S\n", SidString
);
2242 LocalFree(SidString
);
2245 if (RtlEqualSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2247 TRACE("Found account domain!\n");
2249 NamesBuffer
[i
].Use
= SidTypeDomain
;
2250 NamesBuffer
[i
].Flags
= 0;
2252 NamesBuffer
[i
].Name
.Length
= AccountDomainName
.Length
;
2253 NamesBuffer
[i
].Name
.MaximumLength
= AccountDomainName
.MaximumLength
;
2254 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(AccountDomainName
.MaximumLength
);
2255 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2257 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2261 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, AccountDomainName
.Buffer
, AccountDomainName
.MaximumLength
);
2263 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2267 if (!NT_SUCCESS(Status
))
2270 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2272 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2276 else if (LsapIsPrefixSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2278 TRACE("Found account domain account!\n");
2280 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2282 Status
= SamrLookupIdsInDomain(DomainHandle
,
2287 if (NT_SUCCESS(Status
))
2289 NamesBuffer
[i
].Use
= Use
.Element
[0];
2290 NamesBuffer
[i
].Flags
= 0;
2292 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2293 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2294 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2295 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2297 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2298 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2300 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2304 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2305 Names
.Element
[0].Buffer
,
2306 Names
.Element
[0].MaximumLength
);
2308 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2309 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2311 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2315 if (!NT_SUCCESS(Status
))
2318 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2320 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2328 if (DomainHandle
!= NULL
)
2329 SamrCloseHandle(&DomainHandle
);
2331 if (ServerHandle
!= NULL
)
2332 SamrCloseHandle(&ServerHandle
);
2339 LsapLookupSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2340 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
2341 PLSAPR_TRANSLATED_NAMES_EX TranslatedNames
,
2342 LSAP_LOOKUP_LEVEL LookupLevel
,
2344 DWORD LookupOptions
,
2345 DWORD ClientRevision
)
2347 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
2348 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
= NULL
;
2349 ULONG NamesBufferLength
;
2352 NTSTATUS Status
= STATUS_SUCCESS
;
2354 NamesBufferLength
= SidEnumBuffer
->Entries
* sizeof(LSAPR_TRANSLATED_NAME_EX
);
2355 NamesBuffer
= MIDL_user_allocate(NamesBufferLength
);
2356 if (NamesBuffer
== NULL
)
2358 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2362 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
2363 if (DomainsBuffer
== NULL
)
2365 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2369 DomainsBuffer
->Domains
= MIDL_user_allocate(SidEnumBuffer
->Entries
* sizeof(LSA_TRUST_INFORMATION
));
2370 if (DomainsBuffer
->Domains
== NULL
)
2372 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2376 DomainsBuffer
->Entries
= 0;
2377 DomainsBuffer
->MaxEntries
= SidEnumBuffer
->Entries
;
2379 /* Initialize all name entries */
2380 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2382 NamesBuffer
[i
].Use
= SidTypeUnknown
;
2383 NamesBuffer
[i
].Name
.Length
= 0;
2384 NamesBuffer
[i
].Name
.MaximumLength
= 0;
2385 NamesBuffer
[i
].Name
.Buffer
= NULL
;
2386 NamesBuffer
[i
].DomainIndex
= -1;
2387 NamesBuffer
[i
].Flags
= 0;
2390 /* Look-up well-known SIDs */
2391 Status
= LsapLookupWellKnownSids(SidEnumBuffer
,
2395 if (!NT_SUCCESS(Status
) &&
2396 Status
!= STATUS_NONE_MAPPED
&&
2397 Status
!= STATUS_SOME_NOT_MAPPED
)
2400 if (Mapped
== SidEnumBuffer
->Entries
)
2403 /* Look-up builtin domain SIDs */
2404 Status
= LsapLookupBuiltinDomainSids(SidEnumBuffer
,
2408 if (!NT_SUCCESS(Status
) &&
2409 Status
!= STATUS_NONE_MAPPED
&&
2410 Status
!= STATUS_SOME_NOT_MAPPED
)
2413 if (Mapped
== SidEnumBuffer
->Entries
)
2416 /* Look-up account domain SIDs */
2417 Status
= LsapLookupAccountDomainSids(SidEnumBuffer
,
2421 if (!NT_SUCCESS(Status
) &&
2422 Status
!= STATUS_NONE_MAPPED
&&
2423 Status
!= STATUS_SOME_NOT_MAPPED
)
2426 if (Mapped
== SidEnumBuffer
->Entries
)
2430 TRACE("done Status: %lx Mapped: %lu\n", Status
, Mapped
);
2432 if (!NT_SUCCESS(Status
))
2434 if (DomainsBuffer
!= NULL
)
2436 if (DomainsBuffer
->Domains
!= NULL
)
2437 MIDL_user_free(DomainsBuffer
->Domains
);
2439 MIDL_user_free(DomainsBuffer
);
2442 if (NamesBuffer
!= NULL
)
2443 MIDL_user_free(NamesBuffer
);
2447 *ReferencedDomains
= DomainsBuffer
;
2448 TranslatedNames
->Entries
= SidEnumBuffer
->Entries
;
2449 TranslatedNames
->Names
= NamesBuffer
;
2450 *MappedCount
= Mapped
;
2453 Status
= STATUS_NONE_MAPPED
;
2454 else if (Mapped
< SidEnumBuffer
->Entries
)
2455 Status
= STATUS_SOME_NOT_MAPPED
;