//
// 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};
- BOOLEAN bUninitFileLock = FALSE;
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->Header.NodeTypeCode = AFS_DIRECTORY_FCB;
-
- //
- // Initialize enumeration information
- //
-
- KeInitializeEvent( &pFcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
- NotificationEvent,
- FALSE);
}
else if( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
{
NULL,
NULL);
- bUninitFileLock = TRUE;
-
//
// Initialize the header file sizes to our dir entry information
//
pFcb->Header.NodeTypeCode = AFS_INVALID_FCB;
}
+ pFcb->ObjectInformation = pObjectInfo;
+
+ AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
//
- // Initialize some fields in the Fcb
+ // Swap the allocated FCB into the ObjectInformation structure if it
+ // does not already have one.
//
if ( InterlockedCompareExchangePointer( (PVOID *)&pObjectInfo->Fcb, pFcb, NULL) != NULL)
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);
}
- pFcb->ObjectInformation = pObjectInfo;
+ 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);
if( pFcb != NULL)
{
- if( bUninitFileLock)
- {
-
- FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
- }
-
if( pNPFcb != NULL)
{
AFSReleaseResource( &pNPFcb->Resource);
+ FsRtlTeardownPerStreamContexts( &pFcb->Header);
+
+ if ( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
+ {
+
+ FsRtlUninitializeFileLock( &pFcb->Specific.File.FileLock);
+
+ ExDeleteResourceLite( &pNPFcb->Specific.File.ExtentsResource);
+
+ ExDeleteResourceLite( &pNPFcb->Specific.File.DirtyExtentsListLock);
+ }
+
+ ExDeleteResourceLite( &pNPFcb->SectionObjectResource);
+
ExDeleteResourceLite( &pNPFcb->PagingResource);
ExDeleteResourceLite( &pNPFcb->CcbListLock);
ExDeleteResourceLite( &pNPFcb->Resource);
- }
- AFSExFreePool( pFcb);
- }
-
- if( pNPFcb != NULL)
- {
+ AFSExFreePoolWithTag( pNPFcb, AFS_FCB_NP_ALLOCATION_TAG);
+ }
- AFSExFreePool( pNPFcb);
+ AFSExFreePoolWithTag( pFcb, AFS_FCB_ALLOCATION_TAG);
}
}
}
{
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);
AFSAcquireExcl( pVolumeCB->VolumeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
*VolumeCB = pVolumeCB;
try_return( ntStatus);
// into the volume tree ...
//
- pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( NonPagedPool,
+ pVolumeCB = (AFSVolumeCB *)AFSExAllocatePoolWithTag( PagedPool,
sizeof( AFSVolumeCB),
AFS_VCB_ALLOCATION_TAG);
pNonPagedVcb = (AFSNonPagedVolumeCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedVolumeCB),
- AFS_VCB_ALLOCATION_TAG);
+ AFS_VCB_NP_ALLOCATION_TAG);
if( pNonPagedVcb == NULL)
{
pNonPagedObject = (AFSNonPagedObjectInfoCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedObjectInfoCB),
- AFS_VCB_ALLOCATION_TAG);
+ AFS_NP_OBJECT_INFO_TAG);
if( pNonPagedObject == NULL)
{
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 (1) on volume %08lX\n",
+ "AFSInitVolume Initializing count (2) on volume %p\n",
pVolumeCB);
- pVolumeCB->VolumeReferenceCount = 1;
+ pVolumeCB->VolumeReferenceCount = 2;
AFSAcquireExcl( pVolumeCB->VolumeLock,
TRUE);
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);
ExDeleteResourceLite( &pNonPagedVcb->ObjectInfoTreeLock);
- AFSExFreePool( pNonPagedVcb);
+ AFSExFreePoolWithTag( pNonPagedVcb, AFS_VCB_NP_ALLOCATION_TAG);
}
if( pNonPagedObject != NULL)
{
- ExDeleteResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
+ ExDeleteResourceLite( &pNonPagedObject->ObjectInfoLock);
- AFSExFreePool( pNonPagedObject);
+ AFSExFreePoolWithTag( pNonPagedObject, AFS_NP_OBJECT_INFO_TAG);
}
if( pVolumeCB != NULL)
if( pVolumeCB->DirectoryCB != NULL)
{
- AFSExFreePool( pVolumeCB->DirectoryCB);
+ 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);
}
- AFSExFreePool( pVolumeCB);
+ AFSExFreePoolWithTag( pVolumeCB, AFS_VCB_ALLOCATION_TAG);
}
if( pNonPagedDirEntry != NULL)
ExDeleteResourceLite( &pNonPagedDirEntry->Lock);
- AFSExFreePool( pNonPagedDirEntry);
+ AFSExFreePoolWithTag( pNonPagedDirEntry, AFS_DIR_ENTRY_NP_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);
- AFSExFreePool( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB);
+ ExDeleteResourceLite( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->NonPaged->Lock);
+
+ 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( BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE))
ExDeleteResourceLite( &VolumeCB->NonPagedVcb->ObjectInfoTreeLock);
- AFSExFreePool( VolumeCB->NonPagedVcb);
+ AFSExFreePoolWithTag( VolumeCB->NonPagedVcb, AFS_VCB_NP_ALLOCATION_TAG);
}
if( VolumeCB->ObjectInformation.NonPagedInfo != NULL)
{
+ ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock);
+
ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->DirectoryNodeHdrLock);
- AFSExFreePool( VolumeCB->ObjectInformation.NonPagedInfo);
+ AFSExFreePoolWithTag( VolumeCB->ObjectInformation.NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
}
if( VolumeCB->DirectoryCB != NULL)
ExDeleteResourceLite( &VolumeCB->DirectoryCB->NonPaged->Lock);
- AFSExFreePool( VolumeCB->DirectoryCB->NonPaged);
+ AFSExFreePoolWithTag( VolumeCB->DirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
}
- AFSExFreePool( VolumeCB->DirectoryCB);
+ 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);
}
- AFSExFreePool( VolumeCB);
+ AFSExFreePoolWithTag( VolumeCB, AFS_VCB_ALLOCATION_TAG);
}
return ntStatus;
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());
pFcb->NPFcb = pNPFcb;
//
- // Initialize enumeration information
- //
-
- KeInitializeEvent( &pFcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
- NotificationEvent,
- FALSE);
-
- //
// Save the root Fcb in the VolumeCB
//
AFSRemoveRootFcb( IN AFSFcb *RootFcb)
{
- AFSDirectoryCB *pCurrentDirEntry = NULL;
- AFSVolumeCB *pVolumeCB = RootFcb->ObjectInformation->VolumeCB;
-
if( RootFcb->NPFcb != NULL)
{
// The non paged region
//
- AFSExFreePool( RootFcb->NPFcb);
+ AFSExFreePoolWithTag( RootFcb->NPFcb, AFS_FCB_NP_ALLOCATION_TAG);
}
//
// And the Fcb itself
//
- AFSExFreePool( RootFcb);
+ AFSExFreePoolWithTag( RootFcb, AFS_FCB_ALLOCATION_TAG);
return;
}
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);
//
// The non paged region
//
- AFSExFreePool( pFcb->NPFcb);
+ AFSExFreePoolWithTag( pFcb->NPFcb, AFS_FCB_NP_ALLOCATION_TAG);
//
// And the Fcb itself, which includes the name
//
- AFSExFreePool( pFcb);
+ AFSExFreePoolWithTag( pFcb, AFS_FCB_ALLOCATION_TAG);
return;
}
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
{
sizeof( AFSCcb));
pCcb->Size = sizeof( AFSCcb);
+
pCcb->Type = AFS_CCB;
+ pCcb->NPCcb = (AFSNonPagedCcb *)AFSExAllocatePoolWithTag( NonPagedPool,
+ sizeof( AFSNonPagedCcb),
+ AFS_CCB_NP_ALLOCATION_TAG);
+
+ if( pCcb->NPCcb == NULL)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSInitCcb Failed to allocate NPCcb\n");
+
+ try_return( Status = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ 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
//
if( pCcb != NULL)
{
- AFSExFreePool( pCcb);
+ if ( pCcb->NPCcb != NULL)
+ {
+
+ AFSExFreePoolWithTag( pCcb->NPCcb, AFS_CCB_NP_ALLOCATION_TAG);
+ }
+
+ AFSExFreePoolWithTag( pCcb, AFS_CCB_ALLOCATION_TAG);
}
*Ccb = NULL;
//
// 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);
if( Fcb != NULL &&
BooleanFlagOn( Ccb->Flags, CCB_FLAG_INSERTED_CCB_LIST))
if( Ccb->MaskName.Buffer != NULL)
{
- AFSExFreePool( Ccb->MaskName.Buffer);
+ AFSExFreePoolWithTag( Ccb->MaskName.Buffer, AFS_GENERIC_MEMORY_6_TAG);
}
if( BooleanFlagOn( Ccb->Flags, CCB_FLAG_FREE_FULL_PATHNAME))
{
- AFSExFreePool( Ccb->FullFileName.Buffer);
+ AFSExFreePoolWithTag( Ccb->FullFileName.Buffer, 0);
}
//
if( Ccb->DirectorySnapshot != NULL)
{
- AFSExFreePool( Ccb->DirectorySnapshot);
+ AFSExFreePoolWithTag( Ccb->DirectorySnapshot, AFS_DIR_SNAPSHOT_TAG);
Ccb->DirectorySnapshot = NULL;
}
if( Ccb->NotifyMask.Buffer != NULL)
{
- AFSExFreePool( Ccb->NotifyMask.Buffer);
+ 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);
+
//
// Free up the Ccb
//
- AFSExFreePool( Ccb);
+ ExDeleteResourceLite( &Ccb->NPCcb->CcbLock);
- return ntStatus;
+ AFSExFreePoolWithTag( Ccb->NPCcb, AFS_CCB_NP_ALLOCATION_TAG);
+
+ AFSExFreePoolWithTag( Ccb, AFS_CCB_ALLOCATION_TAG);
}
NTSTATUS
AFSAcquireExcl( &Fcb->NPFcb->CcbListLock,
TRUE);
+ AFSAcquireExcl( &Ccb->NPCcb->CcbLock,
+ TRUE);
+
if( Fcb->CcbListHead == NULL)
{
Fcb->CcbListHead = Ccb;
SetFlag( Ccb->Flags, CCB_FLAG_INSERTED_CCB_LIST);
+ AFSReleaseResource( &Ccb->NPCcb->CcbLock);
+
AFSReleaseResource( &Fcb->NPFcb->CcbListLock);
return ntStatus;