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
;
99 SIZE_T AccountNameLength
, DomainNameLength
;
103 AccountNameLength
= wcslen(AccountName
);
104 DomainNameLength
= wcslen(DomainName
);
105 if ((AccountNameLength
> UNICODE_STRING_MAX_CHARS
) ||
106 (DomainNameLength
> UNICODE_STRING_MAX_CHARS
))
111 SidEntry
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WELL_KNOWN_SID
));
112 if (SidEntry
== NULL
)
115 InitializeListHead(&SidEntry
->ListEntry
);
117 SidEntry
->Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
119 RtlLengthRequiredSid(SubAuthorityCount
));
120 if (SidEntry
->Sid
== NULL
)
122 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
126 RtlInitializeSid(SidEntry
->Sid
,
130 for (i
= 0; i
< (ULONG
)SubAuthorityCount
; i
++)
132 p
= RtlSubAuthoritySid(SidEntry
->Sid
, i
);
133 *p
= SubAuthorities
[i
];
136 // RtlInitUnicodeString(&SidEntry->AccountName,
138 SidEntry
->AccountName
.Length
= (USHORT
)AccountNameLength
* sizeof(WCHAR
);
139 SidEntry
->AccountName
.MaximumLength
= SidEntry
->AccountName
.Length
+ sizeof(WCHAR
);
140 SidEntry
->AccountName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
141 SidEntry
->AccountName
.MaximumLength
);
142 if (SidEntry
->AccountName
.Buffer
== NULL
)
144 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
145 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
149 wcscpy(SidEntry
->AccountName
.Buffer
,
152 // RtlInitUnicodeString(&SidEntry->DomainName,
154 SidEntry
->DomainName
.Length
= (USHORT
)DomainNameLength
* sizeof(WCHAR
);
155 SidEntry
->DomainName
.MaximumLength
= SidEntry
->DomainName
.Length
+ sizeof(WCHAR
);
156 SidEntry
->DomainName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
157 SidEntry
->DomainName
.MaximumLength
);
158 if (SidEntry
->DomainName
.Buffer
== NULL
)
160 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->AccountName
.Buffer
);
161 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
162 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
166 wcscpy(SidEntry
->DomainName
.Buffer
,
171 InsertTailList(&WellKnownSidListHead
,
172 &SidEntry
->ListEntry
);
175 *SidPtr
= SidEntry
->Sid
;
184 WCHAR szAccountName
[80];
185 WCHAR szDomainName
[80];
186 ULONG SubAuthorities
[8];
189 InitializeListHead(&WellKnownSidListHead
);
191 hInstance
= GetModuleHandleW(L
"lsasrv.dll");
194 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szAccountName
, ARRAYSIZE(szAccountName
));
195 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, ARRAYSIZE(szDomainName
));
196 LsapCreateSid(&NtAuthority
,
205 LsapLoadString(hInstance
, IDS_NULL_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
207 SubAuthorities
[0] = SECURITY_NULL_RID
;
208 LsapCreateSid(&NullSidAuthority
,
213 SidTypeWellKnownGroup
,
217 LsapLoadString(hInstance
, IDS_WORLD_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
219 SubAuthorities
[0] = SECURITY_WORLD_RID
;
220 LsapCreateSid(&WorldSidAuthority
,
225 SidTypeWellKnownGroup
,
229 LsapLoadString(hInstance
, IDS_LOCAL_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
231 SubAuthorities
[0] = SECURITY_LOCAL_RID
;
232 LsapCreateSid(&LocalSidAuthority
,
237 SidTypeWellKnownGroup
,
240 /* Creator Owner Sid */
241 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
243 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_RID
;
244 LsapCreateSid(&CreatorSidAuthority
,
249 SidTypeWellKnownGroup
,
252 /* Creator Group Sid */
253 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
255 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_RID
;
256 LsapCreateSid(&CreatorSidAuthority
,
261 SidTypeWellKnownGroup
,
264 /* Creator Owner Server Sid */
265 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
267 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_SERVER_RID
;
268 LsapCreateSid(&CreatorSidAuthority
,
273 SidTypeWellKnownGroup
,
276 /* Creator Group Server Sid */
277 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
279 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_SERVER_RID
;
280 LsapCreateSid(&CreatorSidAuthority
,
285 SidTypeWellKnownGroup
,
289 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
290 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, ARRAYSIZE(szDomainName
));
292 SubAuthorities
[0] = SECURITY_DIALUP_RID
;
293 LsapCreateSid(&NtAuthority
,
298 SidTypeWellKnownGroup
,
302 LsapLoadString(hInstance
, IDS_NETWORK_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
304 SubAuthorities
[0] = SECURITY_NETWORK_RID
;
305 LsapCreateSid(&NtAuthority
,
310 SidTypeWellKnownGroup
,
314 LsapLoadString(hInstance
, IDS_BATCH_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
316 SubAuthorities
[0] = SECURITY_BATCH_RID
;
317 LsapCreateSid(&NtAuthority
,
322 SidTypeWellKnownGroup
,
325 /* Interactive Sid */
326 LsapLoadString(hInstance
, IDS_INTERACTIVE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
328 SubAuthorities
[0] = SECURITY_INTERACTIVE_RID
;
329 LsapCreateSid(&NtAuthority
,
334 SidTypeWellKnownGroup
,
335 &LsapInteractiveSid
);
338 LsapLoadString(hInstance
, IDS_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
340 SubAuthorities
[0] = SECURITY_SERVICE_RID
;
341 LsapCreateSid(&NtAuthority
,
346 SidTypeWellKnownGroup
,
349 /* Anonymous Logon Sid */
350 LsapLoadString(hInstance
, IDS_ANONYMOUS_LOGON_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
352 SubAuthorities
[0] = SECURITY_ANONYMOUS_LOGON_RID
;
353 LsapCreateSid(&NtAuthority
,
358 SidTypeWellKnownGroup
,
362 LsapLoadString(hInstance
, IDS_PROXY_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
364 SubAuthorities
[0] = SECURITY_PROXY_RID
;
365 LsapCreateSid(&NtAuthority
,
370 SidTypeWellKnownGroup
,
373 /* Enterprise Controllers Sid */
374 LsapLoadString(hInstance
, IDS_ENTERPRISE_CONTROLLERS_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
376 SubAuthorities
[0] = SECURITY_ENTERPRISE_CONTROLLERS_RID
;
377 LsapCreateSid(&NtAuthority
,
382 SidTypeWellKnownGroup
,
385 /* Principal Self Sid */
386 LsapLoadString(hInstance
, IDS_PRINCIPAL_SELF_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
388 SubAuthorities
[0] = SECURITY_PRINCIPAL_SELF_RID
;
389 LsapCreateSid(&NtAuthority
,
394 SidTypeWellKnownGroup
,
397 /* Authenticated Users Sid */
398 LsapLoadString(hInstance
, IDS_AUTHENTICATED_USER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
400 SubAuthorities
[0] = SECURITY_AUTHENTICATED_USER_RID
;
401 LsapCreateSid(&NtAuthority
,
406 SidTypeWellKnownGroup
,
409 /* Restricted Code Sid */
410 LsapLoadString(hInstance
, IDS_RESTRICTED_CODE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
412 SubAuthorities
[0] = SECURITY_RESTRICTED_CODE_RID
;
413 LsapCreateSid(&NtAuthority
,
418 SidTypeWellKnownGroup
,
421 /* Terminal Server Sid */
422 LsapLoadString(hInstance
, IDS_TERMINAL_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
424 SubAuthorities
[0] = SECURITY_TERMINAL_SERVER_RID
;
425 LsapCreateSid(&NtAuthority
,
430 SidTypeWellKnownGroup
,
433 /* Remote Logon Sid */
434 LsapLoadString(hInstance
, IDS_REMOTE_LOGON_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
436 SubAuthorities
[0] = SECURITY_REMOTE_LOGON_RID
;
437 LsapCreateSid(&NtAuthority
,
442 SidTypeWellKnownGroup
,
445 /* This Organization Sid */
446 LsapLoadString(hInstance
, IDS_THIS_ORGANIZATION_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
448 SubAuthorities
[0] = SECURITY_THIS_ORGANIZATION_RID
;
449 LsapCreateSid(&NtAuthority
,
454 SidTypeWellKnownGroup
,
457 /* Local System Sid */
458 LsapLoadString(hInstance
, IDS_LOCAL_SYSTEM_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
460 SubAuthorities
[0] = SECURITY_LOCAL_SYSTEM_RID
;
461 LsapCreateSid(&NtAuthority
,
466 SidTypeWellKnownGroup
,
467 &LsapLocalSystemSid
);
469 /* Local Service Sid */
470 LsapLoadString(hInstance
, IDS_LOCAL_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
472 SubAuthorities
[0] = SECURITY_LOCAL_SERVICE_RID
;
473 LsapCreateSid(&NtAuthority
,
478 SidTypeWellKnownGroup
,
481 LsapCreateSid(&NtAuthority
,
486 SidTypeWellKnownGroup
,
489 /* Network Service Sid */
490 LsapLoadString(hInstance
, IDS_NETWORK_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
492 SubAuthorities
[0] = SECURITY_NETWORK_SERVICE_RID
;
493 LsapCreateSid(&NtAuthority
,
498 SidTypeWellKnownGroup
,
501 LsapCreateSid(&NtAuthority
,
506 SidTypeWellKnownGroup
,
509 /* Builtin Domain Sid */
510 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
511 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szDomainName
, ARRAYSIZE(szDomainName
));
513 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
514 LsapCreateSid(&NtAuthority
,
522 /* Administrators Alias Sid */
523 LsapLoadString(hInstance
, IDS_ALIAS_RID_ADMINS
, szAccountName
, ARRAYSIZE(szAccountName
));
525 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
526 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ADMINS
;
527 LsapCreateSid(&NtAuthority
,
533 &LsapAdministratorsSid
);
535 /* Users Alias Sid */
536 LsapLoadString(hInstance
, IDS_ALIAS_RID_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
538 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
539 SubAuthorities
[1] = DOMAIN_ALIAS_RID_USERS
;
540 LsapCreateSid(&NtAuthority
,
548 /* Guests Alias Sid */
549 LsapLoadString(hInstance
, IDS_ALIAS_RID_GUESTS
, szAccountName
, ARRAYSIZE(szAccountName
));
551 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
552 SubAuthorities
[1] = DOMAIN_ALIAS_RID_GUESTS
;
553 LsapCreateSid(&NtAuthority
,
561 /* Power User Alias Sid */
562 LsapLoadString(hInstance
, IDS_ALIAS_RID_POWER_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
564 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
565 SubAuthorities
[1] = DOMAIN_ALIAS_RID_POWER_USERS
;
566 LsapCreateSid(&NtAuthority
,
574 /* Account Operators Alias Sid */
575 LsapLoadString(hInstance
, IDS_ALIAS_RID_ACCOUNT_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
577 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
578 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ACCOUNT_OPS
;
579 LsapCreateSid(&NtAuthority
,
587 /* System Operators Alias Sid */
588 LsapLoadString(hInstance
, IDS_ALIAS_RID_SYSTEM_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
590 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
591 SubAuthorities
[1] = DOMAIN_ALIAS_RID_SYSTEM_OPS
;
592 LsapCreateSid(&NtAuthority
,
600 /* Print Operators Alias Sid */
601 LsapLoadString(hInstance
, IDS_ALIAS_RID_PRINT_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
603 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
604 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PRINT_OPS
;
605 LsapCreateSid(&NtAuthority
,
613 /* Backup Operators Alias Sid */
614 LsapLoadString(hInstance
, IDS_ALIAS_RID_BACKUP_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
616 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
617 SubAuthorities
[1] = DOMAIN_ALIAS_RID_BACKUP_OPS
;
618 LsapCreateSid(&NtAuthority
,
626 /* Replicators Alias Sid */
627 LsapLoadString(hInstance
, IDS_ALIAS_RID_REPLICATOR
, szAccountName
, ARRAYSIZE(szAccountName
));
629 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
630 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REPLICATOR
;
631 LsapCreateSid(&NtAuthority
,
639 /* RAS Servers Alias Sid */
640 LsapLoadString(hInstance
, IDS_ALIAS_RID_RAS_SERVERS
, szAccountName
, ARRAYSIZE(szAccountName
));
642 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
643 SubAuthorities
[1] = DOMAIN_ALIAS_RID_RAS_SERVERS
;
644 LsapCreateSid(&NtAuthority
,
652 /* Pre-Windows 2000 Compatible Access Alias Sid */
653 LsapLoadString(hInstance
, IDS_ALIAS_RID_PREW2KCOMPACCESS
, szAccountName
, ARRAYSIZE(szAccountName
));
655 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
656 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
;
657 LsapCreateSid(&NtAuthority
,
665 /* Remote Desktop Users Alias Sid */
666 LsapLoadString(hInstance
, IDS_ALIAS_RID_REMOTE_DESKTOP_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
668 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
669 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
;
670 LsapCreateSid(&NtAuthority
,
678 /* Network Configuration Operators Alias Sid */
679 LsapLoadString(hInstance
, IDS_ALIAS_RID_NETWORK_CONFIGURATION_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
681 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
682 SubAuthorities
[1] = DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
;
683 LsapCreateSid(&NtAuthority
,
691 /* FIXME: Add more well known sids */
693 return STATUS_SUCCESS
;
698 LsapLookupWellKnownSid(PSID Sid
)
700 PLIST_ENTRY ListEntry
;
703 ListEntry
= WellKnownSidListHead
.Flink
;
704 while (ListEntry
!= &WellKnownSidListHead
)
706 Ptr
= CONTAINING_RECORD(ListEntry
,
709 if (RtlEqualSid(Sid
, Ptr
->Sid
))
714 ListEntry
= ListEntry
->Flink
;
722 LsapLookupIsolatedWellKnownName(PUNICODE_STRING AccountName
)
724 PLIST_ENTRY ListEntry
;
727 ListEntry
= WellKnownSidListHead
.Flink
;
728 while (ListEntry
!= &WellKnownSidListHead
)
730 Ptr
= CONTAINING_RECORD(ListEntry
,
733 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
))
738 ListEntry
= ListEntry
->Flink
;
746 LsapLookupFullyQualifiedWellKnownName(PUNICODE_STRING AccountName
,
747 PUNICODE_STRING DomainName
)
749 PLIST_ENTRY ListEntry
;
752 ListEntry
= WellKnownSidListHead
.Flink
;
753 while (ListEntry
!= &WellKnownSidListHead
)
755 Ptr
= CONTAINING_RECORD(ListEntry
,
758 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
) &&
759 RtlEqualUnicodeString(DomainName
, &Ptr
->DomainName
, TRUE
))
764 ListEntry
= ListEntry
->Flink
;
773 LsapSplitNames(DWORD Count
,
774 PRPC_UNICODE_STRING Names
,
775 PRPC_UNICODE_STRING
*DomainNames
,
776 PRPC_UNICODE_STRING
*AccountNames
)
778 PRPC_UNICODE_STRING DomainsBuffer
= NULL
;
779 PRPC_UNICODE_STRING AccountsBuffer
= NULL
;
784 NTSTATUS Status
= STATUS_SUCCESS
;
786 DomainsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
787 if (DomainsBuffer
== NULL
)
789 Status
= STATUS_INSUFFICIENT_RESOURCES
;
793 AccountsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
794 if (AccountsBuffer
== NULL
)
796 Status
= STATUS_INSUFFICIENT_RESOURCES
;
800 for (i
= 0; i
< Count
; i
++)
802 //TRACE("Name: %wZ\n", &Names[i]);
804 Ptr
= wcschr(Names
[i
].Buffer
, L
'\\');
807 AccountLength
= Names
[i
].Length
/ sizeof(WCHAR
);
809 AccountsBuffer
[i
].Length
= Names
[i
].Length
;
810 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
811 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
812 if (AccountsBuffer
[i
].Buffer
== NULL
)
814 Status
= STATUS_INSUFFICIENT_RESOURCES
;
818 CopyMemory(AccountsBuffer
[i
].Buffer
,
820 AccountsBuffer
[i
].Length
);
821 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
823 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
827 DomainLength
= (ULONG
)(ULONG_PTR
)(Ptr
- Names
[i
].Buffer
);
828 AccountLength
= (Names
[i
].Length
/ sizeof(WCHAR
)) - DomainLength
- 1;
829 //TRACE("DomainLength: %u\n", DomainLength);
830 //TRACE("AccountLength: %u\n", AccountLength);
832 if (DomainLength
> 0)
834 DomainsBuffer
[i
].Length
= (USHORT
)DomainLength
* sizeof(WCHAR
);
835 DomainsBuffer
[i
].MaximumLength
= DomainsBuffer
[i
].Length
+ sizeof(WCHAR
);
836 DomainsBuffer
[i
].Buffer
= MIDL_user_allocate(DomainsBuffer
[i
].MaximumLength
);
837 if (DomainsBuffer
[i
].Buffer
== NULL
)
839 Status
= STATUS_INSUFFICIENT_RESOURCES
;
843 CopyMemory(DomainsBuffer
[i
].Buffer
,
845 DomainsBuffer
[i
].Length
);
846 DomainsBuffer
[i
].Buffer
[DomainLength
] = UNICODE_NULL
;
848 //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
851 AccountsBuffer
[i
].Length
= (USHORT
)AccountLength
* sizeof(WCHAR
);
852 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
853 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
854 if (AccountsBuffer
[i
].Buffer
== NULL
)
856 Status
= STATUS_INSUFFICIENT_RESOURCES
;
860 CopyMemory(AccountsBuffer
[i
].Buffer
,
861 &(Names
[i
].Buffer
[DomainLength
+ 1]),
862 AccountsBuffer
[i
].Length
);
863 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
865 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
870 if (!NT_SUCCESS(Status
))
872 if (AccountsBuffer
!= NULL
)
874 for (i
= 0; i
< Count
; i
++)
876 if (AccountsBuffer
[i
].Buffer
!= NULL
)
877 MIDL_user_free(AccountsBuffer
[i
].Buffer
);
880 MIDL_user_free(AccountsBuffer
);
883 if (DomainsBuffer
!= NULL
)
885 for (i
= 0; i
< Count
; i
++)
887 if (DomainsBuffer
[i
].Buffer
!= NULL
)
888 MIDL_user_free(DomainsBuffer
[i
].Buffer
);
891 MIDL_user_free(DomainsBuffer
);
896 *DomainNames
= DomainsBuffer
;
897 *AccountNames
= AccountsBuffer
;
905 LsapAddDomainToDomainsList(PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
906 PUNICODE_STRING Name
,
913 while (i
< ReferencedDomains
->Entries
&&
914 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
916 if (RtlEqualSid(Sid
, ReferencedDomains
->Domains
[i
].Sid
))
919 return STATUS_SUCCESS
;
925 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(Sid
));
926 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
927 return STATUS_INSUFFICIENT_RESOURCES
;
929 RtlCopySid(RtlLengthSid(Sid
), ReferencedDomains
->Domains
[i
].Sid
, Sid
);
931 ReferencedDomains
->Domains
[i
].Name
.Length
= Name
->Length
;
932 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= Name
->MaximumLength
;
933 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(Name
->MaximumLength
);
934 if (ReferencedDomains
->Domains
[i
].Name
.Buffer
== NULL
)
936 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
937 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
938 return STATUS_INSUFFICIENT_RESOURCES
;
941 RtlCopyMemory(ReferencedDomains
->Domains
[i
].Name
.Buffer
,
943 Name
->MaximumLength
);
945 ReferencedDomains
->Entries
++;
948 return STATUS_SUCCESS
;
953 LsapAddAuthorityToDomainsList(
954 PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
961 RtlInitializeSid(&AuthoritySid
,
962 RtlIdentifierAuthoritySid(Sid
),
966 while (i
< ReferencedDomains
->Entries
&&
967 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
969 if (RtlEqualSid(&AuthoritySid
, ReferencedDomains
->Domains
[i
].Sid
))
972 return STATUS_SUCCESS
;
978 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(&AuthoritySid
));
979 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
980 return STATUS_INSUFFICIENT_RESOURCES
;
982 RtlCopySid(RtlLengthSid(&AuthoritySid
), ReferencedDomains
->Domains
[i
].Sid
, &AuthoritySid
);
984 ReferencedDomains
->Domains
[i
].Name
.Length
= 0;
985 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= sizeof(WCHAR
);
986 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(sizeof(WCHAR
));
987 if (ReferencedDomains
->Domains
[i
].Name
.Buffer
== NULL
)
989 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
990 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
991 return STATUS_INSUFFICIENT_RESOURCES
;
994 ReferencedDomains
->Domains
[i
].Name
.Buffer
[0] = UNICODE_NULL
;
996 ReferencedDomains
->Entries
++;
999 return STATUS_SUCCESS
;
1004 LsapIsPrefixSid(IN PSID PrefixSid
,
1007 PISID Sid1
= PrefixSid
, Sid2
= Sid
;
1010 if (Sid1
->Revision
!= Sid2
->Revision
)
1013 if ((Sid1
->IdentifierAuthority
.Value
[0] != Sid2
->IdentifierAuthority
.Value
[0]) ||
1014 (Sid1
->IdentifierAuthority
.Value
[1] != Sid2
->IdentifierAuthority
.Value
[1]) ||
1015 (Sid1
->IdentifierAuthority
.Value
[2] != Sid2
->IdentifierAuthority
.Value
[2]) ||
1016 (Sid1
->IdentifierAuthority
.Value
[3] != Sid2
->IdentifierAuthority
.Value
[3]) ||
1017 (Sid1
->IdentifierAuthority
.Value
[4] != Sid2
->IdentifierAuthority
.Value
[4]) ||
1018 (Sid1
->IdentifierAuthority
.Value
[5] != Sid2
->IdentifierAuthority
.Value
[5]))
1021 if (Sid1
->SubAuthorityCount
>= Sid2
->SubAuthorityCount
)
1024 if (Sid1
->SubAuthorityCount
== 0)
1027 for (i
= 0; i
< Sid1
->SubAuthorityCount
; i
++)
1029 if (Sid1
->SubAuthority
[i
] != Sid2
->SubAuthority
[i
])
1038 LsapGetRelativeIdFromSid(PSID Sid_
)
1042 if (Sid
->SubAuthorityCount
!= 0)
1043 return Sid
->SubAuthority
[Sid
->SubAuthorityCount
- 1];
1050 CreateSidFromSidAndRid(PSID SrcSid
,
1059 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1063 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
1065 DstSid
= MIDL_user_allocate(DstSidSize
);
1069 RtlInitializeSid(DstSid
,
1070 RtlIdentifierAuthoritySid(SrcSid
),
1073 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1075 p
= RtlSubAuthoritySid(SrcSid
, i
);
1076 q
= RtlSubAuthoritySid(DstSid
, i
);
1080 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);
1088 CreateDomainSidFromAccountSid(PSID AccountSid
)
1096 RidCount
= *RtlSubAuthorityCountSid(AccountSid
);
1100 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1102 DomainSid
= MIDL_user_allocate(DstSidSize
);
1103 if (DomainSid
== NULL
)
1106 RtlInitializeSid(DomainSid
,
1107 RtlIdentifierAuthoritySid(AccountSid
),
1110 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1112 p
= RtlSubAuthoritySid(AccountSid
, i
);
1113 q
= RtlSubAuthoritySid(DomainSid
, i
);
1122 LsapCopySid(PSID SrcSid
)
1130 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1131 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1133 DstSid
= MIDL_user_allocate(DstSidSize
);
1137 RtlInitializeSid(DstSid
,
1138 RtlIdentifierAuthoritySid(SrcSid
),
1141 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1143 p
= RtlSubAuthoritySid(SrcSid
, i
);
1144 q
= RtlSubAuthoritySid(DstSid
, i
);
1154 LsapLookupIsolatedNames(DWORD Count
,
1155 PRPC_UNICODE_STRING DomainNames
,
1156 PRPC_UNICODE_STRING AccountNames
,
1157 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1158 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1161 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1162 PWELL_KNOWN_SID ptr
, ptr2
;
1166 NTSTATUS Status
= STATUS_SUCCESS
;
1168 for (i
= 0; i
< Count
; i
++)
1170 /* Ignore names which were already mapped */
1171 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1174 /* Ignore fully qualified account names */
1175 if (DomainNames
[i
].Length
!= 0)
1178 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1180 /* Look-up all well-known names */
1181 ptr
= LsapLookupIsolatedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
]);
1184 SidsBuffer
[i
].Use
= ptr
->Use
;
1185 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1186 if (SidsBuffer
[i
].Sid
== NULL
)
1188 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1192 SidsBuffer
[i
].DomainIndex
= -1;
1193 SidsBuffer
[i
].Flags
= 0;
1195 if (ptr
->Use
== SidTypeDomain
)
1197 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1201 if (!NT_SUCCESS(Status
))
1204 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1208 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1211 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1215 if (!NT_SUCCESS(Status
))
1218 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1222 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1223 if (DomainSid
== NULL
)
1225 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1229 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1234 if (DomainSid
!= NULL
)
1236 MIDL_user_free(DomainSid
);
1240 if (!NT_SUCCESS(Status
))
1243 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1251 /* Look-up the built-in domain */
1252 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &BuiltinDomainName
, TRUE
))
1254 SidsBuffer
[i
].Use
= SidTypeDomain
;
1255 SidsBuffer
[i
].Sid
= LsapCopySid(BuiltinDomainSid
);
1256 if (SidsBuffer
[i
].Sid
== NULL
)
1258 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1262 SidsBuffer
[i
].DomainIndex
= -1;
1263 SidsBuffer
[i
].Flags
= 0;
1265 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1269 if (!NT_SUCCESS(Status
))
1272 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1278 /* Look-up the account domain */
1279 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &AccountDomainName
, TRUE
))
1281 SidsBuffer
[i
].Use
= SidTypeDomain
;
1282 SidsBuffer
[i
].Sid
= LsapCopySid(AccountDomainSid
);
1283 if (SidsBuffer
[i
].Sid
== NULL
)
1285 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1288 SidsBuffer
[i
].DomainIndex
= -1;
1289 SidsBuffer
[i
].Flags
= 0;
1291 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1295 if (!NT_SUCCESS(Status
))
1298 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1304 /* FIXME: Look-up the primary domain */
1306 /* FIXME: Look-up the trusted domains */
1318 LsapLookupIsolatedBuiltinNames(DWORD Count
,
1319 PRPC_UNICODE_STRING DomainNames
,
1320 PRPC_UNICODE_STRING AccountNames
,
1321 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1322 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1325 SAMPR_HANDLE ServerHandle
= NULL
;
1326 SAMPR_HANDLE DomainHandle
= NULL
;
1327 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1328 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1331 NTSTATUS Status
= STATUS_SUCCESS
;
1333 Status
= SamrConnect(NULL
,
1335 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1336 if (!NT_SUCCESS(Status
))
1338 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1342 Status
= SamrOpenDomain(ServerHandle
,
1346 if (!NT_SUCCESS(Status
))
1348 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1352 for (i
= 0; i
< Count
; i
++)
1354 /* Ignore names which were already mapped */
1355 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1358 /* Ignore fully qualified account names */
1359 if (DomainNames
[i
].Length
!= 0)
1362 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1364 Status
= SamrLookupNamesInDomain(DomainHandle
,
1369 if (NT_SUCCESS(Status
))
1371 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1373 SidsBuffer
[i
].Use
= Use
.Element
[0];
1374 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1375 RelativeIds
.Element
[0]);
1376 if (SidsBuffer
[i
].Sid
== NULL
)
1378 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1382 SidsBuffer
[i
].DomainIndex
= -1;
1383 SidsBuffer
[i
].Flags
= 0;
1385 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1389 if (!NT_SUCCESS(Status
))
1392 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1397 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1398 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1402 if (DomainHandle
!= NULL
)
1403 SamrCloseHandle(&DomainHandle
);
1405 if (ServerHandle
!= NULL
)
1406 SamrCloseHandle(&ServerHandle
);
1414 LsapLookupIsolatedAccountNames(DWORD Count
,
1415 PRPC_UNICODE_STRING DomainNames
,
1416 PRPC_UNICODE_STRING AccountNames
,
1417 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1418 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1421 SAMPR_HANDLE ServerHandle
= NULL
;
1422 SAMPR_HANDLE DomainHandle
= NULL
;
1423 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1424 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1427 NTSTATUS Status
= STATUS_SUCCESS
;
1431 Status
= SamrConnect(NULL
,
1433 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1434 if (!NT_SUCCESS(Status
))
1436 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1440 Status
= SamrOpenDomain(ServerHandle
,
1444 if (!NT_SUCCESS(Status
))
1446 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1450 for (i
= 0; i
< Count
; i
++)
1452 /* Ignore names which were already mapped */
1453 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1456 /* Ignore fully qualified account names */
1457 if (DomainNames
[i
].Length
!= 0)
1460 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1462 Status
= SamrLookupNamesInDomain(DomainHandle
,
1467 if (NT_SUCCESS(Status
))
1469 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1471 SidsBuffer
[i
].Use
= Use
.Element
[0];
1472 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1473 RelativeIds
.Element
[0]);
1474 if (SidsBuffer
[i
].Sid
== NULL
)
1476 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1480 SidsBuffer
[i
].DomainIndex
= -1;
1481 SidsBuffer
[i
].Flags
= 0;
1483 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1487 if (!NT_SUCCESS(Status
))
1490 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1495 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1496 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1500 if (DomainHandle
!= NULL
)
1501 SamrCloseHandle(&DomainHandle
);
1503 if (ServerHandle
!= NULL
)
1504 SamrCloseHandle(&ServerHandle
);
1512 LsapLookupFullyQualifiedWellKnownNames(DWORD Count
,
1513 PRPC_UNICODE_STRING DomainNames
,
1514 PRPC_UNICODE_STRING AccountNames
,
1515 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1516 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1519 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1520 PWELL_KNOWN_SID ptr
, ptr2
;
1524 NTSTATUS Status
= STATUS_SUCCESS
;
1526 for (i
= 0; i
< Count
; i
++)
1528 /* Ignore names which were already mapped */
1529 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1532 /* Ignore isolated account names */
1533 if (DomainNames
[i
].Length
== 0)
1536 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1538 /* Look-up all well-known names */
1539 ptr
= LsapLookupFullyQualifiedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
],
1540 (PUNICODE_STRING
)&DomainNames
[i
]);
1543 TRACE("Found it! (%wZ\\%wZ)\n", &ptr
->DomainName
, &ptr
->AccountName
);
1545 SidsBuffer
[i
].Use
= ptr
->Use
;
1546 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1547 if (SidsBuffer
[i
].Sid
== NULL
)
1549 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1553 SidsBuffer
[i
].DomainIndex
= -1;
1554 SidsBuffer
[i
].Flags
= 0;
1556 if (ptr
->Use
== SidTypeDomain
)
1558 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1562 if (!NT_SUCCESS(Status
))
1565 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1569 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1572 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1576 if (!NT_SUCCESS(Status
))
1579 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1583 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1584 if (DomainSid
== NULL
)
1586 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1590 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1595 if (DomainSid
!= NULL
)
1597 MIDL_user_free(DomainSid
);
1601 if (!NT_SUCCESS(Status
))
1604 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1620 LsapLookupBuiltinNames(DWORD Count
,
1621 PRPC_UNICODE_STRING DomainNames
,
1622 PRPC_UNICODE_STRING AccountNames
,
1623 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1624 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1627 SAMPR_HANDLE ServerHandle
= NULL
;
1628 SAMPR_HANDLE DomainHandle
= NULL
;
1629 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1630 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1633 NTSTATUS Status
= STATUS_SUCCESS
;
1635 Status
= SamrConnect(NULL
,
1637 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1638 if (!NT_SUCCESS(Status
))
1640 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1644 Status
= SamrOpenDomain(ServerHandle
,
1648 if (!NT_SUCCESS(Status
))
1650 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1654 for (i
= 0; i
< Count
; i
++)
1656 /* Ignore names which were already mapped */
1657 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1660 /* Ignore isolated account names */
1661 if (DomainNames
[i
].Length
== 0)
1664 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &BuiltinDomainName
, TRUE
))
1667 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1669 Status
= SamrLookupNamesInDomain(DomainHandle
,
1674 if (NT_SUCCESS(Status
))
1676 SidsBuffer
[i
].Use
= Use
.Element
[0];
1677 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1678 RelativeIds
.Element
[0]);
1679 if (SidsBuffer
[i
].Sid
== NULL
)
1681 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1685 SidsBuffer
[i
].DomainIndex
= -1;
1686 SidsBuffer
[i
].Flags
= 0;
1688 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1692 if (!NT_SUCCESS(Status
))
1695 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1700 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1701 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1705 if (DomainHandle
!= NULL
)
1706 SamrCloseHandle(&DomainHandle
);
1708 if (ServerHandle
!= NULL
)
1709 SamrCloseHandle(&ServerHandle
);
1717 LsapLookupAccountNames(DWORD Count
,
1718 PRPC_UNICODE_STRING DomainNames
,
1719 PRPC_UNICODE_STRING AccountNames
,
1720 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1721 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1724 SAMPR_HANDLE ServerHandle
= NULL
;
1725 SAMPR_HANDLE DomainHandle
= NULL
;
1726 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1727 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1730 NTSTATUS Status
= STATUS_SUCCESS
;
1732 Status
= SamrConnect(NULL
,
1734 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1735 if (!NT_SUCCESS(Status
))
1737 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1741 Status
= SamrOpenDomain(ServerHandle
,
1745 if (!NT_SUCCESS(Status
))
1747 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1751 for (i
= 0; i
< Count
; i
++)
1753 /* Ignore names which were already mapped */
1754 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1757 /* Ignore isolated account names */
1758 if (DomainNames
[i
].Length
== 0)
1761 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &AccountDomainName
, TRUE
))
1764 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1766 Status
= SamrLookupNamesInDomain(DomainHandle
,
1771 if (NT_SUCCESS(Status
))
1773 SidsBuffer
[i
].Use
= Use
.Element
[0];
1774 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1775 RelativeIds
.Element
[0]);
1776 if (SidsBuffer
[i
].Sid
== NULL
)
1778 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1782 SidsBuffer
[i
].DomainIndex
= -1;
1783 SidsBuffer
[i
].Flags
= 0;
1785 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1789 if (!NT_SUCCESS(Status
))
1792 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1797 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1798 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1802 if (DomainHandle
!= NULL
)
1803 SamrCloseHandle(&DomainHandle
);
1805 if (ServerHandle
!= NULL
)
1806 SamrCloseHandle(&ServerHandle
);
1813 LsapLookupNames(DWORD Count
,
1814 PRPC_UNICODE_STRING Names
,
1815 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
1816 PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids
,
1817 LSAP_LOOKUP_LEVEL LookupLevel
,
1819 DWORD LookupOptions
,
1820 DWORD ClientRevision
)
1822 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
1823 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
= NULL
;
1824 PRPC_UNICODE_STRING DomainNames
= NULL
;
1825 PRPC_UNICODE_STRING AccountNames
= NULL
;
1826 ULONG SidsBufferLength
;
1829 NTSTATUS Status
= STATUS_SUCCESS
;
1833 TranslatedSids
->Entries
= 0;
1834 TranslatedSids
->Sids
= NULL
;
1835 *ReferencedDomains
= NULL
;
1837 SidsBufferLength
= Count
* sizeof(LSAPR_TRANSLATED_SID_EX2
);
1838 SidsBuffer
= MIDL_user_allocate(SidsBufferLength
);
1839 if (SidsBuffer
== NULL
)
1842 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1846 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
1847 if (DomainsBuffer
== NULL
)
1850 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1854 DomainsBuffer
->Domains
= MIDL_user_allocate(Count
* sizeof(LSA_TRUST_INFORMATION
));
1855 if (DomainsBuffer
->Domains
== NULL
)
1858 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1861 DomainsBuffer
->Entries
= 0;
1862 DomainsBuffer
->MaxEntries
= Count
;
1864 for (i
= 0; i
< Count
; i
++)
1866 SidsBuffer
[i
].Use
= SidTypeUnknown
;
1867 SidsBuffer
[i
].Sid
= NULL
;
1868 SidsBuffer
[i
].DomainIndex
= -1;
1869 SidsBuffer
[i
].Flags
= 0;
1872 Status
= LsapSplitNames(Count
,
1876 if (!NT_SUCCESS(Status
))
1878 TRACE("LsapSplitNames failed! (Status %lx)\n", Status
);
1883 Status
= LsapLookupIsolatedNames(Count
,
1889 if (!NT_SUCCESS(Status
) &&
1890 Status
!= STATUS_NONE_MAPPED
&&
1891 Status
!= STATUS_SOME_NOT_MAPPED
)
1893 TRACE("LsapLookupIsolatedNames failed! (Status %lx)\n", Status
);
1897 if (Mapped
== Count
)
1901 Status
= LsapLookupIsolatedBuiltinNames(Count
,
1907 if (!NT_SUCCESS(Status
) &&
1908 Status
!= STATUS_NONE_MAPPED
&&
1909 Status
!= STATUS_SOME_NOT_MAPPED
)
1911 TRACE("LsapLookupIsolatedBuiltinNames failed! (Status %lx)\n", Status
);
1915 if (Mapped
== Count
)
1919 Status
= LsapLookupIsolatedAccountNames(Count
,
1925 if (!NT_SUCCESS(Status
) &&
1926 Status
!= STATUS_NONE_MAPPED
&&
1927 Status
!= STATUS_SOME_NOT_MAPPED
)
1929 TRACE("LsapLookupIsolatedAccountNames failed! (Status %lx)\n", Status
);
1933 if (Mapped
== Count
)
1936 Status
= LsapLookupFullyQualifiedWellKnownNames(Count
,
1942 if (!NT_SUCCESS(Status
) &&
1943 Status
!= STATUS_NONE_MAPPED
&&
1944 Status
!= STATUS_SOME_NOT_MAPPED
)
1946 TRACE("LsapLookupFullyQualifiedWellKnownNames failed! (Status %lx)\n", Status
);
1950 if (Mapped
== Count
)
1953 Status
= LsapLookupBuiltinNames(Count
,
1959 if (!NT_SUCCESS(Status
) &&
1960 Status
!= STATUS_NONE_MAPPED
&&
1961 Status
!= STATUS_SOME_NOT_MAPPED
)
1963 TRACE("LsapLookupBuiltinNames failed! (Status %lx)\n", Status
);
1967 if (Mapped
== Count
)
1971 Status
= LsapLookupAccountNames(Count
,
1977 if (!NT_SUCCESS(Status
) &&
1978 Status
!= STATUS_NONE_MAPPED
&&
1979 Status
!= STATUS_SOME_NOT_MAPPED
)
1981 TRACE("LsapLookupAccountNames failed! (Status %lx)\n", Status
);
1985 if (Mapped
== Count
)
1989 // TRACE("done: Status %lx\n", Status);
1991 if (DomainNames
!= NULL
)
1993 //TRACE("Free DomainNames\n");
1994 for (i
= 0; i
< Count
; i
++)
1996 if (DomainNames
[i
].Buffer
!= NULL
)
1997 MIDL_user_free(DomainNames
[i
].Buffer
);
2000 MIDL_user_free(DomainNames
);
2003 if (AccountNames
!= NULL
)
2005 //TRACE("Free AccountNames\n");
2006 for (i
= 0; i
< Count
; i
++)
2008 //TRACE("i: %lu\n", i);
2009 if (AccountNames
[i
].Buffer
!= NULL
)
2011 MIDL_user_free(AccountNames
[i
].Buffer
);
2015 MIDL_user_free(AccountNames
);
2018 if (!NT_SUCCESS(Status
))
2020 //TRACE("Failure!\n");
2022 //TRACE("Free DomainsBuffer\n");
2023 if (DomainsBuffer
!= NULL
)
2025 if (DomainsBuffer
->Domains
!= NULL
)
2026 MIDL_user_free(DomainsBuffer
->Domains
);
2028 MIDL_user_free(DomainsBuffer
);
2031 //TRACE("Free SidsBuffer\n");
2032 if (SidsBuffer
!= NULL
)
2033 MIDL_user_free(SidsBuffer
);
2037 //TRACE("Success!\n");
2039 *ReferencedDomains
= DomainsBuffer
;
2040 TranslatedSids
->Entries
= Count
;
2041 TranslatedSids
->Sids
= SidsBuffer
;
2042 *MappedCount
= Mapped
;
2045 Status
= STATUS_NONE_MAPPED
;
2046 else if (Mapped
< Count
)
2047 Status
= STATUS_SOME_NOT_MAPPED
;
2050 // TRACE("done: Status %lx\n", Status);
2057 LsapLookupWellKnownSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2058 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2059 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2062 PWELL_KNOWN_SID ptr
, ptr2
;
2063 LPWSTR SidString
= NULL
;
2066 NTSTATUS Status
= STATUS_SUCCESS
;
2068 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2070 /* Ignore SIDs which are already mapped */
2071 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2074 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2075 TRACE("Mapping SID: %S\n", SidString
);
2076 LocalFree(SidString
);
2079 ptr
= LsapLookupWellKnownSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2082 NamesBuffer
[i
].Use
= ptr
->Use
;
2083 NamesBuffer
[i
].Flags
= 0;
2085 NamesBuffer
[i
].Name
.Length
= ptr
->AccountName
.Length
;
2086 NamesBuffer
[i
].Name
.MaximumLength
= ptr
->AccountName
.MaximumLength
;
2087 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(ptr
->AccountName
.MaximumLength
);
2088 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2090 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2094 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, ptr
->AccountName
.Buffer
, ptr
->AccountName
.MaximumLength
);
2096 if (ptr
->DomainName
.Length
== 0)
2098 Status
= LsapAddAuthorityToDomainsList(DomainsBuffer
,
2099 SidEnumBuffer
->SidInfo
[i
].Sid
,
2101 if (!NT_SUCCESS(Status
))
2104 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2108 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
2111 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2115 if (!NT_SUCCESS(Status
))
2118 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2122 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2134 LsapLookupBuiltinDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2135 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2136 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2139 SAMPR_HANDLE ServerHandle
= NULL
;
2140 SAMPR_HANDLE DomainHandle
= NULL
;
2141 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2142 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2143 LPWSTR SidString
= NULL
;
2145 ULONG RelativeIds
[1];
2147 NTSTATUS Status
= STATUS_SUCCESS
;
2149 Status
= SamrConnect(NULL
,
2151 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2152 if (!NT_SUCCESS(Status
))
2154 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2158 Status
= SamrOpenDomain(ServerHandle
,
2162 if (!NT_SUCCESS(Status
))
2164 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2168 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2170 /* Ignore SIDs which are already mapped */
2171 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2174 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2175 TRACE("Mapping SID: %S\n", SidString
);
2176 LocalFree(SidString
);
2179 if (RtlEqualSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2181 TRACE("Found builtin domain!\n");
2183 NamesBuffer
[i
].Use
= SidTypeDomain
;
2184 NamesBuffer
[i
].Flags
= 0;
2186 NamesBuffer
[i
].Name
.Length
= BuiltinDomainName
.Length
;
2187 NamesBuffer
[i
].Name
.MaximumLength
= BuiltinDomainName
.MaximumLength
;
2188 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(BuiltinDomainName
.MaximumLength
);
2189 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2191 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2195 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, BuiltinDomainName
.Buffer
, BuiltinDomainName
.MaximumLength
);
2197 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2201 if (!NT_SUCCESS(Status
))
2204 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2206 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2210 else if (LsapIsPrefixSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2212 TRACE("Found builtin domain account!\n");
2214 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2216 Status
= SamrLookupIdsInDomain(DomainHandle
,
2221 if (NT_SUCCESS(Status
))
2223 NamesBuffer
[i
].Use
= Use
.Element
[0];
2224 NamesBuffer
[i
].Flags
= 0;
2226 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2227 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2228 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2229 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2231 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2232 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2234 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2238 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2239 Names
.Element
[0].Buffer
,
2240 Names
.Element
[0].MaximumLength
);
2242 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2243 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2245 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2249 if (!NT_SUCCESS(Status
))
2252 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2254 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2262 if (DomainHandle
!= NULL
)
2263 SamrCloseHandle(&DomainHandle
);
2265 if (ServerHandle
!= NULL
)
2266 SamrCloseHandle(&ServerHandle
);
2273 LsapLookupAccountDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2274 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2275 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2278 SAMPR_HANDLE ServerHandle
= NULL
;
2279 SAMPR_HANDLE DomainHandle
= NULL
;
2280 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2281 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2282 LPWSTR SidString
= NULL
;
2284 ULONG RelativeIds
[1];
2286 NTSTATUS Status
= STATUS_SUCCESS
;
2288 Status
= SamrConnect(NULL
,
2290 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2291 if (!NT_SUCCESS(Status
))
2293 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2297 Status
= SamrOpenDomain(ServerHandle
,
2301 if (!NT_SUCCESS(Status
))
2303 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2307 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2309 /* Ignore SIDs which are already mapped */
2310 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2313 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2314 TRACE("Mapping SID: %S\n", SidString
);
2315 LocalFree(SidString
);
2318 if (RtlEqualSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2320 TRACE("Found account domain!\n");
2322 NamesBuffer
[i
].Use
= SidTypeDomain
;
2323 NamesBuffer
[i
].Flags
= 0;
2325 NamesBuffer
[i
].Name
.Length
= AccountDomainName
.Length
;
2326 NamesBuffer
[i
].Name
.MaximumLength
= AccountDomainName
.MaximumLength
;
2327 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(AccountDomainName
.MaximumLength
);
2328 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2330 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2334 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, AccountDomainName
.Buffer
, AccountDomainName
.MaximumLength
);
2336 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2340 if (!NT_SUCCESS(Status
))
2343 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2345 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2349 else if (LsapIsPrefixSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2351 TRACE("Found account domain account!\n");
2353 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2355 Status
= SamrLookupIdsInDomain(DomainHandle
,
2360 if (NT_SUCCESS(Status
))
2362 NamesBuffer
[i
].Use
= Use
.Element
[0];
2363 NamesBuffer
[i
].Flags
= 0;
2365 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2366 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2367 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2368 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2370 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2371 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2373 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2377 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2378 Names
.Element
[0].Buffer
,
2379 Names
.Element
[0].MaximumLength
);
2381 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2382 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2384 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2388 if (!NT_SUCCESS(Status
))
2391 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2393 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2401 if (DomainHandle
!= NULL
)
2402 SamrCloseHandle(&DomainHandle
);
2404 if (ServerHandle
!= NULL
)
2405 SamrCloseHandle(&ServerHandle
);
2412 LsapLookupSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2413 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
2414 PLSAPR_TRANSLATED_NAMES_EX TranslatedNames
,
2415 LSAP_LOOKUP_LEVEL LookupLevel
,
2417 DWORD LookupOptions
,
2418 DWORD ClientRevision
)
2420 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
2421 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
= NULL
;
2422 ULONG NamesBufferLength
;
2425 NTSTATUS Status
= STATUS_SUCCESS
;
2427 NamesBufferLength
= SidEnumBuffer
->Entries
* sizeof(LSAPR_TRANSLATED_NAME_EX
);
2428 NamesBuffer
= MIDL_user_allocate(NamesBufferLength
);
2429 if (NamesBuffer
== NULL
)
2431 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2435 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
2436 if (DomainsBuffer
== NULL
)
2438 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2442 DomainsBuffer
->Domains
= MIDL_user_allocate(SidEnumBuffer
->Entries
* sizeof(LSA_TRUST_INFORMATION
));
2443 if (DomainsBuffer
->Domains
== NULL
)
2445 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2449 DomainsBuffer
->Entries
= 0;
2450 DomainsBuffer
->MaxEntries
= SidEnumBuffer
->Entries
;
2452 /* Initialize all name entries */
2453 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2455 NamesBuffer
[i
].Use
= SidTypeUnknown
;
2456 NamesBuffer
[i
].Name
.Length
= 0;
2457 NamesBuffer
[i
].Name
.MaximumLength
= 0;
2458 NamesBuffer
[i
].Name
.Buffer
= NULL
;
2459 NamesBuffer
[i
].DomainIndex
= -1;
2460 NamesBuffer
[i
].Flags
= 0;
2463 /* Look-up well-known SIDs */
2464 Status
= LsapLookupWellKnownSids(SidEnumBuffer
,
2468 if (!NT_SUCCESS(Status
) &&
2469 Status
!= STATUS_NONE_MAPPED
&&
2470 Status
!= STATUS_SOME_NOT_MAPPED
)
2473 if (Mapped
== SidEnumBuffer
->Entries
)
2476 /* Look-up builtin domain SIDs */
2477 Status
= LsapLookupBuiltinDomainSids(SidEnumBuffer
,
2481 if (!NT_SUCCESS(Status
) &&
2482 Status
!= STATUS_NONE_MAPPED
&&
2483 Status
!= STATUS_SOME_NOT_MAPPED
)
2486 if (Mapped
== SidEnumBuffer
->Entries
)
2489 /* Look-up account domain SIDs */
2490 Status
= LsapLookupAccountDomainSids(SidEnumBuffer
,
2494 if (!NT_SUCCESS(Status
) &&
2495 Status
!= STATUS_NONE_MAPPED
&&
2496 Status
!= STATUS_SOME_NOT_MAPPED
)
2499 if (Mapped
== SidEnumBuffer
->Entries
)
2503 TRACE("done Status: %lx Mapped: %lu\n", Status
, Mapped
);
2505 if (!NT_SUCCESS(Status
))
2507 if (DomainsBuffer
!= NULL
)
2509 if (DomainsBuffer
->Domains
!= NULL
)
2510 MIDL_user_free(DomainsBuffer
->Domains
);
2512 MIDL_user_free(DomainsBuffer
);
2515 if (NamesBuffer
!= NULL
)
2516 MIDL_user_free(NamesBuffer
);
2520 *ReferencedDomains
= DomainsBuffer
;
2521 TranslatedNames
->Entries
= SidEnumBuffer
->Entries
;
2522 TranslatedNames
->Names
= NamesBuffer
;
2523 *MappedCount
= Mapped
;
2526 Status
= STATUS_NONE_MAPPED
;
2527 else if (Mapped
< SidEnumBuffer
->Entries
)
2528 Status
= STATUS_SOME_NOT_MAPPED
;