AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
IN PIRP Irp)
{
-
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
IO_STACK_LOCATION *pIrpSp;
FILE_OBJECT *pFileObject = NULL;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate (%08lX) Processing control device open request\n",
+ "AFSCreate (%p) Processing control device open request\n",
Irp);
ntStatus = AFSControlDeviceCreate( Irp);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate (%08lX) Invalid request to open before library is initialized\n",
+ "AFSCreate (%p) Invalid request to open before library is initialized\n",
Irp);
try_return( ntStatus = STATUS_DEVICE_NOT_READY);
AFSDeviceExt *pDeviceExt = NULL;
BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
PACCESS_MASK pDesiredAccess = NULL;
- UNICODE_STRING uniComponentName, uniPathName, uniRootFileName, uniParsedFileName;
+ UNICODE_STRING uniComponentName, uniRootFileName, uniParsedFileName;
UNICODE_STRING uniSubstitutedPathName;
UNICODE_STRING uniRelativeName;
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
+ AFSDirectoryCB *pNewParentDirectoryCB = NULL;
+ BOOLEAN bReleaseParentDir = FALSE, bReleaseDir = FALSE;
ULONG ulParseFlags = 0;
- GUID stAuthGroup;
+ GUID stAuthGroup = {0};
ULONG ulNameProcessingFlags = 0;
BOOLEAN bOpenedReparsePoint = FALSE;
LONG lCount;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSCommonCreate (%08lX) Open request after shutdown\n",
+ "AFSCommonCreate (%p) Open request after shutdown\n",
Irp);
try_return( ntStatus = STATUS_TOO_LATE);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) Failed to parse name \"%wZ\" Status %08lX\n",
+ "AFSCommonCreate (%p) Failed to parse name \"%wZ\" Status %08lX\n",
Irp,
&uniFileName,
ntStatus);
try_return( ntStatus);
}
+ if ( pParentDirectoryCB != NULL)
+ {
+
+ bReleaseParentDir = TRUE;
+ }
+
//
// If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
// name
TRUE) == 0)
{
+ //
+ // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
+ // AFSGlobalRoot->DirectoryCB.
+ //
+
ntStatus = AFSOpenIOCtlFcb( Irp,
&stAuthGroup,
AFSGlobalRoot->DirectoryCB,
ntStatus);
}
}
- else if( pParentDirectoryCB != NULL &&
- pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
+ else if( pParentDirectoryCB != NULL)
{
- ntStatus = AFSOpenSpecialShareFcb( Irp,
- &stAuthGroup,
- pParentDirectoryCB,
- &pFcb,
- &pCcb);
-
- if( !NT_SUCCESS( ntStatus))
+ if( pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
- ntStatus);
+ ntStatus = AFSOpenSpecialShareFcb( Irp,
+ &stAuthGroup,
+ pParentDirectoryCB,
+ &pFcb,
+ &pCcb);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
+ ntStatus);
+ }
}
}
AFS_TRACE_LEVEL_ERROR,
"AFSCommonCreate Failed to open root Status %08lX\n",
ntStatus);
-
- lCount = InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
- &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
- AFSGlobalRoot->DirectoryCB,
- NULL,
- lCount);
}
try_return( ntStatus);
// We have a reference on the root volume
//
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_PARSE_NAME;
+
bReleaseVolume = TRUE;
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) Invalid name %wZ Status %08lX\n",
+ "AFSCommonCreate (%p) Invalid name %wZ Status %08lX\n",
Irp,
&uniFileName,
ntStatus);
&uniParsedFileName,
pNameArray,
ulNameProcessingFlags,
- &pVolumeCB,
- &pParentDirectoryCB,
+ pVolumeCB,
+ pParentDirectoryCB,
+ &pNewVolumeCB,
+ &NewVolumeReferenceReason,
+ &pNewParentDirectoryCB,
&pDirectoryCB,
&uniComponentName);
+ if ( pNewVolumeCB != NULL)
+ {
+
+ //
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
+ //
+
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
+
+ pVolumeCB = pNewVolumeCB;
+
+ pNewVolumeCB = NULL;
+
+ VolumeReferenceReason = NewVolumeReferenceReason;
+
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
+ bReleaseVolume = (pVolumeCB != NULL);
+ }
+
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
+
+ if ( bReleaseParentDir)
+ {
+
+ lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate DecrementX count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirectoryCB->NameInformation.FileName,
+ pParentDirectoryCB,
+ pCcb,
+ lCount);
+ }
+
+ pParentDirectoryCB = pNewParentDirectoryCB;
+
+ pNewParentDirectoryCB = NULL;
+
+ bReleaseParentDir = (pParentDirectoryCB != NULL);
+
+ if ( pDirectoryCB)
+ {
+
+ bReleaseDir = TRUE;
+ }
+
if( !NT_SUCCESS( ntStatus) &&
ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
{
}
//
- // The routine above released the root while walking the
+ // AFSLocateNameEntry released the Parent while walking the
// branch
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) Failed to locate name entry for %wZ Status %08lX\n",
+ "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
Irp,
&uniFileName,
ntStatus);
- //
- // We released any root volume locks in the above on failure
- //
-
- bReleaseVolume = FALSE;
-
try_return( ntStatus);
}
Irp->IoStatus.Information = IO_REPARSE;
- //
- // We released the volume lock above
- //
-
- bReleaseVolume = FALSE;
-
try_return( ntStatus);
}
pParentDirectoryCB != NULL)
{
+ //
+ // pParentDirectoryCB DirOpenReferenceCount is still held
+ //
+
UNICODE_STRING uniFinalComponent;
uniFinalComponent.Length = 0;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) Failing access to symlink %wZ Status %08lX\n",
+ "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
Irp,
&uniFileName,
ntStatus);
{
pDirectoryCB = pVolumeCB->DirectoryCB;
+
+ lCount = InterlockedIncrement( &pDirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Increment0 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryCB->NameInformation.FileName,
+ pDirectoryCB,
+ pCcb,
+ lCount);
+
+ bReleaseDir = TRUE;
}
if( bOpenTargetDirectory)
if( pDirectoryCB != NULL)
{
- //
- // Perform in this order to prevent thrashing
- //
+ if ( !bReleaseParentDir)
+ {
- lCount = InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
+ //
+ // Perform in this order to prevent thrashing
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirectoryCB->NameInformation.FileName,
- pParentDirectoryCB,
- NULL,
- lCount);
+ lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirectoryCB->NameInformation.FileName,
+ pParentDirectoryCB,
+ pCcb,
+ lCount);
+
+ bReleaseParentDir = TRUE;
+ }
//
// Do NOT decrement the reference count on the pDirectoryCB yet.
&uniComponentName,
&pFcb,
&pCcb);
- if( pDirectoryCB != NULL)
- {
- //
- // It is now safe to drop the Reference Count
- //
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
- }
if( !NT_SUCCESS( ntStatus))
{
"AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
&pParentDirectoryCB->NameInformation.FileName,
ntStatus);
-
- //
- // Decrement the reference on the parent
- //
-
- lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirectoryCB->NameInformation.FileName,
- pParentDirectoryCB,
- NULL,
- lCount);
}
try_return( ntStatus);
{
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",
+ "AFSCommonCreate (%p) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
Irp,
&uniFileName,
pDirectoryCB,
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) Opening as reparse point %wZ Type %08lX\n",
+ "AFSCommonCreate (%p) Opening as reparse point %wZ Type %08lX\n",
Irp,
&uniFileName,
pDirectoryCB->ObjectInformation->FileType);
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)
{
"AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
&pDirectoryCB->NameInformation.FileName,
ntStatus);
-
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
}
else
{
AFS_TRACE_LEVEL_VERBOSE,
"AFSCommonCreate Object name collision on create Status %08lX\n",
ntStatus);
-
- InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirectoryCB->NameInformation.FileName,
- pParentDirectoryCB,
- NULL,
- pParentDirectoryCB->OpenReferenceCount);
}
try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
ntStatus);
}
- //
- // Dereference the parent entry
- //
-
- lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirectoryCB->NameInformation.FileName,
- pParentDirectoryCB,
- NULL,
- lCount);
-
try_return( ntStatus);
}
TRUE) == 0)
{
+ //
+ // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
+ // pParentDirectoryCB.
+ //
+
ntStatus = AFSOpenIOCtlFcb( Irp,
&stAuthGroup,
pParentDirectoryCB,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate (%08lX) File %wZ name not found\n",
+ "AFSCommonCreate (%p) File %wZ name not found\n",
Irp,
&uniFileName);
ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
}
- if( !NT_SUCCESS( ntStatus))
- {
-
- //
- // Dereference the parent entry
- //
-
- if( pDirectoryCB != NULL)
- {
-
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
- }
- else
- {
-
- lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirectoryCB->NameInformation.FileName,
- pParentDirectoryCB,
- NULL,
- lCount);
- }
- }
-
try_return( ntStatus);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
+ "AFSCommonCreate (%p) Attempt to open root as delete on close\n",
Irp);
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
-
try_return( ntStatus = STATUS_CANNOT_DELETE);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
+ "AFSCommonCreate (%p) Attempt to open root as target directory\n",
Irp);
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
-
try_return( ntStatus = STATUS_INVALID_PARAMETER);
}
pVolumeCB->ObjectInformation.FileId.Cell,
pVolumeCB->ObjectInformation.FileId.Volume,
ntStatus);
-
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
}
try_return( ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonCreate Failing access to %wZ\n",
+ "AFSCommonCreate Failing access to %wZ Name not found\n",
&uniFileName);
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
"AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
&pDirectoryCB->NameInformation.FileName,
ntStatus);
-
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
}
try_return( ntStatus);
"AFSCommonCreate Failed open on %wZ Status %08lX\n",
&pDirectoryCB->NameInformation.FileName,
ntStatus);
-
- lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryCB->NameInformation.FileName,
- pDirectoryCB,
- NULL,
- lCount);
}
try_exit:
SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
}
+ lCount = pCcb->DirectoryCB->DirOpenReferenceCount;
+
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
&pCcb->DirectoryCB->NameInformation.FileName,
pCcb->DirectoryCB,
pCcb,
- pCcb->DirectoryCB->OpenReferenceCount);
+ lCount);
- ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
+ ASSERT( lCount >= 0);
pCcb->CurrentDirIndex = 0;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSCommonCreate (%08lX) FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
+ "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n",
Irp,
pFileObject,
pFcb,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonCreate (%08lX) Returning with NULL Fcb FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
+ "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n",
Irp,
pFileObject,
pFcb,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSCommonCreate (%08lX) STATUS_REPARSE FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
+ "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n",
Irp,
pFileObject,
pFcb,
if( bReleaseVolume)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
+ "AFSCommonCreate Decrement count on Volume %08lX Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
+ }
+
+ if ( bReleaseDir)
+ {
+
+ //
+ // Release the reference from AFSLocateNameEntry
+ //
+
+ lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryCB->NameInformation.FileName,
+ pDirectoryCB,
+ pCcb,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( bReleaseParentDir)
+ {
+
+ //
+ // Release the reference from AFSLocateNameEntry
+ //
+
+ lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirectoryCB->NameInformation.FileName,
+ pParentDirectoryCB,
+ pCcb,
lCount);
+
+ ASSERT( lCount >= 0);
}
//
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ AFSGlobalRoot->DirectoryCB,
+ 0,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
+ "AFSOpenAFSRoot (%p) Failed to allocate Ccb\n",
Irp);
try_return( ntStatus);
}
//
- // Setup the Ccb
- //
-
- (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
-
- //
// Increment the open count on this Fcb
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
+ "AFSOpenAFSRoot Increment count on Fcb %p Cnt %d\n",
AFSGlobalRoot->RootFcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSOpenAFSRoot Increment handle count on Fcb %p Cnt %d\n",
AFSGlobalRoot->RootFcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Attempt to open root as file Status %08lX\n",
+ "AFSOpenRoot (%p) Attempt to open root as file Status %08lX\n",
Irp,
ntStatus);
ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
AuthGroup,
- FALSE);
+ FALSE,
+ TRUE);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
+ "AFSOpenRoot (%p) Failed to validate root entry Status %08lX\n",
Irp,
ntStatus);
AuthGroup,
NULL,
&VolumeCB->ObjectInformation.FileId,
+ VolumeCB->VolumeInformation.Cell,
+ VolumeCB->VolumeInformation.CellLength,
(void *)&stOpenCB,
sizeof( AFSFileOpenCB),
(void *)&stOpenResultCB,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
+ "AFSOpenRoot (%p) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
Irp,
VolumeCB->ObjectInformation.FileId.Cell,
VolumeCB->ObjectInformation.FileId.Volume,
AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
- {
-
- ntStatus = AFSEnumerateDirectory( AuthGroup,
- &VolumeCB->ObjectInformation,
- TRUE);
+ ntStatus = AFSEnumerateDirectory( AuthGroup,
+ &VolumeCB->ObjectInformation,
+ TRUE);
- if( !NT_SUCCESS( ntStatus))
- {
+ if( !NT_SUCCESS( ntStatus))
+ {
- AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
- Irp,
- ntStatus);
-
- try_return( ntStatus);
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSOpenRoot (%p) Failed to enumerate directory Status %08lX\n",
+ Irp,
+ ntStatus);
- SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+ try_return( ntStatus);
}
AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
// init the volume fcb
//
- if( VolumeCB->RootFcb == NULL)
- {
-
- ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
- VolumeCB);
+ ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
+ VolumeCB);
- if( !NT_SUCCESS( ntStatus))
- {
-
- try_return( ntStatus);
- }
- }
- else
+ if( !NT_SUCCESS( ntStatus))
{
- AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
- TRUE);
+ try_return( ntStatus);
}
+ lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
+ VolumeCB->RootFcb,
+ lCount);
+
bReleaseFcb = TRUE;
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
+ "AFSOpenRoot (%p) Access check failure Status %08lX\n",
Irp,
ntStatus);
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ VolumeCB->DirectoryCB,
+ *pDesiredAccess,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
+ "AFSOpenRoot (%p) Failed to allocate Ccb Status %08lX\n",
Irp,
ntStatus);
bAllocatedCcb = TRUE;
//
- // Setup the ccb
- //
-
- (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
-
- (*Ccb)->GrantedAccess = *pDesiredAccess;
-
- //
// OK, update the share access on the fileobject
//
// Increment the open count on this Fcb
//
- lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
- VolumeCB->RootFcb,
- lCount);
-
lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSOpenRoot Increment handle count on Fcb %p Cnt %d\n",
VolumeCB->RootFcb,
lCount);
if( bReleaseFcb)
{
+ if ( !NT_SUCCESS( ntStatus))
+ {
+
+ lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n",
+ VolumeCB->RootFcb,
+ lCount);
+ }
AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
}
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
ULONG ulOptions = 0;
- ULONG ulShareMode = 0;
- ULONG ulAccess = 0;
ULONG ulAttributes = 0;
- LARGE_INTEGER liAllocationSize = {0,0};
BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
- BOOLEAN bAllocatedFcb = FALSE;
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
AFSDirectoryCB *pDirEntry = NULL;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
+ "AFSProcessCreate (%p) Creating file %wZ Attributes %08lX\n",
Irp,
FullFileName,
ulAttributes);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
+ "AFSProcessCreate (%p) Failed to create directory entry %wZ Status %08lX\n",
Irp,
FullFileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSProcessCreate (%p) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
Irp,
&pDirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
if ( ntStatus == STATUS_NOT_A_DIRECTORY)
{
- if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
+ if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
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",
+ "AFSProcessCreate (%p) 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,
pParentObjectInfo->FileId.Unique,
ntStatus);
}
- else if ( pObjectInfo->ParentObjectInformation == NULL)
+ else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
{
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",
+ "AFSProcessCreate (%p) 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,
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",
+ "AFSProcessCreate (%p) 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,
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,
+ pObjectInfo->ParentFileId.Cell,
+ pObjectInfo->ParentFileId.Volume,
+ pObjectInfo->ParentFileId.Vnode,
+ pObjectInfo->ParentFileId.Unique,
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",
+ "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
Irp,
&pDirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
+ ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
//
// We may have raced and the Fcb is already created
//
- if( pObjectInfo->Fcb != NULL)
- {
+ //
+ // Allocate and initialize the Fcb for the file.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
- Irp,
- FullFileName);
+ ntStatus = AFSInitFcb( pDirEntry);
- *Fcb = pObjectInfo->Fcb;
+ *Fcb = pObjectInfo->Fcb;
- AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
- TRUE);
- }
- else
+ if( !NT_SUCCESS( ntStatus))
{
- //
- // Allocate and initialize the Fcb for the file.
- //
-
- ntStatus = AFSInitFcb( pDirEntry);
-
- *Fcb = pObjectInfo->Fcb;
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
- Irp,
- FullFileName,
- ntStatus);
-
- try_return( ntStatus);
- }
-
- if ( ntStatus != STATUS_REPARSE)
- {
-
- bAllocatedFcb = TRUE;
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessCreate (%p) Failed to initialize fcb %wZ Status %08lX\n",
+ Irp,
+ FullFileName,
+ ntStatus);
- ntStatus = STATUS_SUCCESS;
+ try_return( ntStatus);
}
+ ntStatus = STATUS_SUCCESS;
+
//
// Increment the open count on this Fcb
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
+ "AFSProcessCreate Increment count on Fcb %p Cnt %d\n",
*Fcb,
lCount);
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ pDirEntry,
+ *pDesiredAccess,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+ "AFSProcessCreate (%p) Failed to initialize ccb %wZ Status %08lX\n",
Irp,
FullFileName,
ntStatus);
bAllocatedCcb = TRUE;
//
- // Initialize the Ccb
- //
-
- (*Ccb)->DirectoryCB = pDirEntry;
-
- (*Ccb)->GrantedAccess = *pDesiredAccess;
-
- //
// If this is a file, update the headers filesizes.
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSProcessCreate Increment handle count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
// Increment the open reference and handle on the parent node
//
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
lCount);
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
lCount);
if( ulOptions & FILE_DELETE_ON_CLOSE)
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
+ "AFSProcessCreate (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
Irp,
pDirEntry,
FullFileName);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSProcessCreate Decrement count on Fcb %p Cnt %d\n",
*Fcb,
lCount);
}
AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
}
+ if ( bFileCreated)
+ {
+
+ //
+ // Decrement the reference added during initialization of the DE
+ // AFSInitCcb allocates its own reference count.
+ //
+
+ lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
+ "AFSProcessCreate Create failed, removing DE %p from parent object %p Status %08lX\n",
pDirEntry,
pParentObjectInfo,
ntStatus);
FALSE);
//
- // Decrement the reference added during initialization of the DE
- //
-
- lCount = 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,
- lCount);
-
- //
// Pull the directory entry from the parent
//
*Ccb);
}
- if( bAllocatedFcb)
- {
-
- AFSAcquireExcl( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
- TRUE);
-
- AFSRemoveFcb( &pObjectInfo->Fcb);
-
- AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb)
{
-
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
BOOLEAN bAllocatedCcb = FALSE;
- BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
- AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
+ BOOLEAN bReleaseFcb = FALSE;
+ AFSObjectInfoCB *pParentObject = NULL;
+ AFSObjectInfoCB *pGrandParentObject = NULL;
UNICODE_STRING uniTargetName;
LONG lCount;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
+ "AFSOpenTargetDirectory (%p) Processing file %wZ\n",
Irp,
TargetName);
pParentObject = ParentDirectoryCB->ObjectInformation;
- if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
- {
-
- try_return( ntStatus = STATUS_INVALID_PARAMETER);
- }
-
- //
- // Make sure we have an Fcb for the access
- //
-
- if( pParentObject->Fcb != NULL)
- {
-
- *Fcb = pParentObject->Fcb;
-
- AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
- TRUE);
- }
- else
- {
-
- //
- // Allocate and initialize the Fcb for the file.
- //
-
- ntStatus = AFSInitFcb( ParentDirectoryCB);
+ if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
+ {
- *Fcb = pParentObject->Fcb;
+ try_return( ntStatus = STATUS_INVALID_PARAMETER);
+ }
- if( !NT_SUCCESS( ntStatus))
- {
+ //
+ // Make sure we have an Fcb for the access
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSOpenTargetDirectory (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
- Irp,
- &ParentDirectoryCB->NameInformation.FileName,
- ntStatus);
+ //
+ // Allocate and initialize the Fcb for the file.
+ //
- try_return( ntStatus);
- }
+ ntStatus = AFSInitFcb( ParentDirectoryCB);
- if ( ntStatus != STATUS_REPARSE)
- {
+ *Fcb = pParentObject->Fcb;
- bAllocatedFcb = TRUE;
- }
+ if( !NT_SUCCESS( ntStatus))
+ {
- ntStatus = STATUS_SUCCESS;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSOpenTargetDirectory (%p) Failed to initialize fcb %wZ Status %08lX\n",
+ Irp,
+ &ParentDirectoryCB->NameInformation.FileName,
+ ntStatus);
+
+ try_return( ntStatus);
}
+ ntStatus = STATUS_SUCCESS;
+
//
// Increment the open count on this Fcb
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
+ "AFSOpenTargetDirectory Increment count on Fcb %p Cnt %d\n",
pParentObject->Fcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
+ "AFSOpenTargetDirectory (%p) Access check failure %wZ Status %08lX\n",
Irp,
&ParentDirectoryCB->NameInformation.FileName,
ntStatus);
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ ParentDirectoryCB,
+ *pDesiredAccess,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+ "AFSOpenTargetDirectory (%p) Failed to initialize ccb %wZ Status %08lX\n",
Irp,
&ParentDirectoryCB->NameInformation.FileName,
ntStatus);
bAllocatedCcb = TRUE;
- //
- // Initialize the Ccb
- //
-
- (*Ccb)->DirectoryCB = ParentDirectoryCB;
-
- (*Ccb)->GrantedAccess = *pDesiredAccess;
-
if( TargetDirectoryCB != NULL &&
FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
TargetName,
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSOpenTargetDirectory Increment handle count on Fcb %p Cnt %d\n",
pParentObject->Fcb,
lCount);
// Increment the open reference and handle on the parent node
//
- if( pParentObject->ParentObjectInformation != NULL)
+ if( BooleanFlagOn( pParentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
+ &pParentObject->ParentFileId);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
- pParentObject->ParentObjectInformation,
- lCount);
+ if ( pGrandParentObject)
+ {
- lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
- pParentObject->ParentObjectInformation,
- lCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
+ pGrandParentObject,
+ lCount);
+
+ lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
+ pGrandParentObject,
+ lCount);
+
+ AFSReleaseObjectInfo( &pGrandParentObject);
+ }
}
try_exit:
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenTargetDirectory Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSOpenTargetDirectory Decrement count on Fcb %p Cnt %d\n",
pParentObject->Fcb,
lCount);
}
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- AFSAcquireExcl( &pParentObject->NonPagedInfo->ObjectInfoLock,
- TRUE);
-
- AFSRemoveFcb( &pParentObject->Fcb);
-
- AFSReleaseResource( &pParentObject->NonPagedInfo->ObjectInfoLock);
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb)
{
-
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
- BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
- ULONG ulAdditionalFlags = 0, ulOptions = 0;
+ BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
+ ULONG ulOptions = 0;
AFSFileOpenCB stOpenCB;
AFSFileOpenResultCB stOpenResultCB;
ULONG ulResultLen = 0;
pObjectInfo = DirectoryCB->ObjectInformation;
+ ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
//
// Check if the entry is pending a deletion
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Entry pending delete %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
ntStatus = AFSValidateEntry( DirectoryCB,
AuthGroup,
- FALSE);
+ FALSE,
+ TRUE);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed to validate entry %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
+ "AFSProcessOpen (%p) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed to init fcb on %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
try_return( ntStatus);
}
- if ( ntStatus != STATUS_REPARSE)
- {
-
- bAllocatedFcb = TRUE;
- }
-
ntStatus = STATUS_SUCCESS;
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOpen Increment2 count on Fcb %p Cnt %d\n",
pObjectInfo->Fcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed to check share access on %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
{
- if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- MmFlushForWrite))
+ BOOLEAN bMmFlushed;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOpen Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ MmFlushForWrite);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOpen Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ if ( !bMmFlushed)
{
ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed to flush image section %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Attempt to open file as directory %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Attempt to open directory as file %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AuthGroup,
&DirectoryCB->NameInformation.FileName,
&pObjectInfo->FileId,
+ pObjectInfo->VolumeCB->VolumeInformation.Cell,
+ pObjectInfo->VolumeCB->VolumeInformation.CellLength,
(void *)&stOpenCB,
sizeof( AFSFileOpenCB),
(void *)&stOpenResultCB,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed open in service %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
Irp,
*pDesiredAccess,
stOpenResultCB.GrantedAccess,
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ DirectoryCB,
+ *pDesiredAccess,
+ ulFileAccess);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+ "AFSProcessOpen (%p) Failed to initialize ccb %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
bAllocatedCcb = TRUE;
- (*Ccb)->DirectoryCB = DirectoryCB;
-
- (*Ccb)->FileAccess = ulFileAccess;
-
- (*Ccb)->GrantedAccess = *pDesiredAccess;
-
//
// Perform the access check on the target if this is a mount point or symlink
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOpen Increment handle count on Fcb %p Cnt %d\n",
pObjectInfo->Fcb,
lCount);
// Increment the open reference and handle on the parent node
//
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
lCount);
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
lCount);
if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
+ "AFSProcessOpen (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
Irp,
DirectoryCB,
&DirectoryCB->NameInformation.FileName);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOpen Decrement2 count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOpen Decrement2 count on Fcb %p Cnt %d\n",
pObjectInfo->Fcb,
lCount);
}
AuthGroup,
&DirectoryCB->NameInformation.FileName,
&pObjectInfo->FileId,
+ pObjectInfo->VolumeCB->VolumeInformation.Cell,
+ pObjectInfo->VolumeCB->VolumeInformation.CellLength,
(void *)&stReleaseFileAccess,
sizeof( AFSFileAccessReleaseCB),
NULL,
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- AFSAcquireExcl( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
- TRUE);
-
- AFSRemoveFcb( &pObjectInfo->Fcb);
-
- AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb)
{
-
+ UNREFERENCED_PARAMETER(DeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
PFILE_OBJECT pFileObject = NULL;
LARGE_INTEGER liZero = {0,0};
BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
ULONG ulAttributes = 0;
- LARGE_INTEGER liTime;
ULONG ulCreateDisposition = 0;
- BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
+ BOOLEAN bAllocatedCcb = FALSE;
+ BOOLEAN bUserMapped = FALSE;
PACCESS_MASK pDesiredAccess = NULL;
USHORT usShareAccess;
AFSObjectInfoCB *pParentObjectInfo = NULL;
pObjectInfo = DirectoryCB->ObjectInformation;
+ ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
//
// Check if we should go and retrieve updated information for the node
//
ntStatus = AFSValidateEntry( DirectoryCB,
AuthGroup,
- FALSE);
+ FALSE,
+ TRUE);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
+ "AFSProcessOverwriteSupersede (%p) Failed to validate entry %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
// Be sure we have an Fcb for the object block
//
- if( pObjectInfo->Fcb == NULL)
- {
-
- ntStatus = AFSInitFcb( DirectoryCB);
-
- *Fcb = pObjectInfo->Fcb;
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
- Irp,
- &DirectoryCB->NameInformation.FileName,
- ntStatus);
+ ntStatus = AFSInitFcb( DirectoryCB);
- try_return( ntStatus);
- }
+ *Fcb = pObjectInfo->Fcb;
- if ( ntStatus != STATUS_REPARSE)
- {
+ if( !NT_SUCCESS( ntStatus))
+ {
- bAllocatedFcb = TRUE;
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSProcessOverwriteSupersede (%p) Failed to initialize fcb %wZ Status %08lX\n",
+ Irp,
+ &DirectoryCB->NameInformation.FileName,
+ ntStatus);
- ntStatus = STATUS_SUCCESS;
+ try_return( ntStatus);
}
- else
- {
- AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
- TRUE);
- }
+ ntStatus = STATUS_SUCCESS;
//
// Increment the open count on this Fcb.
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOverwriteSupersede Increment2 count on Fcb %p Cnt %d\n",
pObjectInfo->Fcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
+ "AFSProcessOverwriteSupersede (%p) Access check failure %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
}
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
//
// Before we actually truncate, check to see if the purge
// is going to fail.
//
- if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &liZero))
+ bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &liZero);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ if( bUserMapped)
{
ntStatus = STATUS_USER_MAPPED_FILE;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
+ "AFSProcessOverwriteSupersede (%p) File user mapped %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ DirectoryCB,
+ *pDesiredAccess,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+ "AFSProcessOverwriteSupersede (%p) Failed to initialize ccb %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
bAllocatedCcb = TRUE;
//
- // Initialize the Ccb
- //
-
- (*Ccb)->DirectoryCB = DirectoryCB;
-
- (*Ccb)->GrantedAccess = *pDesiredAccess;
-
- //
// Set the file length to zero
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
+ "AFSProcessOverwriteSupersede (%p) Failed to update file information %wZ Status %08lX\n",
Irp,
&DirectoryCB->NameInformation.FileName,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOverwriteSupersede Increment handle count on Fcb %p Cnt %d\n",
pObjectInfo->Fcb,
lCount);
// Increment the open reference and handle on the parent node
//
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
lCount);
- lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
- pObjectInfo->ParentObjectInformation,
+ "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
+ pParentObjectInfo,
lCount);
AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessOverwriteSupersede Decrement2 count on Fcb %08lX Cnt %d\n",
+ "AFSProcessOverwriteSupersede Decrement2 count on Fcb %p Cnt %d\n",
pObjectInfo->Fcb,
lCount);
}
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- AFSAcquireExcl( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
- TRUE);
-
- AFSRemoveFcb( &pObjectInfo->Fcb);
-
- AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
__Enter
{
- //
- // For now, jsut let the open happen
- //
-
- Irp->IoStatus.Information = FILE_OPENED;
+ if ( KernelMode == Irp->RequestorMode) {
+ //
+ // For now, just let the open happen
+ //
+ Irp->IoStatus.Information = FILE_OPENED;
+ }
+ else
+ {
+ //
+ // Not from usermode, All access must be via
+ // the FS component (which will do the
+ // security check)
+ //
+ ntStatus = STATUS_ACCESS_DENIED;
+ }
}
return ntStatus;
}
+//
+// AFSOpenIOCtlFcb does not release a DirOpenReferenceCount on
+// the ParentDirCB.
+//
+
NTSTATUS
AFSOpenIOCtlFcb( IN PIRP Irp,
IN GUID *AuthGroup,
NTSTATUS ntStatus = STATUS_SUCCESS;
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
- UNICODE_STRING uniFullFileName;
+ BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
AFSFileID stFileID;
AFSObjectInfoCB *pParentObjectInfo = NULL;
}
}
- if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
- {
-
- //
- // Allocate and initialize the Fcb for the file.
- //
-
- ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
-
- *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
- Irp,
- ntStatus);
-
- try_return( ntStatus);
- }
+ //
+ // Allocate and initialize the Fcb for the file.
+ //
- if ( ntStatus != STATUS_REPARSE)
- {
+ ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
- bAllocatedFcb = TRUE;
- }
+ *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
- ntStatus = STATUS_SUCCESS;
- }
- else
+ if( !NT_SUCCESS( ntStatus))
{
- *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSOpenIOCtlFcb (%p) Failed to initialize fcb Status %08lX\n",
+ Irp,
+ ntStatus);
- AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
- TRUE);
+ try_return( ntStatus);
}
+ ntStatus = STATUS_SUCCESS;
+
//
// Increment the open reference and handle on the node
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
+ "AFSOpenIOCtlFcb Increment count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
+ 0,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
+ "AFSOpenIOCtlFcb (%p) Failed to initialize ccb Status %08lX\n",
Irp,
ntStatus);
bAllocatedCcb = TRUE;
//
- // Setup the Ccb
- //
-
- (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
-
- //
// Set the PIOCtl index
//
AuthGroup,
NULL,
&stFileID,
+ NULL,
+ 0,
(void *)&stPIOCtlOpen,
sizeof( AFSPIOCtlOpenCloseRequestCB),
NULL,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
+ "AFSOpenIOCtlFcb (%p) Failed service open Status %08lX\n",
Irp,
ntStatus);
}
//
- // Reference the directory entry
- //
-
- lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
- &(*Ccb)->DirectoryCB->NameInformation.FileName,
- (*Ccb)->DirectoryCB,
- (*Ccb),
- lCount);
-
- //
// Increment the handle on the node
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSOpenIOCtlFcb Increment handle count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSOpenIOCtlFcb Increment child open handle count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
+ "AFSOpenIOCtlFcb Increment child open ref count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
try_exit:
//
- //Dereference the passed in parent since the returned dir entry
- // is already referenced
- //
-
- lCount = InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &ParentDirCB->NameInformation.FileName,
- ParentDirCB,
- NULL,
- lCount);
-
- //
// If we created the Fcb we need to release the resources
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenIOCtlFcb Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSOpenIOCtlFcb Decrement count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
}
*Ccb = NULL;
- if( bAllocatedFcb)
- {
-
- //
- // Need to tear down this Fcb since it is not in the tree for the worker thread
- //
-
- AFSAcquireExcl( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
- TRUE);
-
- AFSRemoveFcb( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
-
- AFSReleaseResource( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
- }
+ //
+ // Fcb will be freed by AFSPrimaryVolumeWorker thread
+ //
*Fcb = NULL;
}
PFILE_OBJECT pFileObject = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
+ AFSObjectInfoCB *pObjectInfo = NULL;
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSPipeOpenCloseRequestCB stPipeOpen;
LONG lCount;
AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
+ "AFSOpenSpecialShareFcb (%p) Processing Share %wZ open\n",
Irp,
&DirectoryCB->NameInformation.FileName);
- pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
+ pObjectInfo = DirectoryCB->ObjectInformation;
+
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
if( DirectoryCB->ObjectInformation->Fcb == NULL)
{
ntStatus = AFSInitFcb( DirectoryCB);
- *Fcb = DirectoryCB->ObjectInformation->Fcb;
+ *Fcb = pObjectInfo->Fcb;
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
+ "AFSOpenSpecialShareFcb (%p) Failed to initialize fcb Status %08lX\n",
Irp,
ntStatus);
else
{
- *Fcb = DirectoryCB->ObjectInformation->Fcb;
+ *Fcb = pObjectInfo->Fcb;
AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
TRUE);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
+ "AFSOpenSpecialShareFcb Increment count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
// Initialize the Ccb for the file.
//
- ntStatus = AFSInitCcb( Ccb);
+ ntStatus = AFSInitCcb( Ccb,
+ DirectoryCB,
+ 0,
+ 0);
if( !NT_SUCCESS( ntStatus))
{
AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
+ "AFSOpenSpecialShareFcb (%p) Failed to initialize ccb Status %08lX\n",
Irp,
ntStatus);
bAllocatedCcb = TRUE;
//
- // Setup the Ccb
- //
-
- (*Ccb)->DirectoryCB = DirectoryCB;
-
- //
// Call the service to open the share
//
AuthGroup,
&DirectoryCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
(void *)&stPipeOpen,
sizeof( AFSPipeOpenCloseRequestCB),
NULL,
AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
+ "AFSOpenSpecialShareFcb (%p) Failed service open Status %08lX\n",
Irp,
ntStatus);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
+ "AFSOpenSpecialShareFcb Increment handle count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
+ "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
+ "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %p Cnt %d\n",
pParentObjectInfo,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSOpenSpecialShareFcb Decrement count on Fcb %08lX Cnt %d\n",
+ "AFSOpenSpecialShareFcb Decrement count on Fcb %p Cnt %d\n",
(*Fcb),
lCount);
}