2004-08-15 Casper S. Hornstrup <chorns@users.sourceforge.net>
[reactos.git] / reactos / lib / advapi32 / token / token.c
1 /* $Id: token.c,v 1.13 2004/08/15 17:03:15 chorns Exp $
2 *
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)
8 * UPDATE HISTORY:
9 * Created 01/11/98
10 */
11
12 #include "advapi32.h"
13
14
15 /*
16 * @implemented
17 */
18 BOOL STDCALL
19 AdjustTokenGroups (HANDLE TokenHandle,
20 BOOL ResetToDefault,
21 PTOKEN_GROUPS NewState,
22 DWORD BufferLength,
23 PTOKEN_GROUPS PreviousState,
24 PDWORD ReturnLength)
25 {
26 NTSTATUS Status;
27
28 Status = NtAdjustGroupsToken (TokenHandle,
29 ResetToDefault,
30 NewState,
31 BufferLength,
32 PreviousState,
33 (PULONG)ReturnLength);
34 if (!NT_SUCCESS (Status))
35 {
36 SetLastError (RtlNtStatusToDosError (Status));
37 return FALSE;
38 }
39
40 return TRUE;
41 }
42
43
44 /*
45 * @implemented
46 */
47 BOOL STDCALL
48 AdjustTokenPrivileges (HANDLE TokenHandle,
49 BOOL DisableAllPrivileges,
50 PTOKEN_PRIVILEGES NewState,
51 DWORD BufferLength,
52 PTOKEN_PRIVILEGES PreviousState,
53 PDWORD ReturnLength)
54 {
55 NTSTATUS Status;
56
57 Status = NtAdjustPrivilegesToken (TokenHandle,
58 DisableAllPrivileges,
59 NewState,
60 BufferLength,
61 PreviousState,
62 (PULONG)ReturnLength);
63 if (STATUS_NOT_ALL_ASSIGNED == Status)
64 {
65 SetLastError(ERROR_NOT_ALL_ASSIGNED);
66 return TRUE;
67 }
68 if (! NT_SUCCESS(Status))
69 {
70 SetLastError(RtlNtStatusToDosError(Status));
71 return FALSE;
72 }
73
74 SetLastError(ERROR_SUCCESS); /* AdjustTokenPrivileges is documented to do this */
75 return TRUE;
76 }
77
78
79 /*
80 * @implemented
81 */
82 BOOL STDCALL
83 GetTokenInformation (HANDLE TokenHandle,
84 TOKEN_INFORMATION_CLASS TokenInformationClass,
85 LPVOID TokenInformation,
86 DWORD TokenInformationLength,
87 PDWORD ReturnLength)
88 {
89 NTSTATUS Status;
90
91 Status = NtQueryInformationToken (TokenHandle,
92 TokenInformationClass,
93 TokenInformation,
94 TokenInformationLength,
95 (PULONG)ReturnLength);
96 if (!NT_SUCCESS (Status))
97 {
98 SetLastError (RtlNtStatusToDosError (Status));
99 return FALSE;
100 }
101
102 return TRUE;
103 }
104
105
106 /*
107 * @implemented
108 */
109 BOOL STDCALL
110 SetTokenInformation (HANDLE TokenHandle,
111 TOKEN_INFORMATION_CLASS TokenInformationClass,
112 LPVOID TokenInformation,
113 DWORD TokenInformationLength)
114 {
115 NTSTATUS Status;
116
117 Status = NtSetInformationToken (TokenHandle,
118 TokenInformationClass,
119 TokenInformation,
120 TokenInformationLength);
121 if (!NT_SUCCESS (Status))
122 {
123 SetLastError (RtlNtStatusToDosError (Status));
124 return FALSE;
125 }
126
127 return TRUE;
128 }
129
130
131 /*
132 * @implemented
133 */
134 BOOL STDCALL
135 AccessCheck (PSECURITY_DESCRIPTOR pSecurityDescriptor,
136 HANDLE ClientToken,
137 DWORD DesiredAccess,
138 PGENERIC_MAPPING GenericMapping,
139 PPRIVILEGE_SET PrivilegeSet,
140 LPDWORD PrivilegeSetLength,
141 LPDWORD GrantedAccess,
142 LPBOOL AccessStatus)
143 {
144 NTSTATUS Status;
145 NTSTATUS AccessStat;
146
147 Status = NtAccessCheck (pSecurityDescriptor,
148 ClientToken,
149 DesiredAccess,
150 GenericMapping,
151 PrivilegeSet,
152 (PULONG)PrivilegeSetLength,
153 (PACCESS_MASK)GrantedAccess,
154 &AccessStat);
155 if (!NT_SUCCESS (Status))
156 {
157 SetLastError (RtlNtStatusToDosError (Status));
158 return FALSE;
159 }
160
161 if (!NT_SUCCESS (AccessStat))
162 {
163 SetLastError (RtlNtStatusToDosError (Status));
164 *AccessStatus = FALSE;
165 return TRUE;
166 }
167
168 *AccessStatus = TRUE;
169
170 return TRUE;
171 }
172
173
174 /*
175 * @implemented
176 */
177 BOOL STDCALL
178 OpenProcessToken (HANDLE ProcessHandle,
179 DWORD DesiredAccess,
180 PHANDLE TokenHandle)
181 {
182 NTSTATUS Status;
183
184 Status = NtOpenProcessToken (ProcessHandle,
185 DesiredAccess,
186 TokenHandle);
187 if (!NT_SUCCESS (Status))
188 {
189 SetLastError (RtlNtStatusToDosError (Status));
190 return FALSE;
191 }
192
193 return TRUE;
194 }
195
196
197 /*
198 * @implemented
199 */
200 BOOL STDCALL
201 OpenThreadToken (HANDLE ThreadHandle,
202 DWORD DesiredAccess,
203 BOOL OpenAsSelf,
204 PHANDLE TokenHandle)
205 {
206 NTSTATUS Status;
207
208 Status = NtOpenThreadToken (ThreadHandle,
209 DesiredAccess,
210 OpenAsSelf,
211 TokenHandle);
212 if (!NT_SUCCESS(Status))
213 {
214 SetLastError (RtlNtStatusToDosError (Status));
215 return FALSE;
216 }
217
218 return TRUE;
219 }
220
221
222 /*
223 * @implemented
224 */
225 BOOL STDCALL
226 SetThreadToken (PHANDLE ThreadHandle,
227 HANDLE TokenHandle)
228 {
229 NTSTATUS Status;
230 HANDLE hThread;
231
232 hThread = NtCurrentThread();
233 if (ThreadHandle != NULL)
234 hThread = ThreadHandle;
235
236 Status = NtSetInformationThread (hThread,
237 ThreadImpersonationToken,
238 TokenHandle,
239 sizeof(HANDLE));
240 if (!NT_SUCCESS(Status))
241 {
242 SetLastError (RtlNtStatusToDosError (Status));
243 return FALSE;
244 }
245
246 return TRUE;
247 }
248
249
250 /*
251 * @implemented
252 */
253 BOOL STDCALL
254 DuplicateTokenEx (HANDLE ExistingTokenHandle,
255 DWORD dwDesiredAccess,
256 LPSECURITY_ATTRIBUTES lpTokenAttributes,
257 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
258 TOKEN_TYPE TokenType,
259 PHANDLE DuplicateTokenHandle)
260 {
261 OBJECT_ATTRIBUTES ObjectAttributes;
262 HANDLE NewToken;
263 NTSTATUS Status;
264
265 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
266 ObjectAttributes.RootDirectory = NULL;
267 ObjectAttributes.ObjectName = NULL;
268 ObjectAttributes.Attributes = 0;
269 if (lpTokenAttributes->bInheritHandle)
270 {
271 ObjectAttributes.Attributes |= OBJ_INHERIT;
272 }
273 ObjectAttributes.SecurityDescriptor = lpTokenAttributes->lpSecurityDescriptor;
274 ObjectAttributes.SecurityQualityOfService = NULL;
275
276 Status = NtDuplicateToken (ExistingTokenHandle,
277 dwDesiredAccess,
278 &ObjectAttributes,
279 ImpersonationLevel,
280 TokenType,
281 &NewToken);
282 if (!NT_SUCCESS(Status))
283 {
284 SetLastError(RtlNtStatusToDosError(Status));
285 return FALSE;
286 }
287
288 return TRUE;
289 }
290
291
292 /*
293 * @implemented
294 */
295 BOOL STDCALL
296 DuplicateToken (HANDLE ExistingTokenHandle,
297 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
298 PHANDLE DuplicateTokenHandle)
299 {
300 return DuplicateTokenEx (ExistingTokenHandle,
301 TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY,
302 NULL,
303 ImpersonationLevel,
304 TokenImpersonation,
305 DuplicateTokenHandle);
306 }
307
308 /* EOF */