2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/advapi32/token/token.c
5 * PURPOSE: Token functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
11 #define NTOS_MODE_USER
19 WINBOOL ResetToDefault,
20 PTOKEN_GROUPS NewState,
22 PTOKEN_GROUPS PreviousState,
27 errCode = NtAdjustGroupsToken(TokenHandle,ResetToDefault,NewState,
28 BufferLength, PreviousState, (PULONG)ReturnLength );
29 if ( !NT_SUCCESS(errCode) ) {
30 SetLastError(RtlNtStatusToDosError(errCode));
38 AdjustTokenPrivileges (
40 WINBOOL DisableAllPrivileges,
41 PTOKEN_PRIVILEGES NewState,
43 PTOKEN_PRIVILEGES PreviousState,
47 errCode = NtAdjustPrivilegesToken(TokenHandle,DisableAllPrivileges,NewState,
48 BufferLength, PreviousState, (PULONG)ReturnLength );
49 if ( !NT_SUCCESS(errCode) ) {
50 SetLastError(RtlNtStatusToDosError(errCode));
61 TOKEN_INFORMATION_CLASS TokenInformationClass,
62 LPVOID TokenInformation,
63 DWORD TokenInformationLength,
68 errCode = NtQueryInformationToken(TokenHandle,TokenInformationClass,TokenInformation,
69 TokenInformationLength, (PULONG)ReturnLength);
70 if ( !NT_SUCCESS(errCode) ) {
71 SetLastError(RtlNtStatusToDosError(errCode));
81 TOKEN_INFORMATION_CLASS TokenInformationClass,
82 LPVOID TokenInformation,
83 DWORD TokenInformationLength
87 errCode = NtSetInformationToken(TokenHandle,TokenInformationClass,TokenInformation,
88 TokenInformationLength);
89 if ( !NT_SUCCESS(errCode) ) {
90 SetLastError(RtlNtStatusToDosError(errCode));
99 PSECURITY_DESCRIPTOR pSecurityDescriptor,
102 PGENERIC_MAPPING GenericMapping,
103 PPRIVILEGE_SET PrivilegeSet,
104 LPDWORD PrivilegeSetLength,
105 LPDWORD GrantedAccess,
110 errCode = NtAccessCheck( pSecurityDescriptor,
115 (PULONG)PrivilegeSetLength,
116 (PULONG)GrantedAccess,
117 (PBOOLEAN)AccessStatus);
118 if ( !NT_SUCCESS(errCode) ) {
119 SetLastError(RtlNtStatusToDosError(errCode));
130 HANDLE ProcessHandle,
136 errCode = NtOpenProcessToken(ProcessHandle,DesiredAccess,TokenHandle);
137 if ( !NT_SUCCESS(errCode) ) {
138 SetLastError(RtlNtStatusToDosError(errCode));
156 errCode = NtOpenThreadToken(ThreadHandle,DesiredAccess,OpenAsSelf,TokenHandle);
157 if ( !NT_SUCCESS(errCode) ) {
158 SetLastError(RtlNtStatusToDosError(errCode));
168 PHANDLE ThreadHandle,
173 HANDLE hThread = NtCurrentThread();
174 if ( ThreadHandle != NULL )
175 hThread = ThreadHandle;
176 errCode = NtSetInformationThread(hThread,ThreadImpersonationToken,TokenHandle,sizeof(HANDLE));
177 if ( !NT_SUCCESS(errCode) ) {
178 SetLastError(RtlNtStatusToDosError(errCode));
188 HANDLE ExistingTokenHandle,
189 DWORD dwDesiredAccess,
190 LPSECURITY_ATTRIBUTES lpTokenAttributes,
191 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
192 TOKEN_TYPE TokenType,
193 PHANDLE DuplicateTokenHandle
199 OBJECT_ATTRIBUTES ObjectAttributes;
202 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
203 ObjectAttributes.RootDirectory = NULL;
204 ObjectAttributes.ObjectName = NULL;
205 ObjectAttributes.Attributes = 0;
206 if ( lpTokenAttributes->bInheritHandle )
207 ObjectAttributes.Attributes |= OBJ_INHERIT;
209 ObjectAttributes.SecurityDescriptor = lpTokenAttributes->lpSecurityDescriptor;
210 ObjectAttributes.SecurityQualityOfService = NULL;
212 errCode = NtDuplicateToken( ExistingTokenHandle, dwDesiredAccess,
213 &ObjectAttributes, ImpersonationLevel,
214 TokenType, &NewToken );
216 if ( !NT_SUCCESS(errCode) ) {
217 SetLastError(RtlNtStatusToDosError(errCode));
227 HANDLE ExistingTokenHandle,
228 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
229 PHANDLE DuplicateTokenHandle
232 return DuplicateTokenEx (
234 TOKEN_DUPLICATE|TOKEN_IMPERSONATE|TOKEN_QUERY,