:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / 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 <windows.h>
12 #include <ddk/ntddk.h>
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 */