NOTHING;
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
"EXCEPTION - AFSCreate\n");
ntStatus = STATUS_ACCESS_DENIED;
+
+ AFSDumpTraceFilesFnc();
}
//
pDirectoryCB == NULL))
{
+ if ( pVolumeCB &&
+ BooleanFlagOn( pVolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate ReadOnly Device on create Status %08lX\n",
+ ntStatus);
+
+ InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Decrement13 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirectoryCB->NameInformation.FileName,
+ pParentDirectoryCB,
+ NULL,
+ pParentDirectoryCB->OpenReferenceCount);
+
+ try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
+ }
+
if( uniComponentName.Length == 0 ||
pDirectoryCB != NULL)
{
if( pCcb != NULL)
{
+ AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+ TRUE);
+
RtlCopyMemory( &pCcb->AuthGroup,
&stAuthGroup,
sizeof( GUID));
pCcb->NameArray = pNameArray;
pNameArray = NULL;
+
+ AFSReleaseResource( &pCcb->NPCcb->CcbLock);
}
//
// For files perform additional processing
//
- if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+ switch( pFcb->Header.NodeTypeCode)
{
- pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+
+ case AFS_FILE_FCB:
+ case AFS_IOCTL_FCB:
+ {
+
+ pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+ }
}
//
if( uniSubstitutedPathName.Buffer != NULL)
{
- AFSExFreePool( uniSubstitutedPathName.Buffer);
+ AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
}
if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
{
- AFSExFreePool( uniRootFileName.Buffer);
+ AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
}
if( bReleaseVolume)
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
+ "AFSOpenTargetDirectory (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
Irp,
&ParentDirectoryCB->NameInformation.FileName,
ntStatus);
try_return( ntStatus);
}
- if ( ntStatus == STATUS_REPARSE)
+ if ( ntStatus != STATUS_REPARSE)
{
bAllocatedFcb = TRUE;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSObjectInfoCB *pObjectInfo = NULL;
LONG lCount;
+ LARGE_INTEGER liSaveSize;
+ LARGE_INTEGER liSaveVDL;
+ LARGE_INTEGER liSaveAlloc;
__Enter
{
pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
+
usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
pFileObject = pIrpSp->FileObject;
(*Ccb)->GrantedAccess = *pDesiredAccess;
//
- // Need to purge any data currently in the cache
+ // Set the file length to zero
//
- CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
+ TRUE);
+
+ bReleasePaging = TRUE;
+
+ liSaveSize = pObjectInfo->Fcb->Header.FileSize;
+ liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
+ liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
KeQuerySystemTime( &pObjectInfo->LastWriteTime);
+ //
+ // Set the update flag accordingly
+ //
+
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
+ AFS_FCB_FLAG_UPDATE_CREATE_TIME |
+ AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
+ AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
+ AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
pObjectInfo,
AuthGroup);
if( !NT_SUCCESS( ntStatus))
{
+ pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
+ pObjectInfo->Fcb->Header.FileSize = liSaveSize;
+ pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
+ pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
+ pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
try_return( ntStatus);
}
- AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
- TRUE);
-
- bReleasePaging = TRUE;
-
- pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
-
- pFileObject->FsContext = (void *)pObjectInfo->Fcb;
-
- pFileObject->FsContext2 = (void *)*Ccb;
-
- //
- // Set the update flag accordingly
- //
-
- SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
- AFS_FCB_FLAG_UPDATE_CREATE_TIME |
- AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
- AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
- AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
-
- CcSetFileSizes( pFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
-
- AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
-
- bReleasePaging = FALSE;
-
ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
if( ulCreateDisposition == FILE_SUPERSEDE)
pObjectInfo->ParentObjectInformation,
lCount);
+ AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
+
+ bReleaseFcb = FALSE;
+
*Fcb = pObjectInfo->Fcb;
+ //
+ // Now that the Fcb->Resource has been dropped
+ // we can call CcSetFileSizes. We are still holding
+ // the PagingIoResource
+ //
+
+ pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
+
+ pFileObject->FsContext = (void *)pObjectInfo->Fcb;
+
+ pFileObject->FsContext2 = (void *)*Ccb;
+
+ CcSetFileSizes( pFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
try_exit:
if( bReleasePaging)