1 /* $Id: semgr.c,v 1.13 1999/12/26 17:22:19 ea Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Security manager
6 * FILE: kernel/se/semgr.c
9 * 26/07/98: Added stubs for security functions
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
16 #include <internal/debug.h>
18 /* FUNCTIONS ***************************************************************/
22 NTSTATUS STDCALL
NtPrivilegeCheck (IN HANDLE ClientToken
,
23 IN PPRIVILEGE_SET RequiredPrivileges
,
32 NtPrivilegedServiceAuditAlarm (
33 IN PUNICODE_STRING SubsystemName
,
34 IN PUNICODE_STRING ServiceName
,
35 IN HANDLE ClientToken
,
36 IN PPRIVILEGE_SET Privileges
,
37 IN BOOLEAN AccessGranted
46 NtPrivilegeObjectAuditAlarm (
47 IN PUNICODE_STRING SubsystemName
,
49 IN HANDLE ClientToken
,
50 IN ULONG DesiredAccess
,
51 IN PPRIVILEGE_SET Privileges
,
52 IN BOOLEAN AccessGranted
61 NtOpenObjectAuditAlarm (
62 IN PUNICODE_STRING SubsystemName
,
64 IN POBJECT_ATTRIBUTES ObjectAttributes
,
65 IN HANDLE ClientToken
,
66 IN ULONG DesiredAccess
,
67 IN ULONG GrantedAccess
,
68 IN PPRIVILEGE_SET Privileges
,
69 IN BOOLEAN ObjectCreation
,
70 IN BOOLEAN AccessGranted
,
71 OUT PBOOLEAN GenerateOnClose
81 IN HANDLE ProcessHandle
,
82 IN ACCESS_MASK DesiredAccess
,
83 OUT PHANDLE TokenHandle
93 IN HANDLE ThreadHandle
,
94 IN ACCESS_MASK DesiredAccess
,
95 IN BOOLEAN OpenAsSelf
,
96 OUT PHANDLE TokenHandle
105 NTSTATUS STDCALL
NtImpersonateThread (IN HANDLE ThreadHandle
,
106 IN HANDLE ThreadToImpersonate
,
107 IN PSECURITY_QUALITY_OF_SERVICE
108 SecurityQualityOfService
)
117 NtAccessCheckAndAuditAlarm (
118 IN PUNICODE_STRING SubsystemName
,
119 IN PHANDLE ObjectHandle
,
120 IN POBJECT_ATTRIBUTES ObjectAttributes
,
121 IN ACCESS_MASK DesiredAccess
,
122 IN PGENERIC_MAPPING GenericMapping
,
123 IN BOOLEAN ObjectCreation
,
124 OUT PULONG GrantedAccess
,
125 OUT PBOOLEAN AccessStatus
,
126 OUT PBOOLEAN GenerateOnClose
135 NtAdjustGroupsToken (
136 IN HANDLE TokenHandle
,
137 IN BOOLEAN ResetToDefault
,
138 IN PTOKEN_GROUPS NewState
,
139 IN ULONG BufferLength
,
140 OUT PTOKEN_GROUPS PreviousState OPTIONAL
,
141 OUT PULONG ReturnLength
150 NtAdjustPrivilegesToken(IN HANDLE TokenHandle
,
151 IN BOOLEAN DisableAllPrivileges
,
152 IN PTOKEN_PRIVILEGES NewState
,
153 IN ULONG BufferLength
,
154 OUT PTOKEN_PRIVILEGES PreviousState
,
155 OUT PULONG ReturnLength
)
164 PULONG Version
, // ???
172 NTSTATUS STDCALL
NtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName
,
174 IN BOOLEAN GenerateOnClose
)
179 NTSTATUS STDCALL
NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
180 IN HANDLE ClientToken
,
181 IN ACCESS_MASK DesiredAccess
,
182 IN PGENERIC_MAPPING GenericMapping
,
183 OUT PPRIVILEGE_SET PrivilegeSet
,
184 OUT PULONG ReturnLength
,
185 OUT PULONG GrantedAccess
,
186 OUT PBOOLEAN AccessStatus
)
194 NtDeleteObjectAuditAlarm (
195 IN PUNICODE_STRING SubsystemName
,
197 IN BOOLEAN GenerateOnClose
203 VOID STDCALL
SeReleaseSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext
)
208 VOID STDCALL
SeCaptureSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext
)
214 Process
= PsGetCurrentThread()->ThreadsProcess
;
216 SubjectContext
->ProcessAuditId
= Process
;
217 SubjectContext
->ClientToken
=
218 PsReferenceImpersonationToken(PsGetCurrentThread(),
221 &SubjectContext
->ImpersonationLevel
);
222 SubjectContext
->PrimaryToken
= PsReferencePrimaryToken(Process
);
225 BOOLEAN
SepPrivilegeCheck(PACCESS_TOKEN Token
,
226 PLUID_AND_ATTRIBUTES Privileges
,
227 ULONG PrivilegeCount
,
228 ULONG PrivilegeControl
,
229 KPROCESSOR_MODE PreviousMode
)
232 PLUID_AND_ATTRIBUTES Current
;
236 if (PreviousMode
== KernelMode
)
242 if (PrivilegeCount
!= 0)
247 i
= Token
->PrivilegeCount
;
248 Current
= Token
->Privileges
;
249 for (i
= 0; i
< Token
->PrivilegeCount
; i
++)
251 if (!(Current
[i
].Attributes
& 2) &&
252 Privileges
[i
].Luid
.u
.LowPart
==
253 Current
[i
].Luid
.u
.LowPart
&&
254 Privileges
[i
].Luid
.u
.HighPart
==
255 Current
[i
].Luid
.u
.HighPart
)
257 Privileges
[i
].Attributes
=
258 Privileges
[i
].Attributes
| 0x80;
267 if ((PrivilegeControl
& 0x2) && PrivilegeCount
== j
)
272 if (j
> 0 && !(PrivilegeControl
& 0x2))
280 BOOLEAN STDCALL
SePrivilegeCheck(PPRIVILEGE_SET Privileges
,
281 PSECURITY_SUBJECT_CONTEXT SubjectContext
,
282 KPROCESSOR_MODE PreviousMode
)
284 PACCESS_TOKEN Token
= NULL
;
286 if (SubjectContext
->ClientToken
== NULL
)
288 Token
= SubjectContext
->PrimaryToken
;
292 Token
= SubjectContext
->ClientToken
;
293 if (SubjectContext
->ImpersonationLevel
< 2)
299 return(SepPrivilegeCheck(Token
,
300 Privileges
->Privilege
,
301 Privileges
->PrivilegeCount
,
306 BOOLEAN STDCALL
SeSinglePrivilegeCheck(LUID PrivilegeValue
,
307 KPROCESSOR_MODE PreviousMode
)
309 SECURITY_SUBJECT_CONTEXT SubjectContext
;
313 SeCaptureSubjectContext(&SubjectContext
);
315 Priv
.PrivilegeCount
= 1;
317 Priv
.Privilege
[0].Luid
= PrivilegeValue
;
318 Priv
.Privilege
[0].Attributes
= 0;
320 r
= SePrivilegeCheck(&Priv
,
324 if (PreviousMode
!= KernelMode
)
326 /* SePrivilegeServiceAuditAlarm(0,
330 SeReleaseSubjectContext(&SubjectContext
);
334 NTSTATUS STDCALL
SeDeassignSecurity(PSECURITY_DESCRIPTOR
* SecurityDescriptor
)
339 NTSTATUS STDCALL
SeAssignSecurity(PSECURITY_DESCRIPTOR ParentDescriptor
,
340 PSECURITY_DESCRIPTOR ExplicitDescriptor
,
341 BOOLEAN IsDirectoryObject
,
342 PSECURITY_SUBJECT_CONTEXT SubjectContext
,
343 PGENERIC_MAPPING GenericMapping
,
349 BOOLEAN STDCALL
SeAccessCheck (IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
350 IN PSECURITY_DESCRIPTOR_CONTEXT SubjectSecurityContext
,
351 IN BOOLEAN SubjectContextLocked
,
352 IN ACCESS_MASK DesiredAccess
,
353 IN ACCESS_MASK PreviouslyGrantedAccess
,
354 OUT PPRIVILEGE_SET
* Privileges
,
355 IN PGENERIC_MAPPING GenericMapping
,
356 IN KPROCESSOR_MODE AccessMode
,
357 OUT PACCESS_MODE GrantedAccess
,
358 OUT PNTSTATUS AccessStatus
)
360 * FUNCTION: Determines whether the requested access rights can be granted
361 * to an object protected by a security descriptor and an object owner
363 * SecurityDescriptor = Security descriptor protecting the object
364 * SubjectSecurityContext = Subject's captured security context
365 * SubjectContextLocked = Indicates the user's subject context is locked
366 * DesiredAccess = Access rights the caller is trying to acquire
367 * PreviouslyGrantedAccess = Specified the access rights already granted
369 * GenericMapping = Generic mapping associated with the object
370 * AccessMode = Access mode used for the check
371 * GrantedAccess (OUT) = On return specifies the access granted
372 * AccessStatus (OUT) = Status indicating why access was denied
373 * RETURNS: If access was granted, returns TRUE
383 ACCESS_MASK CurrentAccess
;
385 CurrentAccess
= PreviouslyGrantedAccess
;
388 * Ignore the SACL for now
394 Status
= RtlGetDaclSecurityDescriptor(SecurityDescriptor
,
398 if (!NT_SUCCESS(Status
))
403 CurrentAce
= (PACE
)(Dacl
+ 1);
404 for (i
= 0; i
< Dacl
->AceCount
; i
++)
406 Sid
= (PSID
)(CurrentAce
+ 1);
407 if (CurrentAce
->Header
.AceType
== ACCESS_DENIED_ACE_TYPE
)
409 if (RtlEqualSid(Sid
, NULL
))
411 *AccessStatus
= STATUS_ACCESS_DENIED
;
413 return(STATUS_SUCCESS
);
416 if (CurrentAce
->Header
.AceType
== ACCESS_ALLOWED_ACE_TYPE
)
418 if (RtlEqualSid(Sid
, NULL
))
420 CurrentAccess
= CurrentAccess
|
421 CurrentAce
->Header
.AccessMask
;
425 if (!(CurrentAccess
& DesiredAccess
) &&
426 !((~CurrentAccess
) & DesiredAccess
))
428 *AccessStatus
= STATUS_ACCESS_DENIED
;
432 *AccessStatus
= STATUS_SUCCESS
;
434 *GrantedAccess
= CurrentAccess
;
436 return(STATUS_SUCCESS
);