1 /* $Id: token.c,v 1.16 2004/12/11 00:21:33 weiden Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/advapi32/token/token.c
6 * PURPOSE: Token functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
19 AdjustTokenGroups (HANDLE TokenHandle
,
21 PTOKEN_GROUPS NewState
,
23 PTOKEN_GROUPS PreviousState
,
28 Status
= NtAdjustGroupsToken (TokenHandle
,
33 (PULONG
)ReturnLength
);
34 if (!NT_SUCCESS (Status
))
36 SetLastError (RtlNtStatusToDosError (Status
));
48 AdjustTokenPrivileges (HANDLE TokenHandle
,
49 BOOL DisableAllPrivileges
,
50 PTOKEN_PRIVILEGES NewState
,
52 PTOKEN_PRIVILEGES PreviousState
,
57 Status
= NtAdjustPrivilegesToken (TokenHandle
,
62 (PULONG
)ReturnLength
);
63 if (STATUS_NOT_ALL_ASSIGNED
== Status
)
65 SetLastError(ERROR_NOT_ALL_ASSIGNED
);
68 if (! NT_SUCCESS(Status
))
70 SetLastError(RtlNtStatusToDosError(Status
));
74 SetLastError(ERROR_SUCCESS
); /* AdjustTokenPrivileges is documented to do this */
83 GetTokenInformation (HANDLE TokenHandle
,
84 TOKEN_INFORMATION_CLASS TokenInformationClass
,
85 LPVOID TokenInformation
,
86 DWORD TokenInformationLength
,
91 Status
= NtQueryInformationToken (TokenHandle
,
92 TokenInformationClass
,
94 TokenInformationLength
,
95 (PULONG
)ReturnLength
);
96 if (!NT_SUCCESS (Status
))
98 SetLastError (RtlNtStatusToDosError (Status
));
110 SetTokenInformation (HANDLE TokenHandle
,
111 TOKEN_INFORMATION_CLASS TokenInformationClass
,
112 LPVOID TokenInformation
,
113 DWORD TokenInformationLength
)
117 Status
= NtSetInformationToken (TokenHandle
,
118 TokenInformationClass
,
120 TokenInformationLength
);
121 if (!NT_SUCCESS (Status
))
123 SetLastError (RtlNtStatusToDosError (Status
));
135 AccessCheck (PSECURITY_DESCRIPTOR pSecurityDescriptor
,
138 PGENERIC_MAPPING GenericMapping
,
139 PPRIVILEGE_SET PrivilegeSet
,
140 LPDWORD PrivilegeSetLength
,
141 LPDWORD GrantedAccess
,
147 Status
= NtAccessCheck (pSecurityDescriptor
,
152 (PULONG
)PrivilegeSetLength
,
153 (PACCESS_MASK
)GrantedAccess
,
155 if (!NT_SUCCESS (Status
))
157 SetLastError (RtlNtStatusToDosError (Status
));
161 if (!NT_SUCCESS (AccessStat
))
163 SetLastError (RtlNtStatusToDosError (Status
));
164 *AccessStatus
= FALSE
;
168 *AccessStatus
= TRUE
;
178 OpenProcessToken (HANDLE ProcessHandle
,
184 Status
= NtOpenProcessToken (ProcessHandle
,
187 if (!NT_SUCCESS (Status
))
189 SetLastError (RtlNtStatusToDosError (Status
));
201 OpenThreadToken (HANDLE ThreadHandle
,
208 Status
= NtOpenThreadToken (ThreadHandle
,
212 if (!NT_SUCCESS(Status
))
214 SetLastError (RtlNtStatusToDosError (Status
));
226 SetThreadToken (PHANDLE ThreadHandle
,
232 hThread
= NtCurrentThread();
233 if (ThreadHandle
!= NULL
)
234 hThread
= ThreadHandle
;
236 Status
= NtSetInformationThread (hThread
,
237 ThreadImpersonationToken
,
240 if (!NT_SUCCESS(Status
))
242 SetLastError (RtlNtStatusToDosError (Status
));
254 DuplicateTokenEx (HANDLE ExistingTokenHandle
,
255 DWORD dwDesiredAccess
,
256 LPSECURITY_ATTRIBUTES lpTokenAttributes
,
257 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
,
258 TOKEN_TYPE TokenType
,
259 PHANDLE DuplicateTokenHandle
)
261 OBJECT_ATTRIBUTES ObjectAttributes
;
265 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
266 ObjectAttributes
.RootDirectory
= NULL
;
267 ObjectAttributes
.ObjectName
= NULL
;
268 ObjectAttributes
.Attributes
= 0;
269 if (lpTokenAttributes
->bInheritHandle
)
271 ObjectAttributes
.Attributes
|= OBJ_INHERIT
;
273 ObjectAttributes
.SecurityDescriptor
= lpTokenAttributes
->lpSecurityDescriptor
;
274 ObjectAttributes
.SecurityQualityOfService
= NULL
;
276 Status
= NtDuplicateToken (ExistingTokenHandle
,
282 if (!NT_SUCCESS(Status
))
284 SetLastError(RtlNtStatusToDosError(Status
));
296 DuplicateToken (HANDLE ExistingTokenHandle
,
297 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
,
298 PHANDLE DuplicateTokenHandle
)
300 return DuplicateTokenEx (ExistingTokenHandle
,
301 TOKEN_DUPLICATE
| TOKEN_IMPERSONATE
| TOKEN_QUERY
,
305 DuplicateTokenHandle
);