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 /* GLOBALS *****************************************************************/
14 typedef wchar_t *PSAMPR_SERVER_NAME
;
15 typedef void *SAMPR_HANDLE
;
17 typedef struct _SAMPR_RETURNED_USTRING_ARRAY
20 PRPC_UNICODE_STRING Element
;
21 } SAMPR_RETURNED_USTRING_ARRAY
, *PSAMPR_RETURNED_USTRING_ARRAY
;
23 typedef struct _SAMPR_ULONG_ARRAY
26 unsigned long *Element
;
27 } SAMPR_ULONG_ARRAY
, *PSAMPR_ULONG_ARRAY
;
32 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr
);
36 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr
);
40 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
41 OUT SAMPR_HANDLE
*ServerHandle
,
42 IN ACCESS_MASK DesiredAccess
);
46 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
);
50 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
51 IN ACCESS_MASK DesiredAccess
,
53 OUT SAMPR_HANDLE
*DomainHandle
);
57 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
59 IN ULONG
*RelativeIds
,
60 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
61 OUT PSAMPR_ULONG_ARRAY Use
);
65 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
67 IN RPC_UNICODE_STRING Names
[],
68 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
69 OUT PSAMPR_ULONG_ARRAY Use
);
72 typedef struct _WELL_KNOWN_SID
76 UNICODE_STRING AccountName
;
77 UNICODE_STRING DomainName
;
79 } WELL_KNOWN_SID
, *PWELL_KNOWN_SID
;
82 LIST_ENTRY WellKnownSidListHead
;
83 PSID LsapWorldSid
= NULL
;
84 PSID LsapNetworkSid
= NULL
;
85 PSID LsapBatchSid
= NULL
;
86 PSID LsapInteractiveSid
= NULL
;
87 PSID LsapServiceSid
= NULL
;
88 PSID LsapLocalSystemSid
= NULL
;
89 PSID LsapAdministratorsSid
= NULL
;
92 /* FUNCTIONS ***************************************************************/
95 LsapCreateSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
96 UCHAR SubAuthorityCount
,
97 PULONG SubAuthorities
,
103 PWELL_KNOWN_SID SidEntry
;
107 SidEntry
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WELL_KNOWN_SID
));
108 if (SidEntry
== NULL
)
111 InitializeListHead(&SidEntry
->ListEntry
);
113 SidEntry
->Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
115 RtlLengthRequiredSid(SubAuthorityCount
));
116 if (SidEntry
->Sid
== NULL
)
118 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
122 RtlInitializeSid(SidEntry
->Sid
,
126 for (i
= 0; i
< (ULONG
)SubAuthorityCount
; i
++)
128 p
= RtlSubAuthoritySid(SidEntry
->Sid
, i
);
129 *p
= SubAuthorities
[i
];
132 // RtlInitUnicodeString(&SidEntry->AccountName,
134 SidEntry
->AccountName
.Length
= wcslen(AccountName
) * sizeof(WCHAR
);
135 SidEntry
->AccountName
.MaximumLength
= SidEntry
->AccountName
.Length
+ sizeof(WCHAR
);
136 SidEntry
->AccountName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
137 SidEntry
->AccountName
.MaximumLength
);
138 if (SidEntry
->AccountName
.Buffer
== NULL
)
140 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
141 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
145 wcscpy(SidEntry
->AccountName
.Buffer
,
148 // RtlInitUnicodeString(&SidEntry->DomainName,
150 SidEntry
->DomainName
.Length
= wcslen(DomainName
) * sizeof(WCHAR
);
151 SidEntry
->DomainName
.MaximumLength
= SidEntry
->DomainName
.Length
+ sizeof(WCHAR
);
152 SidEntry
->DomainName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
153 SidEntry
->DomainName
.MaximumLength
);
154 if (SidEntry
->DomainName
.Buffer
== NULL
)
156 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->AccountName
.Buffer
);
157 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
158 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
162 wcscpy(SidEntry
->DomainName
.Buffer
,
167 InsertTailList(&WellKnownSidListHead
,
168 &SidEntry
->ListEntry
);
171 *SidPtr
= SidEntry
->Sid
;
180 WCHAR szAccountName
[80];
181 WCHAR szDomainName
[80];
182 ULONG SubAuthorities
[8];
185 InitializeListHead(&WellKnownSidListHead
);
187 hInstance
= GetModuleHandleW(L
"lsasrv.dll");
191 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szAccountName
, 80);
192 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, 80);
193 LsapCreateSid(&NtAuthority
,
202 LsapLoadString(hInstance
, IDS_NULL_RID
, szAccountName
, 80);
204 SubAuthorities
[0] = SECURITY_NULL_RID
;
205 LsapCreateSid(&NullSidAuthority
,
210 SidTypeWellKnownGroup
,
214 LsapLoadString(hInstance
, IDS_WORLD_RID
, szAccountName
, 80);
216 SubAuthorities
[0] = SECURITY_WORLD_RID
;
217 LsapCreateSid(&WorldSidAuthority
,
222 SidTypeWellKnownGroup
,
226 LsapLoadString(hInstance
, IDS_LOCAL_RID
, szAccountName
, 80);
228 SubAuthorities
[0] = SECURITY_LOCAL_RID
;
229 LsapCreateSid(&LocalSidAuthority
,
234 SidTypeWellKnownGroup
,
237 /* Creator Owner Sid */
238 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_RID
, szAccountName
, 80);
240 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_RID
;
241 LsapCreateSid(&CreatorSidAuthority
,
246 SidTypeWellKnownGroup
,
249 /* Creator Group Sid */
250 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_RID
, szAccountName
, 80);
252 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_RID
;
253 LsapCreateSid(&CreatorSidAuthority
,
258 SidTypeWellKnownGroup
,
261 /* Creator Owner Server Sid */
262 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_SERVER_RID
, szAccountName
, 80);
264 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_SERVER_RID
;
265 LsapCreateSid(&CreatorSidAuthority
,
270 SidTypeWellKnownGroup
,
273 /* Creator Group Server Sid */
274 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_SERVER_RID
, szAccountName
, 80);
276 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_SERVER_RID
;
277 LsapCreateSid(&CreatorSidAuthority
,
282 SidTypeWellKnownGroup
,
286 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, 80);
287 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, 80);
289 SubAuthorities
[0] = SECURITY_DIALUP_RID
;
290 LsapCreateSid(&NtAuthority
,
295 SidTypeWellKnownGroup
,
299 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, 80);
301 SubAuthorities
[0] = SECURITY_NETWORK_RID
;
302 LsapCreateSid(&NtAuthority
,
307 SidTypeWellKnownGroup
,
311 LsapLoadString(hInstance
, IDS_BATCH_RID
, szAccountName
, 80);
313 SubAuthorities
[0] = SECURITY_BATCH_RID
;
314 LsapCreateSid(&NtAuthority
,
319 SidTypeWellKnownGroup
,
322 /* Interactive Sid */
323 LsapLoadString(hInstance
, IDS_INTERACTIVE_RID
, szAccountName
, 80);
325 SubAuthorities
[0] = SECURITY_INTERACTIVE_RID
;
326 LsapCreateSid(&NtAuthority
,
331 SidTypeWellKnownGroup
,
332 &LsapInteractiveSid
);
335 LsapLoadString(hInstance
, IDS_SERVICE_RID
, szAccountName
, 80);
337 SubAuthorities
[0] = SECURITY_SERVICE_RID
;
338 LsapCreateSid(&NtAuthority
,
343 SidTypeWellKnownGroup
,
346 /* Anonymous Logon Sid */
347 LsapLoadString(hInstance
, IDS_ANONYMOUS_LOGON_RID
, szAccountName
, 80);
349 SubAuthorities
[0] = SECURITY_ANONYMOUS_LOGON_RID
;
350 LsapCreateSid(&NtAuthority
,
355 SidTypeWellKnownGroup
,
359 LsapLoadString(hInstance
, IDS_PROXY_RID
, szAccountName
, 80);
361 SubAuthorities
[0] = SECURITY_PROXY_RID
;
362 LsapCreateSid(&NtAuthority
,
367 SidTypeWellKnownGroup
,
370 /* Enterprise Controllers Sid */
371 LsapLoadString(hInstance
, IDS_ENTERPRISE_CONTROLLERS_RID
, szAccountName
, 80);
373 SubAuthorities
[0] = SECURITY_ENTERPRISE_CONTROLLERS_RID
;
374 LsapCreateSid(&NtAuthority
,
379 SidTypeWellKnownGroup
,
382 /* Principal Self Sid */
383 LsapLoadString(hInstance
, IDS_PRINCIPAL_SELF_RID
, szAccountName
, 80);
385 SubAuthorities
[0] = SECURITY_PRINCIPAL_SELF_RID
;
386 LsapCreateSid(&NtAuthority
,
391 SidTypeWellKnownGroup
,
394 /* Authenticated Users Sid */
395 LsapLoadString(hInstance
, IDS_AUTHENTICATED_USER_RID
, szAccountName
, 80);
397 SubAuthorities
[0] = SECURITY_AUTHENTICATED_USER_RID
;
398 LsapCreateSid(&NtAuthority
,
403 SidTypeWellKnownGroup
,
406 /* Restricted Code Sid */
407 LsapLoadString(hInstance
, IDS_RESTRICTED_CODE_RID
, szAccountName
, 80);
409 SubAuthorities
[0] = SECURITY_RESTRICTED_CODE_RID
;
410 LsapCreateSid(&NtAuthority
,
415 SidTypeWellKnownGroup
,
418 /* Terminal Server Sid */
419 LsapLoadString(hInstance
, IDS_TERMINAL_SERVER_RID
, szAccountName
, 80);
421 SubAuthorities
[0] = SECURITY_TERMINAL_SERVER_RID
;
422 LsapCreateSid(&NtAuthority
,
427 SidTypeWellKnownGroup
,
430 /* Remote Logon Sid */
431 LsapLoadString(hInstance
, IDS_REMOTE_LOGON_RID
, szAccountName
, 80);
433 SubAuthorities
[0] = SECURITY_REMOTE_LOGON_RID
;
434 LsapCreateSid(&NtAuthority
,
439 SidTypeWellKnownGroup
,
442 /* This Organization Sid */
443 LsapLoadString(hInstance
, IDS_THIS_ORGANIZATION_RID
, szAccountName
, 80);
445 SubAuthorities
[0] = SECURITY_THIS_ORGANIZATION_RID
;
446 LsapCreateSid(&NtAuthority
,
451 SidTypeWellKnownGroup
,
454 /* Local System Sid */
455 LsapLoadString(hInstance
, IDS_LOCAL_SYSTEM_RID
, szAccountName
, 80);
457 SubAuthorities
[0] = SECURITY_LOCAL_SYSTEM_RID
;
458 LsapCreateSid(&NtAuthority
,
463 SidTypeWellKnownGroup
,
464 &LsapLocalSystemSid
);
466 /* Local Service Sid */
467 LsapLoadString(hInstance
, IDS_LOCAL_SERVICE_RID
, szAccountName
, 80);
469 SubAuthorities
[0] = SECURITY_LOCAL_SERVICE_RID
;
470 LsapCreateSid(&NtAuthority
,
475 SidTypeWellKnownGroup
,
478 LsapCreateSid(&NtAuthority
,
483 SidTypeWellKnownGroup
,
486 /* Network Service Sid */
487 LsapLoadString(hInstance
, IDS_NETWORK_SERVICE_RID
, szAccountName
, 80);
489 SubAuthorities
[0] = SECURITY_NETWORK_SERVICE_RID
;
490 LsapCreateSid(&NtAuthority
,
495 SidTypeWellKnownGroup
,
498 LsapCreateSid(&NtAuthority
,
503 SidTypeWellKnownGroup
,
506 /* Builtin Domain Sid */
507 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szAccountName
, 80);
508 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szDomainName
, 80);
510 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
511 LsapCreateSid(&NtAuthority
,
519 /* Administrators Alias Sid */
520 LsapLoadString(hInstance
, IDS_ALIAS_RID_ADMINS
, szAccountName
, 80);
522 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
523 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ADMINS
;
524 LsapCreateSid(&NtAuthority
,
530 &LsapAdministratorsSid
);
532 /* Users Alias Sid */
533 LsapLoadString(hInstance
, IDS_ALIAS_RID_USERS
, szAccountName
, 80);
535 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
536 SubAuthorities
[1] = DOMAIN_ALIAS_RID_USERS
;
537 LsapCreateSid(&NtAuthority
,
545 /* Guests Alias Sid */
546 LsapLoadString(hInstance
, IDS_ALIAS_RID_GUESTS
, szAccountName
, 80);
548 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
549 SubAuthorities
[1] = DOMAIN_ALIAS_RID_GUESTS
;
550 LsapCreateSid(&NtAuthority
,
558 /* Power User Alias Sid */
559 LsapLoadString(hInstance
, IDS_ALIAS_RID_POWER_USERS
, szAccountName
, 80);
561 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
562 SubAuthorities
[1] = DOMAIN_ALIAS_RID_POWER_USERS
;
563 LsapCreateSid(&NtAuthority
,
571 /* Account Operators Alias Sid */
572 LsapLoadString(hInstance
, IDS_ALIAS_RID_ACCOUNT_OPS
, szAccountName
, 80);
574 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
575 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ACCOUNT_OPS
;
576 LsapCreateSid(&NtAuthority
,
584 /* System Operators Alias Sid */
585 LsapLoadString(hInstance
, IDS_ALIAS_RID_SYSTEM_OPS
, szAccountName
, 80);
587 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
588 SubAuthorities
[1] = DOMAIN_ALIAS_RID_SYSTEM_OPS
;
589 LsapCreateSid(&NtAuthority
,
597 /* Print Operators Alias Sid */
598 LsapLoadString(hInstance
, IDS_ALIAS_RID_PRINT_OPS
, szAccountName
, 80);
600 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
601 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PRINT_OPS
;
602 LsapCreateSid(&NtAuthority
,
610 /* Backup Operators Alias Sid */
611 LsapLoadString(hInstance
, IDS_ALIAS_RID_BACKUP_OPS
, szAccountName
, 80);
613 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
614 SubAuthorities
[1] = DOMAIN_ALIAS_RID_BACKUP_OPS
;
615 LsapCreateSid(&NtAuthority
,
623 /* Replicators Alias Sid */
624 LsapLoadString(hInstance
, IDS_ALIAS_RID_REPLICATOR
, szAccountName
, 80);
626 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
627 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REPLICATOR
;
628 LsapCreateSid(&NtAuthority
,
636 /* RAS Servers Alias Sid */
637 LsapLoadString(hInstance
, IDS_ALIAS_RID_RAS_SERVERS
, szAccountName
, 80);
639 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
640 SubAuthorities
[1] = DOMAIN_ALIAS_RID_RAS_SERVERS
;
641 LsapCreateSid(&NtAuthority
,
649 /* Pre-Windows 2000 Compatible Access Alias Sid */
650 LsapLoadString(hInstance
, IDS_ALIAS_RID_PREW2KCOMPACCESS
, szAccountName
, 80);
652 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
653 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
;
654 LsapCreateSid(&NtAuthority
,
662 /* Remote Desktop Users Alias Sid */
663 LsapLoadString(hInstance
, IDS_ALIAS_RID_REMOTE_DESKTOP_USERS
, szAccountName
, 80);
665 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
666 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
;
667 LsapCreateSid(&NtAuthority
,
675 /* Network Configuration Operators Alias Sid */
676 LsapLoadString(hInstance
, IDS_ALIAS_RID_NETWORK_CONFIGURATION_OPS
, szAccountName
, 80);
678 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
679 SubAuthorities
[1] = DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
;
680 LsapCreateSid(&NtAuthority
,
688 /* FIXME: Add more well known sids */
690 return STATUS_SUCCESS
;
695 LsapLookupWellKnownSid(PSID Sid
)
697 PLIST_ENTRY ListEntry
;
700 ListEntry
= WellKnownSidListHead
.Flink
;
701 while (ListEntry
!= &WellKnownSidListHead
)
703 Ptr
= CONTAINING_RECORD(ListEntry
,
706 if (RtlEqualSid(Sid
, Ptr
->Sid
))
711 ListEntry
= ListEntry
->Flink
;
719 LsapLookupIsolatedWellKnownName(PUNICODE_STRING AccountName
)
721 PLIST_ENTRY ListEntry
;
724 ListEntry
= WellKnownSidListHead
.Flink
;
725 while (ListEntry
!= &WellKnownSidListHead
)
727 Ptr
= CONTAINING_RECORD(ListEntry
,
730 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
))
735 ListEntry
= ListEntry
->Flink
;
743 LsapLookupFullyQualifiedWellKnownName(PUNICODE_STRING AccountName
,
744 PUNICODE_STRING DomainName
)
746 PLIST_ENTRY ListEntry
;
749 ListEntry
= WellKnownSidListHead
.Flink
;
750 while (ListEntry
!= &WellKnownSidListHead
)
752 Ptr
= CONTAINING_RECORD(ListEntry
,
755 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
) &&
756 RtlEqualUnicodeString(DomainName
, &Ptr
->DomainName
, TRUE
))
761 ListEntry
= ListEntry
->Flink
;
770 LsapSplitNames(DWORD Count
,
771 PRPC_UNICODE_STRING Names
,
772 PRPC_UNICODE_STRING
*DomainNames
,
773 PRPC_UNICODE_STRING
*AccountNames
)
775 PRPC_UNICODE_STRING DomainsBuffer
= NULL
;
776 PRPC_UNICODE_STRING AccountsBuffer
= NULL
;
781 NTSTATUS Status
= STATUS_SUCCESS
;
783 DomainsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
784 if (DomainsBuffer
== NULL
)
786 Status
= STATUS_INSUFFICIENT_RESOURCES
;
790 AccountsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
791 if (AccountsBuffer
== NULL
)
793 Status
= STATUS_INSUFFICIENT_RESOURCES
;
797 for (i
= 0; i
< Count
; i
++)
799 //TRACE("Name: %wZ\n", &Names[i]);
801 Ptr
= wcschr(Names
[i
].Buffer
, L
'\\');
804 AccountLength
= Names
[i
].Length
/ sizeof(WCHAR
);
806 AccountsBuffer
[i
].Length
= Names
[i
].Length
;
807 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
808 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
809 if (AccountsBuffer
[i
].Buffer
== NULL
)
811 Status
= STATUS_INSUFFICIENT_RESOURCES
;
815 CopyMemory(AccountsBuffer
[i
].Buffer
,
817 AccountsBuffer
[i
].Length
);
818 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
820 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
824 DomainLength
= (ULONG
)(ULONG_PTR
)(Ptr
- Names
[i
].Buffer
);
825 AccountLength
= (Names
[i
].Length
/ sizeof(WCHAR
)) - DomainLength
- 1;
826 //TRACE("DomainLength: %u\n", DomainLength);
827 //TRACE("AccountLength: %u\n", AccountLength);
829 if (DomainLength
> 0)
831 DomainsBuffer
[i
].Length
= (USHORT
)DomainLength
* sizeof(WCHAR
);
832 DomainsBuffer
[i
].MaximumLength
= DomainsBuffer
[i
].Length
+ sizeof(WCHAR
);
833 DomainsBuffer
[i
].Buffer
= MIDL_user_allocate(DomainsBuffer
[i
].MaximumLength
);
834 if (DomainsBuffer
[i
].Buffer
== NULL
)
836 Status
= STATUS_INSUFFICIENT_RESOURCES
;
840 CopyMemory(DomainsBuffer
[i
].Buffer
,
842 DomainsBuffer
[i
].Length
);
843 DomainsBuffer
[i
].Buffer
[DomainLength
] = UNICODE_NULL
;
845 //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
848 AccountsBuffer
[i
].Length
= (USHORT
)AccountLength
* sizeof(WCHAR
);
849 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
850 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
851 if (AccountsBuffer
[i
].Buffer
== NULL
)
853 Status
= STATUS_INSUFFICIENT_RESOURCES
;
857 CopyMemory(AccountsBuffer
[i
].Buffer
,
858 &(Names
[i
].Buffer
[DomainLength
+ 1]),
859 AccountsBuffer
[i
].Length
);
860 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
862 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
867 if (!NT_SUCCESS(Status
))
869 if (AccountsBuffer
!= NULL
)
871 for (i
= 0; i
< Count
; i
++)
873 if (AccountsBuffer
[i
].Buffer
!= NULL
)
874 MIDL_user_free(AccountsBuffer
[i
].Buffer
);
877 MIDL_user_free(AccountsBuffer
);
880 if (DomainsBuffer
!= NULL
)
882 for (i
= 0; i
< Count
; i
++)
884 if (DomainsBuffer
[i
].Buffer
!= NULL
)
885 MIDL_user_free(DomainsBuffer
[i
].Buffer
);
888 MIDL_user_free(DomainsBuffer
);
893 *DomainNames
= DomainsBuffer
;
894 *AccountNames
= AccountsBuffer
;
902 LsapAddDomainToDomainsList(PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
903 PUNICODE_STRING Name
,
910 while (i
< ReferencedDomains
->Entries
&&
911 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
913 if (RtlEqualSid(Sid
, ReferencedDomains
->Domains
[i
].Sid
))
916 return STATUS_SUCCESS
;
922 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(Sid
));
923 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
924 return STATUS_INSUFFICIENT_RESOURCES
;
926 RtlCopySid(RtlLengthSid(Sid
), ReferencedDomains
->Domains
[i
].Sid
, Sid
);
928 ReferencedDomains
->Domains
[i
].Name
.Length
= Name
->Length
;
929 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= Name
->MaximumLength
;
930 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(Name
->MaximumLength
);
931 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
933 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
934 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
935 return STATUS_INSUFFICIENT_RESOURCES
;
938 RtlCopyMemory(ReferencedDomains
->Domains
[i
].Name
.Buffer
,
940 Name
->MaximumLength
);
942 ReferencedDomains
->Entries
++;
945 return STATUS_SUCCESS
;
950 LsapIsPrefixSid(IN PSID PrefixSid
,
953 PISID Sid1
= PrefixSid
, Sid2
= Sid
;
956 if (Sid1
->Revision
!= Sid2
->Revision
)
959 if ((Sid1
->IdentifierAuthority
.Value
[0] != Sid2
->IdentifierAuthority
.Value
[0]) ||
960 (Sid1
->IdentifierAuthority
.Value
[1] != Sid2
->IdentifierAuthority
.Value
[1]) ||
961 (Sid1
->IdentifierAuthority
.Value
[2] != Sid2
->IdentifierAuthority
.Value
[2]) ||
962 (Sid1
->IdentifierAuthority
.Value
[3] != Sid2
->IdentifierAuthority
.Value
[3]) ||
963 (Sid1
->IdentifierAuthority
.Value
[4] != Sid2
->IdentifierAuthority
.Value
[4]) ||
964 (Sid1
->IdentifierAuthority
.Value
[5] != Sid2
->IdentifierAuthority
.Value
[5]))
967 if (Sid1
->SubAuthorityCount
>= Sid2
->SubAuthorityCount
)
970 if (Sid1
->SubAuthorityCount
== 0)
973 for (i
= 0; i
< Sid1
->SubAuthorityCount
; i
++)
975 if (Sid1
->SubAuthority
[i
] != Sid2
->SubAuthority
[i
])
984 LsapGetRelativeIdFromSid(PSID Sid_
)
988 if (Sid
->SubAuthorityCount
!= 0)
989 return Sid
->SubAuthority
[Sid
->SubAuthorityCount
- 1];
996 CreateSidFromSidAndRid(PSID SrcSid
,
1005 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1009 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
1011 DstSid
= MIDL_user_allocate(DstSidSize
);
1015 RtlInitializeSid(DstSid
,
1016 RtlIdentifierAuthoritySid(SrcSid
),
1019 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1021 p
= RtlSubAuthoritySid(SrcSid
, i
);
1022 q
= RtlSubAuthoritySid(DstSid
, i
);
1026 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);
1034 CreateDomainSidFromAccountSid(PSID AccountSid
)
1042 RidCount
= *RtlSubAuthorityCountSid(AccountSid
);
1046 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1048 DomainSid
= MIDL_user_allocate(DstSidSize
);
1049 if (DomainSid
== NULL
)
1052 RtlInitializeSid(DomainSid
,
1053 RtlIdentifierAuthoritySid(AccountSid
),
1056 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1058 p
= RtlSubAuthoritySid(AccountSid
, i
);
1059 q
= RtlSubAuthoritySid(DomainSid
, i
);
1068 LsapCopySid(PSID SrcSid
)
1076 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1077 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1079 DstSid
= MIDL_user_allocate(DstSidSize
);
1083 RtlInitializeSid(DstSid
,
1084 RtlIdentifierAuthoritySid(SrcSid
),
1087 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1089 p
= RtlSubAuthoritySid(SrcSid
, i
);
1090 q
= RtlSubAuthoritySid(DstSid
, i
);
1100 LsapLookupIsolatedNames(DWORD Count
,
1101 PRPC_UNICODE_STRING DomainNames
,
1102 PRPC_UNICODE_STRING AccountNames
,
1103 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1104 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1107 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1108 PWELL_KNOWN_SID ptr
, ptr2
;
1112 NTSTATUS Status
= STATUS_SUCCESS
;
1114 for (i
= 0; i
< Count
; i
++)
1116 /* Ignore names which were already mapped */
1117 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1120 /* Ignore fully qualified account names */
1121 if (DomainNames
[i
].Length
!= 0)
1124 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1126 /* Look-up all well-known names */
1127 ptr
= LsapLookupIsolatedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
]);
1130 SidsBuffer
[i
].Use
= ptr
->Use
;
1131 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1132 if (SidsBuffer
[i
].Sid
== NULL
)
1134 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1138 SidsBuffer
[i
].DomainIndex
= -1;
1139 SidsBuffer
[i
].Flags
= 0;
1141 if (ptr
->Use
== SidTypeDomain
)
1143 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1147 if (!NT_SUCCESS(Status
))
1150 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1154 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1157 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1161 if (!NT_SUCCESS(Status
))
1164 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1168 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1169 if (DomainSid
== NULL
)
1171 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1175 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1180 if (DomainSid
!= NULL
)
1182 MIDL_user_free(DomainSid
);
1186 if (!NT_SUCCESS(Status
))
1189 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1197 /* Look-up the built-in domain */
1198 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &BuiltinDomainName
, TRUE
))
1200 SidsBuffer
[i
].Use
= SidTypeDomain
;
1201 SidsBuffer
[i
].Sid
= LsapCopySid(BuiltinDomainSid
);
1202 if (SidsBuffer
[i
].Sid
== NULL
)
1204 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1208 SidsBuffer
[i
].DomainIndex
= -1;
1209 SidsBuffer
[i
].Flags
= 0;
1211 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1215 if (!NT_SUCCESS(Status
))
1218 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1224 /* Look-up the account domain */
1225 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &AccountDomainName
, TRUE
))
1227 SidsBuffer
[i
].Use
= SidTypeDomain
;
1228 SidsBuffer
[i
].Sid
= LsapCopySid(AccountDomainSid
);
1229 if (SidsBuffer
[i
].Sid
== NULL
)
1231 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1234 SidsBuffer
[i
].DomainIndex
= -1;
1235 SidsBuffer
[i
].Flags
= 0;
1237 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1241 if (!NT_SUCCESS(Status
))
1244 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1250 /* FIXME: Look-up the primary domain */
1252 /* FIXME: Look-up the trusted domains */
1264 LsapLookupIsolatedBuiltinNames(DWORD Count
,
1265 PRPC_UNICODE_STRING DomainNames
,
1266 PRPC_UNICODE_STRING AccountNames
,
1267 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1268 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1271 SAMPR_HANDLE ServerHandle
= NULL
;
1272 SAMPR_HANDLE DomainHandle
= NULL
;
1273 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1274 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1277 NTSTATUS Status
= STATUS_SUCCESS
;
1279 Status
= SamrConnect(NULL
,
1281 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1282 if (!NT_SUCCESS(Status
))
1284 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1288 Status
= SamrOpenDomain(ServerHandle
,
1292 if (!NT_SUCCESS(Status
))
1294 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1298 for (i
= 0; i
< Count
; i
++)
1300 /* Ignore names which were already mapped */
1301 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1304 /* Ignore fully qualified account names */
1305 if (DomainNames
[i
].Length
!= 0)
1308 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1310 Status
= SamrLookupNamesInDomain(DomainHandle
,
1315 if (NT_SUCCESS(Status
))
1317 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1319 SidsBuffer
[i
].Use
= Use
.Element
[0];
1320 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1321 RelativeIds
.Element
[0]);
1322 if (SidsBuffer
[i
].Sid
== NULL
)
1324 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1328 SidsBuffer
[i
].DomainIndex
= -1;
1329 SidsBuffer
[i
].Flags
= 0;
1331 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1335 if (!NT_SUCCESS(Status
))
1338 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1343 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1344 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1348 if (DomainHandle
!= NULL
)
1349 SamrCloseHandle(&DomainHandle
);
1351 if (ServerHandle
!= NULL
)
1352 SamrCloseHandle(&ServerHandle
);
1360 LsapLookupIsolatedAccountNames(DWORD Count
,
1361 PRPC_UNICODE_STRING DomainNames
,
1362 PRPC_UNICODE_STRING AccountNames
,
1363 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1364 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1367 SAMPR_HANDLE ServerHandle
= NULL
;
1368 SAMPR_HANDLE DomainHandle
= NULL
;
1369 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1370 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1373 NTSTATUS Status
= STATUS_SUCCESS
;
1377 Status
= SamrConnect(NULL
,
1379 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1380 if (!NT_SUCCESS(Status
))
1382 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1386 Status
= SamrOpenDomain(ServerHandle
,
1390 if (!NT_SUCCESS(Status
))
1392 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1396 for (i
= 0; i
< Count
; i
++)
1398 /* Ignore names which were already mapped */
1399 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1402 /* Ignore fully qualified account names */
1403 if (DomainNames
[i
].Length
!= 0)
1406 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1408 Status
= SamrLookupNamesInDomain(DomainHandle
,
1413 if (NT_SUCCESS(Status
))
1415 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1417 SidsBuffer
[i
].Use
= Use
.Element
[0];
1418 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1419 RelativeIds
.Element
[0]);
1420 if (SidsBuffer
[i
].Sid
== NULL
)
1422 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1426 SidsBuffer
[i
].DomainIndex
= -1;
1427 SidsBuffer
[i
].Flags
= 0;
1429 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1433 if (!NT_SUCCESS(Status
))
1436 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1441 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1442 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1446 if (DomainHandle
!= NULL
)
1447 SamrCloseHandle(&DomainHandle
);
1449 if (ServerHandle
!= NULL
)
1450 SamrCloseHandle(&ServerHandle
);
1458 LsapLookupFullyQualifiedWellKnownNames(DWORD Count
,
1459 PRPC_UNICODE_STRING DomainNames
,
1460 PRPC_UNICODE_STRING AccountNames
,
1461 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1462 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1465 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1466 PWELL_KNOWN_SID ptr
, ptr2
;
1470 NTSTATUS Status
= STATUS_SUCCESS
;
1472 for (i
= 0; i
< Count
; i
++)
1474 /* Ignore names which were already mapped */
1475 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1478 /* Ignore isolated account names */
1479 if (DomainNames
[i
].Length
== 0)
1482 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1484 /* Look-up all well-known names */
1485 ptr
= LsapLookupFullyQualifiedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
],
1486 (PUNICODE_STRING
)&DomainNames
[i
]);
1489 TRACE("Found it! (%wZ\\%wZ)\n", &ptr
->DomainName
, &ptr
->AccountName
);
1491 SidsBuffer
[i
].Use
= ptr
->Use
;
1492 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1493 if (SidsBuffer
[i
].Sid
== NULL
)
1495 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1499 SidsBuffer
[i
].DomainIndex
= -1;
1500 SidsBuffer
[i
].Flags
= 0;
1502 if (ptr
->Use
== SidTypeDomain
)
1504 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1508 if (!NT_SUCCESS(Status
))
1511 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1515 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1518 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1522 if (!NT_SUCCESS(Status
))
1525 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1529 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1530 if (DomainSid
== NULL
)
1532 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1536 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1541 if (DomainSid
!= NULL
)
1543 MIDL_user_free(DomainSid
);
1547 if (!NT_SUCCESS(Status
))
1550 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1566 LsapLookupBuiltinNames(DWORD Count
,
1567 PRPC_UNICODE_STRING DomainNames
,
1568 PRPC_UNICODE_STRING AccountNames
,
1569 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1570 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1573 SAMPR_HANDLE ServerHandle
= NULL
;
1574 SAMPR_HANDLE DomainHandle
= NULL
;
1575 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1576 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1579 NTSTATUS Status
= STATUS_SUCCESS
;
1581 Status
= SamrConnect(NULL
,
1583 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1584 if (!NT_SUCCESS(Status
))
1586 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1590 Status
= SamrOpenDomain(ServerHandle
,
1594 if (!NT_SUCCESS(Status
))
1596 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1600 for (i
= 0; i
< Count
; i
++)
1602 /* Ignore names which were already mapped */
1603 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1606 /* Ignore isolated account names */
1607 if (DomainNames
[i
].Length
== 0)
1610 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &BuiltinDomainName
, TRUE
))
1613 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1615 Status
= SamrLookupNamesInDomain(DomainHandle
,
1620 if (NT_SUCCESS(Status
))
1622 SidsBuffer
[i
].Use
= Use
.Element
[0];
1623 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1624 RelativeIds
.Element
[0]);
1625 if (SidsBuffer
[i
].Sid
== NULL
)
1627 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1631 SidsBuffer
[i
].DomainIndex
= -1;
1632 SidsBuffer
[i
].Flags
= 0;
1634 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1638 if (!NT_SUCCESS(Status
))
1641 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1646 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1647 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1651 if (DomainHandle
!= NULL
)
1652 SamrCloseHandle(&DomainHandle
);
1654 if (ServerHandle
!= NULL
)
1655 SamrCloseHandle(&ServerHandle
);
1663 LsapLookupAccountNames(DWORD Count
,
1664 PRPC_UNICODE_STRING DomainNames
,
1665 PRPC_UNICODE_STRING AccountNames
,
1666 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1667 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1670 SAMPR_HANDLE ServerHandle
= NULL
;
1671 SAMPR_HANDLE DomainHandle
= NULL
;
1672 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1673 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1676 NTSTATUS Status
= STATUS_SUCCESS
;
1678 Status
= SamrConnect(NULL
,
1680 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1681 if (!NT_SUCCESS(Status
))
1683 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1687 Status
= SamrOpenDomain(ServerHandle
,
1691 if (!NT_SUCCESS(Status
))
1693 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1697 for (i
= 0; i
< Count
; i
++)
1699 /* Ignore names which were already mapped */
1700 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1703 /* Ignore isolated account names */
1704 if (DomainNames
[i
].Length
== 0)
1707 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &AccountDomainName
, TRUE
))
1710 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1712 Status
= SamrLookupNamesInDomain(DomainHandle
,
1717 if (NT_SUCCESS(Status
))
1719 SidsBuffer
[i
].Use
= Use
.Element
[0];
1720 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1721 RelativeIds
.Element
[0]);
1722 if (SidsBuffer
[i
].Sid
== NULL
)
1724 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1728 SidsBuffer
[i
].DomainIndex
= -1;
1729 SidsBuffer
[i
].Flags
= 0;
1731 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1735 if (!NT_SUCCESS(Status
))
1738 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1743 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1744 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1748 if (DomainHandle
!= NULL
)
1749 SamrCloseHandle(&DomainHandle
);
1751 if (ServerHandle
!= NULL
)
1752 SamrCloseHandle(&ServerHandle
);
1759 LsapLookupNames(DWORD Count
,
1760 PRPC_UNICODE_STRING Names
,
1761 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
1762 PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids
,
1763 LSAP_LOOKUP_LEVEL LookupLevel
,
1765 DWORD LookupOptions
,
1766 DWORD ClientRevision
)
1768 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
1769 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
= NULL
;
1770 PRPC_UNICODE_STRING DomainNames
= NULL
;
1771 PRPC_UNICODE_STRING AccountNames
= NULL
;
1772 ULONG SidsBufferLength
;
1775 NTSTATUS Status
= STATUS_SUCCESS
;
1779 TranslatedSids
->Entries
= 0;
1780 TranslatedSids
->Sids
= NULL
;
1781 *ReferencedDomains
= NULL
;
1783 SidsBufferLength
= Count
* sizeof(LSAPR_TRANSLATED_SID_EX2
);
1784 SidsBuffer
= MIDL_user_allocate(SidsBufferLength
);
1785 if (SidsBuffer
== NULL
)
1788 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1792 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
1793 if (DomainsBuffer
== NULL
)
1796 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1800 DomainsBuffer
->Domains
= MIDL_user_allocate(Count
* sizeof(LSA_TRUST_INFORMATION
));
1801 if (DomainsBuffer
->Domains
== NULL
)
1804 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1807 DomainsBuffer
->Entries
= 0;
1808 DomainsBuffer
->MaxEntries
= Count
;
1810 for (i
= 0; i
< Count
; i
++)
1812 SidsBuffer
[i
].Use
= SidTypeUnknown
;
1813 SidsBuffer
[i
].Sid
= NULL
;
1814 SidsBuffer
[i
].DomainIndex
= -1;
1815 SidsBuffer
[i
].Flags
= 0;
1818 Status
= LsapSplitNames(Count
,
1822 if (!NT_SUCCESS(Status
))
1824 TRACE("LsapSplitNames failed! (Status %lx)\n", Status
);
1829 Status
= LsapLookupIsolatedNames(Count
,
1835 if (!NT_SUCCESS(Status
) &&
1836 Status
!= STATUS_NONE_MAPPED
&&
1837 Status
!= STATUS_SOME_NOT_MAPPED
)
1839 TRACE("LsapLookupIsolatedNames failed! (Status %lx)\n", Status
);
1843 if (Mapped
== Count
)
1847 Status
= LsapLookupIsolatedBuiltinNames(Count
,
1853 if (!NT_SUCCESS(Status
) &&
1854 Status
!= STATUS_NONE_MAPPED
&&
1855 Status
!= STATUS_SOME_NOT_MAPPED
)
1857 TRACE("LsapLookupIsolatedBuiltinNames failed! (Status %lx)\n", Status
);
1861 if (Mapped
== Count
)
1865 Status
= LsapLookupIsolatedAccountNames(Count
,
1871 if (!NT_SUCCESS(Status
) &&
1872 Status
!= STATUS_NONE_MAPPED
&&
1873 Status
!= STATUS_SOME_NOT_MAPPED
)
1875 TRACE("LsapLookupIsolatedAccountNames failed! (Status %lx)\n", Status
);
1879 if (Mapped
== Count
)
1882 Status
= LsapLookupFullyQualifiedWellKnownNames(Count
,
1888 if (!NT_SUCCESS(Status
) &&
1889 Status
!= STATUS_NONE_MAPPED
&&
1890 Status
!= STATUS_SOME_NOT_MAPPED
)
1892 TRACE("LsapLookupFullyQualifiedWellKnownNames failed! (Status %lx)\n", Status
);
1896 if (Mapped
== Count
)
1899 Status
= LsapLookupBuiltinNames(Count
,
1905 if (!NT_SUCCESS(Status
) &&
1906 Status
!= STATUS_NONE_MAPPED
&&
1907 Status
!= STATUS_SOME_NOT_MAPPED
)
1909 TRACE("LsapLookupBuiltinNames failed! (Status %lx)\n", Status
);
1913 if (Mapped
== Count
)
1917 Status
= LsapLookupAccountNames(Count
,
1923 if (!NT_SUCCESS(Status
) &&
1924 Status
!= STATUS_NONE_MAPPED
&&
1925 Status
!= STATUS_SOME_NOT_MAPPED
)
1927 TRACE("LsapLookupAccountNames failed! (Status %lx)\n", Status
);
1931 if (Mapped
== Count
)
1935 // TRACE("done: Status %lx\n", Status);
1937 if (DomainNames
!= NULL
)
1939 //TRACE("Free DomainNames\n");
1940 for (i
= 0; i
< Count
; i
++)
1942 if (DomainNames
[i
].Buffer
!= NULL
)
1943 MIDL_user_free(DomainNames
[i
].Buffer
);
1946 MIDL_user_free(DomainNames
);
1949 if (AccountNames
!= NULL
)
1951 //TRACE("Free AccountNames\n");
1952 for (i
= 0; i
< Count
; i
++)
1954 //TRACE("i: %lu\n", i);
1955 if (AccountNames
[i
].Buffer
!= NULL
)
1957 MIDL_user_free(AccountNames
[i
].Buffer
);
1961 MIDL_user_free(AccountNames
);
1964 if (!NT_SUCCESS(Status
))
1966 //TRACE("Failure!\n");
1968 //TRACE("Free DomainsBuffer\n");
1969 if (DomainsBuffer
!= NULL
)
1971 if (DomainsBuffer
->Domains
!= NULL
)
1972 MIDL_user_free(DomainsBuffer
->Domains
);
1974 MIDL_user_free(DomainsBuffer
);
1977 //TRACE("Free SidsBuffer\n");
1978 if (SidsBuffer
!= NULL
)
1979 MIDL_user_free(SidsBuffer
);
1983 //TRACE("Success!\n");
1985 *ReferencedDomains
= DomainsBuffer
;
1986 TranslatedSids
->Entries
= Count
;
1987 TranslatedSids
->Sids
= SidsBuffer
;
1988 *MappedCount
= Mapped
;
1991 Status
= STATUS_NONE_MAPPED
;
1992 else if (Mapped
< Count
)
1993 Status
= STATUS_SOME_NOT_MAPPED
;
1996 // TRACE("done: Status %lx\n", Status);
2003 LsapLookupWellKnownSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2004 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2005 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2008 PWELL_KNOWN_SID ptr
, ptr2
;
2009 LPWSTR SidString
= NULL
;
2012 NTSTATUS Status
= STATUS_SUCCESS
;
2014 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2016 /* Ignore SIDs which are already mapped */
2017 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2020 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2021 TRACE("Mapping SID: %S\n", SidString
);
2022 LocalFree(SidString
);
2025 ptr
= LsapLookupWellKnownSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2028 NamesBuffer
[i
].Use
= ptr
->Use
;
2029 NamesBuffer
[i
].Flags
= 0;
2031 NamesBuffer
[i
].Name
.Length
= ptr
->AccountName
.Length
;
2032 NamesBuffer
[i
].Name
.MaximumLength
= ptr
->AccountName
.MaximumLength
;
2033 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(ptr
->AccountName
.MaximumLength
);
2034 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2036 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2040 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, ptr
->AccountName
.Buffer
, ptr
->AccountName
.MaximumLength
);
2042 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
2045 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2049 if (!NT_SUCCESS(Status
))
2052 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2055 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2067 LsapLookupBuiltinDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2068 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2069 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2072 SAMPR_HANDLE ServerHandle
= NULL
;
2073 SAMPR_HANDLE DomainHandle
= NULL
;
2074 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2075 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2076 LPWSTR SidString
= NULL
;
2078 ULONG RelativeIds
[1];
2080 NTSTATUS Status
= STATUS_SUCCESS
;
2082 Status
= SamrConnect(NULL
,
2084 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2085 if (!NT_SUCCESS(Status
))
2087 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2091 Status
= SamrOpenDomain(ServerHandle
,
2095 if (!NT_SUCCESS(Status
))
2097 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2101 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2103 /* Ignore SIDs which are already mapped */
2104 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2107 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2108 TRACE("Mapping SID: %S\n", SidString
);
2109 LocalFree(SidString
);
2112 if (RtlEqualSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2114 TRACE("Found builtin domain!\n");
2116 NamesBuffer
[i
].Use
= SidTypeDomain
;
2117 NamesBuffer
[i
].Flags
= 0;
2119 NamesBuffer
[i
].Name
.Length
= BuiltinDomainName
.Length
;
2120 NamesBuffer
[i
].Name
.MaximumLength
= BuiltinDomainName
.MaximumLength
;
2121 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(BuiltinDomainName
.MaximumLength
);
2122 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2124 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2128 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, BuiltinDomainName
.Buffer
, BuiltinDomainName
.MaximumLength
);
2130 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2134 if (!NT_SUCCESS(Status
))
2137 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2139 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2143 else if (LsapIsPrefixSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2145 TRACE("Found builtin domain account!\n");
2147 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2149 Status
= SamrLookupIdsInDomain(DomainHandle
,
2154 if (NT_SUCCESS(Status
))
2156 NamesBuffer
[i
].Use
= Use
.Element
[0];
2157 NamesBuffer
[i
].Flags
= 0;
2159 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2160 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2161 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2162 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2164 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2165 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2167 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2171 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2172 Names
.Element
[0].Buffer
,
2173 Names
.Element
[0].MaximumLength
);
2175 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2176 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2178 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2182 if (!NT_SUCCESS(Status
))
2185 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2187 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2195 if (DomainHandle
!= NULL
)
2196 SamrCloseHandle(&DomainHandle
);
2198 if (ServerHandle
!= NULL
)
2199 SamrCloseHandle(&ServerHandle
);
2206 LsapLookupAccountDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2207 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2208 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2211 SAMPR_HANDLE ServerHandle
= NULL
;
2212 SAMPR_HANDLE DomainHandle
= NULL
;
2213 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2214 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2215 LPWSTR SidString
= NULL
;
2217 ULONG RelativeIds
[1];
2219 NTSTATUS Status
= STATUS_SUCCESS
;
2221 Status
= SamrConnect(NULL
,
2223 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2224 if (!NT_SUCCESS(Status
))
2226 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2230 Status
= SamrOpenDomain(ServerHandle
,
2234 if (!NT_SUCCESS(Status
))
2236 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2240 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2242 /* Ignore SIDs which are already mapped */
2243 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2246 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2247 TRACE("Mapping SID: %S\n", SidString
);
2248 LocalFree(SidString
);
2251 if (RtlEqualSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2253 TRACE("Found account domain!\n");
2255 NamesBuffer
[i
].Use
= SidTypeDomain
;
2256 NamesBuffer
[i
].Flags
= 0;
2258 NamesBuffer
[i
].Name
.Length
= AccountDomainName
.Length
;
2259 NamesBuffer
[i
].Name
.MaximumLength
= AccountDomainName
.MaximumLength
;
2260 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(AccountDomainName
.MaximumLength
);
2261 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2263 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2267 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, AccountDomainName
.Buffer
, AccountDomainName
.MaximumLength
);
2269 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2273 if (!NT_SUCCESS(Status
))
2276 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2278 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2282 else if (LsapIsPrefixSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2284 TRACE("Found account domain account!\n");
2286 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2288 Status
= SamrLookupIdsInDomain(DomainHandle
,
2293 if (NT_SUCCESS(Status
))
2295 NamesBuffer
[i
].Use
= Use
.Element
[0];
2296 NamesBuffer
[i
].Flags
= 0;
2298 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2299 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2300 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2301 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2303 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2304 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2306 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2310 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2311 Names
.Element
[0].Buffer
,
2312 Names
.Element
[0].MaximumLength
);
2314 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2315 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2317 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2321 if (!NT_SUCCESS(Status
))
2324 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2326 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2334 if (DomainHandle
!= NULL
)
2335 SamrCloseHandle(&DomainHandle
);
2337 if (ServerHandle
!= NULL
)
2338 SamrCloseHandle(&ServerHandle
);
2345 LsapLookupSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2346 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
2347 PLSAPR_TRANSLATED_NAMES_EX TranslatedNames
,
2348 LSAP_LOOKUP_LEVEL LookupLevel
,
2350 DWORD LookupOptions
,
2351 DWORD ClientRevision
)
2353 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
2354 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
= NULL
;
2355 ULONG NamesBufferLength
;
2358 NTSTATUS Status
= STATUS_SUCCESS
;
2360 NamesBufferLength
= SidEnumBuffer
->Entries
* sizeof(LSAPR_TRANSLATED_NAME_EX
);
2361 NamesBuffer
= MIDL_user_allocate(NamesBufferLength
);
2362 if (NamesBuffer
== NULL
)
2364 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2368 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
2369 if (DomainsBuffer
== NULL
)
2371 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2375 DomainsBuffer
->Domains
= MIDL_user_allocate(SidEnumBuffer
->Entries
* sizeof(LSA_TRUST_INFORMATION
));
2376 if (DomainsBuffer
->Domains
== NULL
)
2378 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2382 DomainsBuffer
->Entries
= 0;
2383 DomainsBuffer
->MaxEntries
= SidEnumBuffer
->Entries
;
2385 /* Initialize all name entries */
2386 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2388 NamesBuffer
[i
].Use
= SidTypeUnknown
;
2389 NamesBuffer
[i
].Name
.Length
= 0;
2390 NamesBuffer
[i
].Name
.MaximumLength
= 0;
2391 NamesBuffer
[i
].Name
.Buffer
= NULL
;
2392 NamesBuffer
[i
].DomainIndex
= -1;
2393 NamesBuffer
[i
].Flags
= 0;
2396 /* Look-up well-known SIDs */
2397 Status
= LsapLookupWellKnownSids(SidEnumBuffer
,
2401 if (!NT_SUCCESS(Status
) &&
2402 Status
!= STATUS_NONE_MAPPED
&&
2403 Status
!= STATUS_SOME_NOT_MAPPED
)
2406 if (Mapped
== SidEnumBuffer
->Entries
)
2409 /* Look-up builtin domain SIDs */
2410 Status
= LsapLookupBuiltinDomainSids(SidEnumBuffer
,
2414 if (!NT_SUCCESS(Status
) &&
2415 Status
!= STATUS_NONE_MAPPED
&&
2416 Status
!= STATUS_SOME_NOT_MAPPED
)
2419 if (Mapped
== SidEnumBuffer
->Entries
)
2422 /* Look-up account domain SIDs */
2423 Status
= LsapLookupAccountDomainSids(SidEnumBuffer
,
2427 if (!NT_SUCCESS(Status
) &&
2428 Status
!= STATUS_NONE_MAPPED
&&
2429 Status
!= STATUS_SOME_NOT_MAPPED
)
2432 if (Mapped
== SidEnumBuffer
->Entries
)
2436 TRACE("done Status: %lx Mapped: %lu\n", Status
, Mapped
);
2438 if (!NT_SUCCESS(Status
))
2440 if (DomainsBuffer
!= NULL
)
2442 if (DomainsBuffer
->Domains
!= NULL
)
2443 MIDL_user_free(DomainsBuffer
->Domains
);
2445 MIDL_user_free(DomainsBuffer
);
2448 if (NamesBuffer
!= NULL
)
2449 MIDL_user_free(NamesBuffer
);
2453 *ReferencedDomains
= DomainsBuffer
;
2454 TranslatedNames
->Entries
= SidEnumBuffer
->Entries
;
2455 TranslatedNames
->Names
= NamesBuffer
;
2456 *MappedCount
= Mapped
;
2459 Status
= STATUS_NONE_MAPPED
;
2460 else if (Mapped
< SidEnumBuffer
->Entries
)
2461 Status
= STATUS_SOME_NOT_MAPPED
;