-/* $Id: access.c,v 1.7 2004/08/15 16:39:11 chorns Exp $
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/se/access.c
+ * PURPOSE: Access state functions
*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * PURPOSE: Access rights handling functions
- * FILE: ntoskrnl/se/access.c
- * PROGRAMER: Eric Kohl <ekohl@rz-online.de>
- * REVISION HISTORY:
- * 07/04/2000: Created
+ * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) -
+ * Based on patch by Javier M. Mellid
*/
/* INCLUDES *****************************************************************/
#define NDEBUG
#include <internal/debug.h>
-/* FUNCTIONS ***************************************************************/
-
-/*
- * @implemented
- */
-BOOLEAN
-STDCALL
-RtlAreAllAccessesGranted (
- ACCESS_MASK GrantedAccess,
- ACCESS_MASK DesiredAccess
- )
-{
- return ((GrantedAccess & DesiredAccess) == DesiredAccess);
-}
+#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | \
+ GENERIC_ALL)
+/* FUNCTIONS ***************************************************************/
/*
* @implemented
*/
-BOOLEAN
+NTSTATUS
STDCALL
-RtlAreAnyAccessesGranted (
- ACCESS_MASK GrantedAccess,
- ACCESS_MASK DesiredAccess
- )
+SeCreateAccessState(PACCESS_STATE AccessState,
+ PAUX_DATA AuxData,
+ ACCESS_MASK Access,
+ PGENERIC_MAPPING GenericMapping)
{
- return ((GrantedAccess & DesiredAccess) != 0);
+ ACCESS_MASK AccessMask = Access;
+ PTOKEN Token;
+
+ PAGED_CODE();
+
+ /* Map the Generic Acess to Specific Access if we have a Mapping */
+ if ((Access & GENERIC_ACCESS) && (GenericMapping))
+ {
+ RtlMapGenericMask(&AccessMask, GenericMapping);
+ }
+
+ /* Initialize the Access State */
+ RtlZeroMemory(AccessState, sizeof(ACCESS_STATE));
+
+ /* Capture the Subject Context */
+ SeCaptureSubjectContext(&AccessState->SubjectSecurityContext);
+
+ /* Set Access State Data */
+ AccessState->AuxData = AuxData;
+ AccessState->RemainingDesiredAccess = AccessMask;
+ AccessState->OriginalDesiredAccess = AccessMask;
+ ExpAllocateLocallyUniqueId(&AccessState->OperationID);
+
+ /* Get the Token to use */
+ Token = AccessState->SubjectSecurityContext.ClientToken ?
+ (PTOKEN)&AccessState->SubjectSecurityContext.ClientToken :
+ (PTOKEN)&AccessState->SubjectSecurityContext.PrimaryToken;
+
+ /* Check for Travers Privilege */
+ if (Token->TokenFlags & TOKEN_HAS_TRAVERSE_PRIVILEGE)
+ {
+ /* Preserve the Traverse Privilege */
+ AccessState->Flags = TOKEN_HAS_TRAVERSE_PRIVILEGE;
+ }
+
+ /* Set the Auxiliary Data */
+ AuxData->PrivilegeSet = (PPRIVILEGE_SET)((ULONG_PTR)AccessState +
+ FIELD_OFFSET(ACCESS_STATE,
+ Privileges));
+ if (GenericMapping) AuxData->GenericMapping = *GenericMapping;
+
+ /* Return Sucess */
+ return STATUS_SUCCESS;
}
-
/*
* @implemented
*/
VOID
STDCALL
-RtlMapGenericMask (
- PACCESS_MASK AccessMask,
- PGENERIC_MAPPING GenericMapping
- )
-{
- if (*AccessMask & GENERIC_READ)
- *AccessMask |= GenericMapping->GenericRead;
-
- if (*AccessMask & GENERIC_WRITE)
- *AccessMask |= GenericMapping->GenericWrite;
-
- if (*AccessMask & GENERIC_EXECUTE)
- *AccessMask |= GenericMapping->GenericExecute;
-
- if (*AccessMask & GENERIC_ALL)
- *AccessMask |= GenericMapping->GenericAll;
-
- *AccessMask &= 0x0FFFFFFF;
-}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-STDCALL
-SeCreateAccessState(
- PACCESS_STATE AccessState,
- PVOID AuxData,
- ACCESS_MASK Access,
- PGENERIC_MAPPING GenericMapping
- )
+SeDeleteAccessState(IN PACCESS_STATE AccessState)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ PAUX_DATA AuxData;
+ PAGED_CODE();
+
+ /* Get the Auxiliary Data */
+ AuxData = AccessState->AuxData;
+
+ /* Deallocate Privileges */
+ if (AccessState->PrivilegesAllocated) ExFreePool(AuxData->PrivilegeSet);
+
+ /* Deallocate Name and Type Name */
+ if (AccessState->ObjectName.Buffer)
+ {
+ ExFreePool(AccessState->ObjectName.Buffer);
+ }
+ if (AccessState->ObjectTypeName.Buffer)
+ {
+ ExFreePool(AccessState->ObjectTypeName.Buffer);
+ }
+
+ /* Release the Subject Context */
+ SeReleaseSubjectContext(&AccessState->SubjectSecurityContext);
}
/*
- * @unimplemented
+ * @implemented
*/
VOID
STDCALL
-SeDeleteAccessState(
- IN PACCESS_STATE AccessState
- )
+SeSetAccessStateGenericMapping(PACCESS_STATE AccessState,
+ PGENERIC_MAPPING GenericMapping)
{
- UNIMPLEMENTED;
-}
+ PAGED_CODE();
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-SeSetAccessStateGenericMapping(
- PACCESS_STATE AccessState,
- PGENERIC_MAPPING GenericMapping
- )
-{
- UNIMPLEMENTED;
+ /* Set the Generic Mapping */
+ ((PAUX_DATA)AccessState->AuxData)->GenericMapping = *GenericMapping;
}
/* EOF */