2 * Copyright 1999, 2000 Juergen Schmied <juergen.schmied@debitel.net>
3 * Copyright 2003 CodeWeavers Inc. (Ulrich Czekalla)
4 * Copyright 2006 Robert Reif
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #define WIN32_NO_STATUS
32 #include "ddk/ntddk.h"
34 #include "kernelbase.h"
35 #include "wine/debug.h"
36 #include "wine/heap.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(security
);
41 /******************************************************************************
43 ******************************************************************************/
45 typedef struct _MAX_SID
47 /* same fields as struct _SID */
49 BYTE SubAuthorityCount
;
50 SID_IDENTIFIER_AUTHORITY IdentifierAuthority
;
51 DWORD SubAuthority
[SID_MAX_SUB_AUTHORITIES
];
54 typedef struct WELLKNOWNSID
56 WELL_KNOWN_SID_TYPE Type
;
60 static const WELLKNOWNSID WellKnownSids
[] =
62 { WinNullSid
, { SID_REVISION
, 1, { SECURITY_NULL_SID_AUTHORITY
}, { SECURITY_NULL_RID
} } },
63 { WinWorldSid
, { SID_REVISION
, 1, { SECURITY_WORLD_SID_AUTHORITY
}, { SECURITY_WORLD_RID
} } },
64 { WinLocalSid
, { SID_REVISION
, 1, { SECURITY_LOCAL_SID_AUTHORITY
}, { SECURITY_LOCAL_RID
} } },
65 { WinCreatorOwnerSid
, { SID_REVISION
, 1, { SECURITY_CREATOR_SID_AUTHORITY
}, { SECURITY_CREATOR_OWNER_RID
} } },
66 { WinCreatorGroupSid
, { SID_REVISION
, 1, { SECURITY_CREATOR_SID_AUTHORITY
}, { SECURITY_CREATOR_GROUP_RID
} } },
67 { WinCreatorOwnerRightsSid
, { SID_REVISION
, 1, { SECURITY_CREATOR_SID_AUTHORITY
}, { SECURITY_CREATOR_OWNER_RIGHTS_RID
} } },
68 { WinCreatorOwnerServerSid
, { SID_REVISION
, 1, { SECURITY_CREATOR_SID_AUTHORITY
}, { SECURITY_CREATOR_OWNER_SERVER_RID
} } },
69 { WinCreatorGroupServerSid
, { SID_REVISION
, 1, { SECURITY_CREATOR_SID_AUTHORITY
}, { SECURITY_CREATOR_GROUP_SERVER_RID
} } },
70 { WinNtAuthoritySid
, { SID_REVISION
, 0, { SECURITY_NT_AUTHORITY
}, { SECURITY_NULL_RID
} } },
71 { WinDialupSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_DIALUP_RID
} } },
72 { WinNetworkSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_NETWORK_RID
} } },
73 { WinBatchSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_BATCH_RID
} } },
74 { WinInteractiveSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_INTERACTIVE_RID
} } },
75 { WinServiceSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_SERVICE_RID
} } },
76 { WinAnonymousSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_ANONYMOUS_LOGON_RID
} } },
77 { WinProxySid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_PROXY_RID
} } },
78 { WinEnterpriseControllersSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_ENTERPRISE_CONTROLLERS_RID
} } },
79 { WinSelfSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_PRINCIPAL_SELF_RID
} } },
80 { WinAuthenticatedUserSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_AUTHENTICATED_USER_RID
} } },
81 { WinRestrictedCodeSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_RESTRICTED_CODE_RID
} } },
82 { WinTerminalServerSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_TERMINAL_SERVER_RID
} } },
83 { WinRemoteLogonIdSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_REMOTE_LOGON_RID
} } },
84 { WinLogonIdsSid
, { SID_REVISION
, SECURITY_LOGON_IDS_RID_COUNT
, { SECURITY_NT_AUTHORITY
}, { SECURITY_LOGON_IDS_RID
} } },
85 { WinLocalSystemSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_LOCAL_SYSTEM_RID
} } },
86 { WinLocalServiceSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_LOCAL_SERVICE_RID
} } },
87 { WinNetworkServiceSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_NETWORK_SERVICE_RID
} } },
88 { WinBuiltinDomainSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
} } },
89 { WinBuiltinAdministratorsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_ADMINS
} } },
90 { WinBuiltinUsersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_USERS
} } },
91 { WinBuiltinGuestsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_GUESTS
} } },
92 { WinBuiltinPowerUsersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_POWER_USERS
} } },
93 { WinBuiltinAccountOperatorsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_ACCOUNT_OPS
} } },
94 { WinBuiltinSystemOperatorsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_SYSTEM_OPS
} } },
95 { WinBuiltinPrintOperatorsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_PRINT_OPS
} } },
96 { WinBuiltinBackupOperatorsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_BACKUP_OPS
} } },
97 { WinBuiltinReplicatorSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_REPLICATOR
} } },
98 { WinBuiltinPreWindows2000CompatibleAccessSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
} } },
99 { WinBuiltinRemoteDesktopUsersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS
} } },
100 { WinBuiltinNetworkConfigurationOperatorsSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
} } },
101 { WinNTLMAuthenticationSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_PACKAGE_BASE_RID
, SECURITY_PACKAGE_NTLM_RID
} } },
102 { WinDigestAuthenticationSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_PACKAGE_BASE_RID
, SECURITY_PACKAGE_DIGEST_RID
} } },
103 { WinSChannelAuthenticationSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_PACKAGE_BASE_RID
, SECURITY_PACKAGE_SCHANNEL_RID
} } },
104 { WinThisOrganizationSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_THIS_ORGANIZATION_RID
} } },
105 { WinOtherOrganizationSid
, { SID_REVISION
, 1, { SECURITY_NT_AUTHORITY
}, { SECURITY_OTHER_ORGANIZATION_RID
} } },
106 { WinBuiltinIncomingForestTrustBuildersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS
} } },
107 { WinBuiltinPerfMonitoringUsersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_MONITORING_USERS
} } },
108 { WinBuiltinPerfLoggingUsersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_LOGGING_USERS
} } },
109 { WinBuiltinAuthorizationAccessSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS
} } },
110 { WinBuiltinTerminalServerLicenseServersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS
} } },
111 { WinBuiltinDCOMUsersSid
, { SID_REVISION
, 2, { SECURITY_NT_AUTHORITY
}, { SECURITY_BUILTIN_DOMAIN_RID
, DOMAIN_ALIAS_RID_DCOM_USERS
} } },
112 { WinLowLabelSid
, { SID_REVISION
, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY
}, { SECURITY_MANDATORY_LOW_RID
} } },
113 { WinMediumLabelSid
, { SID_REVISION
, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY
}, { SECURITY_MANDATORY_MEDIUM_RID
} } },
114 { WinHighLabelSid
, { SID_REVISION
, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY
}, { SECURITY_MANDATORY_HIGH_RID
} } },
115 { WinSystemLabelSid
, { SID_REVISION
, 1, { SECURITY_MANDATORY_LABEL_AUTHORITY
}, { SECURITY_MANDATORY_SYSTEM_RID
} } },
116 { WinBuiltinAnyPackageSid
, { SID_REVISION
, 2, { SECURITY_APP_PACKAGE_AUTHORITY
}, { SECURITY_APP_PACKAGE_BASE_RID
, SECURITY_BUILTIN_PACKAGE_ANY_PACKAGE
} } },
119 /* these SIDs must be constructed as relative to some domain - only the RID is well-known */
120 typedef struct WELLKNOWNRID
122 WELL_KNOWN_SID_TYPE Type
;
126 static const WELLKNOWNRID WellKnownRids
[] =
128 { WinAccountAdministratorSid
, DOMAIN_USER_RID_ADMIN
},
129 { WinAccountGuestSid
, DOMAIN_USER_RID_GUEST
},
130 { WinAccountKrbtgtSid
, DOMAIN_USER_RID_KRBTGT
},
131 { WinAccountDomainAdminsSid
, DOMAIN_GROUP_RID_ADMINS
},
132 { WinAccountDomainUsersSid
, DOMAIN_GROUP_RID_USERS
},
133 { WinAccountDomainGuestsSid
, DOMAIN_GROUP_RID_GUESTS
},
134 { WinAccountComputersSid
, DOMAIN_GROUP_RID_COMPUTERS
},
135 { WinAccountControllersSid
, DOMAIN_GROUP_RID_CONTROLLERS
},
136 { WinAccountCertAdminsSid
, DOMAIN_GROUP_RID_CERT_ADMINS
},
137 { WinAccountSchemaAdminsSid
, DOMAIN_GROUP_RID_SCHEMA_ADMINS
},
138 { WinAccountEnterpriseAdminsSid
, DOMAIN_GROUP_RID_ENTERPRISE_ADMINS
},
139 { WinAccountPolicyAdminsSid
, DOMAIN_GROUP_RID_POLICY_ADMINS
},
140 { WinAccountRasAndIasServersSid
, DOMAIN_ALIAS_RID_RAS_SERVERS
},
143 static NTSTATUS
open_file( LPCWSTR name
, DWORD access
, HANDLE
*file
)
145 UNICODE_STRING file_nameW
;
146 OBJECT_ATTRIBUTES attr
;
150 if ((status
= RtlDosPathNameToNtPathName_U_WithStatus( name
, &file_nameW
, NULL
, NULL
))) return status
;
151 attr
.Length
= sizeof(attr
);
152 attr
.RootDirectory
= 0;
153 attr
.Attributes
= OBJ_CASE_INSENSITIVE
;
154 attr
.ObjectName
= &file_nameW
;
155 attr
.SecurityDescriptor
= NULL
;
156 status
= NtCreateFile( file
, access
|SYNCHRONIZE
, &attr
, &io
, NULL
, FILE_FLAG_BACKUP_SEMANTICS
,
157 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
, FILE_OPEN
,
158 FILE_OPEN_FOR_BACKUP_INTENT
, NULL
, 0 );
159 RtlFreeUnicodeString( &file_nameW
);
163 static const char *debugstr_sid( PSID sid
)
168 if (psid
== NULL
) return "(null)";
170 auth
= psid
->IdentifierAuthority
.Value
[5] +
171 (psid
->IdentifierAuthority
.Value
[4] << 8) +
172 (psid
->IdentifierAuthority
.Value
[3] << 16) +
173 (psid
->IdentifierAuthority
.Value
[2] << 24);
175 switch (psid
->SubAuthorityCount
) {
177 return wine_dbg_sprintf("S-%d-%d", psid
->Revision
, auth
);
179 return wine_dbg_sprintf("S-%d-%d-%lu", psid
->Revision
, auth
,
180 psid
->SubAuthority
[0]);
182 return wine_dbg_sprintf("S-%d-%d-%lu-%lu", psid
->Revision
, auth
,
183 psid
->SubAuthority
[0], psid
->SubAuthority
[1]);
185 return wine_dbg_sprintf("S-%d-%d-%lu-%lu-%lu", psid
->Revision
, auth
,
186 psid
->SubAuthority
[0], psid
->SubAuthority
[1], psid
->SubAuthority
[2]);
188 return wine_dbg_sprintf("S-%d-%d-%lu-%lu-%lu-%lu", psid
->Revision
, auth
,
189 psid
->SubAuthority
[0], psid
->SubAuthority
[1], psid
->SubAuthority
[2],
190 psid
->SubAuthority
[3]);
192 return wine_dbg_sprintf("S-%d-%d-%lu-%lu-%lu-%lu-%lu", psid
->Revision
, auth
,
193 psid
->SubAuthority
[0], psid
->SubAuthority
[1], psid
->SubAuthority
[2],
194 psid
->SubAuthority
[3], psid
->SubAuthority
[4]);
196 return wine_dbg_sprintf("S-%d-%d-%lu-%lu-%lu-%lu-%lu-%lu", psid
->Revision
, auth
,
197 psid
->SubAuthority
[3], psid
->SubAuthority
[1], psid
->SubAuthority
[2],
198 psid
->SubAuthority
[0], psid
->SubAuthority
[4], psid
->SubAuthority
[5]);
200 return wine_dbg_sprintf("S-%d-%d-%lu-%lu-%lu-%lu-%lu-%lu-%lu", psid
->Revision
, auth
,
201 psid
->SubAuthority
[0], psid
->SubAuthority
[1], psid
->SubAuthority
[2],
202 psid
->SubAuthority
[3], psid
->SubAuthority
[4], psid
->SubAuthority
[5],
203 psid
->SubAuthority
[6]);
205 return wine_dbg_sprintf("S-%d-%d-%lu-%lu-%lu-%lu-%lu-%lu-%lu-%lu", psid
->Revision
, auth
,
206 psid
->SubAuthority
[0], psid
->SubAuthority
[1], psid
->SubAuthority
[2],
207 psid
->SubAuthority
[3], psid
->SubAuthority
[4], psid
->SubAuthority
[5],
208 psid
->SubAuthority
[6], psid
->SubAuthority
[7]);
213 /******************************************************************************
214 * AllocateAndInitializeSid (kernelbase.@)
216 BOOL WINAPI
AllocateAndInitializeSid( PSID_IDENTIFIER_AUTHORITY auth
, BYTE count
,
217 DWORD auth0
, DWORD auth1
, DWORD auth2
, DWORD auth3
,
218 DWORD auth4
, DWORD auth5
, DWORD auth6
, DWORD auth7
, PSID
*sid
)
220 return set_ntstatus( RtlAllocateAndInitializeSid( auth
, count
, auth0
, auth1
, auth2
, auth3
,
221 auth4
, auth5
, auth6
, auth7
, sid
));
224 /***********************************************************************
225 * AllocateLocallyUniqueId (kernelbase.@)
227 BOOL WINAPI
AllocateLocallyUniqueId( PLUID luid
)
229 return set_ntstatus( NtAllocateLocallyUniqueId( luid
));
232 /******************************************************************************
233 * CopySid (kernelbase.@)
235 BOOL WINAPI
CopySid( DWORD len
, PSID dest
, PSID source
)
237 return RtlCopySid( len
, dest
, source
);
240 /******************************************************************************
241 * EqualPrefixSid (kernelbase.@)
243 BOOL WINAPI
EqualPrefixSid( PSID sid1
, PSID sid2
)
245 return RtlEqualPrefixSid( sid1
, sid2
);
248 /******************************************************************************
249 * EqualSid (kernelbase.@)
251 BOOL WINAPI
EqualSid( PSID sid1
, PSID sid2
)
253 BOOL ret
= RtlEqualSid( sid1
, sid2
);
254 SetLastError(ERROR_SUCCESS
);
258 /******************************************************************************
259 * EqualDomainSid (kernelbase.@)
261 BOOL WINAPI
EqualDomainSid( PSID sid1
, PSID sid2
, BOOL
*equal
)
263 MAX_SID builtin_sid
, domain_sid1
, domain_sid2
;
266 TRACE( "(%p,%p,%p)\n", sid1
, sid2
, equal
);
268 if (!IsValidSid( sid1
) || !IsValidSid( sid2
))
270 SetLastError( ERROR_INVALID_SID
);
276 SetLastError( ERROR_INVALID_PARAMETER
);
280 size
= sizeof(domain_sid1
);
281 if (GetWindowsAccountDomainSid( sid1
, &domain_sid1
, &size
))
283 size
= sizeof(domain_sid2
);
284 if (GetWindowsAccountDomainSid( sid2
, &domain_sid2
, &size
))
286 *equal
= EqualSid( &domain_sid1
, &domain_sid2
);
292 size
= sizeof(builtin_sid
);
293 if (!CreateWellKnownSid( WinBuiltinDomainSid
, NULL
, &builtin_sid
, &size
))
296 if (!memcmp(GetSidIdentifierAuthority( sid1
)->Value
, builtin_sid
.IdentifierAuthority
.Value
, sizeof(builtin_sid
.IdentifierAuthority
.Value
)) &&
297 !memcmp(GetSidIdentifierAuthority( sid2
)->Value
, builtin_sid
.IdentifierAuthority
.Value
, sizeof(builtin_sid
.IdentifierAuthority
.Value
)))
299 if (*GetSidSubAuthorityCount( sid1
) != 0 && *GetSidSubAuthorityCount( sid2
) != 0 &&
300 (*GetSidSubAuthority( sid1
, 0 ) == SECURITY_BUILTIN_DOMAIN_RID
||
301 *GetSidSubAuthority( sid2
, 0 ) == SECURITY_BUILTIN_DOMAIN_RID
))
303 *equal
= EqualSid( sid1
, sid2
);
309 SetLastError( ERROR_NON_DOMAIN_SID
);
313 /******************************************************************************
314 * FreeSid (kernelbase.@)
316 void * WINAPI
FreeSid( PSID pSid
)
319 return NULL
; /* is documented like this */
322 /******************************************************************************
323 * GetLengthSid (kernelbase.@)
325 DWORD WINAPI
GetLengthSid( PSID sid
)
327 return RtlLengthSid( sid
);
330 /******************************************************************************
331 * GetSidIdentifierAuthority (kernelbase.@)
333 PSID_IDENTIFIER_AUTHORITY WINAPI
GetSidIdentifierAuthority( PSID sid
)
335 SetLastError(ERROR_SUCCESS
);
336 return RtlIdentifierAuthoritySid( sid
);
339 /******************************************************************************
340 * GetSidLengthRequired (kernelbase.@)
342 DWORD WINAPI
GetSidLengthRequired( BYTE count
)
344 return RtlLengthRequiredSid( count
);
347 /******************************************************************************
348 * GetSidSubAuthority (kernelbase.@)
350 PDWORD WINAPI
GetSidSubAuthority( PSID sid
, DWORD auth
)
352 SetLastError(ERROR_SUCCESS
);
353 return RtlSubAuthoritySid( sid
, auth
);
356 /******************************************************************************
357 * GetSidSubAuthorityCount (kernelbase.@)
359 PUCHAR WINAPI
GetSidSubAuthorityCount( PSID sid
)
361 SetLastError(ERROR_SUCCESS
);
362 return RtlSubAuthorityCountSid( sid
);
365 /******************************************************************************
366 * GetWindowsAccountDomainSid (kernelbase.@)
368 BOOL WINAPI
GetWindowsAccountDomainSid( PSID sid
, PSID domain_sid
, DWORD
*size
)
370 SID_IDENTIFIER_AUTHORITY domain_ident
= { SECURITY_NT_AUTHORITY
};
374 FIXME( "(%p %p %p): semi-stub\n", sid
, domain_sid
, size
);
376 if (!sid
|| !IsValidSid( sid
))
378 SetLastError( ERROR_INVALID_SID
);
384 SetLastError( ERROR_INVALID_PARAMETER
);
388 if (*GetSidSubAuthorityCount( sid
) < 4)
390 SetLastError( ERROR_INVALID_SID
);
394 required_size
= GetSidLengthRequired( 4 );
395 if (*size
< required_size
|| !domain_sid
)
397 *size
= required_size
;
398 SetLastError( domain_sid
? ERROR_INSUFFICIENT_BUFFER
: ERROR_INVALID_PARAMETER
);
402 InitializeSid( domain_sid
, &domain_ident
, 4 );
403 for (i
= 0; i
< 4; i
++)
404 *GetSidSubAuthority( domain_sid
, i
) = *GetSidSubAuthority( sid
, i
);
406 *size
= required_size
;
410 /******************************************************************************
411 * InitializeSid (kernelbase.@)
413 BOOL WINAPI
InitializeSid ( PSID sid
, PSID_IDENTIFIER_AUTHORITY auth
, BYTE count
)
415 return set_ntstatus(RtlInitializeSid( sid
, auth
, count
));
418 /******************************************************************************
419 * IsValidSid (kernelbase.@)
421 BOOL WINAPI
IsValidSid( PSID sid
)
423 return RtlValidSid( sid
);
426 /******************************************************************************
427 * CreateWellKnownSid (kernelbase.@)
429 BOOL WINAPI
CreateWellKnownSid( WELL_KNOWN_SID_TYPE type
, PSID domain
, PSID sid
, DWORD
*size
)
433 TRACE("(%d, %s, %p, %p)\n", type
, debugstr_sid(domain
), sid
, size
);
435 if (size
== NULL
|| (domain
&& !IsValidSid(domain
)))
437 SetLastError(ERROR_INVALID_PARAMETER
);
441 for (i
= 0; i
< ARRAY_SIZE(WellKnownSids
); i
++)
443 if (WellKnownSids
[i
].Type
== type
)
445 DWORD length
= GetSidLengthRequired(WellKnownSids
[i
].Sid
.SubAuthorityCount
);
450 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
455 SetLastError(ERROR_INVALID_PARAMETER
);
458 CopyMemory(sid
, &WellKnownSids
[i
].Sid
.Revision
, length
);
464 if (domain
== NULL
|| *GetSidSubAuthorityCount(domain
) == SID_MAX_SUB_AUTHORITIES
)
466 SetLastError(ERROR_INVALID_PARAMETER
);
470 for (i
= 0; i
< ARRAY_SIZE(WellKnownRids
); i
++)
472 if (WellKnownRids
[i
].Type
== type
)
474 UCHAR domain_subauth
= *GetSidSubAuthorityCount(domain
);
475 DWORD domain_sid_length
= GetSidLengthRequired(domain_subauth
);
476 DWORD output_sid_length
= GetSidLengthRequired(domain_subauth
+ 1);
478 if (*size
< output_sid_length
)
480 *size
= output_sid_length
;
481 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
486 SetLastError(ERROR_INVALID_PARAMETER
);
489 CopyMemory(sid
, domain
, domain_sid_length
);
490 (*GetSidSubAuthorityCount(sid
))++;
491 (*GetSidSubAuthority(sid
, domain_subauth
)) = WellKnownRids
[i
].Rid
;
492 *size
= output_sid_length
;
496 SetLastError(ERROR_INVALID_PARAMETER
);
500 /******************************************************************************
501 * IsWellKnownSid (kernelbase.@)
503 BOOL WINAPI
IsWellKnownSid( PSID sid
, WELL_KNOWN_SID_TYPE type
)
507 TRACE("(%s, %d)\n", debugstr_sid(sid
), type
);
509 for (i
= 0; i
< ARRAY_SIZE(WellKnownSids
); i
++)
510 if (WellKnownSids
[i
].Type
== type
)
511 if (EqualSid(sid
, (PSID
)&WellKnownSids
[i
].Sid
.Revision
))
518 /******************************************************************************
520 ******************************************************************************/
523 /******************************************************************************
524 * AdjustTokenGroups (kernelbase.@)
526 BOOL WINAPI
AdjustTokenGroups( HANDLE token
, BOOL reset
, PTOKEN_GROUPS
new,
527 DWORD len
, PTOKEN_GROUPS prev
, PDWORD ret_len
)
529 return set_ntstatus( NtAdjustGroupsToken( token
, reset
, new, len
, prev
, ret_len
));
532 /******************************************************************************
533 * AdjustTokenPrivileges (kernelbase.@)
535 BOOL WINAPI
AdjustTokenPrivileges( HANDLE token
, BOOL disable
, PTOKEN_PRIVILEGES
new, DWORD len
,
536 PTOKEN_PRIVILEGES prev
, PDWORD ret_len
)
540 TRACE("(%p %d %p %ld %p %p)\n", token
, disable
, new, len
, prev
, ret_len
);
542 status
= NtAdjustPrivilegesToken( token
, disable
, new, len
, prev
, ret_len
);
543 SetLastError( RtlNtStatusToDosError( status
));
544 return (status
== STATUS_SUCCESS
) || (status
== STATUS_NOT_ALL_ASSIGNED
);
547 /******************************************************************************
548 * CheckTokenMembership (kernelbase.@)
550 BOOL WINAPI
CheckTokenMembership( HANDLE token
, PSID sid_to_check
, PBOOL is_member
)
552 PTOKEN_GROUPS token_groups
= NULL
;
553 HANDLE thread_token
= NULL
;
557 TRACE("(%p %s %p)\n", token
, debugstr_sid(sid_to_check
), is_member
);
563 if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY
, TRUE
, &thread_token
))
565 HANDLE process_token
;
566 ret
= OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE
, &process_token
);
569 ret
= DuplicateTokenEx(process_token
, TOKEN_QUERY
, NULL
, SecurityImpersonation
,
570 TokenImpersonation
, &thread_token
);
571 CloseHandle(process_token
);
575 token
= thread_token
;
581 ret
= GetTokenInformation(token
, TokenType
, &type
, sizeof(TOKEN_TYPE
), &size
);
584 if (type
== TokenPrimary
)
586 SetLastError(ERROR_NO_IMPERSONATION_TOKEN
);
591 ret
= GetTokenInformation(token
, TokenGroups
, NULL
, 0, &size
);
592 if (!ret
&& GetLastError() != ERROR_INSUFFICIENT_BUFFER
)
595 token_groups
= heap_alloc(size
);
602 ret
= GetTokenInformation(token
, TokenGroups
, token_groups
, size
, &size
);
606 for (i
= 0; i
< token_groups
->GroupCount
; i
++)
608 TRACE("Groups[%ld]: {0x%lx, %s}\n", i
,
609 token_groups
->Groups
[i
].Attributes
,
610 debugstr_sid(token_groups
->Groups
[i
].Sid
));
611 if ((token_groups
->Groups
[i
].Attributes
& SE_GROUP_ENABLED
) &&
612 EqualSid(sid_to_check
, token_groups
->Groups
[i
].Sid
))
615 TRACE("sid enabled and found in token\n");
621 heap_free(token_groups
);
622 if (thread_token
!= NULL
) CloseHandle(thread_token
);
626 /*************************************************************************
627 * CreateRestrictedToken (kernelbase.@)
629 BOOL WINAPI
CreateRestrictedToken( HANDLE token
, DWORD flags
,
630 DWORD disable_sid_count
, SID_AND_ATTRIBUTES
*disable_sids
,
631 DWORD delete_priv_count
, LUID_AND_ATTRIBUTES
*delete_privs
,
632 DWORD restrict_sid_count
, SID_AND_ATTRIBUTES
*restrict_sids
, HANDLE
*ret
)
634 TOKEN_PRIVILEGES
*nt_privs
= NULL
;
635 TOKEN_GROUPS
*nt_disable_sids
= NULL
, *nt_restrict_sids
= NULL
;
636 NTSTATUS status
= STATUS_NO_MEMORY
;
638 TRACE("token %p, flags %#lx, disable_sids %lu %p, delete_privs %lu %p, restrict_sids %lu %p, ret %p\n",
639 token
, flags
, disable_sid_count
, disable_sids
, delete_priv_count
, delete_privs
,
640 restrict_sid_count
, restrict_sids
, ret
);
642 if (disable_sid_count
)
644 if (!(nt_disable_sids
= heap_alloc( offsetof( TOKEN_GROUPS
, Groups
[disable_sid_count
] ) ))) goto out
;
645 nt_disable_sids
->GroupCount
= disable_sid_count
;
646 memcpy( nt_disable_sids
->Groups
, disable_sids
, disable_sid_count
* sizeof(*disable_sids
) );
649 if (delete_priv_count
)
651 if (!(nt_privs
= heap_alloc( offsetof( TOKEN_PRIVILEGES
, Privileges
[delete_priv_count
] ) ))) goto out
;
652 nt_privs
->PrivilegeCount
= delete_priv_count
;
653 memcpy( nt_privs
->Privileges
, delete_privs
, delete_priv_count
* sizeof(*delete_privs
) );
656 if (restrict_sid_count
)
658 if (!(nt_restrict_sids
= heap_alloc( offsetof( TOKEN_GROUPS
, Groups
[restrict_sid_count
] ) ))) goto out
;
659 nt_restrict_sids
->GroupCount
= restrict_sid_count
;
660 memcpy( nt_restrict_sids
->Groups
, restrict_sids
, restrict_sid_count
* sizeof(*restrict_sids
) );
663 status
= NtFilterToken(token
, flags
, nt_disable_sids
, nt_privs
, nt_restrict_sids
, ret
);
666 heap_free(nt_disable_sids
);
668 heap_free(nt_restrict_sids
);
669 return set_ntstatus( status
);
672 /******************************************************************************
673 * DuplicateToken (kernelbase.@)
675 BOOL WINAPI
DuplicateToken( HANDLE token
, SECURITY_IMPERSONATION_LEVEL level
, PHANDLE ret
)
677 return DuplicateTokenEx( token
, TOKEN_IMPERSONATE
|TOKEN_QUERY
, NULL
, level
, TokenImpersonation
, ret
);
680 /******************************************************************************
681 * DuplicateTokenEx (kernelbase.@)
683 BOOL WINAPI
DuplicateTokenEx( HANDLE token
, DWORD access
, LPSECURITY_ATTRIBUTES sa
,
684 SECURITY_IMPERSONATION_LEVEL level
, TOKEN_TYPE type
, PHANDLE ret
)
686 SECURITY_QUALITY_OF_SERVICE qos
;
687 OBJECT_ATTRIBUTES attr
;
689 TRACE("%p 0x%08lx 0x%08x 0x%08x %p\n", token
, access
, level
, type
, ret
);
691 qos
.Length
= sizeof(qos
);
692 qos
.ImpersonationLevel
= level
;
693 qos
.ContextTrackingMode
= SECURITY_STATIC_TRACKING
;
694 qos
.EffectiveOnly
= FALSE
;
695 InitializeObjectAttributes( &attr
, NULL
, (sa
&& sa
->bInheritHandle
) ? OBJ_INHERIT
: 0,
696 NULL
, sa
? sa
->lpSecurityDescriptor
: NULL
);
697 attr
.SecurityQualityOfService
= &qos
;
698 return set_ntstatus( NtDuplicateToken( token
, access
, &attr
, FALSE
, type
, ret
));
701 /******************************************************************************
702 * GetTokenInformation (kernelbase.@)
704 BOOL WINAPI
GetTokenInformation( HANDLE token
, TOKEN_INFORMATION_CLASS
class,
705 LPVOID info
, DWORD len
, LPDWORD retlen
)
707 TRACE("(%p, %s, %p, %ld, %p):\n",
709 (class == TokenUser
) ? "TokenUser" :
710 (class == TokenGroups
) ? "TokenGroups" :
711 (class == TokenPrivileges
) ? "TokenPrivileges" :
712 (class == TokenOwner
) ? "TokenOwner" :
713 (class == TokenPrimaryGroup
) ? "TokenPrimaryGroup" :
714 (class == TokenDefaultDacl
) ? "TokenDefaultDacl" :
715 (class == TokenSource
) ? "TokenSource" :
716 (class == TokenType
) ? "TokenType" :
717 (class == TokenImpersonationLevel
) ? "TokenImpersonationLevel" :
718 (class == TokenStatistics
) ? "TokenStatistics" :
719 (class == TokenRestrictedSids
) ? "TokenRestrictedSids" :
720 (class == TokenSessionId
) ? "TokenSessionId" :
721 (class == TokenGroupsAndPrivileges
) ? "TokenGroupsAndPrivileges" :
722 (class == TokenSessionReference
) ? "TokenSessionReference" :
723 (class == TokenSandBoxInert
) ? "TokenSandBoxInert" :
727 return set_ntstatus( NtQueryInformationToken( token
, class, info
, len
, retlen
));
730 /******************************************************************************
731 * ImpersonateAnonymousToken (kernelbase.@)
733 BOOL WINAPI
ImpersonateAnonymousToken( HANDLE thread
)
735 TRACE("(%p)\n", thread
);
736 return set_ntstatus( NtImpersonateAnonymousToken( thread
) );
739 /******************************************************************************
740 * ImpersonateLoggedOnUser (kernelbase.@)
742 BOOL WINAPI
ImpersonateLoggedOnUser( HANDLE token
)
748 static BOOL warn
= TRUE
;
752 FIXME( "(%p)\n", token
);
755 if (!GetTokenInformation( token
, TokenType
, &type
, sizeof(type
), &size
)) return FALSE
;
757 if (type
== TokenPrimary
)
759 if (!DuplicateToken( token
, SecurityImpersonation
, &dup
)) return FALSE
;
760 ret
= SetThreadToken( NULL
, dup
);
763 else ret
= SetThreadToken( NULL
, token
);
768 /******************************************************************************
769 * ImpersonateNamedPipeClient (kernelbase.@)
771 BOOL WINAPI
ImpersonateNamedPipeClient( HANDLE pipe
)
773 IO_STATUS_BLOCK io_block
;
775 return set_ntstatus( NtFsControlFile( pipe
, NULL
, NULL
, NULL
, &io_block
,
776 FSCTL_PIPE_IMPERSONATE
, NULL
, 0, NULL
, 0 ));
779 /******************************************************************************
780 * ImpersonateSelf (kernelbase.@)
782 BOOL WINAPI
ImpersonateSelf( SECURITY_IMPERSONATION_LEVEL level
)
784 return set_ntstatus( RtlImpersonateSelf( level
) );
787 /******************************************************************************
788 * IsTokenRestricted (kernelbase.@)
790 BOOL WINAPI
IsTokenRestricted( HANDLE token
)
792 TOKEN_GROUPS
*groups
;
797 TRACE("(%p)\n", token
);
799 status
= NtQueryInformationToken(token
, TokenRestrictedSids
, NULL
, 0, &size
);
800 if (status
!= STATUS_BUFFER_TOO_SMALL
) return set_ntstatus(status
);
802 groups
= heap_alloc(size
);
805 SetLastError(ERROR_OUTOFMEMORY
);
809 status
= NtQueryInformationToken(token
, TokenRestrictedSids
, groups
, size
, &size
);
810 if (status
!= STATUS_SUCCESS
)
813 return set_ntstatus(status
);
816 restricted
= groups
->GroupCount
> 0;
822 /******************************************************************************
823 * OpenProcessToken (kernelbase.@)
825 BOOL WINAPI
OpenProcessToken( HANDLE process
, DWORD access
, HANDLE
*handle
)
827 return set_ntstatus( NtOpenProcessToken( process
, access
, handle
));
830 /******************************************************************************
831 * OpenThreadToken (kernelbase.@)
833 BOOL WINAPI
OpenThreadToken( HANDLE thread
, DWORD access
, BOOL self
, HANDLE
*handle
)
835 return set_ntstatus( NtOpenThreadToken( thread
, access
, self
, handle
));
838 /******************************************************************************
839 * PrivilegeCheck (kernelbase.@)
841 BOOL WINAPI
PrivilegeCheck( HANDLE token
, PPRIVILEGE_SET privs
, LPBOOL result
)
844 BOOL ret
= set_ntstatus( NtPrivilegeCheck( token
, privs
, &res
));
845 if (ret
) *result
= res
;
849 /******************************************************************************
850 * RevertToSelf (kernelbase.@)
852 BOOL WINAPI
RevertToSelf(void)
854 return SetThreadToken( NULL
, 0 );
857 /*************************************************************************
858 * SetThreadToken (kernelbase.@)
860 BOOL WINAPI
SetThreadToken( PHANDLE thread
, HANDLE token
)
862 return set_ntstatus( NtSetInformationThread( thread
? *thread
: GetCurrentThread(),
863 ThreadImpersonationToken
, &token
, sizeof(token
) ));
866 /******************************************************************************
867 * SetTokenInformation (kernelbase.@)
869 BOOL WINAPI
SetTokenInformation( HANDLE token
, TOKEN_INFORMATION_CLASS
class, LPVOID info
, DWORD len
)
871 TRACE("(%p, %s, %p, %ld)\n",
873 (class == TokenUser
) ? "TokenUser" :
874 (class == TokenGroups
) ? "TokenGroups" :
875 (class == TokenPrivileges
) ? "TokenPrivileges" :
876 (class == TokenOwner
) ? "TokenOwner" :
877 (class == TokenPrimaryGroup
) ? "TokenPrimaryGroup" :
878 (class == TokenDefaultDacl
) ? "TokenDefaultDacl" :
879 (class == TokenSource
) ? "TokenSource" :
880 (class == TokenType
) ? "TokenType" :
881 (class == TokenImpersonationLevel
) ? "TokenImpersonationLevel" :
882 (class == TokenStatistics
) ? "TokenStatistics" :
883 (class == TokenRestrictedSids
) ? "TokenRestrictedSids" :
884 (class == TokenSessionId
) ? "TokenSessionId" :
885 (class == TokenGroupsAndPrivileges
) ? "TokenGroupsAndPrivileges" :
886 (class == TokenSessionReference
) ? "TokenSessionReference" :
887 (class == TokenSandBoxInert
) ? "TokenSandBoxInert" :
891 return set_ntstatus( NtSetInformationToken( token
, class, info
, len
));
895 /******************************************************************************
896 * Security descriptor functions
897 ******************************************************************************/
900 /******************************************************************************
901 * ConvertToAutoInheritPrivateObjectSecurity (kernelbase.@)
903 BOOL WINAPI
ConvertToAutoInheritPrivateObjectSecurity( PSECURITY_DESCRIPTOR parent
,
904 PSECURITY_DESCRIPTOR current
,
905 PSECURITY_DESCRIPTOR
*descr
,
906 GUID
*type
, BOOL is_dir
,
907 PGENERIC_MAPPING mapping
)
909 return set_ntstatus( RtlConvertToAutoInheritSecurityObject( parent
, current
, descr
, type
, is_dir
, mapping
));
912 /******************************************************************************
913 * CreateBoundaryDescriptorW (kernelbase.@)
915 HANDLE WINAPI
CreateBoundaryDescriptorW( LPCWSTR name
, ULONG flags
)
917 FIXME("%s %lu - stub\n", debugstr_w(name
), flags
);
921 /******************************************************************************
922 * CreatePrivateObjectSecurity (kernelbase.@)
924 BOOL WINAPI
CreatePrivateObjectSecurity( PSECURITY_DESCRIPTOR parent
, PSECURITY_DESCRIPTOR creator
,
925 PSECURITY_DESCRIPTOR
*descr
, BOOL is_container
, HANDLE token
,
926 PGENERIC_MAPPING mapping
)
928 return set_ntstatus( RtlNewSecurityObject( parent
, creator
, descr
, is_container
, token
, mapping
));
931 /******************************************************************************
932 * CreatePrivateObjectSecurityEx (kernelbase.@)
934 BOOL WINAPI
CreatePrivateObjectSecurityEx( PSECURITY_DESCRIPTOR parent
, PSECURITY_DESCRIPTOR creator
,
935 PSECURITY_DESCRIPTOR
*descr
, GUID
*type
, BOOL is_container
,
936 ULONG flags
, HANDLE token
, PGENERIC_MAPPING mapping
)
938 return set_ntstatus( RtlNewSecurityObjectEx( parent
, creator
, descr
, type
, is_container
, flags
, token
, mapping
));
941 /******************************************************************************
942 * CreatePrivateObjectSecurityWithMultipleInheritance (kernelbase.@)
944 BOOL WINAPI
CreatePrivateObjectSecurityWithMultipleInheritance( PSECURITY_DESCRIPTOR parent
,
945 PSECURITY_DESCRIPTOR creator
,
946 PSECURITY_DESCRIPTOR
*descr
,
947 GUID
**types
, ULONG count
,
948 BOOL is_container
, ULONG flags
,
949 HANDLE token
, PGENERIC_MAPPING mapping
)
951 return set_ntstatus( RtlNewSecurityObjectWithMultipleInheritance( parent
, creator
, descr
, types
, count
,
952 is_container
, flags
, token
, mapping
));
955 /******************************************************************************
956 * DestroyPrivateObjectSecurity (kernelbase.@)
958 BOOL WINAPI
DestroyPrivateObjectSecurity( PSECURITY_DESCRIPTOR
*descr
)
960 return set_ntstatus( RtlDeleteSecurityObject( descr
));
963 /******************************************************************************
964 * GetFileSecurityW (kernelbase.@)
966 BOOL WINAPI
GetFileSecurityW( LPCWSTR name
, SECURITY_INFORMATION info
,
967 PSECURITY_DESCRIPTOR descr
, DWORD len
, LPDWORD ret_len
)
973 TRACE( "(%s,%ld,%p,%ld,%p)\n", debugstr_w(name
), info
, descr
, len
, ret_len
);
975 if (info
& (OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
| DACL_SECURITY_INFORMATION
))
976 access
|= READ_CONTROL
;
977 if (info
& SACL_SECURITY_INFORMATION
)
978 access
|= ACCESS_SYSTEM_SECURITY
;
980 if (!(status
= open_file( name
, access
, &file
)))
982 status
= NtQuerySecurityObject( file
, info
, descr
, len
, ret_len
);
985 return set_ntstatus( status
);
988 /******************************************************************************
989 * GetKernelObjectSecurity (kernelbase.@)
991 BOOL WINAPI
GetKernelObjectSecurity( HANDLE handle
, SECURITY_INFORMATION info
,
992 PSECURITY_DESCRIPTOR descr
, DWORD len
, LPDWORD ret_len
)
994 return set_ntstatus( NtQuerySecurityObject( handle
, info
, descr
, len
, ret_len
));
997 /******************************************************************************
998 * GetPrivateObjectSecurity (kernelbase.@)
1000 BOOL WINAPI
GetPrivateObjectSecurity( PSECURITY_DESCRIPTOR obj_descr
, SECURITY_INFORMATION info
,
1001 PSECURITY_DESCRIPTOR ret_descr
, DWORD len
, PDWORD ret_len
)
1003 SECURITY_DESCRIPTOR desc
;
1004 BOOL defaulted
, present
;
1008 TRACE("(%p,0x%08lx,%p,0x%08lx,%p)\n", obj_descr
, info
, ret_descr
, len
, ret_len
);
1010 if (!InitializeSecurityDescriptor(&desc
, SECURITY_DESCRIPTOR_REVISION
)) return FALSE
;
1012 if (info
& OWNER_SECURITY_INFORMATION
)
1014 if (!GetSecurityDescriptorOwner(obj_descr
, &psid
, &defaulted
)) return FALSE
;
1015 SetSecurityDescriptorOwner(&desc
, psid
, defaulted
);
1017 if (info
& GROUP_SECURITY_INFORMATION
)
1019 if (!GetSecurityDescriptorGroup(obj_descr
, &psid
, &defaulted
)) return FALSE
;
1020 SetSecurityDescriptorGroup(&desc
, psid
, defaulted
);
1022 if (info
& DACL_SECURITY_INFORMATION
)
1024 if (!GetSecurityDescriptorDacl(obj_descr
, &present
, &pacl
, &defaulted
)) return FALSE
;
1025 SetSecurityDescriptorDacl(&desc
, present
, pacl
, defaulted
);
1027 if (info
& SACL_SECURITY_INFORMATION
)
1029 if (!GetSecurityDescriptorSacl(obj_descr
, &present
, &pacl
, &defaulted
)) return FALSE
;
1030 SetSecurityDescriptorSacl(&desc
, present
, pacl
, defaulted
);
1034 return MakeSelfRelativeSD(&desc
, ret_descr
, ret_len
);
1037 /******************************************************************************
1038 * GetSecurityDescriptorControl (kernelbase.@)
1040 BOOL WINAPI
GetSecurityDescriptorControl( PSECURITY_DESCRIPTOR descr
, PSECURITY_DESCRIPTOR_CONTROL control
,
1043 return set_ntstatus( RtlGetControlSecurityDescriptor( descr
, control
, revision
));
1046 /******************************************************************************
1047 * GetSecurityDescriptorDacl (kernelbase.@)
1049 BOOL WINAPI
GetSecurityDescriptorDacl( PSECURITY_DESCRIPTOR descr
, LPBOOL dacl_present
, PACL
*dacl
,
1050 LPBOOL dacl_defaulted
)
1052 BOOLEAN present
, defaulted
;
1053 BOOL ret
= set_ntstatus( RtlGetDaclSecurityDescriptor( descr
, &present
, dacl
, &defaulted
));
1054 *dacl_present
= present
;
1055 *dacl_defaulted
= defaulted
;
1059 /******************************************************************************
1060 * GetSecurityDescriptorGroup (kernelbase.@)
1062 BOOL WINAPI
GetSecurityDescriptorGroup( PSECURITY_DESCRIPTOR descr
, PSID
*group
, LPBOOL group_defaulted
)
1065 BOOL ret
= set_ntstatus( RtlGetGroupSecurityDescriptor( descr
, group
, &defaulted
));
1066 *group_defaulted
= defaulted
;
1070 /******************************************************************************
1071 * GetSecurityDescriptorLength (kernelbase.@)
1073 DWORD WINAPI
GetSecurityDescriptorLength( PSECURITY_DESCRIPTOR descr
)
1075 return RtlLengthSecurityDescriptor( descr
);
1078 /******************************************************************************
1079 * GetSecurityDescriptorOwner (kernelbase.@)
1081 BOOL WINAPI
GetSecurityDescriptorOwner( PSECURITY_DESCRIPTOR descr
, PSID
*owner
, LPBOOL owner_defaulted
)
1084 BOOL ret
= set_ntstatus( RtlGetOwnerSecurityDescriptor( descr
, owner
, &defaulted
));
1085 *owner_defaulted
= defaulted
;
1089 /******************************************************************************
1090 * GetSecurityDescriptorSacl (kernelbase.@)
1092 BOOL WINAPI
GetSecurityDescriptorSacl( PSECURITY_DESCRIPTOR descr
, LPBOOL sacl_present
, PACL
*sacl
,
1093 LPBOOL sacl_defaulted
)
1095 BOOLEAN present
, defaulted
;
1096 BOOL ret
= set_ntstatus( RtlGetSaclSecurityDescriptor( descr
, &present
, sacl
, &defaulted
));
1097 *sacl_present
= present
;
1098 *sacl_defaulted
= defaulted
;
1102 /******************************************************************************
1103 * InitializeSecurityDescriptor (kernelbase.@)
1105 BOOL WINAPI
InitializeSecurityDescriptor( PSECURITY_DESCRIPTOR descr
, DWORD revision
)
1107 return set_ntstatus( RtlCreateSecurityDescriptor( descr
, revision
));
1110 /******************************************************************************
1111 * IsValidSecurityDescriptor (kernelbase.@)
1113 BOOL WINAPI
IsValidSecurityDescriptor( PSECURITY_DESCRIPTOR descr
)
1115 if (!RtlValidSecurityDescriptor( descr
))
1116 return set_ntstatus(STATUS_INVALID_SECURITY_DESCR
);
1121 /******************************************************************************
1122 * MakeAbsoluteSD (kernelbase.@)
1124 BOOL WINAPI
MakeAbsoluteSD ( PSECURITY_DESCRIPTOR rel_descr
, PSECURITY_DESCRIPTOR abs_descr
,
1125 LPDWORD abs_size
, PACL dacl
, LPDWORD dacl_size
, PACL sacl
, LPDWORD sacl_size
,
1126 PSID owner
, LPDWORD owner_size
, PSID group
, LPDWORD group_size
)
1128 return set_ntstatus( RtlSelfRelativeToAbsoluteSD( rel_descr
, abs_descr
, abs_size
,
1129 dacl
, dacl_size
, sacl
, sacl_size
,
1130 owner
, owner_size
, group
, group_size
));
1133 /******************************************************************************
1134 * MakeSelfRelativeSD (kernelbase.@)
1136 BOOL WINAPI
MakeSelfRelativeSD( PSECURITY_DESCRIPTOR abs_descr
, PSECURITY_DESCRIPTOR rel_descr
,
1139 return set_ntstatus( RtlMakeSelfRelativeSD( abs_descr
, rel_descr
, len
));
1142 /******************************************************************************
1143 * SetFileSecurityW (kernelbase.@)
1145 BOOL WINAPI
SetFileSecurityW( LPCWSTR name
, SECURITY_INFORMATION info
, PSECURITY_DESCRIPTOR descr
)
1151 TRACE( "(%s, 0x%lx, %p)\n", debugstr_w(name
), info
, descr
);
1153 if (info
& (OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
)) access
|= WRITE_OWNER
;
1154 if (info
& SACL_SECURITY_INFORMATION
) access
|= ACCESS_SYSTEM_SECURITY
;
1155 if (info
& DACL_SECURITY_INFORMATION
) access
|= WRITE_DAC
;
1157 if (!(status
= open_file( name
, access
, &file
)))
1159 status
= NtSetSecurityObject( file
, info
, descr
);
1162 return set_ntstatus( status
);
1165 /*************************************************************************
1166 * SetKernelObjectSecurity (kernelbase.@)
1168 BOOL WINAPI
SetKernelObjectSecurity( HANDLE handle
, SECURITY_INFORMATION info
, PSECURITY_DESCRIPTOR descr
)
1170 return set_ntstatus( NtSetSecurityObject( handle
, info
, descr
));
1173 /*************************************************************************
1174 * SetPrivateObjectSecurity (kernelbase.@)
1176 BOOL WINAPI
SetPrivateObjectSecurity( SECURITY_INFORMATION info
, PSECURITY_DESCRIPTOR descr
,
1177 PSECURITY_DESCRIPTOR
*obj_descr
, PGENERIC_MAPPING mapping
,
1180 FIXME( "0x%08lx %p %p %p %p - stub\n", info
, descr
, obj_descr
, mapping
, token
);
1184 /*************************************************************************
1185 * SetPrivateObjectSecurityEx (kernelbase.@)
1187 BOOL WINAPI
SetPrivateObjectSecurityEx( SECURITY_INFORMATION info
, PSECURITY_DESCRIPTOR descr
,
1188 PSECURITY_DESCRIPTOR
*obj_descr
, ULONG flags
,
1189 PGENERIC_MAPPING mapping
, HANDLE token
)
1191 FIXME( "0x%08lx %p %p %lu %p %p - stub\n", info
, descr
, obj_descr
, flags
, mapping
, token
);
1195 /******************************************************************************
1196 * SetSecurityDescriptorControl (kernelbase.@)
1198 BOOL WINAPI
SetSecurityDescriptorControl( PSECURITY_DESCRIPTOR descr
, SECURITY_DESCRIPTOR_CONTROL mask
,
1199 SECURITY_DESCRIPTOR_CONTROL set
)
1201 return set_ntstatus( RtlSetControlSecurityDescriptor( descr
, mask
, set
));
1204 /******************************************************************************
1205 * SetSecurityDescriptorDacl (kernelbase.@)
1207 BOOL WINAPI
SetSecurityDescriptorDacl( PSECURITY_DESCRIPTOR descr
, BOOL present
, PACL dacl
, BOOL defaulted
)
1209 return set_ntstatus( RtlSetDaclSecurityDescriptor( descr
, present
, dacl
, defaulted
));
1212 /******************************************************************************
1213 * SetSecurityDescriptorGroup (kernelbase.@)
1215 BOOL WINAPI
SetSecurityDescriptorGroup( PSECURITY_DESCRIPTOR descr
, PSID group
, BOOL defaulted
)
1217 return set_ntstatus( RtlSetGroupSecurityDescriptor( descr
, group
, defaulted
));
1220 /******************************************************************************
1221 * SetSecurityDescriptorOwner (kernelbase.@)
1223 BOOL WINAPI
SetSecurityDescriptorOwner( PSECURITY_DESCRIPTOR descr
, PSID owner
, BOOL defaulted
)
1225 return set_ntstatus( RtlSetOwnerSecurityDescriptor( descr
, owner
, defaulted
));
1228 /**************************************************************************
1229 * SetSecurityDescriptorSacl (kernelbase.@)
1231 BOOL WINAPI
SetSecurityDescriptorSacl ( PSECURITY_DESCRIPTOR descr
, BOOL present
, PACL sacl
, BOOL defaulted
)
1233 return set_ntstatus( RtlSetSaclSecurityDescriptor( descr
, present
, sacl
, defaulted
));
1237 /******************************************************************************
1238 * Access control functions
1239 ******************************************************************************/
1242 /******************************************************************************
1243 * AccessCheck (kernelbase.@)
1245 BOOL WINAPI
AccessCheck( PSECURITY_DESCRIPTOR descr
, HANDLE token
, DWORD access
, PGENERIC_MAPPING mapping
,
1246 PPRIVILEGE_SET priv
, LPDWORD priv_len
, LPDWORD granted
, LPBOOL status
)
1248 NTSTATUS access_status
;
1249 BOOL ret
= set_ntstatus( NtAccessCheck( descr
, token
, access
, mapping
, priv
, priv_len
,
1250 granted
, &access_status
));
1251 if (ret
) *status
= set_ntstatus( access_status
);
1255 /******************************************************************************
1256 * AccessCheckAndAuditAlarmW (kernelbase.@)
1258 BOOL WINAPI
AccessCheckAndAuditAlarmW( LPCWSTR subsystem
, LPVOID id
, LPWSTR type_name
,
1259 LPWSTR name
, PSECURITY_DESCRIPTOR descr
, DWORD access
,
1260 PGENERIC_MAPPING mapping
, BOOL creation
,
1261 LPDWORD granted
, LPBOOL status
, LPBOOL on_close
)
1263 FIXME( "stub (%s,%p,%s,%s,%p,%08lx,%p,%x,%p,%p,%p)\n", debugstr_w(subsystem
),
1264 id
, debugstr_w(type_name
), debugstr_w(name
), descr
, access
, mapping
,
1265 creation
, granted
, status
, on_close
);
1269 /******************************************************************************
1270 * AccessCheckByType (kernelbase.@)
1272 BOOL WINAPI
AccessCheckByType( PSECURITY_DESCRIPTOR descr
, PSID sid
, HANDLE token
, DWORD access
,
1273 POBJECT_TYPE_LIST types
, DWORD types_len
, PGENERIC_MAPPING mapping
,
1274 PPRIVILEGE_SET priv
, LPDWORD priv_len
, LPDWORD granted
, LPBOOL status
)
1281 /******************************************************************************
1282 * AddAccessAllowedAce (kernelbase.@)
1284 BOOL WINAPI
AddAccessAllowedAce( PACL acl
, DWORD rev
, DWORD access
, PSID sid
)
1286 return set_ntstatus( RtlAddAccessAllowedAce( acl
, rev
, access
, sid
));
1289 /******************************************************************************
1290 * AddAccessAllowedAceEx (kernelbase.@)
1292 BOOL WINAPI
AddAccessAllowedAceEx( PACL acl
, DWORD rev
, DWORD flags
, DWORD access
, PSID sid
)
1294 return set_ntstatus( RtlAddAccessAllowedAceEx( acl
, rev
, flags
, access
, sid
));
1297 /******************************************************************************
1298 * AddAccessAllowedObjectAce (kernelbase.@)
1300 BOOL WINAPI
AddAccessAllowedObjectAce( PACL acl
, DWORD rev
, DWORD flags
, DWORD access
,
1301 GUID
*type
, GUID
*inherit
, PSID sid
)
1303 return set_ntstatus( RtlAddAccessAllowedObjectAce( acl
, rev
, flags
, access
, type
, inherit
, sid
));
1306 /******************************************************************************
1307 * AddAccessDeniedAce (kernelbase.@)
1309 BOOL WINAPI
AddAccessDeniedAce( PACL acl
, DWORD rev
, DWORD access
, PSID sid
)
1311 return set_ntstatus( RtlAddAccessDeniedAce( acl
, rev
, access
, sid
));
1314 /******************************************************************************
1315 * AddAccessDeniedAceEx (kernelbase.@)
1317 BOOL WINAPI
AddAccessDeniedAceEx( PACL acl
, DWORD rev
, DWORD flags
, DWORD access
, PSID sid
)
1319 return set_ntstatus( RtlAddAccessDeniedAceEx( acl
, rev
, flags
, access
, sid
));
1322 /******************************************************************************
1323 * AddAccessDeniedObjectAce (kernelbase.@)
1325 BOOL WINAPI
AddAccessDeniedObjectAce( PACL acl
, DWORD rev
, DWORD flags
, DWORD access
,
1326 GUID
*type
, GUID
*inherit
, PSID sid
)
1328 return set_ntstatus( RtlAddAccessDeniedObjectAce( acl
, rev
, flags
, access
, type
, inherit
, sid
));
1331 /******************************************************************************
1332 * AddAce (kernelbase.@)
1334 BOOL WINAPI
AddAce( PACL acl
, DWORD rev
, DWORD index
, LPVOID list
, DWORD len
)
1336 return set_ntstatus( RtlAddAce( acl
, rev
, index
, list
, len
));
1339 /******************************************************************************
1340 * AddAuditAccessAce (kernelbase.@)
1342 BOOL WINAPI
AddAuditAccessAce( PACL acl
, DWORD rev
, DWORD access
, PSID sid
, BOOL success
, BOOL failure
)
1344 return set_ntstatus( RtlAddAuditAccessAce( acl
, rev
, access
, sid
, success
, failure
));
1347 /******************************************************************************
1348 * AddAuditAccessAceEx (kernelbase.@)
1350 BOOL WINAPI
AddAuditAccessAceEx( PACL acl
, DWORD rev
, DWORD flags
, DWORD access
,
1351 PSID sid
, BOOL success
, BOOL failure
)
1353 return set_ntstatus( RtlAddAuditAccessAceEx( acl
, rev
, flags
, access
, sid
, success
, failure
));
1356 /******************************************************************************
1357 * AddAuditAccessObjectAce (kernelbase.@)
1359 BOOL WINAPI
AddAuditAccessObjectAce( PACL acl
, DWORD rev
, DWORD flags
, DWORD access
,
1360 GUID
*type
, GUID
*inherit
, PSID sid
, BOOL success
, BOOL failure
)
1362 return set_ntstatus( RtlAddAuditAccessObjectAce( acl
, rev
, flags
, access
,
1363 type
, inherit
, sid
, success
, failure
));
1366 /******************************************************************************
1367 * AddMandatoryAce (kernelbase.@)
1369 BOOL WINAPI
AddMandatoryAce( PACL acl
, DWORD rev
, DWORD flags
, DWORD policy
, PSID sid
)
1371 return set_ntstatus( RtlAddMandatoryAce( acl
, rev
, flags
, policy
,
1372 SYSTEM_MANDATORY_LABEL_ACE_TYPE
, sid
));
1375 /******************************************************************************
1376 * AreAllAccessesGranted (kernelbase.@)
1378 BOOL WINAPI
AreAllAccessesGranted( DWORD granted
, DWORD desired
)
1380 return RtlAreAllAccessesGranted( granted
, desired
);
1383 /******************************************************************************
1384 * AreAnyAccessesGranted (kernelbase.@)
1386 BOOL WINAPI
AreAnyAccessesGranted( DWORD granted
, DWORD desired
)
1388 return RtlAreAnyAccessesGranted( granted
, desired
);
1391 /******************************************************************************
1392 * DeleteAce (kernelbase.@)
1394 BOOL WINAPI
DeleteAce( PACL acl
, DWORD index
)
1396 return set_ntstatus( RtlDeleteAce( acl
, index
));
1399 /******************************************************************************
1400 * FindFirstFreeAce (kernelbase.@)
1402 BOOL WINAPI
FindFirstFreeAce( PACL acl
, LPVOID
*ace
)
1404 return RtlFirstFreeAce( acl
, (PACE_HEADER
*)ace
);
1407 /******************************************************************************
1408 * GetAce (kernelbase.@)
1410 BOOL WINAPI
GetAce( PACL acl
, DWORD index
, LPVOID
*ace
)
1412 return set_ntstatus( RtlGetAce( acl
, index
, ace
));
1415 /******************************************************************************
1416 * GetAclInformation (kernelbase.@)
1418 BOOL WINAPI
GetAclInformation( PACL acl
, LPVOID info
, DWORD len
, ACL_INFORMATION_CLASS
class )
1420 return set_ntstatus( RtlQueryInformationAcl( acl
, info
, len
, class ));
1423 /*************************************************************************
1424 * InitializeAcl (kernelbase.@)
1426 BOOL WINAPI
InitializeAcl( PACL acl
, DWORD size
, DWORD rev
)
1428 return set_ntstatus( RtlCreateAcl( acl
, size
, rev
));
1431 /******************************************************************************
1432 * IsValidAcl (kernelbase.@)
1434 BOOL WINAPI
IsValidAcl( PACL acl
)
1436 return RtlValidAcl( acl
);
1439 /******************************************************************************
1440 * MapGenericMask (kernelbase.@)
1442 void WINAPI
MapGenericMask( PDWORD access
, PGENERIC_MAPPING mapping
)
1444 RtlMapGenericMask( access
, mapping
);
1447 /******************************************************************************
1448 * ObjectCloseAuditAlarmW (kernelbase.@)
1450 BOOL WINAPI
ObjectCloseAuditAlarmW( LPCWSTR subsystem
, LPVOID id
, BOOL on_close
)
1452 FIXME( "stub (%s,%p,%x)\n", debugstr_w(subsystem
), id
, on_close
);
1456 /******************************************************************************
1457 * ObjectDeleteAuditAlarmW (kernelbase.@)
1459 BOOL WINAPI
ObjectDeleteAuditAlarmW( LPCWSTR subsystem
, LPVOID id
, BOOL on_close
)
1461 FIXME( "stub (%s,%p,%x)\n", debugstr_w(subsystem
), id
, on_close
);
1465 /******************************************************************************
1466 * ObjectOpenAuditAlarmW (kernelbase.@)
1468 BOOL WINAPI
ObjectOpenAuditAlarmW( LPCWSTR subsystem
, LPVOID id
, LPWSTR type
, LPWSTR name
,
1469 PSECURITY_DESCRIPTOR descr
, HANDLE token
, DWORD desired
,
1470 DWORD granted
, PPRIVILEGE_SET privs
, BOOL creation
,
1471 BOOL access
, LPBOOL on_close
)
1473 FIXME( "stub (%s,%p,%s,%s,%p,%p,0x%08lx,0x%08lx,%p,%x,%x,%p)\n", debugstr_w(subsystem
),
1474 id
, debugstr_w(type
), debugstr_w(name
), descr
, token
, desired
, granted
,
1475 privs
, creation
, access
, on_close
);
1479 /******************************************************************************
1480 * ObjectPrivilegeAuditAlarmW (kernelbase.@)
1482 BOOL WINAPI
ObjectPrivilegeAuditAlarmW( LPCWSTR subsystem
, LPVOID id
, HANDLE token
,
1483 DWORD desired
, PPRIVILEGE_SET privs
, BOOL granted
)
1485 FIXME( "stub (%s,%p,%p,0x%08lx,%p,%x)\n", debugstr_w(subsystem
), id
, token
, desired
, privs
, granted
);
1489 /******************************************************************************
1490 * PrivilegedServiceAuditAlarmW (kernelbase.@)
1492 BOOL WINAPI
PrivilegedServiceAuditAlarmW( LPCWSTR subsystem
, LPCWSTR service
, HANDLE token
,
1493 PPRIVILEGE_SET privs
, BOOL granted
)
1495 FIXME( "stub %s,%s,%p,%p,%x)\n", debugstr_w(subsystem
), debugstr_w(service
), token
, privs
, granted
);
1499 /******************************************************************************
1500 * SetAclInformation (kernelbase.@)
1502 BOOL WINAPI
SetAclInformation( PACL acl
, LPVOID info
, DWORD len
, ACL_INFORMATION_CLASS
class )
1504 FIXME( "%p %p 0x%08lx 0x%08x - stub\n", acl
, info
, len
, class );
1508 /******************************************************************************
1509 * SetCachedSigningLevel (kernelbase.@)
1511 BOOL WINAPI
SetCachedSigningLevel( PHANDLE source
, ULONG count
, ULONG flags
, HANDLE file
)
1513 FIXME( "%p %lu %lu %p - stub\n", source
, count
, flags
, file
);