ULONG ulParseFlags = 0;
GUID stAuthGroup;
ULONG ulNameProcessingFlags = 0;
+ BOOLEAN bOpenedReparsePoint = FALSE;
__Enter
{
try_return( ntStatus);
}
- if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT) &&
- pDirectoryCB != NULL &&
- !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
+ if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ Type %08lX\n",
- Irp,
- &uniFileName,
- pDirectoryCB->ObjectInformation->FileType);
+ if( pDirectoryCB == NULL ||
+ !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
+ Irp,
+ &uniFileName,
+ pDirectoryCB,
+ pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
+ }
+ else
+ {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate (%08lX) Opening as reparse point %wZ Type %08lX\n",
+ Irp,
+ &uniFileName,
+ pDirectoryCB->ObjectInformation->FileType);
+
+ bOpenedReparsePoint = TRUE;
+ }
}
//
&pParentDirectoryCB->NameInformation.FileName,
ntStatus);
}
- else
- {
-
- //
- // Reference the new dir entry
- //
-
- InterlockedIncrement( &pCcb->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Increment (Create) count on %wZ DE %p Ccb %p Cnt %d\n",
- &pCcb->DirectoryCB->NameInformation.FileName,
- pCcb->DirectoryCB,
- pCcb,
- pCcb->DirectoryCB->OpenReferenceCount);
- }
//
// Dereference the parent entry
}
}
+ if( bOpenedReparsePoint)
+ {
+ SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
+ }
+
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Failed to open file in service Status %08lX\n",
+ "AFSOpenRoot (%08lX) Failed open in service AFSRoot Status %08lX\n",
Irp,
ntStatus);
pObjectInfo = pDirEntry->ObjectInformation;
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
+ pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique);
+
+ ntStatus = AFSEvaluateNode( AuthGroup,
+ pDirEntry);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus);
+
+ try_return( ntStatus);
+ }
+
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
+ }
+
//
// We may have raced and the Fcb is already created
//
if( bFileCreated)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
+ pDirEntry,
+ pParentObjectInfo,
+ ntStatus);
+
//
// Remove the dir entry from the parent
//
AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- AFSDeleteDirEntry( pParentObjectInfo,
- pDirEntry);
+ SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
+
+ //
+ // Decrement the reference added during initialization of the DE
+ //
+
+ InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ pDirEntry->OpenReferenceCount);
+
+ //
+ // Pull the directory entry from the parent
+ //
+
+ AFSRemoveDirNodeFromParent( pParentObjectInfo,
+ pDirEntry,
+ FALSE); // Leave it in the enum list so the worker cleans it up
+
+ AFSNotifyDelete( pDirEntry,
+ FALSE);
+
+ //
+ // Tag the parent as needing verification
+ //
+
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
ULONG ulResultLen = 0;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSObjectInfoCB *pObjectInfo = NULL;
+ ULONG ulFileAccess = 0;
+ AFSFileAccessReleaseCB stReleaseFileAccess;
__Enter
{
stOpenCB.ShareAccess = usShareAccess;
+ stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
+
+ stOpenCB.Identifier = (ULONGLONG)pFileObject;
+
stOpenResultCB.GrantedAccess = 0;
ulResultLen = sizeof( AFSFileOpenResultCB);
}
//
+ // Save the granted access in case we need to release it below
+ //
+
+ ulFileAccess = stOpenResultCB.FileAccess;
+
+ //
// Check if there is a conflict
//
(*Ccb)->DirectoryCB = DirectoryCB;
+ (*Ccb)->FileAccess = ulFileAccess;
+
//
// Perform the access check on the target if this is a mount point or symlink
//
if( !NT_SUCCESS( ntStatus))
{
+ if ( ulFileAccess > 0)
+ {
+
+ stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
+
+ stReleaseFileAccess.FileAccess = ulFileAccess;
+
+ stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
+
+ AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
+ AFS_REQUEST_FLAG_SYNCHRONOUS,
+ AuthGroup,
+ &DirectoryCB->NameInformation.FileName,
+ &pObjectInfo->FileId,
+ (void *)&stReleaseFileAccess,
+ sizeof( AFSFileAccessReleaseCB),
+ NULL,
+ NULL);
+ }
+
if( bAllocatedCcb)
{