EX_FAST_REF FastRef;
ULONG Count;
PSECURITY_DESCRIPTOR OldSecurityDescriptor;
-
+
/* Get the fast reference and capture it */
FastRef = *(PEX_FAST_REF)SecurityDescriptor;
-
+
/* Don't free again later */
*SecurityDescriptor = NULL;
-
+
/* Get the descriptor and reference count */
OldSecurityDescriptor = ExGetObjectFastReference(FastRef);
Count = ExGetCountFastReference(FastRef);
-
+
/* Dereference the descriptor */
ObDereferenceSecurityDescriptor(OldSecurityDescriptor, Count + 1);
OldValue = ExCompareSwapFastReference(FastRef,
CachedDescriptor,
OldDescriptor);
-
+
/* Get the security descriptor */
SecurityDescriptor = ExGetObjectFastReference(OldValue);
Count = ExGetCountFastReference(OldValue);
-
+
/* Make sure the swap worked */
if (SecurityDescriptor == OldDescriptor)
{
return FALSE;
}
+ /* First try to perform a fast traverse check
+ * If it fails, then the entire access check will
+ * have to be done.
+ */
+ Result = SeFastTraverseCheck(SecurityDescriptor,
+ AccessState,
+ FILE_WRITE_DATA,
+ AccessMode);
+ if (Result)
+ {
+ ObReleaseObjectSecurity(SecurityDescriptor, SdAllocated);
+ return TRUE;
+ }
+
/* Lock the security context */
SeLockSubjectContext(&AccessState->SubjectSecurityContext);
PAGED_CODE();
/* Check if we're dealing with a kernel handle */
- if (ObIsKernelHandle(Handle, ExGetPreviousMode()))
+ if (ObpIsKernelHandle(Handle, ExGetPreviousMode()))
{
/* Use the kernel table and convert the handle */
HandleTable = ObpKernelHandleTable;