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
;
25 typedef struct _SAMPR_ULONG_ARRAY
28 unsigned long *Element
;
29 } SAMPR_ULONG_ARRAY
, *PSAMPR_ULONG_ARRAY
;
34 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr
);
38 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr
);
42 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
43 OUT SAMPR_HANDLE
*ServerHandle
,
44 IN ACCESS_MASK DesiredAccess
);
48 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
);
52 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
53 IN ACCESS_MASK DesiredAccess
,
55 OUT SAMPR_HANDLE
*DomainHandle
);
59 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
61 IN ULONG
*RelativeIds
,
62 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
63 OUT PSAMPR_ULONG_ARRAY Use
);
67 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
69 IN RPC_UNICODE_STRING Names
[],
70 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
71 OUT PSAMPR_ULONG_ARRAY Use
);
74 typedef struct _WELL_KNOWN_SID
78 UNICODE_STRING AccountName
;
79 UNICODE_STRING DomainName
;
81 } WELL_KNOWN_SID
, *PWELL_KNOWN_SID
;
84 LIST_ENTRY WellKnownSidListHead
;
85 PSID LsapWorldSid
= NULL
;
86 PSID LsapNetworkSid
= NULL
;
87 PSID LsapBatchSid
= NULL
;
88 PSID LsapInteractiveSid
= NULL
;
89 PSID LsapServiceSid
= NULL
;
90 PSID LsapLocalSystemSid
= NULL
;
91 PSID LsapAdministratorsSid
= NULL
;
94 /* FUNCTIONS ***************************************************************/
97 LsapCreateSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
98 UCHAR SubAuthorityCount
,
99 PULONG SubAuthorities
,
105 PWELL_KNOWN_SID SidEntry
;
109 SidEntry
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WELL_KNOWN_SID
));
110 if (SidEntry
== NULL
)
113 InitializeListHead(&SidEntry
->ListEntry
);
115 SidEntry
->Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
117 RtlLengthRequiredSid(SubAuthorityCount
));
118 if (SidEntry
->Sid
== NULL
)
120 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
124 RtlInitializeSid(SidEntry
->Sid
,
128 for (i
= 0; i
< (ULONG
)SubAuthorityCount
; i
++)
130 p
= RtlSubAuthoritySid(SidEntry
->Sid
, i
);
131 *p
= SubAuthorities
[i
];
134 // RtlInitUnicodeString(&SidEntry->AccountName,
136 SidEntry
->AccountName
.Length
= wcslen(AccountName
) * sizeof(WCHAR
);
137 SidEntry
->AccountName
.MaximumLength
= SidEntry
->AccountName
.Length
+ sizeof(WCHAR
);
138 SidEntry
->AccountName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
139 SidEntry
->AccountName
.MaximumLength
);
140 if (SidEntry
->AccountName
.Buffer
== NULL
)
142 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
143 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
147 wcscpy(SidEntry
->AccountName
.Buffer
,
150 // RtlInitUnicodeString(&SidEntry->DomainName,
152 SidEntry
->DomainName
.Length
= wcslen(DomainName
) * sizeof(WCHAR
);
153 SidEntry
->DomainName
.MaximumLength
= SidEntry
->DomainName
.Length
+ sizeof(WCHAR
);
154 SidEntry
->DomainName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
155 SidEntry
->DomainName
.MaximumLength
);
156 if (SidEntry
->DomainName
.Buffer
== NULL
)
158 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->AccountName
.Buffer
);
159 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
160 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
164 wcscpy(SidEntry
->DomainName
.Buffer
,
169 InsertTailList(&WellKnownSidListHead
,
170 &SidEntry
->ListEntry
);
173 *SidPtr
= SidEntry
->Sid
;
182 WCHAR szAccountName
[80];
183 WCHAR szDomainName
[80];
184 ULONG SubAuthorities
[8];
187 InitializeListHead(&WellKnownSidListHead
);
189 hInstance
= GetModuleHandleW(L
"lsasrv.dll");
193 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szAccountName
, ARRAYSIZE(szAccountName
));
194 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, ARRAYSIZE(szDomainName
));
195 LsapCreateSid(&NtAuthority
,
204 LsapLoadString(hInstance
, IDS_NULL_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
206 SubAuthorities
[0] = SECURITY_NULL_RID
;
207 LsapCreateSid(&NullSidAuthority
,
212 SidTypeWellKnownGroup
,
216 LsapLoadString(hInstance
, IDS_WORLD_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
218 SubAuthorities
[0] = SECURITY_WORLD_RID
;
219 LsapCreateSid(&WorldSidAuthority
,
224 SidTypeWellKnownGroup
,
228 LsapLoadString(hInstance
, IDS_LOCAL_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
230 SubAuthorities
[0] = SECURITY_LOCAL_RID
;
231 LsapCreateSid(&LocalSidAuthority
,
236 SidTypeWellKnownGroup
,
239 /* Creator Owner Sid */
240 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
242 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_RID
;
243 LsapCreateSid(&CreatorSidAuthority
,
248 SidTypeWellKnownGroup
,
251 /* Creator Group Sid */
252 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
254 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_RID
;
255 LsapCreateSid(&CreatorSidAuthority
,
260 SidTypeWellKnownGroup
,
263 /* Creator Owner Server Sid */
264 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
266 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_SERVER_RID
;
267 LsapCreateSid(&CreatorSidAuthority
,
272 SidTypeWellKnownGroup
,
275 /* Creator Group Server Sid */
276 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
278 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_SERVER_RID
;
279 LsapCreateSid(&CreatorSidAuthority
,
284 SidTypeWellKnownGroup
,
288 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
289 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, ARRAYSIZE(szDomainName
));
291 SubAuthorities
[0] = SECURITY_DIALUP_RID
;
292 LsapCreateSid(&NtAuthority
,
297 SidTypeWellKnownGroup
,
301 LsapLoadString(hInstance
, IDS_NETWORK_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
303 SubAuthorities
[0] = SECURITY_NETWORK_RID
;
304 LsapCreateSid(&NtAuthority
,
309 SidTypeWellKnownGroup
,
313 LsapLoadString(hInstance
, IDS_BATCH_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
315 SubAuthorities
[0] = SECURITY_BATCH_RID
;
316 LsapCreateSid(&NtAuthority
,
321 SidTypeWellKnownGroup
,
324 /* Interactive Sid */
325 LsapLoadString(hInstance
, IDS_INTERACTIVE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
327 SubAuthorities
[0] = SECURITY_INTERACTIVE_RID
;
328 LsapCreateSid(&NtAuthority
,
333 SidTypeWellKnownGroup
,
334 &LsapInteractiveSid
);
337 LsapLoadString(hInstance
, IDS_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
339 SubAuthorities
[0] = SECURITY_SERVICE_RID
;
340 LsapCreateSid(&NtAuthority
,
345 SidTypeWellKnownGroup
,
348 /* Anonymous Logon Sid */
349 LsapLoadString(hInstance
, IDS_ANONYMOUS_LOGON_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
351 SubAuthorities
[0] = SECURITY_ANONYMOUS_LOGON_RID
;
352 LsapCreateSid(&NtAuthority
,
357 SidTypeWellKnownGroup
,
361 LsapLoadString(hInstance
, IDS_PROXY_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
363 SubAuthorities
[0] = SECURITY_PROXY_RID
;
364 LsapCreateSid(&NtAuthority
,
369 SidTypeWellKnownGroup
,
372 /* Enterprise Controllers Sid */
373 LsapLoadString(hInstance
, IDS_ENTERPRISE_CONTROLLERS_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
375 SubAuthorities
[0] = SECURITY_ENTERPRISE_CONTROLLERS_RID
;
376 LsapCreateSid(&NtAuthority
,
381 SidTypeWellKnownGroup
,
384 /* Principal Self Sid */
385 LsapLoadString(hInstance
, IDS_PRINCIPAL_SELF_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
387 SubAuthorities
[0] = SECURITY_PRINCIPAL_SELF_RID
;
388 LsapCreateSid(&NtAuthority
,
393 SidTypeWellKnownGroup
,
396 /* Authenticated Users Sid */
397 LsapLoadString(hInstance
, IDS_AUTHENTICATED_USER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
399 SubAuthorities
[0] = SECURITY_AUTHENTICATED_USER_RID
;
400 LsapCreateSid(&NtAuthority
,
405 SidTypeWellKnownGroup
,
408 /* Restricted Code Sid */
409 LsapLoadString(hInstance
, IDS_RESTRICTED_CODE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
411 SubAuthorities
[0] = SECURITY_RESTRICTED_CODE_RID
;
412 LsapCreateSid(&NtAuthority
,
417 SidTypeWellKnownGroup
,
420 /* Terminal Server Sid */
421 LsapLoadString(hInstance
, IDS_TERMINAL_SERVER_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
423 SubAuthorities
[0] = SECURITY_TERMINAL_SERVER_RID
;
424 LsapCreateSid(&NtAuthority
,
429 SidTypeWellKnownGroup
,
432 /* Remote Logon Sid */
433 LsapLoadString(hInstance
, IDS_REMOTE_LOGON_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
435 SubAuthorities
[0] = SECURITY_REMOTE_LOGON_RID
;
436 LsapCreateSid(&NtAuthority
,
441 SidTypeWellKnownGroup
,
444 /* This Organization Sid */
445 LsapLoadString(hInstance
, IDS_THIS_ORGANIZATION_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
447 SubAuthorities
[0] = SECURITY_THIS_ORGANIZATION_RID
;
448 LsapCreateSid(&NtAuthority
,
453 SidTypeWellKnownGroup
,
456 /* Local System Sid */
457 LsapLoadString(hInstance
, IDS_LOCAL_SYSTEM_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
459 SubAuthorities
[0] = SECURITY_LOCAL_SYSTEM_RID
;
460 LsapCreateSid(&NtAuthority
,
465 SidTypeWellKnownGroup
,
466 &LsapLocalSystemSid
);
468 /* Local Service Sid */
469 LsapLoadString(hInstance
, IDS_LOCAL_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
471 SubAuthorities
[0] = SECURITY_LOCAL_SERVICE_RID
;
472 LsapCreateSid(&NtAuthority
,
477 SidTypeWellKnownGroup
,
480 LsapCreateSid(&NtAuthority
,
485 SidTypeWellKnownGroup
,
488 /* Network Service Sid */
489 LsapLoadString(hInstance
, IDS_NETWORK_SERVICE_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
491 SubAuthorities
[0] = SECURITY_NETWORK_SERVICE_RID
;
492 LsapCreateSid(&NtAuthority
,
497 SidTypeWellKnownGroup
,
500 LsapCreateSid(&NtAuthority
,
505 SidTypeWellKnownGroup
,
508 /* Builtin Domain Sid */
509 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szAccountName
, ARRAYSIZE(szAccountName
));
510 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szDomainName
, ARRAYSIZE(szDomainName
));
512 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
513 LsapCreateSid(&NtAuthority
,
521 /* Administrators Alias Sid */
522 LsapLoadString(hInstance
, IDS_ALIAS_RID_ADMINS
, szAccountName
, ARRAYSIZE(szAccountName
));
524 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
525 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ADMINS
;
526 LsapCreateSid(&NtAuthority
,
532 &LsapAdministratorsSid
);
534 /* Users Alias Sid */
535 LsapLoadString(hInstance
, IDS_ALIAS_RID_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
537 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
538 SubAuthorities
[1] = DOMAIN_ALIAS_RID_USERS
;
539 LsapCreateSid(&NtAuthority
,
547 /* Guests Alias Sid */
548 LsapLoadString(hInstance
, IDS_ALIAS_RID_GUESTS
, szAccountName
, ARRAYSIZE(szAccountName
));
550 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
551 SubAuthorities
[1] = DOMAIN_ALIAS_RID_GUESTS
;
552 LsapCreateSid(&NtAuthority
,
560 /* Power User Alias Sid */
561 LsapLoadString(hInstance
, IDS_ALIAS_RID_POWER_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
563 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
564 SubAuthorities
[1] = DOMAIN_ALIAS_RID_POWER_USERS
;
565 LsapCreateSid(&NtAuthority
,
573 /* Account Operators Alias Sid */
574 LsapLoadString(hInstance
, IDS_ALIAS_RID_ACCOUNT_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
576 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
577 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ACCOUNT_OPS
;
578 LsapCreateSid(&NtAuthority
,
586 /* System Operators Alias Sid */
587 LsapLoadString(hInstance
, IDS_ALIAS_RID_SYSTEM_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
589 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
590 SubAuthorities
[1] = DOMAIN_ALIAS_RID_SYSTEM_OPS
;
591 LsapCreateSid(&NtAuthority
,
599 /* Print Operators Alias Sid */
600 LsapLoadString(hInstance
, IDS_ALIAS_RID_PRINT_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
602 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
603 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PRINT_OPS
;
604 LsapCreateSid(&NtAuthority
,
612 /* Backup Operators Alias Sid */
613 LsapLoadString(hInstance
, IDS_ALIAS_RID_BACKUP_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
615 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
616 SubAuthorities
[1] = DOMAIN_ALIAS_RID_BACKUP_OPS
;
617 LsapCreateSid(&NtAuthority
,
625 /* Replicators Alias Sid */
626 LsapLoadString(hInstance
, IDS_ALIAS_RID_REPLICATOR
, szAccountName
, ARRAYSIZE(szAccountName
));
628 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
629 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REPLICATOR
;
630 LsapCreateSid(&NtAuthority
,
638 /* RAS Servers Alias Sid */
639 LsapLoadString(hInstance
, IDS_ALIAS_RID_RAS_SERVERS
, szAccountName
, ARRAYSIZE(szAccountName
));
641 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
642 SubAuthorities
[1] = DOMAIN_ALIAS_RID_RAS_SERVERS
;
643 LsapCreateSid(&NtAuthority
,
651 /* Pre-Windows 2000 Compatible Access Alias Sid */
652 LsapLoadString(hInstance
, IDS_ALIAS_RID_PREW2KCOMPACCESS
, szAccountName
, ARRAYSIZE(szAccountName
));
654 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
655 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
;
656 LsapCreateSid(&NtAuthority
,
664 /* Remote Desktop Users Alias Sid */
665 LsapLoadString(hInstance
, IDS_ALIAS_RID_REMOTE_DESKTOP_USERS
, szAccountName
, ARRAYSIZE(szAccountName
));
667 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
668 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
;
669 LsapCreateSid(&NtAuthority
,
677 /* Network Configuration Operators Alias Sid */
678 LsapLoadString(hInstance
, IDS_ALIAS_RID_NETWORK_CONFIGURATION_OPS
, szAccountName
, ARRAYSIZE(szAccountName
));
680 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
681 SubAuthorities
[1] = DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
;
682 LsapCreateSid(&NtAuthority
,
690 /* FIXME: Add more well known sids */
692 return STATUS_SUCCESS
;
697 LsapLookupWellKnownSid(PSID Sid
)
699 PLIST_ENTRY ListEntry
;
702 ListEntry
= WellKnownSidListHead
.Flink
;
703 while (ListEntry
!= &WellKnownSidListHead
)
705 Ptr
= CONTAINING_RECORD(ListEntry
,
708 if (RtlEqualSid(Sid
, Ptr
->Sid
))
713 ListEntry
= ListEntry
->Flink
;
721 LsapLookupIsolatedWellKnownName(PUNICODE_STRING AccountName
)
723 PLIST_ENTRY ListEntry
;
726 ListEntry
= WellKnownSidListHead
.Flink
;
727 while (ListEntry
!= &WellKnownSidListHead
)
729 Ptr
= CONTAINING_RECORD(ListEntry
,
732 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
))
737 ListEntry
= ListEntry
->Flink
;
745 LsapLookupFullyQualifiedWellKnownName(PUNICODE_STRING AccountName
,
746 PUNICODE_STRING DomainName
)
748 PLIST_ENTRY ListEntry
;
751 ListEntry
= WellKnownSidListHead
.Flink
;
752 while (ListEntry
!= &WellKnownSidListHead
)
754 Ptr
= CONTAINING_RECORD(ListEntry
,
757 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
) &&
758 RtlEqualUnicodeString(DomainName
, &Ptr
->DomainName
, TRUE
))
763 ListEntry
= ListEntry
->Flink
;
772 LsapSplitNames(DWORD Count
,
773 PRPC_UNICODE_STRING Names
,
774 PRPC_UNICODE_STRING
*DomainNames
,
775 PRPC_UNICODE_STRING
*AccountNames
)
777 PRPC_UNICODE_STRING DomainsBuffer
= NULL
;
778 PRPC_UNICODE_STRING AccountsBuffer
= NULL
;
783 NTSTATUS Status
= STATUS_SUCCESS
;
785 DomainsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
786 if (DomainsBuffer
== NULL
)
788 Status
= STATUS_INSUFFICIENT_RESOURCES
;
792 AccountsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
793 if (AccountsBuffer
== NULL
)
795 Status
= STATUS_INSUFFICIENT_RESOURCES
;
799 for (i
= 0; i
< Count
; i
++)
801 //TRACE("Name: %wZ\n", &Names[i]);
803 Ptr
= wcschr(Names
[i
].Buffer
, L
'\\');
806 AccountLength
= Names
[i
].Length
/ sizeof(WCHAR
);
808 AccountsBuffer
[i
].Length
= Names
[i
].Length
;
809 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
810 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
811 if (AccountsBuffer
[i
].Buffer
== NULL
)
813 Status
= STATUS_INSUFFICIENT_RESOURCES
;
817 CopyMemory(AccountsBuffer
[i
].Buffer
,
819 AccountsBuffer
[i
].Length
);
820 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
822 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
826 DomainLength
= (ULONG
)(ULONG_PTR
)(Ptr
- Names
[i
].Buffer
);
827 AccountLength
= (Names
[i
].Length
/ sizeof(WCHAR
)) - DomainLength
- 1;
828 //TRACE("DomainLength: %u\n", DomainLength);
829 //TRACE("AccountLength: %u\n", AccountLength);
831 if (DomainLength
> 0)
833 DomainsBuffer
[i
].Length
= (USHORT
)DomainLength
* sizeof(WCHAR
);
834 DomainsBuffer
[i
].MaximumLength
= DomainsBuffer
[i
].Length
+ sizeof(WCHAR
);
835 DomainsBuffer
[i
].Buffer
= MIDL_user_allocate(DomainsBuffer
[i
].MaximumLength
);
836 if (DomainsBuffer
[i
].Buffer
== NULL
)
838 Status
= STATUS_INSUFFICIENT_RESOURCES
;
842 CopyMemory(DomainsBuffer
[i
].Buffer
,
844 DomainsBuffer
[i
].Length
);
845 DomainsBuffer
[i
].Buffer
[DomainLength
] = UNICODE_NULL
;
847 //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
850 AccountsBuffer
[i
].Length
= (USHORT
)AccountLength
* sizeof(WCHAR
);
851 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
852 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
853 if (AccountsBuffer
[i
].Buffer
== NULL
)
855 Status
= STATUS_INSUFFICIENT_RESOURCES
;
859 CopyMemory(AccountsBuffer
[i
].Buffer
,
860 &(Names
[i
].Buffer
[DomainLength
+ 1]),
861 AccountsBuffer
[i
].Length
);
862 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
864 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
869 if (!NT_SUCCESS(Status
))
871 if (AccountsBuffer
!= NULL
)
873 for (i
= 0; i
< Count
; i
++)
875 if (AccountsBuffer
[i
].Buffer
!= NULL
)
876 MIDL_user_free(AccountsBuffer
[i
].Buffer
);
879 MIDL_user_free(AccountsBuffer
);
882 if (DomainsBuffer
!= NULL
)
884 for (i
= 0; i
< Count
; i
++)
886 if (DomainsBuffer
[i
].Buffer
!= NULL
)
887 MIDL_user_free(DomainsBuffer
[i
].Buffer
);
890 MIDL_user_free(DomainsBuffer
);
895 *DomainNames
= DomainsBuffer
;
896 *AccountNames
= AccountsBuffer
;
904 LsapAddDomainToDomainsList(PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
905 PUNICODE_STRING Name
,
912 while (i
< ReferencedDomains
->Entries
&&
913 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
915 if (RtlEqualSid(Sid
, ReferencedDomains
->Domains
[i
].Sid
))
918 return STATUS_SUCCESS
;
924 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(Sid
));
925 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
926 return STATUS_INSUFFICIENT_RESOURCES
;
928 RtlCopySid(RtlLengthSid(Sid
), ReferencedDomains
->Domains
[i
].Sid
, Sid
);
930 ReferencedDomains
->Domains
[i
].Name
.Length
= Name
->Length
;
931 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= Name
->MaximumLength
;
932 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(Name
->MaximumLength
);
933 if (ReferencedDomains
->Domains
[i
].Name
.Buffer
== NULL
)
935 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
936 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
937 return STATUS_INSUFFICIENT_RESOURCES
;
940 RtlCopyMemory(ReferencedDomains
->Domains
[i
].Name
.Buffer
,
942 Name
->MaximumLength
);
944 ReferencedDomains
->Entries
++;
947 return STATUS_SUCCESS
;
952 LsapIsPrefixSid(IN PSID PrefixSid
,
955 PISID Sid1
= PrefixSid
, Sid2
= Sid
;
958 if (Sid1
->Revision
!= Sid2
->Revision
)
961 if ((Sid1
->IdentifierAuthority
.Value
[0] != Sid2
->IdentifierAuthority
.Value
[0]) ||
962 (Sid1
->IdentifierAuthority
.Value
[1] != Sid2
->IdentifierAuthority
.Value
[1]) ||
963 (Sid1
->IdentifierAuthority
.Value
[2] != Sid2
->IdentifierAuthority
.Value
[2]) ||
964 (Sid1
->IdentifierAuthority
.Value
[3] != Sid2
->IdentifierAuthority
.Value
[3]) ||
965 (Sid1
->IdentifierAuthority
.Value
[4] != Sid2
->IdentifierAuthority
.Value
[4]) ||
966 (Sid1
->IdentifierAuthority
.Value
[5] != Sid2
->IdentifierAuthority
.Value
[5]))
969 if (Sid1
->SubAuthorityCount
>= Sid2
->SubAuthorityCount
)
972 if (Sid1
->SubAuthorityCount
== 0)
975 for (i
= 0; i
< Sid1
->SubAuthorityCount
; i
++)
977 if (Sid1
->SubAuthority
[i
] != Sid2
->SubAuthority
[i
])
986 LsapGetRelativeIdFromSid(PSID Sid_
)
990 if (Sid
->SubAuthorityCount
!= 0)
991 return Sid
->SubAuthority
[Sid
->SubAuthorityCount
- 1];
998 CreateSidFromSidAndRid(PSID SrcSid
,
1007 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1011 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
1013 DstSid
= MIDL_user_allocate(DstSidSize
);
1017 RtlInitializeSid(DstSid
,
1018 RtlIdentifierAuthoritySid(SrcSid
),
1021 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1023 p
= RtlSubAuthoritySid(SrcSid
, i
);
1024 q
= RtlSubAuthoritySid(DstSid
, i
);
1028 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);
1036 CreateDomainSidFromAccountSid(PSID AccountSid
)
1044 RidCount
= *RtlSubAuthorityCountSid(AccountSid
);
1048 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1050 DomainSid
= MIDL_user_allocate(DstSidSize
);
1051 if (DomainSid
== NULL
)
1054 RtlInitializeSid(DomainSid
,
1055 RtlIdentifierAuthoritySid(AccountSid
),
1058 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1060 p
= RtlSubAuthoritySid(AccountSid
, i
);
1061 q
= RtlSubAuthoritySid(DomainSid
, i
);
1070 LsapCopySid(PSID SrcSid
)
1078 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1079 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1081 DstSid
= MIDL_user_allocate(DstSidSize
);
1085 RtlInitializeSid(DstSid
,
1086 RtlIdentifierAuthoritySid(SrcSid
),
1089 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1091 p
= RtlSubAuthoritySid(SrcSid
, i
);
1092 q
= RtlSubAuthoritySid(DstSid
, i
);
1102 LsapLookupIsolatedNames(DWORD Count
,
1103 PRPC_UNICODE_STRING DomainNames
,
1104 PRPC_UNICODE_STRING AccountNames
,
1105 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1106 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1109 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1110 PWELL_KNOWN_SID ptr
, ptr2
;
1114 NTSTATUS Status
= STATUS_SUCCESS
;
1116 for (i
= 0; i
< Count
; i
++)
1118 /* Ignore names which were already mapped */
1119 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1122 /* Ignore fully qualified account names */
1123 if (DomainNames
[i
].Length
!= 0)
1126 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1128 /* Look-up all well-known names */
1129 ptr
= LsapLookupIsolatedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
]);
1132 SidsBuffer
[i
].Use
= ptr
->Use
;
1133 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1134 if (SidsBuffer
[i
].Sid
== NULL
)
1136 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1140 SidsBuffer
[i
].DomainIndex
= -1;
1141 SidsBuffer
[i
].Flags
= 0;
1143 if (ptr
->Use
== SidTypeDomain
)
1145 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1149 if (!NT_SUCCESS(Status
))
1152 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1156 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1159 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1163 if (!NT_SUCCESS(Status
))
1166 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1170 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1171 if (DomainSid
== NULL
)
1173 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1177 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1182 if (DomainSid
!= NULL
)
1184 MIDL_user_free(DomainSid
);
1188 if (!NT_SUCCESS(Status
))
1191 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1199 /* Look-up the built-in domain */
1200 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &BuiltinDomainName
, TRUE
))
1202 SidsBuffer
[i
].Use
= SidTypeDomain
;
1203 SidsBuffer
[i
].Sid
= LsapCopySid(BuiltinDomainSid
);
1204 if (SidsBuffer
[i
].Sid
== NULL
)
1206 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1210 SidsBuffer
[i
].DomainIndex
= -1;
1211 SidsBuffer
[i
].Flags
= 0;
1213 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1217 if (!NT_SUCCESS(Status
))
1220 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1226 /* Look-up the account domain */
1227 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &AccountDomainName
, TRUE
))
1229 SidsBuffer
[i
].Use
= SidTypeDomain
;
1230 SidsBuffer
[i
].Sid
= LsapCopySid(AccountDomainSid
);
1231 if (SidsBuffer
[i
].Sid
== NULL
)
1233 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1236 SidsBuffer
[i
].DomainIndex
= -1;
1237 SidsBuffer
[i
].Flags
= 0;
1239 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1243 if (!NT_SUCCESS(Status
))
1246 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1252 /* FIXME: Look-up the primary domain */
1254 /* FIXME: Look-up the trusted domains */
1266 LsapLookupIsolatedBuiltinNames(DWORD Count
,
1267 PRPC_UNICODE_STRING DomainNames
,
1268 PRPC_UNICODE_STRING AccountNames
,
1269 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1270 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1273 SAMPR_HANDLE ServerHandle
= NULL
;
1274 SAMPR_HANDLE DomainHandle
= NULL
;
1275 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1276 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1279 NTSTATUS Status
= STATUS_SUCCESS
;
1281 Status
= SamrConnect(NULL
,
1283 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1284 if (!NT_SUCCESS(Status
))
1286 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1290 Status
= SamrOpenDomain(ServerHandle
,
1294 if (!NT_SUCCESS(Status
))
1296 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1300 for (i
= 0; i
< Count
; i
++)
1302 /* Ignore names which were already mapped */
1303 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1306 /* Ignore fully qualified account names */
1307 if (DomainNames
[i
].Length
!= 0)
1310 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1312 Status
= SamrLookupNamesInDomain(DomainHandle
,
1317 if (NT_SUCCESS(Status
))
1319 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1321 SidsBuffer
[i
].Use
= Use
.Element
[0];
1322 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1323 RelativeIds
.Element
[0]);
1324 if (SidsBuffer
[i
].Sid
== NULL
)
1326 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1330 SidsBuffer
[i
].DomainIndex
= -1;
1331 SidsBuffer
[i
].Flags
= 0;
1333 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1337 if (!NT_SUCCESS(Status
))
1340 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1345 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1346 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1350 if (DomainHandle
!= NULL
)
1351 SamrCloseHandle(&DomainHandle
);
1353 if (ServerHandle
!= NULL
)
1354 SamrCloseHandle(&ServerHandle
);
1362 LsapLookupIsolatedAccountNames(DWORD Count
,
1363 PRPC_UNICODE_STRING DomainNames
,
1364 PRPC_UNICODE_STRING AccountNames
,
1365 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1366 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1369 SAMPR_HANDLE ServerHandle
= NULL
;
1370 SAMPR_HANDLE DomainHandle
= NULL
;
1371 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1372 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1375 NTSTATUS Status
= STATUS_SUCCESS
;
1379 Status
= SamrConnect(NULL
,
1381 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1382 if (!NT_SUCCESS(Status
))
1384 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1388 Status
= SamrOpenDomain(ServerHandle
,
1392 if (!NT_SUCCESS(Status
))
1394 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1398 for (i
= 0; i
< Count
; i
++)
1400 /* Ignore names which were already mapped */
1401 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1404 /* Ignore fully qualified account names */
1405 if (DomainNames
[i
].Length
!= 0)
1408 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1410 Status
= SamrLookupNamesInDomain(DomainHandle
,
1415 if (NT_SUCCESS(Status
))
1417 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1419 SidsBuffer
[i
].Use
= Use
.Element
[0];
1420 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1421 RelativeIds
.Element
[0]);
1422 if (SidsBuffer
[i
].Sid
== NULL
)
1424 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1428 SidsBuffer
[i
].DomainIndex
= -1;
1429 SidsBuffer
[i
].Flags
= 0;
1431 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1435 if (!NT_SUCCESS(Status
))
1438 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1443 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1444 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1448 if (DomainHandle
!= NULL
)
1449 SamrCloseHandle(&DomainHandle
);
1451 if (ServerHandle
!= NULL
)
1452 SamrCloseHandle(&ServerHandle
);
1460 LsapLookupFullyQualifiedWellKnownNames(DWORD Count
,
1461 PRPC_UNICODE_STRING DomainNames
,
1462 PRPC_UNICODE_STRING AccountNames
,
1463 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1464 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1467 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1468 PWELL_KNOWN_SID ptr
, ptr2
;
1472 NTSTATUS Status
= STATUS_SUCCESS
;
1474 for (i
= 0; i
< Count
; i
++)
1476 /* Ignore names which were already mapped */
1477 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1480 /* Ignore isolated account names */
1481 if (DomainNames
[i
].Length
== 0)
1484 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1486 /* Look-up all well-known names */
1487 ptr
= LsapLookupFullyQualifiedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
],
1488 (PUNICODE_STRING
)&DomainNames
[i
]);
1491 TRACE("Found it! (%wZ\\%wZ)\n", &ptr
->DomainName
, &ptr
->AccountName
);
1493 SidsBuffer
[i
].Use
= ptr
->Use
;
1494 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1495 if (SidsBuffer
[i
].Sid
== NULL
)
1497 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1501 SidsBuffer
[i
].DomainIndex
= -1;
1502 SidsBuffer
[i
].Flags
= 0;
1504 if (ptr
->Use
== SidTypeDomain
)
1506 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1510 if (!NT_SUCCESS(Status
))
1513 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1517 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1520 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1524 if (!NT_SUCCESS(Status
))
1527 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1531 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1532 if (DomainSid
== NULL
)
1534 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1538 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1543 if (DomainSid
!= NULL
)
1545 MIDL_user_free(DomainSid
);
1549 if (!NT_SUCCESS(Status
))
1552 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1568 LsapLookupBuiltinNames(DWORD Count
,
1569 PRPC_UNICODE_STRING DomainNames
,
1570 PRPC_UNICODE_STRING AccountNames
,
1571 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1572 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1575 SAMPR_HANDLE ServerHandle
= NULL
;
1576 SAMPR_HANDLE DomainHandle
= NULL
;
1577 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1578 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1581 NTSTATUS Status
= STATUS_SUCCESS
;
1583 Status
= SamrConnect(NULL
,
1585 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1586 if (!NT_SUCCESS(Status
))
1588 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1592 Status
= SamrOpenDomain(ServerHandle
,
1596 if (!NT_SUCCESS(Status
))
1598 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1602 for (i
= 0; i
< Count
; i
++)
1604 /* Ignore names which were already mapped */
1605 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1608 /* Ignore isolated account names */
1609 if (DomainNames
[i
].Length
== 0)
1612 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &BuiltinDomainName
, TRUE
))
1615 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1617 Status
= SamrLookupNamesInDomain(DomainHandle
,
1622 if (NT_SUCCESS(Status
))
1624 SidsBuffer
[i
].Use
= Use
.Element
[0];
1625 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1626 RelativeIds
.Element
[0]);
1627 if (SidsBuffer
[i
].Sid
== NULL
)
1629 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1633 SidsBuffer
[i
].DomainIndex
= -1;
1634 SidsBuffer
[i
].Flags
= 0;
1636 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1640 if (!NT_SUCCESS(Status
))
1643 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1648 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1649 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1653 if (DomainHandle
!= NULL
)
1654 SamrCloseHandle(&DomainHandle
);
1656 if (ServerHandle
!= NULL
)
1657 SamrCloseHandle(&ServerHandle
);
1665 LsapLookupAccountNames(DWORD Count
,
1666 PRPC_UNICODE_STRING DomainNames
,
1667 PRPC_UNICODE_STRING AccountNames
,
1668 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1669 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1672 SAMPR_HANDLE ServerHandle
= NULL
;
1673 SAMPR_HANDLE DomainHandle
= NULL
;
1674 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1675 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1678 NTSTATUS Status
= STATUS_SUCCESS
;
1680 Status
= SamrConnect(NULL
,
1682 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1683 if (!NT_SUCCESS(Status
))
1685 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1689 Status
= SamrOpenDomain(ServerHandle
,
1693 if (!NT_SUCCESS(Status
))
1695 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1699 for (i
= 0; i
< Count
; i
++)
1701 /* Ignore names which were already mapped */
1702 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1705 /* Ignore isolated account names */
1706 if (DomainNames
[i
].Length
== 0)
1709 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &AccountDomainName
, TRUE
))
1712 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1714 Status
= SamrLookupNamesInDomain(DomainHandle
,
1719 if (NT_SUCCESS(Status
))
1721 SidsBuffer
[i
].Use
= Use
.Element
[0];
1722 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1723 RelativeIds
.Element
[0]);
1724 if (SidsBuffer
[i
].Sid
== NULL
)
1726 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1730 SidsBuffer
[i
].DomainIndex
= -1;
1731 SidsBuffer
[i
].Flags
= 0;
1733 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1737 if (!NT_SUCCESS(Status
))
1740 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1745 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1746 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1750 if (DomainHandle
!= NULL
)
1751 SamrCloseHandle(&DomainHandle
);
1753 if (ServerHandle
!= NULL
)
1754 SamrCloseHandle(&ServerHandle
);
1761 LsapLookupNames(DWORD Count
,
1762 PRPC_UNICODE_STRING Names
,
1763 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
1764 PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids
,
1765 LSAP_LOOKUP_LEVEL LookupLevel
,
1767 DWORD LookupOptions
,
1768 DWORD ClientRevision
)
1770 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
1771 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
= NULL
;
1772 PRPC_UNICODE_STRING DomainNames
= NULL
;
1773 PRPC_UNICODE_STRING AccountNames
= NULL
;
1774 ULONG SidsBufferLength
;
1777 NTSTATUS Status
= STATUS_SUCCESS
;
1781 TranslatedSids
->Entries
= 0;
1782 TranslatedSids
->Sids
= NULL
;
1783 *ReferencedDomains
= NULL
;
1785 SidsBufferLength
= Count
* sizeof(LSAPR_TRANSLATED_SID_EX2
);
1786 SidsBuffer
= MIDL_user_allocate(SidsBufferLength
);
1787 if (SidsBuffer
== NULL
)
1790 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1794 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
1795 if (DomainsBuffer
== NULL
)
1798 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1802 DomainsBuffer
->Domains
= MIDL_user_allocate(Count
* sizeof(LSA_TRUST_INFORMATION
));
1803 if (DomainsBuffer
->Domains
== NULL
)
1806 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1809 DomainsBuffer
->Entries
= 0;
1810 DomainsBuffer
->MaxEntries
= Count
;
1812 for (i
= 0; i
< Count
; i
++)
1814 SidsBuffer
[i
].Use
= SidTypeUnknown
;
1815 SidsBuffer
[i
].Sid
= NULL
;
1816 SidsBuffer
[i
].DomainIndex
= -1;
1817 SidsBuffer
[i
].Flags
= 0;
1820 Status
= LsapSplitNames(Count
,
1824 if (!NT_SUCCESS(Status
))
1826 TRACE("LsapSplitNames failed! (Status %lx)\n", Status
);
1831 Status
= LsapLookupIsolatedNames(Count
,
1837 if (!NT_SUCCESS(Status
) &&
1838 Status
!= STATUS_NONE_MAPPED
&&
1839 Status
!= STATUS_SOME_NOT_MAPPED
)
1841 TRACE("LsapLookupIsolatedNames failed! (Status %lx)\n", Status
);
1845 if (Mapped
== Count
)
1849 Status
= LsapLookupIsolatedBuiltinNames(Count
,
1855 if (!NT_SUCCESS(Status
) &&
1856 Status
!= STATUS_NONE_MAPPED
&&
1857 Status
!= STATUS_SOME_NOT_MAPPED
)
1859 TRACE("LsapLookupIsolatedBuiltinNames failed! (Status %lx)\n", Status
);
1863 if (Mapped
== Count
)
1867 Status
= LsapLookupIsolatedAccountNames(Count
,
1873 if (!NT_SUCCESS(Status
) &&
1874 Status
!= STATUS_NONE_MAPPED
&&
1875 Status
!= STATUS_SOME_NOT_MAPPED
)
1877 TRACE("LsapLookupIsolatedAccountNames failed! (Status %lx)\n", Status
);
1881 if (Mapped
== Count
)
1884 Status
= LsapLookupFullyQualifiedWellKnownNames(Count
,
1890 if (!NT_SUCCESS(Status
) &&
1891 Status
!= STATUS_NONE_MAPPED
&&
1892 Status
!= STATUS_SOME_NOT_MAPPED
)
1894 TRACE("LsapLookupFullyQualifiedWellKnownNames failed! (Status %lx)\n", Status
);
1898 if (Mapped
== Count
)
1901 Status
= LsapLookupBuiltinNames(Count
,
1907 if (!NT_SUCCESS(Status
) &&
1908 Status
!= STATUS_NONE_MAPPED
&&
1909 Status
!= STATUS_SOME_NOT_MAPPED
)
1911 TRACE("LsapLookupBuiltinNames failed! (Status %lx)\n", Status
);
1915 if (Mapped
== Count
)
1919 Status
= LsapLookupAccountNames(Count
,
1925 if (!NT_SUCCESS(Status
) &&
1926 Status
!= STATUS_NONE_MAPPED
&&
1927 Status
!= STATUS_SOME_NOT_MAPPED
)
1929 TRACE("LsapLookupAccountNames failed! (Status %lx)\n", Status
);
1933 if (Mapped
== Count
)
1937 // TRACE("done: Status %lx\n", Status);
1939 if (DomainNames
!= NULL
)
1941 //TRACE("Free DomainNames\n");
1942 for (i
= 0; i
< Count
; i
++)
1944 if (DomainNames
[i
].Buffer
!= NULL
)
1945 MIDL_user_free(DomainNames
[i
].Buffer
);
1948 MIDL_user_free(DomainNames
);
1951 if (AccountNames
!= NULL
)
1953 //TRACE("Free AccountNames\n");
1954 for (i
= 0; i
< Count
; i
++)
1956 //TRACE("i: %lu\n", i);
1957 if (AccountNames
[i
].Buffer
!= NULL
)
1959 MIDL_user_free(AccountNames
[i
].Buffer
);
1963 MIDL_user_free(AccountNames
);
1966 if (!NT_SUCCESS(Status
))
1968 //TRACE("Failure!\n");
1970 //TRACE("Free DomainsBuffer\n");
1971 if (DomainsBuffer
!= NULL
)
1973 if (DomainsBuffer
->Domains
!= NULL
)
1974 MIDL_user_free(DomainsBuffer
->Domains
);
1976 MIDL_user_free(DomainsBuffer
);
1979 //TRACE("Free SidsBuffer\n");
1980 if (SidsBuffer
!= NULL
)
1981 MIDL_user_free(SidsBuffer
);
1985 //TRACE("Success!\n");
1987 *ReferencedDomains
= DomainsBuffer
;
1988 TranslatedSids
->Entries
= Count
;
1989 TranslatedSids
->Sids
= SidsBuffer
;
1990 *MappedCount
= Mapped
;
1993 Status
= STATUS_NONE_MAPPED
;
1994 else if (Mapped
< Count
)
1995 Status
= STATUS_SOME_NOT_MAPPED
;
1998 // TRACE("done: Status %lx\n", Status);
2005 LsapLookupWellKnownSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2006 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2007 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2010 PWELL_KNOWN_SID ptr
, ptr2
;
2011 LPWSTR SidString
= NULL
;
2014 NTSTATUS Status
= STATUS_SUCCESS
;
2016 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2018 /* Ignore SIDs which are already mapped */
2019 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2022 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2023 TRACE("Mapping SID: %S\n", SidString
);
2024 LocalFree(SidString
);
2027 ptr
= LsapLookupWellKnownSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2030 NamesBuffer
[i
].Use
= ptr
->Use
;
2031 NamesBuffer
[i
].Flags
= 0;
2033 NamesBuffer
[i
].Name
.Length
= ptr
->AccountName
.Length
;
2034 NamesBuffer
[i
].Name
.MaximumLength
= ptr
->AccountName
.MaximumLength
;
2035 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(ptr
->AccountName
.MaximumLength
);
2036 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2038 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2042 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, ptr
->AccountName
.Buffer
, ptr
->AccountName
.MaximumLength
);
2044 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
2047 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2051 if (!NT_SUCCESS(Status
))
2054 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2057 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2069 LsapLookupBuiltinDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2070 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2071 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2074 SAMPR_HANDLE ServerHandle
= NULL
;
2075 SAMPR_HANDLE DomainHandle
= NULL
;
2076 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2077 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2078 LPWSTR SidString
= NULL
;
2080 ULONG RelativeIds
[1];
2082 NTSTATUS Status
= STATUS_SUCCESS
;
2084 Status
= SamrConnect(NULL
,
2086 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2087 if (!NT_SUCCESS(Status
))
2089 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2093 Status
= SamrOpenDomain(ServerHandle
,
2097 if (!NT_SUCCESS(Status
))
2099 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2103 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2105 /* Ignore SIDs which are already mapped */
2106 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2109 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2110 TRACE("Mapping SID: %S\n", SidString
);
2111 LocalFree(SidString
);
2114 if (RtlEqualSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2116 TRACE("Found builtin domain!\n");
2118 NamesBuffer
[i
].Use
= SidTypeDomain
;
2119 NamesBuffer
[i
].Flags
= 0;
2121 NamesBuffer
[i
].Name
.Length
= BuiltinDomainName
.Length
;
2122 NamesBuffer
[i
].Name
.MaximumLength
= BuiltinDomainName
.MaximumLength
;
2123 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(BuiltinDomainName
.MaximumLength
);
2124 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2126 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2130 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, BuiltinDomainName
.Buffer
, BuiltinDomainName
.MaximumLength
);
2132 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2136 if (!NT_SUCCESS(Status
))
2139 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2141 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2145 else if (LsapIsPrefixSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2147 TRACE("Found builtin domain account!\n");
2149 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2151 Status
= SamrLookupIdsInDomain(DomainHandle
,
2156 if (NT_SUCCESS(Status
))
2158 NamesBuffer
[i
].Use
= Use
.Element
[0];
2159 NamesBuffer
[i
].Flags
= 0;
2161 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2162 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2163 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2164 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2166 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2167 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2169 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2173 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2174 Names
.Element
[0].Buffer
,
2175 Names
.Element
[0].MaximumLength
);
2177 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2178 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2180 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2184 if (!NT_SUCCESS(Status
))
2187 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2189 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2197 if (DomainHandle
!= NULL
)
2198 SamrCloseHandle(&DomainHandle
);
2200 if (ServerHandle
!= NULL
)
2201 SamrCloseHandle(&ServerHandle
);
2208 LsapLookupAccountDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2209 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2210 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2213 SAMPR_HANDLE ServerHandle
= NULL
;
2214 SAMPR_HANDLE DomainHandle
= NULL
;
2215 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2216 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2217 LPWSTR SidString
= NULL
;
2219 ULONG RelativeIds
[1];
2221 NTSTATUS Status
= STATUS_SUCCESS
;
2223 Status
= SamrConnect(NULL
,
2225 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2226 if (!NT_SUCCESS(Status
))
2228 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2232 Status
= SamrOpenDomain(ServerHandle
,
2236 if (!NT_SUCCESS(Status
))
2238 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2242 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2244 /* Ignore SIDs which are already mapped */
2245 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2248 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2249 TRACE("Mapping SID: %S\n", SidString
);
2250 LocalFree(SidString
);
2253 if (RtlEqualSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2255 TRACE("Found account domain!\n");
2257 NamesBuffer
[i
].Use
= SidTypeDomain
;
2258 NamesBuffer
[i
].Flags
= 0;
2260 NamesBuffer
[i
].Name
.Length
= AccountDomainName
.Length
;
2261 NamesBuffer
[i
].Name
.MaximumLength
= AccountDomainName
.MaximumLength
;
2262 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(AccountDomainName
.MaximumLength
);
2263 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2265 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2269 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, AccountDomainName
.Buffer
, AccountDomainName
.MaximumLength
);
2271 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2275 if (!NT_SUCCESS(Status
))
2278 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2280 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2284 else if (LsapIsPrefixSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2286 TRACE("Found account domain account!\n");
2288 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2290 Status
= SamrLookupIdsInDomain(DomainHandle
,
2295 if (NT_SUCCESS(Status
))
2297 NamesBuffer
[i
].Use
= Use
.Element
[0];
2298 NamesBuffer
[i
].Flags
= 0;
2300 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2301 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2302 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2303 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2305 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2306 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2308 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2312 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2313 Names
.Element
[0].Buffer
,
2314 Names
.Element
[0].MaximumLength
);
2316 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2317 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2319 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2323 if (!NT_SUCCESS(Status
))
2326 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2328 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2336 if (DomainHandle
!= NULL
)
2337 SamrCloseHandle(&DomainHandle
);
2339 if (ServerHandle
!= NULL
)
2340 SamrCloseHandle(&ServerHandle
);
2347 LsapLookupSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2348 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
2349 PLSAPR_TRANSLATED_NAMES_EX TranslatedNames
,
2350 LSAP_LOOKUP_LEVEL LookupLevel
,
2352 DWORD LookupOptions
,
2353 DWORD ClientRevision
)
2355 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
2356 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
= NULL
;
2357 ULONG NamesBufferLength
;
2360 NTSTATUS Status
= STATUS_SUCCESS
;
2362 NamesBufferLength
= SidEnumBuffer
->Entries
* sizeof(LSAPR_TRANSLATED_NAME_EX
);
2363 NamesBuffer
= MIDL_user_allocate(NamesBufferLength
);
2364 if (NamesBuffer
== NULL
)
2366 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2370 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
2371 if (DomainsBuffer
== NULL
)
2373 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2377 DomainsBuffer
->Domains
= MIDL_user_allocate(SidEnumBuffer
->Entries
* sizeof(LSA_TRUST_INFORMATION
));
2378 if (DomainsBuffer
->Domains
== NULL
)
2380 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2384 DomainsBuffer
->Entries
= 0;
2385 DomainsBuffer
->MaxEntries
= SidEnumBuffer
->Entries
;
2387 /* Initialize all name entries */
2388 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2390 NamesBuffer
[i
].Use
= SidTypeUnknown
;
2391 NamesBuffer
[i
].Name
.Length
= 0;
2392 NamesBuffer
[i
].Name
.MaximumLength
= 0;
2393 NamesBuffer
[i
].Name
.Buffer
= NULL
;
2394 NamesBuffer
[i
].DomainIndex
= -1;
2395 NamesBuffer
[i
].Flags
= 0;
2398 /* Look-up well-known SIDs */
2399 Status
= LsapLookupWellKnownSids(SidEnumBuffer
,
2403 if (!NT_SUCCESS(Status
) &&
2404 Status
!= STATUS_NONE_MAPPED
&&
2405 Status
!= STATUS_SOME_NOT_MAPPED
)
2408 if (Mapped
== SidEnumBuffer
->Entries
)
2411 /* Look-up builtin domain SIDs */
2412 Status
= LsapLookupBuiltinDomainSids(SidEnumBuffer
,
2416 if (!NT_SUCCESS(Status
) &&
2417 Status
!= STATUS_NONE_MAPPED
&&
2418 Status
!= STATUS_SOME_NOT_MAPPED
)
2421 if (Mapped
== SidEnumBuffer
->Entries
)
2424 /* Look-up account domain SIDs */
2425 Status
= LsapLookupAccountDomainSids(SidEnumBuffer
,
2429 if (!NT_SUCCESS(Status
) &&
2430 Status
!= STATUS_NONE_MAPPED
&&
2431 Status
!= STATUS_SOME_NOT_MAPPED
)
2434 if (Mapped
== SidEnumBuffer
->Entries
)
2438 TRACE("done Status: %lx Mapped: %lu\n", Status
, Mapped
);
2440 if (!NT_SUCCESS(Status
))
2442 if (DomainsBuffer
!= NULL
)
2444 if (DomainsBuffer
->Domains
!= NULL
)
2445 MIDL_user_free(DomainsBuffer
->Domains
);
2447 MIDL_user_free(DomainsBuffer
);
2450 if (NamesBuffer
!= NULL
)
2451 MIDL_user_free(NamesBuffer
);
2455 *ReferencedDomains
= DomainsBuffer
;
2456 TranslatedNames
->Entries
= SidEnumBuffer
->Entries
;
2457 TranslatedNames
->Names
= NamesBuffer
;
2458 *MappedCount
= Mapped
;
2461 Status
= STATUS_NONE_MAPPED
;
2462 else if (Mapped
< SidEnumBuffer
->Entries
)
2463 Status
= STATUS_SOME_NOT_MAPPED
;