Use free Windows DDK and compile with latest MinGW releases.
[reactos.git] / reactos / lib / advapi32 / token / token.c
1 /*
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)
7 * UPDATE HISTORY:
8 * Created 01/11/98
9 */
10
11 #include <advapi32.h>
12
13
14 WINBOOL
15 STDCALL
16 AdjustTokenGroups (
17 HANDLE TokenHandle,
18 WINBOOL ResetToDefault,
19 PTOKEN_GROUPS NewState,
20 DWORD BufferLength,
21 PTOKEN_GROUPS PreviousState,
22 PDWORD ReturnLength
23 )
24 {
25 NTSTATUS errCode;
26 errCode = NtAdjustGroupsToken(TokenHandle,ResetToDefault,NewState,
27 BufferLength, PreviousState, (PULONG)ReturnLength );
28 if ( !NT_SUCCESS(errCode) ) {
29 SetLastError(RtlNtStatusToDosError(errCode));
30 return FALSE;
31 }
32 return TRUE;
33 }
34
35 WINBOOL
36 STDCALL
37 AdjustTokenPrivileges (
38 HANDLE TokenHandle,
39 WINBOOL DisableAllPrivileges,
40 PTOKEN_PRIVILEGES NewState,
41 DWORD BufferLength,
42 PTOKEN_PRIVILEGES PreviousState,
43 PDWORD ReturnLength
44 )
45 { NTSTATUS errCode;
46 errCode = NtAdjustPrivilegesToken(TokenHandle,DisableAllPrivileges,NewState,
47 BufferLength, PreviousState, (PULONG)ReturnLength );
48 if ( !NT_SUCCESS(errCode) ) {
49 SetLastError(RtlNtStatusToDosError(errCode));
50 return FALSE;
51 }
52 return TRUE;
53 }
54
55
56 WINBOOL
57 STDCALL
58 GetTokenInformation (
59 HANDLE TokenHandle,
60 TOKEN_INFORMATION_CLASS TokenInformationClass,
61 LPVOID TokenInformation,
62 DWORD TokenInformationLength,
63 PDWORD ReturnLength
64 )
65 {
66 NTSTATUS errCode;
67 errCode = NtQueryInformationToken(TokenHandle,TokenInformationClass,TokenInformation,
68 TokenInformationLength, (PULONG)ReturnLength);
69 if ( !NT_SUCCESS(errCode) ) {
70 SetLastError(RtlNtStatusToDosError(errCode));
71 return FALSE;
72 }
73 return TRUE;
74 }
75
76 WINBOOL
77 STDCALL
78 SetTokenInformation (
79 HANDLE TokenHandle,
80 TOKEN_INFORMATION_CLASS TokenInformationClass,
81 LPVOID TokenInformation,
82 DWORD TokenInformationLength
83 )
84 {
85 NTSTATUS errCode;
86 errCode = NtSetInformationToken(TokenHandle,TokenInformationClass,TokenInformation,
87 TokenInformationLength);
88 if ( !NT_SUCCESS(errCode) ) {
89 SetLastError(RtlNtStatusToDosError(errCode));
90 return FALSE;
91 }
92 return TRUE;
93 }
94
95 WINBOOL
96 STDCALL
97 AccessCheck (
98 PSECURITY_DESCRIPTOR pSecurityDescriptor,
99 HANDLE ClientToken,
100 DWORD DesiredAccess,
101 PGENERIC_MAPPING GenericMapping,
102 PPRIVILEGE_SET PrivilegeSet,
103 LPDWORD PrivilegeSetLength,
104 LPDWORD GrantedAccess,
105 LPBOOL AccessStatus
106 )
107 {
108 NTSTATUS errCode;
109 errCode = NtAccessCheck( pSecurityDescriptor,
110 ClientToken,
111 DesiredAccess,
112 GenericMapping,
113 PrivilegeSet,
114 (PULONG)PrivilegeSetLength,
115 (PULONG)GrantedAccess,
116 (PBOOLEAN)AccessStatus);
117 if ( !NT_SUCCESS(errCode) ) {
118 SetLastError(RtlNtStatusToDosError(errCode));
119 return FALSE;
120 }
121 return TRUE;
122 }
123
124
125
126 WINBOOL
127 STDCALL
128 OpenProcessToken (
129 HANDLE ProcessHandle,
130 DWORD DesiredAccess,
131 PHANDLE TokenHandle
132 )
133 {
134 NTSTATUS errCode;
135 errCode = NtOpenProcessToken(ProcessHandle,DesiredAccess,TokenHandle);
136 if ( !NT_SUCCESS(errCode) ) {
137 SetLastError(RtlNtStatusToDosError(errCode));
138 return FALSE;
139 }
140 return TRUE;
141 }
142
143
144
145 WINBOOL
146 STDCALL
147 OpenThreadToken (
148 HANDLE ThreadHandle,
149 DWORD DesiredAccess,
150 WINBOOL OpenAsSelf,
151 PHANDLE TokenHandle
152 )
153 {
154 NTSTATUS errCode;
155 errCode = NtOpenThreadToken(ThreadHandle,DesiredAccess,OpenAsSelf,TokenHandle);
156 if ( !NT_SUCCESS(errCode) ) {
157 SetLastError(RtlNtStatusToDosError(errCode));
158 return FALSE;
159 }
160 return TRUE;
161 }
162
163
164 WINBOOL
165 STDCALL
166 SetThreadToken (
167 PHANDLE ThreadHandle,
168 HANDLE TokenHandle
169 )
170 {
171 NTSTATUS errCode;
172 HANDLE hThread = NtCurrentThread();
173 if ( ThreadHandle != NULL )
174 hThread = ThreadHandle;
175 errCode = NtSetInformationThread(hThread,ThreadImpersonationToken,TokenHandle,sizeof(HANDLE));
176 if ( !NT_SUCCESS(errCode) ) {
177 SetLastError(RtlNtStatusToDosError(errCode));
178 return FALSE;
179 }
180 return TRUE;
181 }
182
183
184 WINBOOL
185 STDCALL
186 DuplicateTokenEx (
187 HANDLE ExistingTokenHandle,
188 DWORD dwDesiredAccess,
189 LPSECURITY_ATTRIBUTES lpTokenAttributes,
190 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
191 TOKEN_TYPE TokenType,
192 PHANDLE DuplicateTokenHandle
193 )
194 {
195 NTSTATUS errCode;
196 HANDLE NewToken;
197
198 OBJECT_ATTRIBUTES ObjectAttributes;
199
200
201 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
202 ObjectAttributes.RootDirectory = NULL;
203 ObjectAttributes.ObjectName = NULL;
204 ObjectAttributes.Attributes = 0;
205 if ( lpTokenAttributes->bInheritHandle )
206 ObjectAttributes.Attributes |= OBJ_INHERIT;
207
208 ObjectAttributes.SecurityDescriptor = lpTokenAttributes->lpSecurityDescriptor;
209 ObjectAttributes.SecurityQualityOfService = NULL;
210
211 errCode = NtDuplicateToken( ExistingTokenHandle, dwDesiredAccess,
212 &ObjectAttributes, ImpersonationLevel,
213 TokenType, &NewToken );
214
215 if ( !NT_SUCCESS(errCode) ) {
216 SetLastError(RtlNtStatusToDosError(errCode));
217 return FALSE;
218 }
219 return TRUE;
220 }
221
222
223 WINBOOL
224 STDCALL
225 DuplicateToken (
226 HANDLE ExistingTokenHandle,
227 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
228 PHANDLE DuplicateTokenHandle
229 )
230 {
231 return DuplicateTokenEx (
232 ExistingTokenHandle,
233 TOKEN_DUPLICATE|TOKEN_IMPERSONATE|TOKEN_QUERY,
234 NULL,
235 ImpersonationLevel,
236 TokenImpersonation,
237 DuplicateTokenHandle
238 );
239 }
240
241
242
243
244
245 /* EOF */