if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_ERROR,
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n"));
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( AFSGlobalDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ AFSGlobalDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
if( AFSGlobalDotDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ AFSGlobalDotDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
FileName));
}
+ //
+ // This reference count is either stored into the return DirectoryCB
+ // or released before function exit.
+ //
+
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_DIRENTRY);
pObjectInfoCB,
lCount));
- if( bAllocatedObjectCB)
+ if( bAllocatedObjectCB &&
+ lCount == 0)
{
- ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
-
AFSDeleteObjectInfo( &pObjectInfoCB);
}
}
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
- AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pDirNode->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
return ntStatus;
}
-AFSNameArrayHdr *
-AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
- IN ULONG InitialElementCount)
+void
+AFSSetEnumerationEvent( IN AFSFcb *Fcb)
{
-
- AFSNameArrayHdr *pNameArray = NULL;
- AFSNameArrayCB *pCurrentElement = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
LONG lCount;
- __Enter
+ //
+ // Depending on the type of node, set the event
+ //
+
+ switch( Fcb->Header.NodeTypeCode)
{
- if( InitialElementCount == 0)
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
{
- InitialElementCount = pDevExt->Specific.RDR.NameArrayLength;
- }
+ lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
- pNameArray = (AFSNameArrayHdr *)AFSExAllocatePoolWithTag( PagedPool,
- sizeof( AFSNameArrayHdr) +
- (InitialElementCount * sizeof( AFSNameArrayCB)),
- AFS_NAME_ARRAY_TAG);
+ break;
+ }
+ }
- if( pNameArray == NULL)
- {
+ return;
+}
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInitNameArray Failed to allocate name array\n"));
+void
+AFSClearEnumerationEvent( IN AFSFcb *Fcb)
+{
- try_return( pNameArray);
- }
+ LONG lCount;
- RtlZeroMemory( pNameArray,
- sizeof( AFSNameArrayHdr) +
- (InitialElementCount * sizeof( AFSNameArrayCB)));
+ //
+ // Depending on the type of node, set the event
+ //
- pNameArray->MaxElementCount = InitialElementCount;
+ switch( Fcb->Header.NodeTypeCode)
+ {
- if( DirectoryCB != NULL)
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
{
- pCurrentElement = &pNameArray->ElementArray[ 0];
+ ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
+
+ lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
- pNameArray->CurrentEntry = pCurrentElement;
+ break;
+ }
+ }
- pNameArray->Count = 1;
+ return;
+}
- pNameArray->LinkCount = 0;
+BOOLEAN
+AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
+{
- lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
+ BOOLEAN bIsInProcess = FALSE;
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- pNameArray,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount));
+ __Enter
+ {
- pCurrentElement->DirectoryCB = DirectoryCB;
+ if( ObjectInfo->Fcb == NULL)
+ {
- pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
+ try_return( bIsInProcess);
+ }
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
+ switch( ObjectInfo->Fcb->Header.NodeTypeCode)
+ {
- if( pCurrentElement->FileId.Vnode == 1)
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
{
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
+ if( ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0)
+ {
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- pNameArray,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType));
+ bIsInProcess = TRUE;
+ }
+
+ break;
+ }
}
try_exit:
NOTHING;
}
- return pNameArray;
+ return bIsInProcess;
}
NTSTATUS
-AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
- IN UNICODE_STRING *Path,
- IN AFSDirectoryCB *DirectoryCB)
+AFSVerifyVolume( IN ULONGLONG ProcessId,
+ IN AFSVolumeCB *VolumeCB)
{
+ UNREFERENCED_PARAMETER(ProcessId);
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount;
- __Enter
- {
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] passed Path %wZ DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- &Path,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType));
+ return ntStatus;
+}
- //
- // Init some info in the header
- //
+NTSTATUS
+AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
+{
- pCurrentElement = &NameArray->ElementArray[ 0];
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSObjectInfoCB *pObjectInfoCB = NULL;
+ AFSDirectoryCB *pDirNode = NULL;
+ ULONG ulEntryLength = 0;
+ AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+ LONG lCount;
+
+ __Enter
+ {
- NameArray->CurrentEntry = pCurrentElement;
+ pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
+ 0);
- //
- // The first entry points at the root
- //
+ if( pObjectInfoCB == NULL)
+ {
- pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
- lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_PIOCTL);
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
+ "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
+ pObjectInfoCB,
lCount));
- pCurrentElement->Component = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB->NameInformation.FileName;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
+
+ pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
+ ulEntryLength = sizeof( AFSDirectoryCB) + AFSPIOCtlName.Length;
- pCurrentElement->Flags = 0;
+ pDirNode = (AFSDirectoryCB *)AFSExAllocatePoolWithTag( PagedPool,
+ ulEntryLength,
+ AFS_DIR_ENTRY_TAG);
- if( pCurrentElement->FileId.Vnode == 1)
+ if( pDirNode == NULL)
{
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- NameArray->Count = 1;
-
- NameArray->LinkCount = 0;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType));
+ "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
- //
- // If the root is the parent then we are done ...
- //
+ pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
+ sizeof( AFSNonPagedDirectoryCB),
+ AFS_DIR_ENTRY_NP_TAG);
- if( &DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation == DirectoryCB->ObjectInformation)
+ if( pNonPagedDirEntry == NULL)
{
- try_return( ntStatus);
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
- IN AFSNameArrayHdr *RelatedNameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
- LONG lCount;
-
- __Enter
- {
-
- if ( DirectoryCB)
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- RelatedNameArray,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType));
- }
- else
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE NULL\n",
- NameArray,
- RelatedNameArray));
- }
-
- //
- // Init some info in the header
- //
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- pCurrentRelatedElement = &RelatedNameArray->ElementArray[ 0];
-
- NameArray->Count = 0;
-
- NameArray->LinkCount = RelatedNameArray->LinkCount;
-
- //
- // Populate the name array with the data from the related array
- //
-
- while( TRUE)
- {
-
- pCurrentElement->DirectoryCB = pCurrentRelatedElement->DirectoryCB;
-
- pCurrentElement->Component = pCurrentRelatedElement->DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = pCurrentElement->DirectoryCB->ObjectInformation->FileId;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount));
-
- lCount = InterlockedIncrement( &NameArray->Count);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArrayFromRelatedArray [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- lCount - 1,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-
- if( pCurrentElement->DirectoryCB == DirectoryCB ||
- NameArray->Count == RelatedNameArray->Count)
- {
-
- //
- // Done ...
- //
-
- break;
- }
-
- pCurrentElement++;
-
- pCurrentRelatedElement++;
- }
-
- NameArray->CurrentEntry = NameArray->Count > 0 ? pCurrentElement : NULL;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount, lElement;
-
- __Enter
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSFreeNameArray [NA:%p]\n",
- NameArray));
-
- for ( lElement = 0; lElement < NameArray->Count; lElement++)
- {
-
- pCurrentElement = &NameArray->ElementArray[ lElement];
-
- lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount));
-
- ASSERT( lCount >= 0);
- }
-
- AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount;
-
- __Enter
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType));
-
- if( NameArray->Count == (LONG) NameArray->MaxElementCount)
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInsertNextElement [NA:%p] Name has reached Maximum Size\n",
- NameArray));
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- for ( lCount = 0; lCount < NameArray->Count; lCount++)
- {
-
- if ( AFSIsEqualFID( &NameArray->ElementArray[ lCount].FileId,
- &DirectoryCB->ObjectInformation->FileId) )
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSInsertNextElement [NA:%p] DE %p recursion Status %08X\n",
- NameArray,
- DirectoryCB,
- STATUS_ACCESS_DENIED));
-
- try_return( ntStatus = STATUS_ACCESS_DENIED);
- }
- }
-
- if( NameArray->Count > 0)
- {
-
- NameArray->CurrentEntry++;
- }
- else
- {
- NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
- }
-
- pCurrentElement = NameArray->CurrentEntry;
-
- lCount = InterlockedIncrement( &NameArray->Count);
-
- lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- NameArray,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount));
-
- ASSERT( lCount > 0);
-
- pCurrentElement->DirectoryCB = DirectoryCB;
-
- pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- NameArray->Count - 1,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-AFSDirectoryCB *
-AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSDirectoryCB *pDirectoryCB = NULL;
- AFSNameArrayCB *pCurrentElement = NULL;
- BOOLEAN bVolumeRoot = FALSE;
- LONG lCount;
-
- __Enter
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry [NA:%p]\n",
- NameArray));
-
- if( NameArray->Count == 0)
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSBackupEntry [NA:%p] No more entries\n",
- NameArray));
-
- try_return( pCurrentElement);
- }
-
- lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
- NameArray,
- &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
- NameArray->CurrentEntry->DirectoryCB,
- lCount));
-
- ASSERT( lCount >= 0);
-
- NameArray->CurrentEntry->DirectoryCB = NULL;
-
- lCount = InterlockedDecrement( &NameArray->Count);
-
- if( lCount == 0)
- {
- NameArray->CurrentEntry = NULL;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSBackupEntry [NA:%p] No more entries\n",
- NameArray));
- }
- else
- {
-
- bVolumeRoot = BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-
- NameArray->CurrentEntry--;
-
- pCurrentElement = NameArray->CurrentEntry;
-
- pDirectoryCB = pCurrentElement->DirectoryCB;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- NameArray->Count - 1,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType));
-
- //
- // If the entry we are removing is a volume root,
- // we must remove the mount point entry as well.
- // If the NameArray was constructed by checking the
- // share name via the service, the name array can
- // contain two volume roots in sequence without a
- // mount point separating them.
- //
-
- if ( bVolumeRoot &&
- !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
- {
-
- pDirectoryCB = AFSBackupEntry( NameArray);
- }
- }
-
-
-try_exit:
-
- NOTHING;
- }
-
- return pDirectoryCB;
-}
-
-AFSDirectoryCB *
-AFSGetParentEntry( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSDirectoryCB *pDirEntry = NULL;
- AFSNameArrayCB *pElement = NULL;
-
- __Enter
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetParentEntry [NA:%p]\n",
- NameArray));
-
- if( NameArray->Count == 0 ||
- NameArray->Count == 1)
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSGetParentEntry [NA:%p] No more entries\n",
- NameArray));
-
- try_return( pDirEntry = NULL);
- }
-
- pElement = &NameArray->ElementArray[ NameArray->Count - 2];
-
- pDirEntry = pElement->DirectoryCB;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetParentEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- NameArray->Count - 2,
- pElement->DirectoryCB,
- pElement->FileId.Cell,
- pElement->FileId.Volume,
- pElement->FileId.Vnode,
- pElement->FileId.Unique,
- &pElement->DirectoryCB->NameInformation.FileName,
- pElement->DirectoryCB->ObjectInformation->FileType));
-
-try_exit:
-
- NOTHING;
- }
-
- return pDirEntry;
-}
-
-void
-AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- AFSNameArrayCB *pCurrentElement = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
- LONG lCount, lElement;
-
- __Enter
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType));
-
- //
- // Dereference previous name array contents
- //
-
- for ( lElement = 0; lElement < NameArray->Count; lElement++)
- {
-
- pCurrentElement = &NameArray->ElementArray[ lElement];
-
- lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount));
-
- ASSERT( lCount >= 0);
- }
-
- RtlZeroMemory( NameArray,
- sizeof( AFSNameArrayHdr) +
- ((pDevExt->Specific.RDR.NameArrayLength - 1) * sizeof( AFSNameArrayCB)));
-
- NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
-
- if( DirectoryCB != NULL)
- {
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- NameArray->CurrentEntry = pCurrentElement;
-
- NameArray->Count = 1;
-
- NameArray->LinkCount = 0;
-
- lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- NameArray,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount));
-
- pCurrentElement->DirectoryCB = DirectoryCB;
-
- pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- AFSDbgTrace(( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType));
- }
- }
-
- return;
-}
-
-void
-AFSDumpNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSNameArrayCB *pCurrentElement = NULL;
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- AFSPrint("AFSDumpNameArray Start (%d)\n", NameArray->Count);
-
- while( pCurrentElement->DirectoryCB != NULL)
- {
-
- AFSPrint("FID %08lX-%08lX-%08lX-%08lX %wZ\n",
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName);
-
- pCurrentElement++;
- }
-
- AFSPrint("AFSDumpNameArray End\n\n");
-
- return;
-}
-
-void
-AFSSetEnumerationEvent( IN AFSFcb *Fcb)
-{
- LONG lCount;
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
- break;
- }
- }
-
- return;
-}
-
-void
-AFSClearEnumerationEvent( IN AFSFcb *Fcb)
-{
-
- LONG lCount;
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
-
- lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
- break;
- }
- }
-
- return;
-}
-
-BOOLEAN
-AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
-{
-
- BOOLEAN bIsInProcess = FALSE;
-
- __Enter
- {
-
- if( ObjectInfo->Fcb == NULL)
- {
-
- try_return( bIsInProcess);
- }
-
- switch( ObjectInfo->Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- if( ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0)
- {
-
- bIsInProcess = TRUE;
- }
-
- break;
- }
- }
-
-try_exit:
-
- NOTHING;
- }
-
- return bIsInProcess;
-}
-
-NTSTATUS
-AFSVerifyVolume( IN ULONGLONG ProcessId,
- IN AFSVolumeCB *VolumeCB)
-{
-
- UNREFERENCED_PARAMETER(ProcessId);
- UNREFERENCED_PARAMETER(VolumeCB);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSObjectInfoCB *pObjectInfoCB = NULL;
- AFSDirectoryCB *pDirNode = NULL;
- ULONG ulEntryLength = 0;
- AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
- LONG lCount;
-
- __Enter
- {
-
- pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
- 0);
-
- if( pObjectInfoCB == NULL)
- {
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- lCount = AFSObjectInfoIncrement( pObjectInfoCB,
- AFS_OBJECT_REFERENCE_DIRENTRY);
-
- AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
- pObjectInfoCB,
- lCount));
-
- pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
-
- pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
-
- ulEntryLength = sizeof( AFSDirectoryCB) + AFSPIOCtlName.Length;
-
- pDirNode = (AFSDirectoryCB *)AFSExAllocatePoolWithTag( PagedPool,
- ulEntryLength,
- AFS_DIR_ENTRY_TAG);
-
- if( pDirNode == NULL)
- {
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode));
-
- pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
- sizeof( AFSNonPagedDirectoryCB),
- AFS_DIR_ENTRY_NP_TAG);
-
- if( pNonPagedDirEntry == NULL)
- {
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- RtlZeroMemory( pDirNode,
- ulEntryLength);
+ RtlZeroMemory( pDirNode,
+ ulEntryLength);
RtlZeroMemory( pNonPagedDirEntry,
sizeof( AFSNonPagedDirectoryCB));
{
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
- AFS_OBJECT_REFERENCE_DIRENTRY);
+ AFS_OBJECT_REFERENCE_PIOCTL);
AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
pObjectInfoCB,
lCount));
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
}
}
}
AFSObjectInfoCB *pObjectInfo = NULL;
LONG lCount;
+ ullIndex = AFSCreateLowIndex( FileId);
+
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
{
else
{
- AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
- ullIndex = AFSCreateLowIndex( FileId);
-
ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
ullIndex,
(AFSBTreeEntry **)&pObjectInfo);
-
- AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
}
if ( NT_SUCCESS( ntStatus)) {
lCount));
}
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+
return pObjectInfo;
}
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
{
-
BOOLEAN bAcquiredTreeLock = FALSE;
AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSVolumeCB * pVolume = NULL;
BOOLEAN bHeldInService;
AFSObjectInfoCB * pParentObjectInfo = NULL;
AFSFileID FileId;
LONG lCount;
- if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+ __Enter
{
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+ {
- //
- // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
- // embedded in the VolumeCB.
- //
-
- ASSERT( FALSE);
-
- return;
- }
+ //
+ // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+ // embedded in the VolumeCB.
+ //
- pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
- NULL,
- *ppObjectInfo);
+ ASSERT( FALSE);
- if ( pObjectInfo == NULL)
- {
+ return;
+ }
- return;
- }
+ pVolume = (*ppObjectInfo)->VolumeCB;
- ASSERT( *ppObjectInfo == NULL);
+ if( !ExIsResourceAcquiredExclusiveLite( pVolume->ObjectInfoTree.TreeLock))
+ {
- ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+ ASSERT( !ExIsResourceAcquiredLite( pVolume->ObjectInfoTree.TreeLock));
- bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+ AFSAcquireExcl( pVolume->ObjectInfoTree.TreeLock,
+ TRUE);
- if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
- {
+ bAcquiredTreeLock = TRUE;
+ }
- ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+ for ( lCount = 0; lCount < AFS_OBJECT_REFERENCE_MAX; lCount++)
+ {
- AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ ASSERT( (*ppObjectInfo)->ObjectReferences[ lCount] >= 0);
+ }
- bAcquiredTreeLock = TRUE;
- }
+ ASSERT( (*ppObjectInfo)->ObjectReferenceCount == 0);
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
- {
+ pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
+ NULL,
+ *ppObjectInfo);
- pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
- &pObjectInfo->ParentFileId);
- }
+ if ( pObjectInfo == NULL)
+ {
- //
- // Remove it from the tree and list if it was inserted
- //
+ try_return( NOTHING);
+ }
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
- {
+ ASSERT( *ppObjectInfo == NULL);
- AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
- &pObjectInfo->TreeEntry);
- }
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
- {
+ pParentObjectInfo = AFSFindObjectInfo( pVolume,
+ &pObjectInfo->ParentFileId);
+ if( pParentObjectInfo != NULL)
+ {
- if( pObjectInfo->ListEntry.fLink == NULL)
- {
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
- pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+ lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+ AFS_OBJECT_REFERENCE_CHILD);
- if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ lCount));
- pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+ AFSReleaseObjectInfo( &pParentObjectInfo);
}
}
- else
+
+ //
+ // Remove it from the tree and list if it was inserted
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
{
- ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
+ AFSRemoveHashEntry( &pVolume->ObjectInfoTree.TreeHead,
+ &pObjectInfo->TreeEntry);
}
- if( pObjectInfo->ListEntry.bLink == NULL)
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
{
- pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
+ if( pObjectInfo->ListEntry.fLink == NULL)
+ {
+
+ pVolume->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+
+ if( pVolume->ObjectInfoListTail != NULL)
+ {
- if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+ pVolume->ObjectInfoListTail->ListEntry.fLink = NULL;
+ }
+ }
+ else
{
- pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
}
- }
- else
- {
- ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
- }
- }
+ if( pObjectInfo->ListEntry.bLink == NULL)
+ {
- if( pParentObjectInfo != NULL)
- {
+ pVolume->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+ if( pVolume->ObjectInfoListHead != NULL)
+ {
- lCount = AFSObjectInfoDecrement( pParentObjectInfo,
- AFS_OBJECT_REFERENCE_CHILD);
+ pVolume->ObjectInfoListHead->ListEntry.bLink = NULL;
+ }
+ }
+ else
+ {
- AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
- pParentObjectInfo,
- lCount));
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
+ }
+ }
- AFSReleaseObjectInfo( &pParentObjectInfo);
- }
+ bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
- if( bAcquiredTreeLock)
- {
+ if( bHeldInService)
+ {
- AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
- }
+ FileId = pObjectInfo->FileId;
+ }
- if( bHeldInService)
- {
+ ASSERT( pObjectInfo->ObjectReferenceCount == 0);
- FileId = pObjectInfo->FileId;
- }
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
- ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+ AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+try_exit:
- //
- // Release the fid in the service
- //
+ if( bAcquiredTreeLock)
+ {
- if( bHeldInService)
- {
+ AFSReleaseResource( pVolume->ObjectInfoTree.TreeLock);
+ }
+
+ //
+ // Release the fid in the service
+ //
+
+ if( bHeldInService)
+ {
- AFSReleaseFid( &FileId);
+ AFSReleaseFid( &FileId);
+ }
}
return;
AFSGlobalDotDirEntry->ObjectInformation,
lCount));
- AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
AFSGlobalDotDotDirEntry->ObjectInformation,
lCount));
- AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
pDirNode->ObjectInformation,
lCount));
- AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);