Implement Access State support (SeCreate/DeleteAccessState and
SeSetAccessStateGenericMapping. Based on a patch by Javier M. Mellid
Modified: trunk/reactos/include/ddk/sefuncs.h
Modified: trunk/reactos/include/ddk/setypes.h
Modified: trunk/reactos/ntoskrnl/se/access.c
_____
Modified: trunk/reactos/include/ddk/sefuncs.h
--- trunk/reactos/include/ddk/sefuncs.h 2005-05-09 19:08:49 UTC (rev
15189)
+++ trunk/reactos/include/ddk/sefuncs.h 2005-05-09 19:57:41 UTC (rev
15190)
@@ -122,7 +122,7 @@
STDCALL
SeCreateAccessState(
PACCESS_STATE AccessState,
- PVOID AuxData,
+ PAUX_DATA AuxData,
ACCESS_MASK Access,
PGENERIC_MAPPING GenericMapping
);
_____
Modified: trunk/reactos/include/ddk/setypes.h
--- trunk/reactos/include/ddk/setypes.h 2005-05-09 19:08:49 UTC (rev
15189)
+++ trunk/reactos/include/ddk/setypes.h 2005-05-09 19:57:41 UTC (rev
15190)
@@ -97,6 +97,7 @@
};
} SEP_AUDIT_POLICY, *PSEP_AUDIT_POLICY;
+#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x01
typedef struct _TOKEN {
TOKEN_SOURCE TokenSource; /* 0x00 */
LUID TokenId; /* 0x10 */
@@ -222,6 +223,13 @@
AssignSecurityDescriptor
} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
+typedef struct _AUX_DATA
+{
+ PPRIVILEGE_SET PrivilegeSet;
+ GENERIC_MAPPING GenericMapping;
+ ULONG Reserved;
+} AUX_DATA, *PAUX_DATA;
+
typedef struct _ACCESS_STATE
{
LUID OperationID;
_____
Modified: trunk/reactos/ntoskrnl/se/access.c
--- trunk/reactos/ntoskrnl/se/access.c 2005-05-09 19:08:49 UTC (rev
15189)
+++ trunk/reactos/ntoskrnl/se/access.c 2005-05-09 19:57:41 UTC (rev
15190)
@@ -4,7 +4,8 @@
* FILE: ntoskrnl/se/access.c
* PURPOSE: Access state functions
*
- * PROGRAMMERS: Eric Kohl
+ * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net) -
+ * Based on patch by Javier M. Mellid
*/
/* INCLUDES
*****************************************************************/
@@ -13,47 +14,108 @@
#define NDEBUG
#include <internal/debug.h>
+#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE
| \
+ GENERIC_ALL)
+
/* FUNCTIONS
***************************************************************/
/*
- * @unimplemented
+ * @implemented
*/
NTSTATUS
STDCALL
-SeCreateAccessState(
- PACCESS_STATE AccessState,
- PVOID AuxData,
- ACCESS_MASK Access,
- PGENERIC_MAPPING GenericMapping
- )
+SeCreateAccessState(PACCESS_STATE AccessState,
+ PAUX_DATA AuxData,
+ ACCESS_MASK Access,
+ PGENERIC_MAPPING GenericMapping)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ 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->OriginallyDesiredAccess = 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;
}
/*
- * @unimplemented
+ * @implemented
*/
VOID
STDCALL
-SeDeleteAccessState(
- IN PACCESS_STATE AccessState
- )
+SeDeleteAccessState(IN PACCESS_STATE AccessState)
{
- UNIMPLEMENTED;
+ 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
-SeSetAccessStateGenericMapping(
- PACCESS_STATE AccessState,
- PGENERIC_MAPPING GenericMapping
- )
+SeSetAccessStateGenericMapping(PACCESS_STATE AccessState,
+ PGENERIC_MAPPING GenericMapping)
{
- UNIMPLEMENTED;
+ PAGED_CODE();
+
+ /* Set the Generic Mapping */
+ ((PAUX_DATA)AccessState->AuxData)->GenericMapping =
*GenericMapping;
}
/* EOF */
Show replies by date