//
// Return:
//
-// A status is returned for the function
+// Return Fcb->NPFcb->Resource held exclusive
//
NTSTATUS
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSFcb *pFcb = NULL;
AFSNonPagedFcb *pNPFcb = NULL;
- IO_STATUS_BLOCK stIoSb = {0,0};
USHORT usFcbLength = 0;
- ULONGLONG ullIndex = 0;
- AFSDirEnumEntry *pDirEnumCB = NULL;
AFSObjectInfoCB *pObjectInfo = NULL, *pParentObjectInfo = NULL;
AFSVolumeCB *pVolumeCB = NULL;
pVolumeCB = pObjectInfo->VolumeCB;
+ if ( pObjectInfo->Fcb != NULL)
+ {
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
//
// Allocate the Fcb and the nonpaged portion of the Fcb.
//
ExInitializeResourceLite( &pNPFcb->PagingResource);
+ ExInitializeResourceLite( &pNPFcb->SectionObjectResource);
+
ExInitializeResourceLite( &pNPFcb->CcbListLock);
pFcb->Header.Resource = &pNPFcb->Resource;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitFcb Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSInitFcb Acquiring Fcb lock %p EXCL %08lX\n",
&pNPFcb->Resource,
PsGetCurrentThread());
pFcb->ObjectInformation = pObjectInfo;
+ AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
//
// Swap the allocated FCB into the ObjectInformation structure if it
// does not already have one.
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSInitFcb Raced Fcb %08lX pFcb %08lX Name %wZ\n",
+ "AFSInitFcb Raced Fcb %p pFcb %p Name %wZ\n",
pObjectInfo->Fcb,
pFcb,
&DirEntry->NameInformation.FileName);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitFcb Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSInitFcb Acquiring Fcb lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->Resource,
PsGetCurrentThread());
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
TRUE);
try_return( ntStatus = STATUS_REPARSE);
}
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitFcb Initialized Fcb %08lX Name %wZ\n",
+ "AFSInitFcb Initialized Fcb %p Name %wZ\n",
&pObjectInfo->Fcb,
&DirEntry->NameInformation.FileName);
ExDeleteResourceLite( &pNPFcb->Specific.File.DirtyExtentsListLock);
}
+ ExDeleteResourceLite( &pNPFcb->SectionObjectResource);
+
ExDeleteResourceLite( &pNPFcb->PagingResource);
ExDeleteResourceLite( &pNPFcb->CcbListLock);
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- IO_STATUS_BLOCK stIoStatus = {0,0};
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSNonPagedVolumeCB *pNonPagedVcb = NULL;
AFSVolumeCB *pVolumeCB = NULL;
AFSNonPagedObjectInfoCB *pNonPagedObject = NULL;
ULONGLONG ullIndex = 0;
BOOLEAN bReleaseLocks = FALSE;
- AFSVolumeInfoCB stVolumeInformation;
+ AFSVolumeInfoCB stVolumeInformation = {0};
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
LONG lCount;
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitVolume Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount);
+
AFSReleaseResource( pDeviceExt->Specific.RDR.VolumeTree.TreeLock);
AFSReleaseResource( &pDeviceExt->Specific.RDR.VolumeListLock);
// into the volume tree ...
//
- pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( NonPagedPool,
+ pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( PagedPool,
sizeof( AFSVolumeCB),
AFS_VCB_ALLOCATION_TAG);
RtlZeroMemory( pNonPagedObject,
sizeof( AFSNonPagedObjectInfoCB));
+ ExInitializeResourceLite( &pNonPagedObject->ObjectInfoLock);
+
ExInitializeResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
pVolumeCB->NonPagedVcb = pNonPagedVcb;
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitVolume Initializing count (2) on volume %08lX\n",
+ "AFSInitVolume Initializing count (2) on volume %p\n",
pVolumeCB);
pVolumeCB->VolumeReferenceCount = 2;
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitVolume AFS_DIR_ENTRY_TAG allocated %p\n",
+ pVolumeCB->DirectoryCB);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
if( pNonPagedObject != NULL)
{
- ExDeleteResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
+ ExDeleteResourceLite( &pNonPagedObject->ObjectInfoLock);
AFSExFreePoolWithTag( pNonPagedObject, AFS_NP_OBJECT_INFO_TAG);
}
if( pVolumeCB->DirectoryCB != NULL)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitVolume AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pVolumeCB->DirectoryCB);
+
AFSExFreePoolWithTag( pVolumeCB->DirectoryCB, AFS_DIR_ENTRY_TAG);
}
if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
{
+ AFSAcquireExcl( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+
+ AFSReleaseResource( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
}
AFSDeleteObjectInfo( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
AFSExFreePoolWithTag( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveVolume (pioctl) AFS_DIR_ENTRY_TAG deallocating %p\n",
+ VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB);
+
AFSExFreePoolWithTag( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG);
}
if( VolumeCB->ObjectInformation.NonPagedInfo != NULL)
{
+ ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock);
+
ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->DirectoryNodeHdrLock);
AFSExFreePoolWithTag( VolumeCB->ObjectInformation.NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
AFSExFreePoolWithTag( VolumeCB->DirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveVolume AFS_DIR_ENTRY_TAG deallocating %p\n",
+ VolumeCB->DirectoryCB);
+
AFSExFreePoolWithTag( VolumeCB->DirectoryCB, AFS_DIR_ENTRY_TAG);
}
IN AFSVolumeCB *VolumeCB)
{
+ UNREFERENCED_PARAMETER(ProcessID);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSFcb *pFcb = NULL;
AFSNonPagedFcb *pNPFcb = NULL;
- IO_STATUS_BLOCK stIoStatus = {0,0};
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
__Enter
{
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitRootFcb Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSInitRootFcb Acquiring Fcb lock %p EXCL %08lX\n",
&pNPFcb->Resource,
PsGetCurrentThread());
AFSRemoveRootFcb( IN AFSFcb *RootFcb)
{
- AFSDirectoryCB *pCurrentDirEntry = NULL;
- AFSVolumeCB *pVolumeCB = RootFcb->ObjectInformation->VolumeCB;
-
if( RootFcb->NPFcb != NULL)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRemoveFcb Removing Fcb %08lX\n",
+ "AFSRemoveFcb Removing Fcb %p\n",
pFcb);
if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
ExDeleteResourceLite( &pFcb->NPFcb->PagingResource);
+ ExDeleteResourceLite( &pFcb->NPFcb->SectionObjectResource);
+
ExDeleteResourceLite( &pFcb->NPFcb->CcbListLock);
//
}
NTSTATUS
-AFSInitCcb( IN OUT AFSCcb **Ccb)
+AFSInitCcb( IN OUT AFSCcb **Ccb,
+ IN AFSDirectoryCB *DirectoryCB,
+ IN ACCESS_MASK GrantedAccess,
+ IN ULONG FileAccess)
{
NTSTATUS Status = STATUS_SUCCESS;
AFSCcb *pCcb = NULL;
+ LONG lCount;
__Enter
{
ExInitializeResourceLite( &pCcb->NPCcb->CcbLock);
+ pCcb->DirectoryCB = DirectoryCB;
+
+ lCount = InterlockedIncrement( &pCcb->DirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitCcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pCcb->DirectoryCB->NameInformation.FileName,
+ pCcb->DirectoryCB,
+ pCcb,
+ lCount);
+
+ pCcb->GrantedAccess = GrantedAccess;
+
+ pCcb->FileAccess = FileAccess;
+
//
// Return the Ccb
//
//
// Return:
//
-// A status is returned for the function
+// None
//
-NTSTATUS
+void
AFSRemoveCcb( IN AFSFcb *Fcb,
IN AFSCcb *Ccb)
{
- NTSTATUS ntStatus = STATUS_SUCCESS;
+ LONG lCount;
AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
TRUE);
AFSExFreePoolWithTag( Ccb->NotifyMask.Buffer, AFS_GENERIC_MEMORY_7_TAG);
}
+ if ( Ccb->DirectoryCB != NULL)
+ {
+
+ lCount = InterlockedDecrement( &Ccb->DirectoryCB->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveCcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &Ccb->DirectoryCB->NameInformation.FileName,
+ Ccb->DirectoryCB,
+ Ccb,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
AFSReleaseResource( &Ccb->NPCcb->CcbLock);
//
AFSExFreePoolWithTag( Ccb->NPCcb, AFS_CCB_NP_ALLOCATION_TAG);
AFSExFreePoolWithTag( Ccb, AFS_CCB_ALLOCATION_TAG);
-
- return ntStatus;
}
NTSTATUS