/*
* Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
- * notice,
- * this list of conditions and the following disclaimer in the
- * documentation
- * and/or other materials provided with the distribution.
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
* - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
* nor the names of their contributors may be used to endorse or promote
* products derived from this software without specific prior written
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_DIRENTRY);
- 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));
pObjectInfoCB,
lCount));
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
}
}
}
DWORD ntStatus = STATUS_SUCCESS;
ULONGLONG ullIndex;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
{
if ( NT_SUCCESS( ntStatus)) {
- AFSObjectInfoIncrement( pObjectInfo,
- AFS_OBJECT_REFERENCE_FIND);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSFindObjectInfo Decrement count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
}
return pObjectInfo;
void
AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
{
+ LONG lCount;
+
+ lCount = AFSObjectInfoDecrement( *ppObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
- AFSObjectInfoDecrement( *ppObjectInfo,
- AFS_OBJECT_REFERENCE_FIND);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSReleaseObjectInfo Decrement count on object %p Cnt %d\n",
+ *ppObjectInfo,
+ lCount));
*ppObjectInfo = NULL;
}
// embedded in the VolumeCB.
//
- ASSERT( TRUE);
+ ASSERT( FALSE);
return;
}
pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
NULL,
- (PVOID *)ppObjectInfo);
+ *ppObjectInfo);
if ( pObjectInfo == NULL)
{
return;
}
+ ASSERT( *ppObjectInfo == NULL);
+
ASSERT( pObjectInfo->ObjectReferenceCount == 0);
bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+ AFSGlobalDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+ AFSGlobalDotDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+ pDirNode->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);