Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

258 lines
5.8 KiB

/*++
Copyright (c) 1999-2001 Microsoft Corporation
Module Name:
seutil.cxx
Abstract:
This module implements general security utilities.
Author:
Keith Moore (keithmo) 25-Mar-1999
Revision History:
--*/
#include "precomp.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, UlAssignSecurity )
#pragma alloc_text( PAGE, UlDeassignSecurity )
#pragma alloc_text( PAGE, UlAccessCheck )
#endif // ALLOC_PRAGMA
#if 0
#endif
//
// Public functions.
//
/***************************************************************************++
Routine Description:
Assigns a new security descriptor.
Arguments:
pSecurityDescriptor - Supplies a pointer to the current security
descriptor pointer. The current security descriptor pointer
will be updated with the new security descriptor.
pAccessState - Supplies the ACCESS_STATE structure containing
the state of an access in progress.
Return Value:
NTSTATUS - Completion status.
--***************************************************************************/
NTSTATUS
UlAssignSecurity(
IN OUT PSECURITY_DESCRIPTOR *pSecurityDescriptor,
IN PACCESS_STATE pAccessState
)
{
NTSTATUS status;
//
// Sanity check.
//
PAGED_CODE();
ASSERT( pSecurityDescriptor != NULL );
ASSERT( pAccessState != NULL );
//
// Assign the security descriptor.
//
SeLockSubjectContext( &pAccessState->SubjectSecurityContext );
status = SeAssignSecurity(
NULL, // ParentDescriptor
pAccessState->SecurityDescriptor,
pSecurityDescriptor,
FALSE, // IsDirectoryObject
&pAccessState->SubjectSecurityContext,
IoGetFileObjectGenericMapping(),
PagedPool
);
SeUnlockSubjectContext( &pAccessState->SubjectSecurityContext );
return status;
} // UlAssignSecurity
/***************************************************************************++
Routine Description:
Deletes a security descriptor.
Arguments:
pSecurityDescriptor - Supplies a pointer to the current security
descriptor pointer. The current security descriptor pointer
will be deleted.
--***************************************************************************/
VOID
UlDeassignSecurity(
IN OUT PSECURITY_DESCRIPTOR *pSecurityDescriptor
)
{
//
// Sanity check.
//
PAGED_CODE();
ASSERT( pSecurityDescriptor != NULL );
//
// If there's a security descriptor present, free it.
//
if (*pSecurityDescriptor != NULL)
{
SeDeassignSecurity( pSecurityDescriptor );
}
} // UlDeassignSecurity
/***************************************************************************++
Routine Description:
Determines if a user has access to the specified resource.
Arguments:
pSecurityDescriptor - Supplies the security descriptor protecting
the resource.
pAccessState - Supplies the ACCESS_STATE structure containing
the state of an access in progress.
DesiredAccess - Supplies an access mask describing the user's
desired access to the resource. This mask is assumed to not
contain generic access types.
RequestorMode - Supplies the processor mode by which the access is
being requested.
pObjectName - Supplies the name of the object being referenced.
Return Value:
NTSTATUS - Completion status.
--***************************************************************************/
NTSTATUS
UlAccessCheck(
IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
IN PACCESS_STATE pAccessState,
IN ACCESS_MASK DesiredAccess,
IN KPROCESSOR_MODE RequestorMode,
IN PWSTR pObjectName
)
{
NTSTATUS status;
BOOLEAN accessGranted;
PPRIVILEGE_SET pPrivileges = NULL;
ACCESS_MASK grantedAccess;
UNICODE_STRING objectName;
UNICODE_STRING typeName;
//
// Sanity check.
//
PAGED_CODE();
ASSERT( pSecurityDescriptor != NULL );
ASSERT( pAccessState != NULL );
//
// Perform the access check.
//
SeLockSubjectContext( &pAccessState->SubjectSecurityContext );
accessGranted = SeAccessCheck(
pSecurityDescriptor,
&pAccessState->SubjectSecurityContext,
TRUE, // SubjectContextLocked
DesiredAccess,
0, // PreviouslyGrantedAccess
&pPrivileges,
IoGetFileObjectGenericMapping(),
RequestorMode,
&grantedAccess,
&status
);
if (pPrivileges != NULL)
{
SeAppendPrivileges( pAccessState, pPrivileges );
SeFreePrivileges( pPrivileges );
}
if (accessGranted)
{
pAccessState->PreviouslyGrantedAccess |= grantedAccess;
pAccessState->RemainingDesiredAccess &= ~(grantedAccess | MAXIMUM_ALLOWED);
}
RtlInitUnicodeString( &typeName, L"Ul" );
RtlInitUnicodeString( &objectName, pObjectName );
SeOpenObjectAuditAlarm(
&typeName,
NULL, // Object
&objectName,
pSecurityDescriptor,
pAccessState,
FALSE, // ObjectCreated
accessGranted,
RequestorMode,
&pAccessState->GenerateOnClose
);
SeUnlockSubjectContext( &pAccessState->SubjectSecurityContext );
if (accessGranted)
{
status = STATUS_SUCCESS;
}
else
{
//
// SeAccessCheck() should have set the completion status.
//
ASSERT( !NT_SUCCESS(status) );
}
return status;
} // UlAccessCheck
//
// Private functions.
//