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
11 WINE_DEFAULT_DEBUG_CHANNEL(lsasrv
);
13 typedef wchar_t *PSAMPR_SERVER_NAME
;
14 typedef void *SAMPR_HANDLE
;
16 typedef struct _SAMPR_RETURNED_USTRING_ARRAY
19 PRPC_UNICODE_STRING Element
;
20 } SAMPR_RETURNED_USTRING_ARRAY
, *PSAMPR_RETURNED_USTRING_ARRAY
;
22 typedef struct _SAMPR_ULONG_ARRAY
25 unsigned long *Element
;
26 } SAMPR_ULONG_ARRAY
, *PSAMPR_ULONG_ARRAY
;
31 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(PSAMPR_RETURNED_USTRING_ARRAY Ptr
);
35 SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr
);
39 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
40 OUT SAMPR_HANDLE
*ServerHandle
,
41 IN ACCESS_MASK DesiredAccess
);
45 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
);
49 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
50 IN ACCESS_MASK DesiredAccess
,
52 OUT SAMPR_HANDLE
*DomainHandle
);
56 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
58 IN ULONG
*RelativeIds
,
59 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
60 OUT PSAMPR_ULONG_ARRAY Use
);
64 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
66 IN RPC_UNICODE_STRING Names
[],
67 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
68 OUT PSAMPR_ULONG_ARRAY Use
);
71 typedef struct _WELL_KNOWN_SID
75 UNICODE_STRING AccountName
;
76 UNICODE_STRING DomainName
;
78 } WELL_KNOWN_SID
, *PWELL_KNOWN_SID
;
81 LIST_ENTRY WellKnownSidListHead
;
84 typedef struct _AccountSid
86 WELL_KNOWN_SID_TYPE type
;
89 SID_NAME_USE name_use
;
92 static const WCHAR Account_Operators
[] = { 'A','c','c','o','u','n','t',' ','O','p','e','r','a','t','o','r','s',0 };
93 static const WCHAR Administrator
[] = {'A','d','m','i','n','i','s','t','r','a','t','o','r',0 };
94 static const WCHAR Administrators
[] = { 'A','d','m','i','n','i','s','t','r','a','t','o','r','s',0 };
95 static const WCHAR ANONYMOUS_LOGON
[] = { 'A','N','O','N','Y','M','O','U','S',' ','L','O','G','O','N',0 };
96 static const WCHAR Authenticated_Users
[] = { 'A','u','t','h','e','n','t','i','c','a','t','e','d',' ','U','s','e','r','s',0 };
97 static const WCHAR Backup_Operators
[] = { 'B','a','c','k','u','p',' ','O','p','e','r','a','t','o','r','s',0 };
98 static const WCHAR BATCH
[] = { 'B','A','T','C','H',0 };
99 static const WCHAR Blank
[] = { 0 };
100 static const WCHAR BUILTIN
[] = { 'B','U','I','L','T','I','N',0 };
101 static const WCHAR Cert_Publishers
[] = { 'C','e','r','t',' ','P','u','b','l','i','s','h','e','r','s',0 };
102 static const WCHAR CREATOR_GROUP
[] = { 'C','R','E','A','T','O','R',' ','G','R','O','U','P',0 };
103 static const WCHAR CREATOR_GROUP_SERVER
[] = { 'C','R','E','A','T','O','R',' ','G','R','O','U','P',' ','S','E','R','V','E','R',0 };
104 static const WCHAR CREATOR_OWNER
[] = { 'C','R','E','A','T','O','R',' ','O','W','N','E','R',0 };
105 static const WCHAR CREATOR_OWNER_SERVER
[] = { 'C','R','E','A','T','O','R',' ','O','W','N','E','R',' ','S','E','R','V','E','R',0 };
106 static const WCHAR DIALUP
[] = { 'D','I','A','L','U','P',0 };
107 static const WCHAR Digest_Authentication
[] = { 'D','i','g','e','s','t',' ','A','u','t','h','e','n','t','i','c','a','t','i','o','n',0 };
108 static const WCHAR DOMAIN
[] = {'D','O','M','A','I','N',0};
109 static const WCHAR Domain_Admins
[] = { 'D','o','m','a','i','n',' ','A','d','m','i','n','s',0 };
110 static const WCHAR Domain_Computers
[] = { 'D','o','m','a','i','n',' ','C','o','m','p','u','t','e','r','s',0 };
111 static const WCHAR Domain_Controllers
[] = { 'D','o','m','a','i','n',' ','C','o','n','t','r','o','l','l','e','r','s',0 };
112 static const WCHAR Domain_Guests
[] = { 'D','o','m','a','i','n',' ','G','u','e','s','t','s',0 };
113 static const WCHAR Domain_Users
[] = { 'D','o','m','a','i','n',' ','U','s','e','r','s',0 };
114 static const WCHAR Enterprise_Admins
[] = { 'E','n','t','e','r','p','r','i','s','e',' ','A','d','m','i','n','s',0 };
115 static const WCHAR ENTERPRISE_DOMAIN_CONTROLLERS
[] = { 'E','N','T','E','R','P','R','I','S','E',' ','D','O','M','A','I','N',' ','C','O','N','T','R','O','L','L','E','R','S',0 };
116 static const WCHAR Everyone
[] = { 'E','v','e','r','y','o','n','e',0 };
117 static const WCHAR Group_Policy_Creator_Owners
[] = { 'G','r','o','u','p',' ','P','o','l','i','c','y',' ','C','r','e','a','t','o','r',' ','O','w','n','e','r','s',0 };
118 static const WCHAR Guest
[] = { 'G','u','e','s','t',0 };
119 static const WCHAR Guests
[] = { 'G','u','e','s','t','s',0 };
120 static const WCHAR INTERACTIVE
[] = { 'I','N','T','E','R','A','C','T','I','V','E',0 };
121 static const WCHAR LOCAL
[] = { 'L','O','C','A','L',0 };
122 static const WCHAR LOCAL_SERVICE
[] = { 'L','O','C','A','L',' ','S','E','R','V','I','C','E',0 };
123 static const WCHAR NETWORK
[] = { 'N','E','T','W','O','R','K',0 };
124 static const WCHAR Network_Configuration_Operators
[] = { 'N','e','t','w','o','r','k',' ','C','o','n','f','i','g','u','r','a','t','i','o','n',' ','O','p','e','r','a','t','o','r','s',0 };
125 static const WCHAR NETWORK_SERVICE
[] = { 'N','E','T','W','O','R','K',' ','S','E','R','V','I','C','E',0 };
126 static const WCHAR NT_AUTHORITY
[] = { 'N','T',' ','A','U','T','H','O','R','I','T','Y',0 };
127 static const WCHAR NT_Pseudo_Domain
[] = { 'N','T',' ','P','s','e','u','d','o',' ','D','o','m','a','i','n',0 };
128 static const WCHAR NTML_Authentication
[] = { 'N','T','M','L',' ','A','u','t','h','e','n','t','i','c','a','t','i','o','n',0 };
129 static const WCHAR NULL_SID
[] = { 'N','U','L','L',' ','S','I','D',0 };
130 static const WCHAR Other_Organization
[] = { 'O','t','h','e','r',' ','O','r','g','a','n','i','z','a','t','i','o','n',0 };
131 static const WCHAR Performance_Log_Users
[] = { 'P','e','r','f','o','r','m','a','n','c','e',' ','L','o','g',' ','U','s','e','r','s',0 };
132 static const WCHAR Performance_Monitor_Users
[] = { 'P','e','r','f','o','r','m','a','n','c','e',' ','M','o','n','i','t','o','r',' ','U','s','e','r','s',0 };
133 static const WCHAR Power_Users
[] = { 'P','o','w','e','r',' ','U','s','e','r','s',0 };
134 static const WCHAR Pre_Windows_2000_Compatible_Access
[] = { 'P','r','e','-','W','i','n','d','o','w','s',' ','2','0','0','0',' ','C','o','m','p','a','t','i','b','l','e',' ','A','c','c','e','s','s',0 };
135 static const WCHAR Print_Operators
[] = { 'P','r','i','n','t',' ','O','p','e','r','a','t','o','r','s',0 };
136 static const WCHAR PROXY
[] = { 'P','R','O','X','Y',0 };
137 static const WCHAR RAS_and_IAS_Servers
[] = { 'R','A','S',' ','a','n','d',' ','I','A','S',' ','S','e','r','v','e','r','s',0 };
138 static const WCHAR Remote_Desktop_Users
[] = { 'R','e','m','o','t','e',' ','D','e','s','k','t','o','p',' ','U','s','e','r','s',0 };
139 static const WCHAR REMOTE_INTERACTIVE_LOGON
[] = { 'R','E','M','O','T','E',' ','I','N','T','E','R','A','C','T','I','V','E',' ','L','O','G','O','N',0 };
140 static const WCHAR Replicators
[] = { 'R','e','p','l','i','c','a','t','o','r','s',0 };
141 static const WCHAR RESTRICTED
[] = { 'R','E','S','T','R','I','C','T','E','D',0 };
142 static const WCHAR SChannel_Authentication
[] = { 'S','C','h','a','n','n','e','l',' ','A','u','t','h','e','n','t','i','c','a','t','i','o','n',0 };
143 static const WCHAR Schema_Admins
[] = { 'S','c','h','e','m','a',' ','A','d','m','i','n','s',0 };
144 static const WCHAR SELF
[] = { 'S','E','L','F',0 };
145 static const WCHAR Server_Operators
[] = { 'S','e','r','v','e','r',' ','O','p','e','r','a','t','o','r','s',0 };
146 static const WCHAR SERVICE
[] = { 'S','E','R','V','I','C','E',0 };
147 static const WCHAR SYSTEM
[] = { 'S','Y','S','T','E','M',0 };
148 static const WCHAR TERMINAL_SERVER_USER
[] = { 'T','E','R','M','I','N','A','L',' ','S','E','R','V','E','R',' ','U','S','E','R',0 };
149 static const WCHAR This_Organization
[] = { 'T','h','i','s',' ','O','r','g','a','n','i','z','a','t','i','o','n',0 };
150 static const WCHAR Users
[] = { 'U','s','e','r','s',0 };
152 static const AccountSid ACCOUNT_SIDS
[] = {
153 // { WinNullSid, NULL_SID, Blank, SidTypeWellKnownGroup },
154 // { WinWorldSid, Everyone, Blank, SidTypeWellKnownGroup },
155 // { WinLocalSid, LOCAL, Blank, SidTypeWellKnownGroup },
156 // { WinCreatorOwnerSid, CREATOR_OWNER, Blank, SidTypeWellKnownGroup },
157 // { WinCreatorGroupSid, CREATOR_GROUP, Blank, SidTypeWellKnownGroup },
158 // { WinCreatorOwnerServerSid, CREATOR_OWNER_SERVER, Blank, SidTypeWellKnownGroup },
159 // { WinCreatorGroupServerSid, CREATOR_GROUP_SERVER, Blank, SidTypeWellKnownGroup },
160 // { WinNtAuthoritySid, NT_Pseudo_Domain, NT_Pseudo_Domain, SidTypeDomain },
161 // { WinDialupSid, DIALUP, NT_AUTHORITY, SidTypeWellKnownGroup },
162 // { WinNetworkSid, NETWORK, NT_AUTHORITY, SidTypeWellKnownGroup },
163 // { WinBatchSid, BATCH, NT_AUTHORITY, SidTypeWellKnownGroup },
164 // { WinInteractiveSid, INTERACTIVE, NT_AUTHORITY, SidTypeWellKnownGroup },
165 // { WinServiceSid, SERVICE, NT_AUTHORITY, SidTypeWellKnownGroup },
166 // { WinAnonymousSid, ANONYMOUS_LOGON, NT_AUTHORITY, SidTypeWellKnownGroup },
167 // { WinProxySid, PROXY, NT_AUTHORITY, SidTypeWellKnownGroup },
168 // { WinEnterpriseControllersSid, ENTERPRISE_DOMAIN_CONTROLLERS, NT_AUTHORITY, SidTypeWellKnownGroup },
169 // { WinSelfSid, SELF, NT_AUTHORITY, SidTypeWellKnownGroup },
170 // { WinAuthenticatedUserSid, Authenticated_Users, NT_AUTHORITY, SidTypeWellKnownGroup },
171 // { WinRestrictedCodeSid, RESTRICTED, NT_AUTHORITY, SidTypeWellKnownGroup },
172 // { WinTerminalServerSid, TERMINAL_SERVER_USER, NT_AUTHORITY, SidTypeWellKnownGroup },
173 // { WinRemoteLogonIdSid, REMOTE_INTERACTIVE_LOGON, NT_AUTHORITY, SidTypeWellKnownGroup },
174 // { WinLocalSystemSid, SYSTEM, NT_AUTHORITY, SidTypeWellKnownGroup },
175 // { WinLocalServiceSid, LOCAL_SERVICE, NT_AUTHORITY, SidTypeWellKnownGroup },
176 // { WinNetworkServiceSid, NETWORK_SERVICE, NT_AUTHORITY, SidTypeWellKnownGroup },
177 // { WinBuiltinDomainSid, BUILTIN, BUILTIN, SidTypeDomain },
178 // { WinBuiltinAdministratorsSid, Administrators, BUILTIN, SidTypeAlias },
179 // { WinBuiltinUsersSid, Users, BUILTIN, SidTypeAlias },
180 // { WinBuiltinGuestsSid, Guests, BUILTIN, SidTypeAlias },
181 // { WinBuiltinPowerUsersSid, Power_Users, BUILTIN, SidTypeAlias },
182 // { WinBuiltinAccountOperatorsSid, Account_Operators, BUILTIN, SidTypeAlias },
183 // { WinBuiltinSystemOperatorsSid, Server_Operators, BUILTIN, SidTypeAlias },
184 // { WinBuiltinPrintOperatorsSid, Print_Operators, BUILTIN, SidTypeAlias },
185 // { WinBuiltinBackupOperatorsSid, Backup_Operators, BUILTIN, SidTypeAlias },
186 // { WinBuiltinReplicatorSid, Replicators, BUILTIN, SidTypeAlias },
187 // { WinBuiltinPreWindows2000CompatibleAccessSid, Pre_Windows_2000_Compatible_Access, BUILTIN, SidTypeAlias },
188 // { WinBuiltinRemoteDesktopUsersSid, Remote_Desktop_Users, BUILTIN, SidTypeAlias },
189 // { WinBuiltinNetworkConfigurationOperatorsSid, Network_Configuration_Operators, BUILTIN, SidTypeAlias },
190 { WinNTLMAuthenticationSid
, NTML_Authentication
, NT_AUTHORITY
, SidTypeWellKnownGroup
},
191 { WinDigestAuthenticationSid
, Digest_Authentication
, NT_AUTHORITY
, SidTypeWellKnownGroup
},
192 { WinSChannelAuthenticationSid
, SChannel_Authentication
, NT_AUTHORITY
, SidTypeWellKnownGroup
},
193 // { WinThisOrganizationSid, This_Organization, NT_AUTHORITY, SidTypeWellKnownGroup },
194 { WinOtherOrganizationSid
, Other_Organization
, NT_AUTHORITY
, SidTypeWellKnownGroup
},
195 { WinBuiltinPerfMonitoringUsersSid
, Performance_Monitor_Users
, BUILTIN
, SidTypeAlias
},
196 { WinBuiltinPerfLoggingUsersSid
, Performance_Log_Users
, BUILTIN
, SidTypeAlias
},
202 LsapCreateSid(PSID_IDENTIFIER_AUTHORITY IdentifierAuthority
,
203 UCHAR SubAuthorityCount
,
204 PULONG SubAuthorities
,
209 PWELL_KNOWN_SID SidEntry
;
213 SidEntry
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WELL_KNOWN_SID
));
214 if (SidEntry
== NULL
)
217 InitializeListHead(&SidEntry
->ListEntry
);
219 SidEntry
->Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
221 RtlLengthRequiredSid(SubAuthorityCount
));
222 if (SidEntry
->Sid
== NULL
)
224 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
228 RtlInitializeSid(SidEntry
->Sid
,
232 for (i
= 0; i
< (ULONG
)SubAuthorityCount
; i
++)
234 p
= RtlSubAuthoritySid(SidEntry
->Sid
, i
);
235 *p
= SubAuthorities
[i
];
238 RtlInitUnicodeString(&SidEntry
->AccountName
,
241 RtlInitUnicodeString(&SidEntry
->DomainName
,
246 InsertTailList(&WellKnownSidListHead
,
247 &SidEntry
->ListEntry
);
256 ULONG SubAuthorities
[8];
258 InitializeListHead(&WellKnownSidListHead
);
261 LsapCreateSid(&NtAuthority
,
269 SubAuthorities
[0] = SECURITY_NULL_RID
;
270 LsapCreateSid(&NullSidAuthority
,
275 SidTypeWellKnownGroup
);
278 SubAuthorities
[0] = SECURITY_WORLD_RID
;
279 LsapCreateSid(&WorldSidAuthority
,
284 SidTypeWellKnownGroup
);
287 SubAuthorities
[0] = SECURITY_LOCAL_RID
;
288 LsapCreateSid(&LocalSidAuthority
,
293 SidTypeWellKnownGroup
);
295 /* Creator Owner Sid */
296 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_RID
;
297 LsapCreateSid(&CreatorSidAuthority
,
302 SidTypeWellKnownGroup
);
304 /* Creator Group Sid */
305 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_RID
;
306 LsapCreateSid(&CreatorSidAuthority
,
311 SidTypeWellKnownGroup
);
313 /* Creator Owner Server Sid */
314 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_SERVER_RID
;
315 LsapCreateSid(&CreatorSidAuthority
,
318 L
"CREATOR OWNER SERVER",
320 SidTypeWellKnownGroup
);
322 /* Creator Group Server Sid */
323 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_SERVER_RID
;
324 LsapCreateSid(&CreatorSidAuthority
,
327 L
"CREATOR GROUP SERVER",
329 SidTypeWellKnownGroup
);
332 SubAuthorities
[0] = SECURITY_DIALUP_RID
;
333 LsapCreateSid(&NtAuthority
,
338 SidTypeWellKnownGroup
);
341 SubAuthorities
[0] = SECURITY_NETWORK_RID
;
342 LsapCreateSid(&NtAuthority
,
347 SidTypeWellKnownGroup
);
350 SubAuthorities
[0] = SECURITY_BATCH_RID
;
351 LsapCreateSid(&NtAuthority
,
356 SidTypeWellKnownGroup
);
358 /* Interactive Sid */
359 SubAuthorities
[0] = SECURITY_INTERACTIVE_RID
;
360 LsapCreateSid(&NtAuthority
,
365 SidTypeWellKnownGroup
);
368 SubAuthorities
[0] = SECURITY_SERVICE_RID
;
369 LsapCreateSid(&NtAuthority
,
374 SidTypeWellKnownGroup
);
376 /* Anonymous Logon Sid */
377 SubAuthorities
[0] = SECURITY_ANONYMOUS_LOGON_RID
;
378 LsapCreateSid(&NtAuthority
,
383 SidTypeWellKnownGroup
);
386 SubAuthorities
[0] = SECURITY_PROXY_RID
;
387 LsapCreateSid(&NtAuthority
,
392 SidTypeWellKnownGroup
);
394 /* Enterprise Controllers Sid */
395 SubAuthorities
[0] = SECURITY_ENTERPRISE_CONTROLLERS_RID
;
396 LsapCreateSid(&NtAuthority
,
399 L
"ENTERPRISE DOMAIN CONTROLLERS",
401 SidTypeWellKnownGroup
);
403 /* Principal Self Sid */
404 SubAuthorities
[0] = SECURITY_PRINCIPAL_SELF_RID
;
405 LsapCreateSid(&NtAuthority
,
410 SidTypeWellKnownGroup
);
412 /* Authenticated Users Sid */
413 SubAuthorities
[0] = SECURITY_AUTHENTICATED_USER_RID
;
414 LsapCreateSid(&NtAuthority
,
417 L
"Authenticated Users",
419 SidTypeWellKnownGroup
);
421 /* Restricted Code Sid */
422 SubAuthorities
[0] = SECURITY_RESTRICTED_CODE_RID
;
423 LsapCreateSid(&NtAuthority
,
428 SidTypeWellKnownGroup
);
430 /* Terminal Server Sid */
431 SubAuthorities
[0] = SECURITY_TERMINAL_SERVER_RID
;
432 LsapCreateSid(&NtAuthority
,
435 L
"TERMINAL SERVER USER",
437 SidTypeWellKnownGroup
);
439 /* Remote Logon Sid */
440 SubAuthorities
[0] = SECURITY_REMOTE_LOGON_RID
;
441 LsapCreateSid(&NtAuthority
,
444 L
"REMOTE INTERACTIVE LOGON",
446 SidTypeWellKnownGroup
);
448 /* This Organization Sid */
449 SubAuthorities
[0] = SECURITY_THIS_ORGANIZATION_RID
;
450 LsapCreateSid(&NtAuthority
,
453 L
"This Organization",
455 SidTypeWellKnownGroup
);
457 /* Local System Sid */
458 SubAuthorities
[0] = SECURITY_LOCAL_SYSTEM_RID
;
459 LsapCreateSid(&NtAuthority
,
464 SidTypeWellKnownGroup
);
466 /* Local Service Sid */
467 SubAuthorities
[0] = SECURITY_LOCAL_SERVICE_RID
;
468 LsapCreateSid(&NtAuthority
,
473 SidTypeWellKnownGroup
);
475 LsapCreateSid(&NtAuthority
,
480 SidTypeWellKnownGroup
);
482 /* Network Service Sid */
483 SubAuthorities
[0] = SECURITY_NETWORK_SERVICE_RID
;
484 LsapCreateSid(&NtAuthority
,
489 SidTypeWellKnownGroup
);
491 LsapCreateSid(&NtAuthority
,
496 SidTypeWellKnownGroup
);
498 /* Builtin Domain Sid */
499 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
500 LsapCreateSid(&NtAuthority
,
507 /* Administrators Alias Sid */
508 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
509 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ADMINS
;
510 LsapCreateSid(&NtAuthority
,
517 /* Users Alias Sid */
518 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
519 SubAuthorities
[1] = DOMAIN_ALIAS_RID_USERS
;
520 LsapCreateSid(&NtAuthority
,
527 /* Guests Alias Sid */
528 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
529 SubAuthorities
[1] = DOMAIN_ALIAS_RID_GUESTS
;
530 LsapCreateSid(&NtAuthority
,
537 /* Power User Alias Sid */
538 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
539 SubAuthorities
[1] = DOMAIN_ALIAS_RID_POWER_USERS
;
540 LsapCreateSid(&NtAuthority
,
547 /* Account Operators Alias Sid */
548 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
549 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ACCOUNT_OPS
;
550 LsapCreateSid(&NtAuthority
,
553 L
"Account Operators",
557 /* System Operators Alias Sid */
558 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
559 SubAuthorities
[1] = DOMAIN_ALIAS_RID_SYSTEM_OPS
;
560 LsapCreateSid(&NtAuthority
,
567 /* Print Operators Alias Sid */
568 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
569 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PRINT_OPS
;
570 LsapCreateSid(&NtAuthority
,
577 /* Backup Operators Alias Sid */
578 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
579 SubAuthorities
[1] = DOMAIN_ALIAS_RID_BACKUP_OPS
;
580 LsapCreateSid(&NtAuthority
,
587 /* Replicators Alias Sid */
588 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
589 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REPLICATOR
;
590 LsapCreateSid(&NtAuthority
,
598 /* RAS Servers Alias Sid */
599 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
600 SubAuthorities
[1] = DOMAIN_ALIAS_RID_RAS_SERVERS
;
601 LsapCreateSid(&NtAuthority
,
609 /* Pre-Windows 2000 Compatible Access Alias Sid */
610 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
611 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
;
612 LsapCreateSid(&NtAuthority
,
615 L
"Pre-Windows 2000 Compatible Access",
619 /* Remote Desktop Users Alias Sid */
620 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
621 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
;
622 LsapCreateSid(&NtAuthority
,
625 L
"Remote Desktop Users",
629 /* Network Configuration Operators Alias Sid */
630 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
631 SubAuthorities
[1] = DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
;
632 LsapCreateSid(&NtAuthority
,
635 L
"Network Configuration Operators",
639 /* FIXME: Add more well known sids */
641 return STATUS_SUCCESS
;
646 LsapLookupWellKnownSid(PSID Sid
)
648 PLIST_ENTRY ListEntry
;
651 ListEntry
= WellKnownSidListHead
.Flink
;
652 while (ListEntry
!= &WellKnownSidListHead
)
654 Ptr
= CONTAINING_RECORD(ListEntry
,
657 if (RtlEqualSid(Sid
, Ptr
->Sid
))
662 ListEntry
= ListEntry
->Flink
;
670 LsapLookupIsolatedWellKnownName(PUNICODE_STRING AccountName
)
672 PLIST_ENTRY ListEntry
;
675 ListEntry
= WellKnownSidListHead
.Flink
;
676 while (ListEntry
!= &WellKnownSidListHead
)
678 Ptr
= CONTAINING_RECORD(ListEntry
,
681 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
))
686 ListEntry
= ListEntry
->Flink
;
694 LsapLookupFullyQualifiedWellKnownName(PUNICODE_STRING AccountName
,
695 PUNICODE_STRING DomainName
)
697 PLIST_ENTRY ListEntry
;
700 ListEntry
= WellKnownSidListHead
.Flink
;
701 while (ListEntry
!= &WellKnownSidListHead
)
703 Ptr
= CONTAINING_RECORD(ListEntry
,
706 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
) &&
707 RtlEqualUnicodeString(DomainName
, &Ptr
->DomainName
, TRUE
))
712 ListEntry
= ListEntry
->Flink
;
721 LsapSplitNames(DWORD Count
,
722 PRPC_UNICODE_STRING Names
,
723 PRPC_UNICODE_STRING
*DomainNames
,
724 PRPC_UNICODE_STRING
*AccountNames
)
726 PRPC_UNICODE_STRING DomainsBuffer
= NULL
;
727 PRPC_UNICODE_STRING AccountsBuffer
= NULL
;
732 NTSTATUS Status
= STATUS_SUCCESS
;
734 DomainsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
735 if (DomainsBuffer
== NULL
)
737 Status
= STATUS_INSUFFICIENT_RESOURCES
;
741 AccountsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
742 if (AccountsBuffer
== NULL
)
744 Status
= STATUS_INSUFFICIENT_RESOURCES
;
748 for (i
= 0; i
< Count
; i
++)
750 //TRACE("Name: %wZ\n", &Names[i]);
752 Ptr
= wcschr(Names
[i
].Buffer
, L
'\\');
755 AccountLength
= Names
[i
].Length
/ sizeof(WCHAR
);
757 AccountsBuffer
[i
].Length
= Names
[i
].Length
;
758 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
759 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
760 if (AccountsBuffer
[i
].Buffer
== NULL
)
762 Status
= STATUS_INSUFFICIENT_RESOURCES
;
766 CopyMemory(AccountsBuffer
[i
].Buffer
,
768 AccountsBuffer
[i
].Length
);
769 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
771 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
775 DomainLength
= (ULONG
)(ULONG_PTR
)(Ptr
- Names
[i
].Buffer
);
776 AccountLength
= (Names
[i
].Length
/ sizeof(WCHAR
)) - DomainLength
- 1;
777 //TRACE("DomainLength: %u\n", DomainLength);
778 //TRACE("AccountLength: %u\n", AccountLength);
780 if (DomainLength
> 0)
782 DomainsBuffer
[i
].Length
= (USHORT
)DomainLength
* sizeof(WCHAR
);
783 DomainsBuffer
[i
].MaximumLength
= DomainsBuffer
[i
].Length
+ sizeof(WCHAR
);
784 DomainsBuffer
[i
].Buffer
= MIDL_user_allocate(DomainsBuffer
[i
].MaximumLength
);
785 if (DomainsBuffer
[i
].Buffer
== NULL
)
787 Status
= STATUS_INSUFFICIENT_RESOURCES
;
791 CopyMemory(DomainsBuffer
[i
].Buffer
,
793 DomainsBuffer
[i
].Length
);
794 DomainsBuffer
[i
].Buffer
[DomainLength
] = UNICODE_NULL
;
796 //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
799 AccountsBuffer
[i
].Length
= (USHORT
)AccountLength
* sizeof(WCHAR
);
800 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
801 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
802 if (AccountsBuffer
[i
].Buffer
== NULL
)
804 Status
= STATUS_INSUFFICIENT_RESOURCES
;
808 CopyMemory(AccountsBuffer
[i
].Buffer
,
809 &(Names
[i
].Buffer
[DomainLength
+ 1]),
810 AccountsBuffer
[i
].Length
);
811 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
813 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
818 if (!NT_SUCCESS(Status
))
820 if (AccountsBuffer
!= NULL
)
822 for (i
= 0; i
< Count
; i
++)
824 if (AccountsBuffer
[i
].Buffer
!= NULL
)
825 MIDL_user_free(AccountsBuffer
[i
].Buffer
);
828 MIDL_user_free(AccountsBuffer
);
831 if (DomainsBuffer
!= NULL
)
833 for (i
= 0; i
< Count
; i
++)
835 if (DomainsBuffer
[i
].Buffer
!= NULL
)
836 MIDL_user_free(DomainsBuffer
[i
].Buffer
);
839 MIDL_user_free(DomainsBuffer
);
844 *DomainNames
= DomainsBuffer
;
845 *AccountNames
= AccountsBuffer
;
853 LsapAddDomainToDomainsList(PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
854 PUNICODE_STRING Name
,
861 while (i
< ReferencedDomains
->Entries
&&
862 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
864 if (RtlEqualSid(Sid
, ReferencedDomains
->Domains
[i
].Sid
))
867 return STATUS_SUCCESS
;
873 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(Sid
));
874 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
875 return STATUS_INSUFFICIENT_RESOURCES
;
877 RtlCopySid(RtlLengthSid(Sid
), ReferencedDomains
->Domains
[i
].Sid
, Sid
);
879 ReferencedDomains
->Domains
[i
].Name
.Length
= Name
->Length
;
880 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= Name
->MaximumLength
;
881 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(Name
->MaximumLength
);
882 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
884 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
885 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
886 return STATUS_INSUFFICIENT_RESOURCES
;
889 RtlCopyMemory(ReferencedDomains
->Domains
[i
].Name
.Buffer
,
891 Name
->MaximumLength
);
893 ReferencedDomains
->Entries
++;
896 return STATUS_SUCCESS
;
901 LsapIsPrefixSid(IN PSID PrefixSid
,
904 PISID Sid1
= PrefixSid
, Sid2
= Sid
;
907 if (Sid1
->Revision
!= Sid2
->Revision
)
910 if ((Sid1
->IdentifierAuthority
.Value
[0] != Sid2
->IdentifierAuthority
.Value
[0]) ||
911 (Sid1
->IdentifierAuthority
.Value
[1] != Sid2
->IdentifierAuthority
.Value
[1]) ||
912 (Sid1
->IdentifierAuthority
.Value
[2] != Sid2
->IdentifierAuthority
.Value
[2]) ||
913 (Sid1
->IdentifierAuthority
.Value
[3] != Sid2
->IdentifierAuthority
.Value
[3]) ||
914 (Sid1
->IdentifierAuthority
.Value
[4] != Sid2
->IdentifierAuthority
.Value
[4]) ||
915 (Sid1
->IdentifierAuthority
.Value
[5] != Sid2
->IdentifierAuthority
.Value
[5]))
918 if (Sid1
->SubAuthorityCount
>= Sid2
->SubAuthorityCount
)
921 if (Sid1
->SubAuthorityCount
== 0)
924 for (i
= 0; i
< Sid1
->SubAuthorityCount
; i
++)
926 if (Sid1
->SubAuthority
[i
] != Sid2
->SubAuthority
[i
])
935 LsapGetRelativeIdFromSid(PSID Sid_
)
939 if (Sid
->SubAuthorityCount
!= 0)
940 return Sid
->SubAuthority
[Sid
->SubAuthorityCount
- 1];
947 CreateSidFromSidAndRid(PSID SrcSid
,
956 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
960 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
962 DstSid
= MIDL_user_allocate(DstSidSize
);
966 RtlInitializeSid(DstSid
,
967 RtlIdentifierAuthoritySid(SrcSid
),
970 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
972 p
= RtlSubAuthoritySid(SrcSid
, i
);
973 q
= RtlSubAuthoritySid(DstSid
, i
);
977 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);
985 CreateDomainSidFromAccountSid(PSID AccountSid
)
993 RidCount
= *RtlSubAuthorityCountSid(AccountSid
);
997 DstSidSize
= RtlLengthRequiredSid(RidCount
);
999 DomainSid
= MIDL_user_allocate(DstSidSize
);
1000 if (DomainSid
== NULL
)
1003 RtlInitializeSid(DomainSid
,
1004 RtlIdentifierAuthoritySid(AccountSid
),
1007 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1009 p
= RtlSubAuthoritySid(AccountSid
, i
);
1010 q
= RtlSubAuthoritySid(DomainSid
, i
);
1019 LsapCopySid(PSID SrcSid
)
1027 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1028 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1030 DstSid
= MIDL_user_allocate(DstSidSize
);
1034 RtlInitializeSid(DstSid
,
1035 RtlIdentifierAuthoritySid(SrcSid
),
1038 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1040 p
= RtlSubAuthoritySid(SrcSid
, i
);
1041 q
= RtlSubAuthoritySid(DstSid
, i
);
1051 LsapLookupIsolatedNames(DWORD Count
,
1052 PRPC_UNICODE_STRING DomainNames
,
1053 PRPC_UNICODE_STRING AccountNames
,
1054 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1055 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1058 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1059 PWELL_KNOWN_SID ptr
, ptr2
;
1063 NTSTATUS Status
= STATUS_SUCCESS
;
1065 for (i
= 0; i
< Count
; i
++)
1067 /* Ignore names which were already mapped */
1068 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1071 /* Ignore fully qualified account names */
1072 if (DomainNames
[i
].Length
!= 0)
1075 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1077 /* Look-up all well-known names */
1078 ptr
= LsapLookupIsolatedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
]);
1081 SidsBuffer
[i
].Use
= ptr
->Use
;
1082 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1083 if (SidsBuffer
[i
].Sid
== NULL
)
1085 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1089 SidsBuffer
[i
].DomainIndex
= -1;
1090 SidsBuffer
[i
].Flags
= 0;
1092 if (ptr
->Use
== SidTypeDomain
)
1094 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1098 if (!NT_SUCCESS(Status
))
1101 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1105 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1108 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1112 if (!NT_SUCCESS(Status
))
1115 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1119 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1120 if (DomainSid
== NULL
)
1122 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1126 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1131 if (DomainSid
!= NULL
)
1133 MIDL_user_free(DomainSid
);
1137 if (!NT_SUCCESS(Status
))
1140 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1148 /* Look-up the built-in domain */
1149 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &BuiltinDomainName
, TRUE
))
1151 SidsBuffer
[i
].Use
= SidTypeDomain
;
1152 SidsBuffer
[i
].Sid
= LsapCopySid(BuiltinDomainSid
);
1153 if (SidsBuffer
[i
].Sid
== NULL
)
1155 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1159 SidsBuffer
[i
].DomainIndex
= -1;
1160 SidsBuffer
[i
].Flags
= 0;
1162 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1166 if (!NT_SUCCESS(Status
))
1169 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1175 /* Look-up the account domain */
1176 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &AccountDomainName
, TRUE
))
1178 SidsBuffer
[i
].Use
= SidTypeDomain
;
1179 SidsBuffer
[i
].Sid
= LsapCopySid(AccountDomainSid
);
1180 if (SidsBuffer
[i
].Sid
== NULL
)
1182 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1185 SidsBuffer
[i
].DomainIndex
= -1;
1186 SidsBuffer
[i
].Flags
= 0;
1188 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1192 if (!NT_SUCCESS(Status
))
1195 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1201 /* FIXME: Look-up the primary domain */
1203 /* FIXME: Look-up the trusted domains */
1215 LsapLookupIsolatedBuiltinNames(DWORD Count
,
1216 PRPC_UNICODE_STRING DomainNames
,
1217 PRPC_UNICODE_STRING AccountNames
,
1218 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1219 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1222 SAMPR_HANDLE ServerHandle
= NULL
;
1223 SAMPR_HANDLE DomainHandle
= NULL
;
1224 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1225 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1228 NTSTATUS Status
= STATUS_SUCCESS
;
1230 Status
= SamrConnect(NULL
,
1232 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1233 if (!NT_SUCCESS(Status
))
1235 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1239 Status
= SamrOpenDomain(ServerHandle
,
1243 if (!NT_SUCCESS(Status
))
1245 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1249 for (i
= 0; i
< Count
; i
++)
1251 /* Ignore names which were already mapped */
1252 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1255 /* Ignore fully qualified account names */
1256 if (DomainNames
[i
].Length
!= 0)
1259 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1261 Status
= SamrLookupNamesInDomain(DomainHandle
,
1266 if (NT_SUCCESS(Status
))
1268 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1270 SidsBuffer
[i
].Use
= Use
.Element
[0];
1271 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1272 RelativeIds
.Element
[0]);
1273 if (SidsBuffer
[i
].Sid
== NULL
)
1275 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1279 SidsBuffer
[i
].DomainIndex
= -1;
1280 SidsBuffer
[i
].Flags
= 0;
1282 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1286 if (!NT_SUCCESS(Status
))
1289 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1294 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1295 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1299 if (DomainHandle
!= NULL
)
1300 SamrCloseHandle(&DomainHandle
);
1302 if (ServerHandle
!= NULL
)
1303 SamrCloseHandle(&ServerHandle
);
1311 LsapLookupIsolatedAccountNames(DWORD Count
,
1312 PRPC_UNICODE_STRING DomainNames
,
1313 PRPC_UNICODE_STRING AccountNames
,
1314 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1315 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1318 SAMPR_HANDLE ServerHandle
= NULL
;
1319 SAMPR_HANDLE DomainHandle
= NULL
;
1320 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1321 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1324 NTSTATUS Status
= STATUS_SUCCESS
;
1328 Status
= SamrConnect(NULL
,
1330 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1331 if (!NT_SUCCESS(Status
))
1333 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1337 Status
= SamrOpenDomain(ServerHandle
,
1341 if (!NT_SUCCESS(Status
))
1343 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1347 for (i
= 0; i
< Count
; i
++)
1349 /* Ignore names which were already mapped */
1350 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1353 /* Ignore fully qualified account names */
1354 if (DomainNames
[i
].Length
!= 0)
1357 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1359 Status
= SamrLookupNamesInDomain(DomainHandle
,
1364 if (NT_SUCCESS(Status
))
1366 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1368 SidsBuffer
[i
].Use
= Use
.Element
[0];
1369 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1370 RelativeIds
.Element
[0]);
1371 if (SidsBuffer
[i
].Sid
== NULL
)
1373 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1377 SidsBuffer
[i
].DomainIndex
= -1;
1378 SidsBuffer
[i
].Flags
= 0;
1380 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1384 if (!NT_SUCCESS(Status
))
1387 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1392 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1393 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1397 if (DomainHandle
!= NULL
)
1398 SamrCloseHandle(&DomainHandle
);
1400 if (ServerHandle
!= NULL
)
1401 SamrCloseHandle(&ServerHandle
);
1409 LsapLookupFullyQualifiedWellKnownNames(DWORD Count
,
1410 PRPC_UNICODE_STRING DomainNames
,
1411 PRPC_UNICODE_STRING AccountNames
,
1412 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1413 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1416 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1417 PWELL_KNOWN_SID ptr
, ptr2
;
1421 NTSTATUS Status
= STATUS_SUCCESS
;
1423 for (i
= 0; i
< Count
; i
++)
1425 /* Ignore names which were already mapped */
1426 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1429 /* Ignore isolated account names */
1430 if (DomainNames
[i
].Length
== 0)
1433 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1435 /* Look-up all well-known names */
1436 ptr
= LsapLookupFullyQualifiedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
],
1437 (PUNICODE_STRING
)&DomainNames
[i
]);
1440 TRACE("Found it! (%wZ\\%wZ)\n", &ptr
->DomainName
, &ptr
->AccountName
);
1442 SidsBuffer
[i
].Use
= ptr
->Use
;
1443 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1444 if (SidsBuffer
[i
].Sid
== NULL
)
1446 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1450 SidsBuffer
[i
].DomainIndex
= -1;
1451 SidsBuffer
[i
].Flags
= 0;
1453 if (ptr
->Use
== SidTypeDomain
)
1455 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1459 if (!NT_SUCCESS(Status
))
1462 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1466 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1469 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1473 if (!NT_SUCCESS(Status
))
1476 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1480 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1481 if (DomainSid
== NULL
)
1483 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1487 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1492 if (DomainSid
!= NULL
)
1494 MIDL_user_free(DomainSid
);
1498 if (!NT_SUCCESS(Status
))
1501 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1517 LsapLookupBuiltinNames(DWORD Count
,
1518 PRPC_UNICODE_STRING DomainNames
,
1519 PRPC_UNICODE_STRING AccountNames
,
1520 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1521 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1524 SAMPR_HANDLE ServerHandle
= NULL
;
1525 SAMPR_HANDLE DomainHandle
= NULL
;
1526 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1527 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1530 NTSTATUS Status
= STATUS_SUCCESS
;
1532 Status
= SamrConnect(NULL
,
1534 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1535 if (!NT_SUCCESS(Status
))
1537 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1541 Status
= SamrOpenDomain(ServerHandle
,
1545 if (!NT_SUCCESS(Status
))
1547 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1551 for (i
= 0; i
< Count
; i
++)
1553 /* Ignore names which were already mapped */
1554 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1557 /* Ignore isolated account names */
1558 if (DomainNames
[i
].Length
== 0)
1561 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &BuiltinDomainName
, TRUE
))
1564 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1566 Status
= SamrLookupNamesInDomain(DomainHandle
,
1571 if (NT_SUCCESS(Status
))
1573 SidsBuffer
[i
].Use
= Use
.Element
[0];
1574 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1575 RelativeIds
.Element
[0]);
1576 if (SidsBuffer
[i
].Sid
== NULL
)
1578 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1582 SidsBuffer
[i
].DomainIndex
= -1;
1583 SidsBuffer
[i
].Flags
= 0;
1585 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1589 if (!NT_SUCCESS(Status
))
1592 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1597 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1598 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1602 if (DomainHandle
!= NULL
)
1603 SamrCloseHandle(&DomainHandle
);
1605 if (ServerHandle
!= NULL
)
1606 SamrCloseHandle(&ServerHandle
);
1614 LsapLookupAccountNames(DWORD Count
,
1615 PRPC_UNICODE_STRING DomainNames
,
1616 PRPC_UNICODE_STRING AccountNames
,
1617 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1618 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1621 SAMPR_HANDLE ServerHandle
= NULL
;
1622 SAMPR_HANDLE DomainHandle
= NULL
;
1623 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1624 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1627 NTSTATUS Status
= STATUS_SUCCESS
;
1629 Status
= SamrConnect(NULL
,
1631 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1632 if (!NT_SUCCESS(Status
))
1634 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1638 Status
= SamrOpenDomain(ServerHandle
,
1642 if (!NT_SUCCESS(Status
))
1644 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1648 for (i
= 0; i
< Count
; i
++)
1650 /* Ignore names which were already mapped */
1651 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1654 /* Ignore isolated account names */
1655 if (DomainNames
[i
].Length
== 0)
1658 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &AccountDomainName
, TRUE
))
1661 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1663 Status
= SamrLookupNamesInDomain(DomainHandle
,
1668 if (NT_SUCCESS(Status
))
1670 SidsBuffer
[i
].Use
= Use
.Element
[0];
1671 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1672 RelativeIds
.Element
[0]);
1673 if (SidsBuffer
[i
].Sid
== NULL
)
1675 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1679 SidsBuffer
[i
].DomainIndex
= -1;
1680 SidsBuffer
[i
].Flags
= 0;
1682 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1686 if (!NT_SUCCESS(Status
))
1689 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1694 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1695 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1699 if (DomainHandle
!= NULL
)
1700 SamrCloseHandle(&DomainHandle
);
1702 if (ServerHandle
!= NULL
)
1703 SamrCloseHandle(&ServerHandle
);
1710 LsapLookupNames(DWORD Count
,
1711 PRPC_UNICODE_STRING Names
,
1712 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
1713 PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids
,
1714 LSAP_LOOKUP_LEVEL LookupLevel
,
1716 DWORD LookupOptions
,
1717 DWORD ClientRevision
)
1719 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
1720 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
= NULL
;
1721 PRPC_UNICODE_STRING DomainNames
= NULL
;
1722 PRPC_UNICODE_STRING AccountNames
= NULL
;
1723 ULONG SidsBufferLength
;
1726 NTSTATUS Status
= STATUS_SUCCESS
;
1730 TranslatedSids
->Entries
= 0;
1731 TranslatedSids
->Sids
= NULL
;
1732 *ReferencedDomains
= NULL
;
1734 SidsBufferLength
= Count
* sizeof(LSAPR_TRANSLATED_SID_EX2
);
1735 SidsBuffer
= MIDL_user_allocate(SidsBufferLength
);
1736 if (SidsBuffer
== NULL
)
1739 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1743 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
1744 if (DomainsBuffer
== NULL
)
1747 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1751 DomainsBuffer
->Domains
= MIDL_user_allocate(Count
* sizeof(LSA_TRUST_INFORMATION
));
1752 if (DomainsBuffer
->Domains
== NULL
)
1755 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1758 DomainsBuffer
->Entries
= 0;
1759 DomainsBuffer
->MaxEntries
= Count
;
1761 for (i
= 0; i
< Count
; i
++)
1763 SidsBuffer
[i
].Use
= SidTypeUnknown
;
1764 SidsBuffer
[i
].Sid
= NULL
;
1765 SidsBuffer
[i
].DomainIndex
= -1;
1766 SidsBuffer
[i
].Flags
= 0;
1769 Status
= LsapSplitNames(Count
,
1773 if (!NT_SUCCESS(Status
))
1775 TRACE("LsapSplitNames failed! (Status %lx)\n", Status
);
1780 Status
= LsapLookupIsolatedNames(Count
,
1786 if (!NT_SUCCESS(Status
) &&
1787 Status
!= STATUS_NONE_MAPPED
&&
1788 Status
!= STATUS_SOME_NOT_MAPPED
)
1790 TRACE("LsapLookupIsolatedNames failed! (Status %lx)\n", Status
);
1794 if (Mapped
== Count
)
1798 Status
= LsapLookupIsolatedBuiltinNames(Count
,
1804 if (!NT_SUCCESS(Status
) &&
1805 Status
!= STATUS_NONE_MAPPED
&&
1806 Status
!= STATUS_SOME_NOT_MAPPED
)
1808 TRACE("LsapLookupIsolatedBuiltinNames failed! (Status %lx)\n", Status
);
1812 if (Mapped
== Count
)
1816 Status
= LsapLookupIsolatedAccountNames(Count
,
1822 if (!NT_SUCCESS(Status
) &&
1823 Status
!= STATUS_NONE_MAPPED
&&
1824 Status
!= STATUS_SOME_NOT_MAPPED
)
1826 TRACE("LsapLookupIsolatedAccountNames failed! (Status %lx)\n", Status
);
1830 if (Mapped
== Count
)
1833 Status
= LsapLookupFullyQualifiedWellKnownNames(Count
,
1839 if (!NT_SUCCESS(Status
) &&
1840 Status
!= STATUS_NONE_MAPPED
&&
1841 Status
!= STATUS_SOME_NOT_MAPPED
)
1843 TRACE("LsapLookupFullyQualifiedWellKnownNames failed! (Status %lx)\n", Status
);
1847 if (Mapped
== Count
)
1850 Status
= LsapLookupBuiltinNames(Count
,
1856 if (!NT_SUCCESS(Status
) &&
1857 Status
!= STATUS_NONE_MAPPED
&&
1858 Status
!= STATUS_SOME_NOT_MAPPED
)
1860 TRACE("LsapLookupBuiltinNames failed! (Status %lx)\n", Status
);
1864 if (Mapped
== Count
)
1868 Status
= LsapLookupAccountNames(Count
,
1874 if (!NT_SUCCESS(Status
) &&
1875 Status
!= STATUS_NONE_MAPPED
&&
1876 Status
!= STATUS_SOME_NOT_MAPPED
)
1878 TRACE("LsapLookupAccountNames failed! (Status %lx)\n", Status
);
1882 if (Mapped
== Count
)
1886 // TRACE("done: Status %lx\n", Status);
1888 if (DomainNames
!= NULL
)
1890 //TRACE("Free DomainNames\n");
1891 for (i
= 0; i
< Count
; i
++)
1893 if (DomainNames
[i
].Buffer
!= NULL
)
1894 MIDL_user_free(DomainNames
[i
].Buffer
);
1897 MIDL_user_free(DomainNames
);
1900 if (AccountNames
!= NULL
)
1902 //TRACE("Free AccountNames\n");
1903 for (i
= 0; i
< Count
; i
++)
1905 //TRACE("i: %lu\n", i);
1906 if (AccountNames
[i
].Buffer
!= NULL
)
1908 MIDL_user_free(AccountNames
[i
].Buffer
);
1912 MIDL_user_free(AccountNames
);
1915 if (!NT_SUCCESS(Status
))
1917 //TRACE("Failure!\n");
1919 //TRACE("Free DomainsBuffer\n");
1920 if (DomainsBuffer
!= NULL
)
1922 if (DomainsBuffer
->Domains
!= NULL
)
1923 MIDL_user_free(DomainsBuffer
->Domains
);
1925 MIDL_user_free(DomainsBuffer
);
1928 //TRACE("Free SidsBuffer\n");
1929 if (SidsBuffer
!= NULL
)
1930 MIDL_user_free(SidsBuffer
);
1934 //TRACE("Success!\n");
1936 *ReferencedDomains
= DomainsBuffer
;
1937 TranslatedSids
->Entries
= Count
;
1938 TranslatedSids
->Sids
= SidsBuffer
;
1939 *MappedCount
= Mapped
;
1942 Status
= STATUS_NONE_MAPPED
;
1943 else if (Mapped
< Count
)
1944 Status
= STATUS_SOME_NOT_MAPPED
;
1947 // TRACE("done: Status %lx\n", Status);
1954 LsapLookupWellKnownSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
1955 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
1956 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1959 PWELL_KNOWN_SID ptr
, ptr2
;
1960 LPWSTR SidString
= NULL
;
1963 NTSTATUS Status
= STATUS_SUCCESS
;
1965 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
1967 /* Ignore SIDs which are already mapped */
1968 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
1971 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
1972 TRACE("Mapping SID: %S\n", SidString
);
1973 LocalFree(SidString
);
1976 ptr
= LsapLookupWellKnownSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
1979 NamesBuffer
[i
].Use
= ptr
->Use
;
1980 NamesBuffer
[i
].Flags
= 0;
1982 NamesBuffer
[i
].Name
.Length
= ptr
->AccountName
.Length
;
1983 NamesBuffer
[i
].Name
.MaximumLength
= ptr
->AccountName
.MaximumLength
;
1984 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(ptr
->AccountName
.MaximumLength
);
1985 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
1987 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1991 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, ptr
->AccountName
.Buffer
, ptr
->AccountName
.MaximumLength
);
1993 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1996 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2000 if (!NT_SUCCESS(Status
))
2003 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2006 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2018 LsapLookupBuiltinDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2019 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2020 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2023 SAMPR_HANDLE ServerHandle
= NULL
;
2024 SAMPR_HANDLE DomainHandle
= NULL
;
2025 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2026 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2027 LPWSTR SidString
= NULL
;
2029 ULONG RelativeIds
[1];
2031 NTSTATUS Status
= STATUS_SUCCESS
;
2033 Status
= SamrConnect(NULL
,
2035 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2036 if (!NT_SUCCESS(Status
))
2038 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2042 Status
= SamrOpenDomain(ServerHandle
,
2046 if (!NT_SUCCESS(Status
))
2048 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2052 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2054 /* Ignore SIDs which are already mapped */
2055 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2058 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2059 TRACE("Mapping SID: %S\n", SidString
);
2060 LocalFree(SidString
);
2063 if (RtlEqualSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2065 TRACE("Found builtin domain!\n");
2067 NamesBuffer
[i
].Use
= SidTypeDomain
;
2068 NamesBuffer
[i
].Flags
= 0;
2070 NamesBuffer
[i
].Name
.Length
= BuiltinDomainName
.Length
;
2071 NamesBuffer
[i
].Name
.MaximumLength
= BuiltinDomainName
.MaximumLength
;
2072 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(BuiltinDomainName
.MaximumLength
);
2073 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2075 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2079 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, BuiltinDomainName
.Buffer
, BuiltinDomainName
.MaximumLength
);
2081 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2085 if (!NT_SUCCESS(Status
))
2088 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2090 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2094 else if (LsapIsPrefixSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2096 TRACE("Found builtin domain account!\n");
2098 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2100 Status
= SamrLookupIdsInDomain(DomainHandle
,
2105 if (NT_SUCCESS(Status
))
2107 NamesBuffer
[i
].Use
= Use
.Element
[0];
2108 NamesBuffer
[i
].Flags
= 0;
2110 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2111 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2112 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2113 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2115 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2116 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2118 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2122 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2123 Names
.Element
[0].Buffer
,
2124 Names
.Element
[0].MaximumLength
);
2126 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2127 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2129 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2133 if (!NT_SUCCESS(Status
))
2136 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2138 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2146 if (DomainHandle
!= NULL
)
2147 SamrCloseHandle(&DomainHandle
);
2149 if (ServerHandle
!= NULL
)
2150 SamrCloseHandle(&ServerHandle
);
2157 LsapLookupAccountDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2158 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2159 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2162 SAMPR_HANDLE ServerHandle
= NULL
;
2163 SAMPR_HANDLE DomainHandle
= NULL
;
2164 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2165 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2166 LPWSTR SidString
= NULL
;
2168 ULONG RelativeIds
[1];
2170 NTSTATUS Status
= STATUS_SUCCESS
;
2172 Status
= SamrConnect(NULL
,
2174 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2175 if (!NT_SUCCESS(Status
))
2177 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2181 Status
= SamrOpenDomain(ServerHandle
,
2185 if (!NT_SUCCESS(Status
))
2187 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2191 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2193 /* Ignore SIDs which are already mapped */
2194 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2197 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2198 TRACE("Mapping SID: %S\n", SidString
);
2199 LocalFree(SidString
);
2202 if (RtlEqualSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2204 TRACE("Found account domain!\n");
2206 NamesBuffer
[i
].Use
= SidTypeDomain
;
2207 NamesBuffer
[i
].Flags
= 0;
2209 NamesBuffer
[i
].Name
.Length
= AccountDomainName
.Length
;
2210 NamesBuffer
[i
].Name
.MaximumLength
= AccountDomainName
.MaximumLength
;
2211 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(AccountDomainName
.MaximumLength
);
2212 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2214 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2218 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, AccountDomainName
.Buffer
, AccountDomainName
.MaximumLength
);
2220 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2224 if (!NT_SUCCESS(Status
))
2227 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2229 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2233 else if (LsapIsPrefixSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2235 TRACE("Found account domain account!\n");
2237 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2239 Status
= SamrLookupIdsInDomain(DomainHandle
,
2244 if (NT_SUCCESS(Status
))
2246 NamesBuffer
[i
].Use
= Use
.Element
[0];
2247 NamesBuffer
[i
].Flags
= 0;
2249 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2250 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2251 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2252 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2254 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2255 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2257 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2261 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2262 Names
.Element
[0].Buffer
,
2263 Names
.Element
[0].MaximumLength
);
2265 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2266 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2268 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2272 if (!NT_SUCCESS(Status
))
2275 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2277 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2285 if (DomainHandle
!= NULL
)
2286 SamrCloseHandle(&DomainHandle
);
2288 if (ServerHandle
!= NULL
)
2289 SamrCloseHandle(&ServerHandle
);
2296 LsapLookupSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2297 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
2298 PLSAPR_TRANSLATED_NAMES_EX TranslatedNames
,
2299 LSAP_LOOKUP_LEVEL LookupLevel
,
2301 DWORD LookupOptions
,
2302 DWORD ClientRevision
)
2304 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
2305 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
= NULL
;
2306 ULONG NamesBufferLength
;
2309 NTSTATUS Status
= STATUS_SUCCESS
;
2311 NamesBufferLength
= SidEnumBuffer
->Entries
* sizeof(LSAPR_TRANSLATED_NAME_EX
);
2312 NamesBuffer
= MIDL_user_allocate(NamesBufferLength
);
2313 if (NamesBuffer
== NULL
)
2315 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2319 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
2320 if (DomainsBuffer
== NULL
)
2322 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2326 DomainsBuffer
->Domains
= MIDL_user_allocate(SidEnumBuffer
->Entries
* sizeof(LSA_TRUST_INFORMATION
));
2327 if (DomainsBuffer
->Domains
== NULL
)
2329 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2333 DomainsBuffer
->Entries
= 0;
2334 DomainsBuffer
->MaxEntries
= SidEnumBuffer
->Entries
;
2336 /* Initialize all name entries */
2337 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2339 NamesBuffer
[i
].Use
= SidTypeUnknown
;
2340 NamesBuffer
[i
].Name
.Length
= 0;
2341 NamesBuffer
[i
].Name
.MaximumLength
= 0;
2342 NamesBuffer
[i
].Name
.Buffer
= NULL
;
2343 NamesBuffer
[i
].DomainIndex
= -1;
2344 NamesBuffer
[i
].Flags
= 0;
2347 /* Look-up well-known SIDs */
2348 Status
= LsapLookupWellKnownSids(SidEnumBuffer
,
2352 if (!NT_SUCCESS(Status
) &&
2353 Status
!= STATUS_NONE_MAPPED
&&
2354 Status
!= STATUS_SOME_NOT_MAPPED
)
2357 if (Mapped
== SidEnumBuffer
->Entries
)
2360 /* Look-up builtin domain SIDs */
2361 Status
= LsapLookupBuiltinDomainSids(SidEnumBuffer
,
2365 if (!NT_SUCCESS(Status
) &&
2366 Status
!= STATUS_NONE_MAPPED
&&
2367 Status
!= STATUS_SOME_NOT_MAPPED
)
2370 if (Mapped
== SidEnumBuffer
->Entries
)
2373 /* Look-up account domain SIDs */
2374 Status
= LsapLookupAccountDomainSids(SidEnumBuffer
,
2378 if (!NT_SUCCESS(Status
) &&
2379 Status
!= STATUS_NONE_MAPPED
&&
2380 Status
!= STATUS_SOME_NOT_MAPPED
)
2383 if (Mapped
== SidEnumBuffer
->Entries
)
2387 TRACE("done Status: %lx Mapped: %lu\n", Status
, Mapped
);
2389 if (!NT_SUCCESS(Status
))
2391 if (DomainsBuffer
!= NULL
)
2393 if (DomainsBuffer
->Domains
!= NULL
)
2394 MIDL_user_free(DomainsBuffer
->Domains
);
2396 MIDL_user_free(DomainsBuffer
);
2399 if (NamesBuffer
!= NULL
)
2400 MIDL_user_free(NamesBuffer
);
2404 *ReferencedDomains
= DomainsBuffer
;
2405 TranslatedNames
->Entries
= SidEnumBuffer
->Entries
;
2406 TranslatedNames
->Names
= NamesBuffer
;
2407 *MappedCount
= Mapped
;
2410 Status
= STATUS_NONE_MAPPED
;
2411 else if (Mapped
< SidEnumBuffer
->Entries
)
2412 Status
= STATUS_SOME_NOT_MAPPED
;