NOTHING;
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
"EXCEPTION - AFSCreate\n");
ntStatus = STATUS_ACCESS_DENIED;
+
+ AFSDumpTraceFilesFnc();
}
//
(ULONGLONG)PsGetCurrentThreadId(),
&stAuthGroup);
+ //
+ // If we are in shutdown mode then fail the request
+ //
+
+ if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSCommonCreate (%08lX) Open request after shutdown\n",
+ Irp);
+
+ try_return( ntStatus = STATUS_TOO_LATE);
+ }
+
if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
{
}
//
- // If we are in shutdown mode then fail the request
- //
-
- if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSCommonCreate (%08lX) Open request after shutdown\n",
- Irp);
-
- try_return( ntStatus = STATUS_TOO_LATE);
- }
-
- //
// Go and parse the name for processing.
// If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
// then we are responsible for releasing the uniRootFileName.Buffer.
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;
+ }
}
//
}
NTSTATUS
-AFSOpenRedirector( IN PIRP Irp,
- IN AFSFcb **Fcb,
- IN AFSCcb **Ccb)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- LONG lCount;
-
- __Enter
- {
-
- //
- // Initialize the Ccb for the file.
- //
-
- ntStatus = AFSInitCcb( Ccb);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRedirector (%08lX) Failed to allocate Ccb\n",
- Irp);
-
- try_return( ntStatus);
- }
-
- //
- // Setup the Ccb
- //
-
- (*Ccb)->DirectoryCB = AFSRedirectorRoot->DirectoryCB;
-
- //
- // Increment the open count on this Fcb
- //
-
- lCount = InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenRedirector Increment count on Fcb %08lX Cnt %d\n",
- AFSRedirectorRoot->RootFcb,
- lCount);
-
- lCount = InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenHandleCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenRedirector Increment handle count on Fcb %08lX Cnt %d\n",
- AFSRedirectorRoot->RootFcb,
- lCount);
-
- *Fcb = AFSRedirectorRoot->RootFcb;
-
- lCount = InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
-
- //
- // Return the open result for this file
- //
-
- Irp->IoStatus.Information = FILE_OPENED;
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
AFSOpenAFSRoot( IN PIRP Irp,
IN AFSFcb **Fcb,
IN AFSCcb **Ccb)
ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
AuthGroup,
- TRUE,
FALSE);
if( !NT_SUCCESS( ntStatus))
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);
+ if ( ntStatus == STATUS_NOT_A_DIRECTORY)
+ {
+
+ if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique,
+ ntStatus);
+ }
+ else if ( pObjectInfo->ParentObjectInformation == NULL)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique,
+ ntStatus);
+ }
+ else
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ Irp,
+ &pDirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique,
+ pObjectInfo->ParentObjectInformation->FileId.Cell,
+ pObjectInfo->ParentObjectInformation->FileId.Volume,
+ pObjectInfo->ParentObjectInformation->FileId.Vnode,
+ pObjectInfo->ParentObjectInformation->FileId.Unique,
+ ntStatus);
+ }
+ }
+ else
+ {
+
+ 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);
}
*Fcb = pObjectInfo->Fcb;
- if( !NT_SUCCESS( ntStatus) &&
- ntStatus != STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
ntStatus = STATUS_SUCCESS;
}
+ //
+ // Increment the open count on this Fcb
+ //
+
+ lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
+ *Fcb,
+ lCount);
+
bReleaseFcb = TRUE;
//
pFileObject,
&(*Fcb)->ShareAccess);
- //
- // Increment the open count on this Fcb
- //
-
- lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
- *Fcb,
- lCount);
-
lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
+
+ lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Decrement count on Fcb %08lX Cnt %d\n",
+ *Fcb,
+ lCount);
+ }
+
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
if( bAllocatedFcb)
{
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
+ AFSRemoveFcb( &pObjectInfo->Fcb);
}
*Fcb = NULL;
*Fcb = pParentObject->Fcb;
- if( !NT_SUCCESS( ntStatus) &&
- ntStatus != STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
ntStatus = STATUS_SUCCESS;
}
+ //
+ // Increment the open count on this Fcb
+ //
+
+ lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
+ pParentObject->Fcb,
+ lCount);
+
bReleaseFcb = TRUE;
//
&pParentObject->Fcb->ShareAccess);
}
- //
- // Increment the open count on this Fcb
- //
-
- lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
- pParentObject->Fcb,
- lCount);
-
lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
+
+ lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Decrement count on Fcb %08lX Cnt %d\n",
+ pParentObject->Fcb,
+ lCount);
+ }
+
AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
}
if( bAllocatedFcb)
{
- AFSRemoveFcb( pParentObject->Fcb);
-
- pParentObject->Fcb = NULL;
+ AFSRemoveFcb( &pParentObject->Fcb);
}
*Fcb = NULL;
ntStatus = AFSValidateEntry( DirectoryCB,
AuthGroup,
- TRUE,
FALSE);
if( !NT_SUCCESS( ntStatus))
ntStatus = AFSInitFcb( DirectoryCB);
- if( !NT_SUCCESS( ntStatus) &&
- ntStatus != STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
TRUE);
}
- bReleaseFcb = TRUE;
-
//
- // Reference the Fcb so it won't go away while we call into the service for processing
+ // Increment the open count on this Fcb
//
lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
pObjectInfo->Fcb,
lCount);
+ bReleaseFcb = TRUE;
+
//
// Check access on the entry
//
&pObjectInfo->Fcb->ShareAccess);
}
- //
- // Increment the open count on this Fcb
- //
-
- lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- lCount);
-
lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
if( bReleaseFcb)
{
- //
- // Remove the reference we added initially
- //
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
- lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Decrement count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- lCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOpen Decrement2 count on Fcb %08lX Cnt %d\n",
+ pObjectInfo->Fcb,
+ lCount);
+ }
AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
}
if( bAllocatedFcb)
{
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
+ AFSRemoveFcb( &pObjectInfo->Fcb);
}
*Fcb = NULL;
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;
ntStatus = AFSValidateEntry( DirectoryCB,
AuthGroup,
- TRUE,
FALSE);
if( !NT_SUCCESS( ntStatus))
*Fcb = pObjectInfo->Fcb;
- if( !NT_SUCCESS( ntStatus) &&
- ntStatus != STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
TRUE);
}
- bReleaseFcb = TRUE;
-
//
- // Reference the Fcb so it won't go away while processing the request
+ // Increment the open count on this Fcb.
//
lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
pObjectInfo->Fcb,
lCount);
+ bReleaseFcb = TRUE;
+
//
// Check access on the entry
//
(*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->LastAccessTime);
- //KeQuerySystemTime( &pObjectInfo->CreationTime);
-
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)
Irp->IoStatus.Information = FILE_OVERWRITTEN;
}
- //
- // Increment the open count on this Fcb.
- //
-
- lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- lCount);
-
lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
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)
if( bReleaseFcb)
{
- //
- // Remove the reference we added above to prevent tear down
- //
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb.
+ //
- lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Decrement count on Fcb %08lX Cnt %d\n",
- pObjectInfo->Fcb,
- lCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOverwriteSupersede Decrement2 count on Fcb %08lX Cnt %d\n",
+ pObjectInfo->Fcb,
+ lCount);
+ }
AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
}
if( bAllocatedFcb)
{
- AFSRemoveFcb( pObjectInfo->Fcb);
-
- pObjectInfo->Fcb = NULL;
+ AFSRemoveFcb( &pObjectInfo->Fcb);
}
*Fcb = NULL;
*Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
- if( !NT_SUCCESS( ntStatus) &&
- ntStatus != STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
TRUE);
}
+ //
+ // Increment the open reference and handle on the node
+ //
+
+ lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+
bReleaseFcb = TRUE;
//
lCount);
//
- // Increment the open reference and handle on the node
+ // Increment the handle on the node
//
- lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
- (*Fcb),
- lCount);
-
lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open reference and handle on the node
+ //
+
+ lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenIOCtlFcb Decrement count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+ }
+
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
AFSRemoveCcb( NULL,
*Ccb);
-
- *Ccb = NULL;
}
+ *Ccb = NULL;
+
if( bAllocatedFcb)
{
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
- AFSRemoveFcb( *Fcb);
-
- pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
+ AFSRemoveFcb( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
}
*Fcb = NULL;
-
- *Ccb = NULL;
}
}
*Fcb = DirectoryCB->ObjectInformation->Fcb;
- if( !NT_SUCCESS( ntStatus) &&
- ntStatus != STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
TRUE);
}
+ //
+ // Increment the open count on this Fcb
+ //
+
+ lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+
bReleaseFcb = TRUE;
//
try_return( ntStatus);
}
- //
- // Increment the open count on this Fcb
- //
-
- lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
- (*Fcb),
- lCount);
-
lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
if( bReleaseFcb)
{
+ if( !NT_SUCCESS( ntStatus))
+ {
+ //
+ // Decrement the open count on this Fcb
+ //
+
+ lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenSpecialShareFcb Decrement count on Fcb %08lX Cnt %d\n",
+ (*Fcb),
+ lCount);
+ }
+
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
AFSRemoveCcb( NULL,
*Ccb);
-
- *Ccb = NULL;
}
+ *Ccb = NULL;
+
if( bAllocateFcb)
{
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
- AFSRemoveFcb( *Fcb);
-
- DirectoryCB->ObjectInformation->Fcb = NULL;
+ AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);
}
*Fcb = NULL;
-
- *Ccb = NULL;
}
}