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
,