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,
240 SidEntry
->AccountName
.Length
= wcslen(AccountName
) * sizeof(WCHAR
);
241 SidEntry
->AccountName
.MaximumLength
= SidEntry
->AccountName
.Length
+ sizeof(WCHAR
);
242 SidEntry
->AccountName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
243 SidEntry
->AccountName
.MaximumLength
);
244 if (SidEntry
->AccountName
.Buffer
== NULL
)
246 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
247 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
251 wcscpy(SidEntry
->AccountName
.Buffer
,
254 // RtlInitUnicodeString(&SidEntry->DomainName,
256 SidEntry
->DomainName
.Length
= wcslen(DomainName
) * sizeof(WCHAR
);
257 SidEntry
->DomainName
.MaximumLength
= SidEntry
->DomainName
.Length
+ sizeof(WCHAR
);
258 SidEntry
->DomainName
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), 0,
259 SidEntry
->DomainName
.MaximumLength
);
260 if (SidEntry
->DomainName
.Buffer
== NULL
)
262 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->AccountName
.Buffer
);
263 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
->Sid
);
264 RtlFreeHeap(RtlGetProcessHeap(), 0, SidEntry
);
268 wcscpy(SidEntry
->DomainName
.Buffer
,
273 InsertTailList(&WellKnownSidListHead
,
274 &SidEntry
->ListEntry
);
283 WCHAR szAccountName
[80];
284 WCHAR szDomainName
[80];
285 ULONG SubAuthorities
[8];
288 InitializeListHead(&WellKnownSidListHead
);
290 hInstance
= GetModuleHandleW(L
"lsasrv.dll");
294 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szAccountName
, 80);
295 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, 80);
296 LsapCreateSid(&NtAuthority
,
304 LsapLoadString(hInstance
, IDS_NULL_RID
, szAccountName
, 80);
306 SubAuthorities
[0] = SECURITY_NULL_RID
;
307 LsapCreateSid(&NullSidAuthority
,
312 SidTypeWellKnownGroup
);
315 LsapLoadString(hInstance
, IDS_WORLD_RID
, szAccountName
, 80);
317 SubAuthorities
[0] = SECURITY_WORLD_RID
;
318 LsapCreateSid(&WorldSidAuthority
,
323 SidTypeWellKnownGroup
);
326 LsapLoadString(hInstance
, IDS_LOCAL_RID
, szAccountName
, 80);
328 SubAuthorities
[0] = SECURITY_LOCAL_RID
;
329 LsapCreateSid(&LocalSidAuthority
,
334 SidTypeWellKnownGroup
);
336 /* Creator Owner Sid */
337 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_RID
, szAccountName
, 80);
339 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_RID
;
340 LsapCreateSid(&CreatorSidAuthority
,
345 SidTypeWellKnownGroup
);
347 /* Creator Group Sid */
348 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_RID
, szAccountName
, 80);
350 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_RID
;
351 LsapCreateSid(&CreatorSidAuthority
,
356 SidTypeWellKnownGroup
);
358 /* Creator Owner Server Sid */
359 LsapLoadString(hInstance
, IDS_CREATOR_OWNER_SERVER_RID
, szAccountName
, 80);
361 SubAuthorities
[0] = SECURITY_CREATOR_OWNER_SERVER_RID
;
362 LsapCreateSid(&CreatorSidAuthority
,
367 SidTypeWellKnownGroup
);
369 /* Creator Group Server Sid */
370 LsapLoadString(hInstance
, IDS_CREATOR_GROUP_SERVER_RID
, szAccountName
, 80);
372 SubAuthorities
[0] = SECURITY_CREATOR_GROUP_SERVER_RID
;
373 LsapCreateSid(&CreatorSidAuthority
,
378 SidTypeWellKnownGroup
);
381 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, 80);
382 LsapLoadString(hInstance
, IDS_NT_AUTHORITY
, szDomainName
, 80);
384 SubAuthorities
[0] = SECURITY_DIALUP_RID
;
385 LsapCreateSid(&NtAuthority
,
390 SidTypeWellKnownGroup
);
393 LsapLoadString(hInstance
, IDS_DIALUP_RID
, szAccountName
, 80);
395 SubAuthorities
[0] = SECURITY_NETWORK_RID
;
396 LsapCreateSid(&NtAuthority
,
401 SidTypeWellKnownGroup
);
404 LsapLoadString(hInstance
, IDS_BATCH_RID
, szAccountName
, 80);
406 SubAuthorities
[0] = SECURITY_BATCH_RID
;
407 LsapCreateSid(&NtAuthority
,
412 SidTypeWellKnownGroup
);
414 /* Interactive Sid */
415 LsapLoadString(hInstance
, IDS_INTERACTIVE_RID
, szAccountName
, 80);
417 SubAuthorities
[0] = SECURITY_INTERACTIVE_RID
;
418 LsapCreateSid(&NtAuthority
,
423 SidTypeWellKnownGroup
);
426 LsapLoadString(hInstance
, IDS_SERVICE_RID
, szAccountName
, 80);
428 SubAuthorities
[0] = SECURITY_SERVICE_RID
;
429 LsapCreateSid(&NtAuthority
,
434 SidTypeWellKnownGroup
);
436 /* Anonymous Logon Sid */
437 LsapLoadString(hInstance
, IDS_ANONYMOUS_LOGON_RID
, szAccountName
, 80);
439 SubAuthorities
[0] = SECURITY_ANONYMOUS_LOGON_RID
;
440 LsapCreateSid(&NtAuthority
,
445 SidTypeWellKnownGroup
);
448 LsapLoadString(hInstance
, IDS_PROXY_RID
, szAccountName
, 80);
450 SubAuthorities
[0] = SECURITY_PROXY_RID
;
451 LsapCreateSid(&NtAuthority
,
456 SidTypeWellKnownGroup
);
458 /* Enterprise Controllers Sid */
459 LsapLoadString(hInstance
, IDS_ENTERPRISE_CONTROLLERS_RID
, szAccountName
, 80);
461 SubAuthorities
[0] = SECURITY_ENTERPRISE_CONTROLLERS_RID
;
462 LsapCreateSid(&NtAuthority
,
467 SidTypeWellKnownGroup
);
469 /* Principal Self Sid */
470 LsapLoadString(hInstance
, IDS_PRINCIPAL_SELF_RID
, szAccountName
, 80);
472 SubAuthorities
[0] = SECURITY_PRINCIPAL_SELF_RID
;
473 LsapCreateSid(&NtAuthority
,
478 SidTypeWellKnownGroup
);
480 /* Authenticated Users Sid */
481 LsapLoadString(hInstance
, IDS_AUTHENTICATED_USER_RID
, szAccountName
, 80);
483 SubAuthorities
[0] = SECURITY_AUTHENTICATED_USER_RID
;
484 LsapCreateSid(&NtAuthority
,
489 SidTypeWellKnownGroup
);
491 /* Restricted Code Sid */
492 LsapLoadString(hInstance
, IDS_RESTRICTED_CODE_RID
, szAccountName
, 80);
494 SubAuthorities
[0] = SECURITY_RESTRICTED_CODE_RID
;
495 LsapCreateSid(&NtAuthority
,
500 SidTypeWellKnownGroup
);
502 /* Terminal Server Sid */
503 LsapLoadString(hInstance
, IDS_TERMINAL_SERVER_RID
, szAccountName
, 80);
505 SubAuthorities
[0] = SECURITY_TERMINAL_SERVER_RID
;
506 LsapCreateSid(&NtAuthority
,
511 SidTypeWellKnownGroup
);
513 /* Remote Logon Sid */
514 LsapLoadString(hInstance
, IDS_REMOTE_LOGON_RID
, szAccountName
, 80);
516 SubAuthorities
[0] = SECURITY_REMOTE_LOGON_RID
;
517 LsapCreateSid(&NtAuthority
,
522 SidTypeWellKnownGroup
);
524 /* This Organization Sid */
525 LsapLoadString(hInstance
, IDS_THIS_ORGANIZATION_RID
, szAccountName
, 80);
527 SubAuthorities
[0] = SECURITY_THIS_ORGANIZATION_RID
;
528 LsapCreateSid(&NtAuthority
,
533 SidTypeWellKnownGroup
);
535 /* Local System Sid */
536 LsapLoadString(hInstance
, IDS_LOCAL_SYSTEM_RID
, szAccountName
, 80);
538 SubAuthorities
[0] = SECURITY_LOCAL_SYSTEM_RID
;
539 LsapCreateSid(&NtAuthority
,
544 SidTypeWellKnownGroup
);
546 /* Local Service Sid */
547 LsapLoadString(hInstance
, IDS_LOCAL_SERVICE_RID
, szAccountName
, 80);
549 SubAuthorities
[0] = SECURITY_LOCAL_SERVICE_RID
;
550 LsapCreateSid(&NtAuthority
,
555 SidTypeWellKnownGroup
);
557 LsapCreateSid(&NtAuthority
,
562 SidTypeWellKnownGroup
);
564 /* Network Service Sid */
565 LsapLoadString(hInstance
, IDS_NETWORK_SERVICE_RID
, szAccountName
, 80);
567 SubAuthorities
[0] = SECURITY_NETWORK_SERVICE_RID
;
568 LsapCreateSid(&NtAuthority
,
573 SidTypeWellKnownGroup
);
575 LsapCreateSid(&NtAuthority
,
580 SidTypeWellKnownGroup
);
582 /* Builtin Domain Sid */
583 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szAccountName
, 80);
584 LsapLoadString(hInstance
, IDS_BUILTIN_DOMAIN_RID
, szDomainName
, 80);
586 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
587 LsapCreateSid(&NtAuthority
,
594 /* Administrators Alias Sid */
595 LsapLoadString(hInstance
, IDS_ALIAS_RID_ADMINS
, szAccountName
, 80);
597 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
598 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ADMINS
;
599 LsapCreateSid(&NtAuthority
,
606 /* Users Alias Sid */
607 LsapLoadString(hInstance
, IDS_ALIAS_RID_USERS
, szAccountName
, 80);
609 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
610 SubAuthorities
[1] = DOMAIN_ALIAS_RID_USERS
;
611 LsapCreateSid(&NtAuthority
,
618 /* Guests Alias Sid */
619 LsapLoadString(hInstance
, IDS_ALIAS_RID_GUESTS
, szAccountName
, 80);
621 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
622 SubAuthorities
[1] = DOMAIN_ALIAS_RID_GUESTS
;
623 LsapCreateSid(&NtAuthority
,
630 /* Power User Alias Sid */
631 LsapLoadString(hInstance
, IDS_ALIAS_RID_POWER_USERS
, szAccountName
, 80);
633 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
634 SubAuthorities
[1] = DOMAIN_ALIAS_RID_POWER_USERS
;
635 LsapCreateSid(&NtAuthority
,
642 /* Account Operators Alias Sid */
643 LsapLoadString(hInstance
, IDS_ALIAS_RID_ACCOUNT_OPS
, szAccountName
, 80);
645 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
646 SubAuthorities
[1] = DOMAIN_ALIAS_RID_ACCOUNT_OPS
;
647 LsapCreateSid(&NtAuthority
,
654 /* System Operators Alias Sid */
655 LsapLoadString(hInstance
, IDS_ALIAS_RID_SYSTEM_OPS
, szAccountName
, 80);
657 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
658 SubAuthorities
[1] = DOMAIN_ALIAS_RID_SYSTEM_OPS
;
659 LsapCreateSid(&NtAuthority
,
666 /* Print Operators Alias Sid */
667 LsapLoadString(hInstance
, IDS_ALIAS_RID_PRINT_OPS
, szAccountName
, 80);
669 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
670 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PRINT_OPS
;
671 LsapCreateSid(&NtAuthority
,
678 /* Backup Operators Alias Sid */
679 LsapLoadString(hInstance
, IDS_ALIAS_RID_BACKUP_OPS
, szAccountName
, 80);
681 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
682 SubAuthorities
[1] = DOMAIN_ALIAS_RID_BACKUP_OPS
;
683 LsapCreateSid(&NtAuthority
,
690 /* Replicators Alias Sid */
691 LsapLoadString(hInstance
, IDS_ALIAS_RID_REPLICATOR
, szAccountName
, 80);
693 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
694 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REPLICATOR
;
695 LsapCreateSid(&NtAuthority
,
702 /* RAS Servers Alias Sid */
703 LsapLoadString(hInstance
, IDS_ALIAS_RID_RAS_SERVERS
, szAccountName
, 80);
705 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
706 SubAuthorities
[1] = DOMAIN_ALIAS_RID_RAS_SERVERS
;
707 LsapCreateSid(&NtAuthority
,
714 /* Pre-Windows 2000 Compatible Access Alias Sid */
715 LsapLoadString(hInstance
, IDS_ALIAS_RID_PREW2KCOMPACCESS
, szAccountName
, 80);
717 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
718 SubAuthorities
[1] = DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
;
719 LsapCreateSid(&NtAuthority
,
726 /* Remote Desktop Users Alias Sid */
727 LsapLoadString(hInstance
, IDS_ALIAS_RID_REMOTE_DESKTOP_USERS
, szAccountName
, 80);
729 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
730 SubAuthorities
[1] = DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
;
731 LsapCreateSid(&NtAuthority
,
738 /* Network Configuration Operators Alias Sid */
739 LsapLoadString(hInstance
, IDS_ALIAS_RID_NETWORK_CONFIGURATION_OPS
, szAccountName
, 80);
741 SubAuthorities
[0] = SECURITY_BUILTIN_DOMAIN_RID
;
742 SubAuthorities
[1] = DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
;
743 LsapCreateSid(&NtAuthority
,
750 /* FIXME: Add more well known sids */
752 return STATUS_SUCCESS
;
757 LsapLookupWellKnownSid(PSID Sid
)
759 PLIST_ENTRY ListEntry
;
762 ListEntry
= WellKnownSidListHead
.Flink
;
763 while (ListEntry
!= &WellKnownSidListHead
)
765 Ptr
= CONTAINING_RECORD(ListEntry
,
768 if (RtlEqualSid(Sid
, Ptr
->Sid
))
773 ListEntry
= ListEntry
->Flink
;
781 LsapLookupIsolatedWellKnownName(PUNICODE_STRING AccountName
)
783 PLIST_ENTRY ListEntry
;
786 ListEntry
= WellKnownSidListHead
.Flink
;
787 while (ListEntry
!= &WellKnownSidListHead
)
789 Ptr
= CONTAINING_RECORD(ListEntry
,
792 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
))
797 ListEntry
= ListEntry
->Flink
;
805 LsapLookupFullyQualifiedWellKnownName(PUNICODE_STRING AccountName
,
806 PUNICODE_STRING DomainName
)
808 PLIST_ENTRY ListEntry
;
811 ListEntry
= WellKnownSidListHead
.Flink
;
812 while (ListEntry
!= &WellKnownSidListHead
)
814 Ptr
= CONTAINING_RECORD(ListEntry
,
817 if (RtlEqualUnicodeString(AccountName
, &Ptr
->AccountName
, TRUE
) &&
818 RtlEqualUnicodeString(DomainName
, &Ptr
->DomainName
, TRUE
))
823 ListEntry
= ListEntry
->Flink
;
832 LsapSplitNames(DWORD Count
,
833 PRPC_UNICODE_STRING Names
,
834 PRPC_UNICODE_STRING
*DomainNames
,
835 PRPC_UNICODE_STRING
*AccountNames
)
837 PRPC_UNICODE_STRING DomainsBuffer
= NULL
;
838 PRPC_UNICODE_STRING AccountsBuffer
= NULL
;
843 NTSTATUS Status
= STATUS_SUCCESS
;
845 DomainsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
846 if (DomainsBuffer
== NULL
)
848 Status
= STATUS_INSUFFICIENT_RESOURCES
;
852 AccountsBuffer
= MIDL_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
853 if (AccountsBuffer
== NULL
)
855 Status
= STATUS_INSUFFICIENT_RESOURCES
;
859 for (i
= 0; i
< Count
; i
++)
861 //TRACE("Name: %wZ\n", &Names[i]);
863 Ptr
= wcschr(Names
[i
].Buffer
, L
'\\');
866 AccountLength
= Names
[i
].Length
/ sizeof(WCHAR
);
868 AccountsBuffer
[i
].Length
= Names
[i
].Length
;
869 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
870 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
871 if (AccountsBuffer
[i
].Buffer
== NULL
)
873 Status
= STATUS_INSUFFICIENT_RESOURCES
;
877 CopyMemory(AccountsBuffer
[i
].Buffer
,
879 AccountsBuffer
[i
].Length
);
880 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
882 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
886 DomainLength
= (ULONG
)(ULONG_PTR
)(Ptr
- Names
[i
].Buffer
);
887 AccountLength
= (Names
[i
].Length
/ sizeof(WCHAR
)) - DomainLength
- 1;
888 //TRACE("DomainLength: %u\n", DomainLength);
889 //TRACE("AccountLength: %u\n", AccountLength);
891 if (DomainLength
> 0)
893 DomainsBuffer
[i
].Length
= (USHORT
)DomainLength
* sizeof(WCHAR
);
894 DomainsBuffer
[i
].MaximumLength
= DomainsBuffer
[i
].Length
+ sizeof(WCHAR
);
895 DomainsBuffer
[i
].Buffer
= MIDL_user_allocate(DomainsBuffer
[i
].MaximumLength
);
896 if (DomainsBuffer
[i
].Buffer
== NULL
)
898 Status
= STATUS_INSUFFICIENT_RESOURCES
;
902 CopyMemory(DomainsBuffer
[i
].Buffer
,
904 DomainsBuffer
[i
].Length
);
905 DomainsBuffer
[i
].Buffer
[DomainLength
] = UNICODE_NULL
;
907 //TRACE("Domain name: %wZ\n", &DomainsBuffer[i]);
910 AccountsBuffer
[i
].Length
= (USHORT
)AccountLength
* sizeof(WCHAR
);
911 AccountsBuffer
[i
].MaximumLength
= AccountsBuffer
[i
].Length
+ sizeof(WCHAR
);
912 AccountsBuffer
[i
].Buffer
= MIDL_user_allocate(AccountsBuffer
[i
].MaximumLength
);
913 if (AccountsBuffer
[i
].Buffer
== NULL
)
915 Status
= STATUS_INSUFFICIENT_RESOURCES
;
919 CopyMemory(AccountsBuffer
[i
].Buffer
,
920 &(Names
[i
].Buffer
[DomainLength
+ 1]),
921 AccountsBuffer
[i
].Length
);
922 AccountsBuffer
[i
].Buffer
[AccountLength
] = UNICODE_NULL
;
924 //TRACE("Account name: %wZ\n", &AccountsBuffer[i]);
929 if (!NT_SUCCESS(Status
))
931 if (AccountsBuffer
!= NULL
)
933 for (i
= 0; i
< Count
; i
++)
935 if (AccountsBuffer
[i
].Buffer
!= NULL
)
936 MIDL_user_free(AccountsBuffer
[i
].Buffer
);
939 MIDL_user_free(AccountsBuffer
);
942 if (DomainsBuffer
!= NULL
)
944 for (i
= 0; i
< Count
; i
++)
946 if (DomainsBuffer
[i
].Buffer
!= NULL
)
947 MIDL_user_free(DomainsBuffer
[i
].Buffer
);
950 MIDL_user_free(DomainsBuffer
);
955 *DomainNames
= DomainsBuffer
;
956 *AccountNames
= AccountsBuffer
;
964 LsapAddDomainToDomainsList(PLSAPR_REFERENCED_DOMAIN_LIST ReferencedDomains
,
965 PUNICODE_STRING Name
,
972 while (i
< ReferencedDomains
->Entries
&&
973 ReferencedDomains
->Domains
[i
].Sid
!= NULL
)
975 if (RtlEqualSid(Sid
, ReferencedDomains
->Domains
[i
].Sid
))
978 return STATUS_SUCCESS
;
984 ReferencedDomains
->Domains
[i
].Sid
= MIDL_user_allocate(RtlLengthSid(Sid
));
985 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
986 return STATUS_INSUFFICIENT_RESOURCES
;
988 RtlCopySid(RtlLengthSid(Sid
), ReferencedDomains
->Domains
[i
].Sid
, Sid
);
990 ReferencedDomains
->Domains
[i
].Name
.Length
= Name
->Length
;
991 ReferencedDomains
->Domains
[i
].Name
.MaximumLength
= Name
->MaximumLength
;
992 ReferencedDomains
->Domains
[i
].Name
.Buffer
= MIDL_user_allocate(Name
->MaximumLength
);
993 if (ReferencedDomains
->Domains
[i
].Sid
== NULL
)
995 MIDL_user_free(ReferencedDomains
->Domains
[i
].Sid
);
996 ReferencedDomains
->Domains
[i
].Sid
= NULL
;
997 return STATUS_INSUFFICIENT_RESOURCES
;
1000 RtlCopyMemory(ReferencedDomains
->Domains
[i
].Name
.Buffer
,
1002 Name
->MaximumLength
);
1004 ReferencedDomains
->Entries
++;
1007 return STATUS_SUCCESS
;
1012 LsapIsPrefixSid(IN PSID PrefixSid
,
1015 PISID Sid1
= PrefixSid
, Sid2
= Sid
;
1018 if (Sid1
->Revision
!= Sid2
->Revision
)
1021 if ((Sid1
->IdentifierAuthority
.Value
[0] != Sid2
->IdentifierAuthority
.Value
[0]) ||
1022 (Sid1
->IdentifierAuthority
.Value
[1] != Sid2
->IdentifierAuthority
.Value
[1]) ||
1023 (Sid1
->IdentifierAuthority
.Value
[2] != Sid2
->IdentifierAuthority
.Value
[2]) ||
1024 (Sid1
->IdentifierAuthority
.Value
[3] != Sid2
->IdentifierAuthority
.Value
[3]) ||
1025 (Sid1
->IdentifierAuthority
.Value
[4] != Sid2
->IdentifierAuthority
.Value
[4]) ||
1026 (Sid1
->IdentifierAuthority
.Value
[5] != Sid2
->IdentifierAuthority
.Value
[5]))
1029 if (Sid1
->SubAuthorityCount
>= Sid2
->SubAuthorityCount
)
1032 if (Sid1
->SubAuthorityCount
== 0)
1035 for (i
= 0; i
< Sid1
->SubAuthorityCount
; i
++)
1037 if (Sid1
->SubAuthority
[i
] != Sid2
->SubAuthority
[i
])
1046 LsapGetRelativeIdFromSid(PSID Sid_
)
1050 if (Sid
->SubAuthorityCount
!= 0)
1051 return Sid
->SubAuthority
[Sid
->SubAuthorityCount
- 1];
1058 CreateSidFromSidAndRid(PSID SrcSid
,
1067 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1071 DstSidSize
= RtlLengthRequiredSid(RidCount
+ 1);
1073 DstSid
= MIDL_user_allocate(DstSidSize
);
1077 RtlInitializeSid(DstSid
,
1078 RtlIdentifierAuthoritySid(SrcSid
),
1081 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1083 p
= RtlSubAuthoritySid(SrcSid
, i
);
1084 q
= RtlSubAuthoritySid(DstSid
, i
);
1088 q
= RtlSubAuthoritySid(DstSid
, (ULONG
)RidCount
);
1096 CreateDomainSidFromAccountSid(PSID AccountSid
)
1104 RidCount
= *RtlSubAuthorityCountSid(AccountSid
);
1108 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1110 DomainSid
= MIDL_user_allocate(DstSidSize
);
1111 if (DomainSid
== NULL
)
1114 RtlInitializeSid(DomainSid
,
1115 RtlIdentifierAuthoritySid(AccountSid
),
1118 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1120 p
= RtlSubAuthoritySid(AccountSid
, i
);
1121 q
= RtlSubAuthoritySid(DomainSid
, i
);
1130 LsapCopySid(PSID SrcSid
)
1138 RidCount
= *RtlSubAuthorityCountSid(SrcSid
);
1139 DstSidSize
= RtlLengthRequiredSid(RidCount
);
1141 DstSid
= MIDL_user_allocate(DstSidSize
);
1145 RtlInitializeSid(DstSid
,
1146 RtlIdentifierAuthoritySid(SrcSid
),
1149 for (i
= 0; i
< (ULONG
)RidCount
; i
++)
1151 p
= RtlSubAuthoritySid(SrcSid
, i
);
1152 q
= RtlSubAuthoritySid(DstSid
, i
);
1162 LsapLookupIsolatedNames(DWORD Count
,
1163 PRPC_UNICODE_STRING DomainNames
,
1164 PRPC_UNICODE_STRING AccountNames
,
1165 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1166 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1169 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1170 PWELL_KNOWN_SID ptr
, ptr2
;
1174 NTSTATUS Status
= STATUS_SUCCESS
;
1176 for (i
= 0; i
< Count
; i
++)
1178 /* Ignore names which were already mapped */
1179 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1182 /* Ignore fully qualified account names */
1183 if (DomainNames
[i
].Length
!= 0)
1186 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1188 /* Look-up all well-known names */
1189 ptr
= LsapLookupIsolatedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
]);
1192 SidsBuffer
[i
].Use
= ptr
->Use
;
1193 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1194 if (SidsBuffer
[i
].Sid
== NULL
)
1196 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1200 SidsBuffer
[i
].DomainIndex
= -1;
1201 SidsBuffer
[i
].Flags
= 0;
1203 if (ptr
->Use
== SidTypeDomain
)
1205 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1209 if (!NT_SUCCESS(Status
))
1212 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1216 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1219 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1223 if (!NT_SUCCESS(Status
))
1226 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1230 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1231 if (DomainSid
== NULL
)
1233 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1237 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1242 if (DomainSid
!= NULL
)
1244 MIDL_user_free(DomainSid
);
1248 if (!NT_SUCCESS(Status
))
1251 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1259 /* Look-up the built-in domain */
1260 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &BuiltinDomainName
, TRUE
))
1262 SidsBuffer
[i
].Use
= SidTypeDomain
;
1263 SidsBuffer
[i
].Sid
= LsapCopySid(BuiltinDomainSid
);
1264 if (SidsBuffer
[i
].Sid
== NULL
)
1266 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1270 SidsBuffer
[i
].DomainIndex
= -1;
1271 SidsBuffer
[i
].Flags
= 0;
1273 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1277 if (!NT_SUCCESS(Status
))
1280 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1286 /* Look-up the account domain */
1287 if (RtlEqualUnicodeString((PUNICODE_STRING
)&AccountNames
[i
], &AccountDomainName
, TRUE
))
1289 SidsBuffer
[i
].Use
= SidTypeDomain
;
1290 SidsBuffer
[i
].Sid
= LsapCopySid(AccountDomainSid
);
1291 if (SidsBuffer
[i
].Sid
== NULL
)
1293 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1296 SidsBuffer
[i
].DomainIndex
= -1;
1297 SidsBuffer
[i
].Flags
= 0;
1299 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1303 if (!NT_SUCCESS(Status
))
1306 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1312 /* FIXME: Look-up the primary domain */
1314 /* FIXME: Look-up the trusted domains */
1326 LsapLookupIsolatedBuiltinNames(DWORD Count
,
1327 PRPC_UNICODE_STRING DomainNames
,
1328 PRPC_UNICODE_STRING AccountNames
,
1329 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1330 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1333 SAMPR_HANDLE ServerHandle
= NULL
;
1334 SAMPR_HANDLE DomainHandle
= NULL
;
1335 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1336 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1339 NTSTATUS Status
= STATUS_SUCCESS
;
1341 Status
= SamrConnect(NULL
,
1343 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1344 if (!NT_SUCCESS(Status
))
1346 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1350 Status
= SamrOpenDomain(ServerHandle
,
1354 if (!NT_SUCCESS(Status
))
1356 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1360 for (i
= 0; i
< Count
; i
++)
1362 /* Ignore names which were already mapped */
1363 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1366 /* Ignore fully qualified account names */
1367 if (DomainNames
[i
].Length
!= 0)
1370 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1372 Status
= SamrLookupNamesInDomain(DomainHandle
,
1377 if (NT_SUCCESS(Status
))
1379 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1381 SidsBuffer
[i
].Use
= Use
.Element
[0];
1382 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1383 RelativeIds
.Element
[0]);
1384 if (SidsBuffer
[i
].Sid
== NULL
)
1386 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1390 SidsBuffer
[i
].DomainIndex
= -1;
1391 SidsBuffer
[i
].Flags
= 0;
1393 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1397 if (!NT_SUCCESS(Status
))
1400 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1405 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1406 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1410 if (DomainHandle
!= NULL
)
1411 SamrCloseHandle(&DomainHandle
);
1413 if (ServerHandle
!= NULL
)
1414 SamrCloseHandle(&ServerHandle
);
1422 LsapLookupIsolatedAccountNames(DWORD Count
,
1423 PRPC_UNICODE_STRING DomainNames
,
1424 PRPC_UNICODE_STRING AccountNames
,
1425 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1426 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1429 SAMPR_HANDLE ServerHandle
= NULL
;
1430 SAMPR_HANDLE DomainHandle
= NULL
;
1431 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1432 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1435 NTSTATUS Status
= STATUS_SUCCESS
;
1439 Status
= SamrConnect(NULL
,
1441 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1442 if (!NT_SUCCESS(Status
))
1444 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1448 Status
= SamrOpenDomain(ServerHandle
,
1452 if (!NT_SUCCESS(Status
))
1454 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1458 for (i
= 0; i
< Count
; i
++)
1460 /* Ignore names which were already mapped */
1461 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1464 /* Ignore fully qualified account names */
1465 if (DomainNames
[i
].Length
!= 0)
1468 TRACE("Mapping name: %wZ\n", &AccountNames
[i
]);
1470 Status
= SamrLookupNamesInDomain(DomainHandle
,
1475 if (NT_SUCCESS(Status
))
1477 TRACE("Found relative ID: %lu\n", RelativeIds
.Element
[0]);
1479 SidsBuffer
[i
].Use
= Use
.Element
[0];
1480 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1481 RelativeIds
.Element
[0]);
1482 if (SidsBuffer
[i
].Sid
== NULL
)
1484 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1488 SidsBuffer
[i
].DomainIndex
= -1;
1489 SidsBuffer
[i
].Flags
= 0;
1491 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1495 if (!NT_SUCCESS(Status
))
1498 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1503 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1504 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1508 if (DomainHandle
!= NULL
)
1509 SamrCloseHandle(&DomainHandle
);
1511 if (ServerHandle
!= NULL
)
1512 SamrCloseHandle(&ServerHandle
);
1520 LsapLookupFullyQualifiedWellKnownNames(DWORD Count
,
1521 PRPC_UNICODE_STRING DomainNames
,
1522 PRPC_UNICODE_STRING AccountNames
,
1523 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1524 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1527 UNICODE_STRING EmptyDomainName
= RTL_CONSTANT_STRING(L
"");
1528 PWELL_KNOWN_SID ptr
, ptr2
;
1532 NTSTATUS Status
= STATUS_SUCCESS
;
1534 for (i
= 0; i
< Count
; i
++)
1536 /* Ignore names which were already mapped */
1537 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1540 /* Ignore isolated account names */
1541 if (DomainNames
[i
].Length
== 0)
1544 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1546 /* Look-up all well-known names */
1547 ptr
= LsapLookupFullyQualifiedWellKnownName((PUNICODE_STRING
)&AccountNames
[i
],
1548 (PUNICODE_STRING
)&DomainNames
[i
]);
1551 TRACE("Found it! (%wZ\\%wZ)\n", &ptr
->DomainName
, &ptr
->AccountName
);
1553 SidsBuffer
[i
].Use
= ptr
->Use
;
1554 SidsBuffer
[i
].Sid
= LsapCopySid(ptr
->Sid
);
1555 if (SidsBuffer
[i
].Sid
== NULL
)
1557 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1561 SidsBuffer
[i
].DomainIndex
= -1;
1562 SidsBuffer
[i
].Flags
= 0;
1564 if (ptr
->Use
== SidTypeDomain
)
1566 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1570 if (!NT_SUCCESS(Status
))
1573 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1577 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
1580 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1584 if (!NT_SUCCESS(Status
))
1587 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1591 DomainSid
= CreateDomainSidFromAccountSid(ptr
->Sid
);
1592 if (DomainSid
== NULL
)
1594 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1598 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1603 if (DomainSid
!= NULL
)
1605 MIDL_user_free(DomainSid
);
1609 if (!NT_SUCCESS(Status
))
1612 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1628 LsapLookupBuiltinNames(DWORD Count
,
1629 PRPC_UNICODE_STRING DomainNames
,
1630 PRPC_UNICODE_STRING AccountNames
,
1631 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1632 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1635 SAMPR_HANDLE ServerHandle
= NULL
;
1636 SAMPR_HANDLE DomainHandle
= NULL
;
1637 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1638 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1641 NTSTATUS Status
= STATUS_SUCCESS
;
1643 Status
= SamrConnect(NULL
,
1645 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1646 if (!NT_SUCCESS(Status
))
1648 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1652 Status
= SamrOpenDomain(ServerHandle
,
1656 if (!NT_SUCCESS(Status
))
1658 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1662 for (i
= 0; i
< Count
; i
++)
1664 /* Ignore names which were already mapped */
1665 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1668 /* Ignore isolated account names */
1669 if (DomainNames
[i
].Length
== 0)
1672 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &BuiltinDomainName
, TRUE
))
1675 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1677 Status
= SamrLookupNamesInDomain(DomainHandle
,
1682 if (NT_SUCCESS(Status
))
1684 SidsBuffer
[i
].Use
= Use
.Element
[0];
1685 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(BuiltinDomainSid
,
1686 RelativeIds
.Element
[0]);
1687 if (SidsBuffer
[i
].Sid
== NULL
)
1689 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1693 SidsBuffer
[i
].DomainIndex
= -1;
1694 SidsBuffer
[i
].Flags
= 0;
1696 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1700 if (!NT_SUCCESS(Status
))
1703 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1708 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1709 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1713 if (DomainHandle
!= NULL
)
1714 SamrCloseHandle(&DomainHandle
);
1716 if (ServerHandle
!= NULL
)
1717 SamrCloseHandle(&ServerHandle
);
1725 LsapLookupAccountNames(DWORD Count
,
1726 PRPC_UNICODE_STRING DomainNames
,
1727 PRPC_UNICODE_STRING AccountNames
,
1728 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
1729 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
,
1732 SAMPR_HANDLE ServerHandle
= NULL
;
1733 SAMPR_HANDLE DomainHandle
= NULL
;
1734 SAMPR_ULONG_ARRAY RelativeIds
= {0, NULL
};
1735 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
1738 NTSTATUS Status
= STATUS_SUCCESS
;
1740 Status
= SamrConnect(NULL
,
1742 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
1743 if (!NT_SUCCESS(Status
))
1745 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
1749 Status
= SamrOpenDomain(ServerHandle
,
1753 if (!NT_SUCCESS(Status
))
1755 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
1759 for (i
= 0; i
< Count
; i
++)
1761 /* Ignore names which were already mapped */
1762 if (SidsBuffer
[i
].Use
!= SidTypeUnknown
)
1765 /* Ignore isolated account names */
1766 if (DomainNames
[i
].Length
== 0)
1769 if (!RtlEqualUnicodeString((PUNICODE_STRING
)&DomainNames
[i
], &AccountDomainName
, TRUE
))
1772 TRACE("Mapping name: %wZ\\%wZ\n", &DomainNames
[i
], &AccountNames
[i
]);
1774 Status
= SamrLookupNamesInDomain(DomainHandle
,
1779 if (NT_SUCCESS(Status
))
1781 SidsBuffer
[i
].Use
= Use
.Element
[0];
1782 SidsBuffer
[i
].Sid
= CreateSidFromSidAndRid(AccountDomainSid
,
1783 RelativeIds
.Element
[0]);
1784 if (SidsBuffer
[i
].Sid
== NULL
)
1786 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1790 SidsBuffer
[i
].DomainIndex
= -1;
1791 SidsBuffer
[i
].Flags
= 0;
1793 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
1797 if (!NT_SUCCESS(Status
))
1800 SidsBuffer
[i
].DomainIndex
= DomainIndex
;
1805 SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds
);
1806 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
1810 if (DomainHandle
!= NULL
)
1811 SamrCloseHandle(&DomainHandle
);
1813 if (ServerHandle
!= NULL
)
1814 SamrCloseHandle(&ServerHandle
);
1821 LsapLookupNames(DWORD Count
,
1822 PRPC_UNICODE_STRING Names
,
1823 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
1824 PLSAPR_TRANSLATED_SIDS_EX2 TranslatedSids
,
1825 LSAP_LOOKUP_LEVEL LookupLevel
,
1827 DWORD LookupOptions
,
1828 DWORD ClientRevision
)
1830 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
1831 PLSAPR_TRANSLATED_SID_EX2 SidsBuffer
= NULL
;
1832 PRPC_UNICODE_STRING DomainNames
= NULL
;
1833 PRPC_UNICODE_STRING AccountNames
= NULL
;
1834 ULONG SidsBufferLength
;
1837 NTSTATUS Status
= STATUS_SUCCESS
;
1841 TranslatedSids
->Entries
= 0;
1842 TranslatedSids
->Sids
= NULL
;
1843 *ReferencedDomains
= NULL
;
1845 SidsBufferLength
= Count
* sizeof(LSAPR_TRANSLATED_SID_EX2
);
1846 SidsBuffer
= MIDL_user_allocate(SidsBufferLength
);
1847 if (SidsBuffer
== NULL
)
1850 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1854 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
1855 if (DomainsBuffer
== NULL
)
1858 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1862 DomainsBuffer
->Domains
= MIDL_user_allocate(Count
* sizeof(LSA_TRUST_INFORMATION
));
1863 if (DomainsBuffer
->Domains
== NULL
)
1866 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1869 DomainsBuffer
->Entries
= 0;
1870 DomainsBuffer
->MaxEntries
= Count
;
1872 for (i
= 0; i
< Count
; i
++)
1874 SidsBuffer
[i
].Use
= SidTypeUnknown
;
1875 SidsBuffer
[i
].Sid
= NULL
;
1876 SidsBuffer
[i
].DomainIndex
= -1;
1877 SidsBuffer
[i
].Flags
= 0;
1880 Status
= LsapSplitNames(Count
,
1884 if (!NT_SUCCESS(Status
))
1886 TRACE("LsapSplitNames failed! (Status %lx)\n", Status
);
1891 Status
= LsapLookupIsolatedNames(Count
,
1897 if (!NT_SUCCESS(Status
) &&
1898 Status
!= STATUS_NONE_MAPPED
&&
1899 Status
!= STATUS_SOME_NOT_MAPPED
)
1901 TRACE("LsapLookupIsolatedNames failed! (Status %lx)\n", Status
);
1905 if (Mapped
== Count
)
1909 Status
= LsapLookupIsolatedBuiltinNames(Count
,
1915 if (!NT_SUCCESS(Status
) &&
1916 Status
!= STATUS_NONE_MAPPED
&&
1917 Status
!= STATUS_SOME_NOT_MAPPED
)
1919 TRACE("LsapLookupIsolatedBuiltinNames failed! (Status %lx)\n", Status
);
1923 if (Mapped
== Count
)
1927 Status
= LsapLookupIsolatedAccountNames(Count
,
1933 if (!NT_SUCCESS(Status
) &&
1934 Status
!= STATUS_NONE_MAPPED
&&
1935 Status
!= STATUS_SOME_NOT_MAPPED
)
1937 TRACE("LsapLookupIsolatedAccountNames failed! (Status %lx)\n", Status
);
1941 if (Mapped
== Count
)
1944 Status
= LsapLookupFullyQualifiedWellKnownNames(Count
,
1950 if (!NT_SUCCESS(Status
) &&
1951 Status
!= STATUS_NONE_MAPPED
&&
1952 Status
!= STATUS_SOME_NOT_MAPPED
)
1954 TRACE("LsapLookupFullyQualifiedWellKnownNames failed! (Status %lx)\n", Status
);
1958 if (Mapped
== Count
)
1961 Status
= LsapLookupBuiltinNames(Count
,
1967 if (!NT_SUCCESS(Status
) &&
1968 Status
!= STATUS_NONE_MAPPED
&&
1969 Status
!= STATUS_SOME_NOT_MAPPED
)
1971 TRACE("LsapLookupBuiltinNames failed! (Status %lx)\n", Status
);
1975 if (Mapped
== Count
)
1979 Status
= LsapLookupAccountNames(Count
,
1985 if (!NT_SUCCESS(Status
) &&
1986 Status
!= STATUS_NONE_MAPPED
&&
1987 Status
!= STATUS_SOME_NOT_MAPPED
)
1989 TRACE("LsapLookupAccountNames failed! (Status %lx)\n", Status
);
1993 if (Mapped
== Count
)
1997 // TRACE("done: Status %lx\n", Status);
1999 if (DomainNames
!= NULL
)
2001 //TRACE("Free DomainNames\n");
2002 for (i
= 0; i
< Count
; i
++)
2004 if (DomainNames
[i
].Buffer
!= NULL
)
2005 MIDL_user_free(DomainNames
[i
].Buffer
);
2008 MIDL_user_free(DomainNames
);
2011 if (AccountNames
!= NULL
)
2013 //TRACE("Free AccountNames\n");
2014 for (i
= 0; i
< Count
; i
++)
2016 //TRACE("i: %lu\n", i);
2017 if (AccountNames
[i
].Buffer
!= NULL
)
2019 MIDL_user_free(AccountNames
[i
].Buffer
);
2023 MIDL_user_free(AccountNames
);
2026 if (!NT_SUCCESS(Status
))
2028 //TRACE("Failure!\n");
2030 //TRACE("Free DomainsBuffer\n");
2031 if (DomainsBuffer
!= NULL
)
2033 if (DomainsBuffer
->Domains
!= NULL
)
2034 MIDL_user_free(DomainsBuffer
->Domains
);
2036 MIDL_user_free(DomainsBuffer
);
2039 //TRACE("Free SidsBuffer\n");
2040 if (SidsBuffer
!= NULL
)
2041 MIDL_user_free(SidsBuffer
);
2045 //TRACE("Success!\n");
2047 *ReferencedDomains
= DomainsBuffer
;
2048 TranslatedSids
->Entries
= Count
;
2049 TranslatedSids
->Sids
= SidsBuffer
;
2050 *MappedCount
= Mapped
;
2053 Status
= STATUS_NONE_MAPPED
;
2054 else if (Mapped
< Count
)
2055 Status
= STATUS_SOME_NOT_MAPPED
;
2058 // TRACE("done: Status %lx\n", Status);
2065 LsapLookupWellKnownSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2066 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2067 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2070 PWELL_KNOWN_SID ptr
, ptr2
;
2071 LPWSTR SidString
= NULL
;
2074 NTSTATUS Status
= STATUS_SUCCESS
;
2076 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2078 /* Ignore SIDs which are already mapped */
2079 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2082 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2083 TRACE("Mapping SID: %S\n", SidString
);
2084 LocalFree(SidString
);
2087 ptr
= LsapLookupWellKnownSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2090 NamesBuffer
[i
].Use
= ptr
->Use
;
2091 NamesBuffer
[i
].Flags
= 0;
2093 NamesBuffer
[i
].Name
.Length
= ptr
->AccountName
.Length
;
2094 NamesBuffer
[i
].Name
.MaximumLength
= ptr
->AccountName
.MaximumLength
;
2095 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(ptr
->AccountName
.MaximumLength
);
2096 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2098 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2102 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, ptr
->AccountName
.Buffer
, ptr
->AccountName
.MaximumLength
);
2104 ptr2
= LsapLookupIsolatedWellKnownName(&ptr
->DomainName
);
2107 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2111 if (!NT_SUCCESS(Status
))
2114 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2117 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2129 LsapLookupBuiltinDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2130 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2131 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2134 SAMPR_HANDLE ServerHandle
= NULL
;
2135 SAMPR_HANDLE DomainHandle
= NULL
;
2136 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2137 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2138 LPWSTR SidString
= NULL
;
2140 ULONG RelativeIds
[1];
2142 NTSTATUS Status
= STATUS_SUCCESS
;
2144 Status
= SamrConnect(NULL
,
2146 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2147 if (!NT_SUCCESS(Status
))
2149 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2153 Status
= SamrOpenDomain(ServerHandle
,
2157 if (!NT_SUCCESS(Status
))
2159 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2163 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2165 /* Ignore SIDs which are already mapped */
2166 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2169 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2170 TRACE("Mapping SID: %S\n", SidString
);
2171 LocalFree(SidString
);
2174 if (RtlEqualSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2176 TRACE("Found builtin domain!\n");
2178 NamesBuffer
[i
].Use
= SidTypeDomain
;
2179 NamesBuffer
[i
].Flags
= 0;
2181 NamesBuffer
[i
].Name
.Length
= BuiltinDomainName
.Length
;
2182 NamesBuffer
[i
].Name
.MaximumLength
= BuiltinDomainName
.MaximumLength
;
2183 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(BuiltinDomainName
.MaximumLength
);
2184 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2186 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2190 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, BuiltinDomainName
.Buffer
, BuiltinDomainName
.MaximumLength
);
2192 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2196 if (!NT_SUCCESS(Status
))
2199 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2201 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2205 else if (LsapIsPrefixSid(BuiltinDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2207 TRACE("Found builtin domain account!\n");
2209 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2211 Status
= SamrLookupIdsInDomain(DomainHandle
,
2216 if (NT_SUCCESS(Status
))
2218 NamesBuffer
[i
].Use
= Use
.Element
[0];
2219 NamesBuffer
[i
].Flags
= 0;
2221 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2222 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2223 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2224 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2226 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2227 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2229 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2233 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2234 Names
.Element
[0].Buffer
,
2235 Names
.Element
[0].MaximumLength
);
2237 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2238 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2240 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2244 if (!NT_SUCCESS(Status
))
2247 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2249 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2257 if (DomainHandle
!= NULL
)
2258 SamrCloseHandle(&DomainHandle
);
2260 if (ServerHandle
!= NULL
)
2261 SamrCloseHandle(&ServerHandle
);
2268 LsapLookupAccountDomainSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2269 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
,
2270 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
,
2273 SAMPR_HANDLE ServerHandle
= NULL
;
2274 SAMPR_HANDLE DomainHandle
= NULL
;
2275 SAMPR_RETURNED_USTRING_ARRAY Names
= {0, NULL
};
2276 SAMPR_ULONG_ARRAY Use
= {0, NULL
};
2277 LPWSTR SidString
= NULL
;
2279 ULONG RelativeIds
[1];
2281 NTSTATUS Status
= STATUS_SUCCESS
;
2283 Status
= SamrConnect(NULL
,
2285 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
);
2286 if (!NT_SUCCESS(Status
))
2288 TRACE("SamrConnect failed (Status %08lx)\n", Status
);
2292 Status
= SamrOpenDomain(ServerHandle
,
2296 if (!NT_SUCCESS(Status
))
2298 TRACE("SamOpenDomain failed (Status %08lx)\n", Status
);
2302 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2304 /* Ignore SIDs which are already mapped */
2305 if (NamesBuffer
[i
].Use
!= SidTypeUnknown
)
2308 ConvertSidToStringSidW(SidEnumBuffer
->SidInfo
[i
].Sid
, &SidString
);
2309 TRACE("Mapping SID: %S\n", SidString
);
2310 LocalFree(SidString
);
2313 if (RtlEqualSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2315 TRACE("Found account domain!\n");
2317 NamesBuffer
[i
].Use
= SidTypeDomain
;
2318 NamesBuffer
[i
].Flags
= 0;
2320 NamesBuffer
[i
].Name
.Length
= AccountDomainName
.Length
;
2321 NamesBuffer
[i
].Name
.MaximumLength
= AccountDomainName
.MaximumLength
;
2322 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(AccountDomainName
.MaximumLength
);
2323 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2325 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2329 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
, AccountDomainName
.Buffer
, AccountDomainName
.MaximumLength
);
2331 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2335 if (!NT_SUCCESS(Status
))
2338 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2340 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2344 else if (LsapIsPrefixSid(AccountDomainSid
, SidEnumBuffer
->SidInfo
[i
].Sid
))
2346 TRACE("Found account domain account!\n");
2348 RelativeIds
[0] = LsapGetRelativeIdFromSid(SidEnumBuffer
->SidInfo
[i
].Sid
);
2350 Status
= SamrLookupIdsInDomain(DomainHandle
,
2355 if (NT_SUCCESS(Status
))
2357 NamesBuffer
[i
].Use
= Use
.Element
[0];
2358 NamesBuffer
[i
].Flags
= 0;
2360 NamesBuffer
[i
].Name
.Length
= Names
.Element
[0].Length
;
2361 NamesBuffer
[i
].Name
.MaximumLength
= Names
.Element
[0].MaximumLength
;
2362 NamesBuffer
[i
].Name
.Buffer
= MIDL_user_allocate(Names
.Element
[0].MaximumLength
);
2363 if (NamesBuffer
[i
].Name
.Buffer
== NULL
)
2365 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2366 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2368 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2372 RtlCopyMemory(NamesBuffer
[i
].Name
.Buffer
,
2373 Names
.Element
[0].Buffer
,
2374 Names
.Element
[0].MaximumLength
);
2376 SamIFree_SAMPR_RETURNED_USTRING_ARRAY(&Names
);
2377 SamIFree_SAMPR_ULONG_ARRAY(&Use
);
2379 Status
= LsapAddDomainToDomainsList(DomainsBuffer
,
2383 if (!NT_SUCCESS(Status
))
2386 NamesBuffer
[i
].DomainIndex
= DomainIndex
;
2388 TRACE("Mapped to: %wZ\n", &NamesBuffer
[i
].Name
);
2396 if (DomainHandle
!= NULL
)
2397 SamrCloseHandle(&DomainHandle
);
2399 if (ServerHandle
!= NULL
)
2400 SamrCloseHandle(&ServerHandle
);
2407 LsapLookupSids(PLSAPR_SID_ENUM_BUFFER SidEnumBuffer
,
2408 PLSAPR_REFERENCED_DOMAIN_LIST
*ReferencedDomains
,
2409 PLSAPR_TRANSLATED_NAMES_EX TranslatedNames
,
2410 LSAP_LOOKUP_LEVEL LookupLevel
,
2412 DWORD LookupOptions
,
2413 DWORD ClientRevision
)
2415 PLSAPR_REFERENCED_DOMAIN_LIST DomainsBuffer
= NULL
;
2416 PLSAPR_TRANSLATED_NAME_EX NamesBuffer
= NULL
;
2417 ULONG NamesBufferLength
;
2420 NTSTATUS Status
= STATUS_SUCCESS
;
2422 NamesBufferLength
= SidEnumBuffer
->Entries
* sizeof(LSAPR_TRANSLATED_NAME_EX
);
2423 NamesBuffer
= MIDL_user_allocate(NamesBufferLength
);
2424 if (NamesBuffer
== NULL
)
2426 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2430 DomainsBuffer
= MIDL_user_allocate(sizeof(LSAPR_REFERENCED_DOMAIN_LIST
));
2431 if (DomainsBuffer
== NULL
)
2433 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2437 DomainsBuffer
->Domains
= MIDL_user_allocate(SidEnumBuffer
->Entries
* sizeof(LSA_TRUST_INFORMATION
));
2438 if (DomainsBuffer
->Domains
== NULL
)
2440 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2444 DomainsBuffer
->Entries
= 0;
2445 DomainsBuffer
->MaxEntries
= SidEnumBuffer
->Entries
;
2447 /* Initialize all name entries */
2448 for (i
= 0; i
< SidEnumBuffer
->Entries
; i
++)
2450 NamesBuffer
[i
].Use
= SidTypeUnknown
;
2451 NamesBuffer
[i
].Name
.Length
= 0;
2452 NamesBuffer
[i
].Name
.MaximumLength
= 0;
2453 NamesBuffer
[i
].Name
.Buffer
= NULL
;
2454 NamesBuffer
[i
].DomainIndex
= -1;
2455 NamesBuffer
[i
].Flags
= 0;
2458 /* Look-up well-known SIDs */
2459 Status
= LsapLookupWellKnownSids(SidEnumBuffer
,
2463 if (!NT_SUCCESS(Status
) &&
2464 Status
!= STATUS_NONE_MAPPED
&&
2465 Status
!= STATUS_SOME_NOT_MAPPED
)
2468 if (Mapped
== SidEnumBuffer
->Entries
)
2471 /* Look-up builtin domain SIDs */
2472 Status
= LsapLookupBuiltinDomainSids(SidEnumBuffer
,
2476 if (!NT_SUCCESS(Status
) &&
2477 Status
!= STATUS_NONE_MAPPED
&&
2478 Status
!= STATUS_SOME_NOT_MAPPED
)
2481 if (Mapped
== SidEnumBuffer
->Entries
)
2484 /* Look-up account domain SIDs */
2485 Status
= LsapLookupAccountDomainSids(SidEnumBuffer
,
2489 if (!NT_SUCCESS(Status
) &&
2490 Status
!= STATUS_NONE_MAPPED
&&
2491 Status
!= STATUS_SOME_NOT_MAPPED
)
2494 if (Mapped
== SidEnumBuffer
->Entries
)
2498 TRACE("done Status: %lx Mapped: %lu\n", Status
, Mapped
);
2500 if (!NT_SUCCESS(Status
))
2502 if (DomainsBuffer
!= NULL
)
2504 if (DomainsBuffer
->Domains
!= NULL
)
2505 MIDL_user_free(DomainsBuffer
->Domains
);
2507 MIDL_user_free(DomainsBuffer
);
2510 if (NamesBuffer
!= NULL
)
2511 MIDL_user_free(NamesBuffer
);
2515 *ReferencedDomains
= DomainsBuffer
;
2516 TranslatedNames
->Entries
= SidEnumBuffer
->Entries
;
2517 TranslatedNames
->Names
= NamesBuffer
;
2518 *MappedCount
= Mapped
;
2521 Status
= STATUS_NONE_MAPPED
;
2522 else if (Mapped
< SidEnumBuffer
->Entries
)
2523 Status
= STATUS_SOME_NOT_MAPPED
;