VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner) { PAGED_CODE(); FSP_FILE_NODE_GET_FLAGS(); FSP_FILE_NODE_ASSERT_FLAGS_SET(); Owner = (PVOID)((UINT_PTR)Owner | 3); if (Flags & FspFileNodeAcquirePgio) { if (ExIsResourceAcquiredLite(FileNode->Header.PagingIoResource)) ExReleaseResourceLite(FileNode->Header.PagingIoResource); else ExReleaseResourceForThreadLite(FileNode->Header.PagingIoResource, (ERESOURCE_THREAD)Owner); } if (Flags & FspFileNodeAcquireMain) { if (ExIsResourceAcquiredLite(FileNode->Header.Resource)) ExReleaseResourceLite(FileNode->Header.Resource); else ExReleaseResourceForThreadLite(FileNode->Header.Resource, (ERESOURCE_THREAD)Owner); } FSP_FILE_NODE_CLR_FLAGS(); }
NTSTATUS AFSRemoveVolume( IN AFSVolumeCB *VolumeCB) { NTSTATUS ntStatus = STATUS_SUCCESS; AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension; __Enter { // // Remove the volume from the tree and list // Don't process the list information for reserved entries // if( VolumeCB->ObjectInformation.FileId.Cell != 0) { if( BooleanFlagOn( VolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE)) { AFSRemoveHashEntry( &pDeviceExt->Specific.RDR.VolumeTree.TreeHead, &VolumeCB->TreeEntry); } if( VolumeCB->ListEntry.fLink == NULL) { pDeviceExt->Specific.RDR.VolumeListTail = (AFSVolumeCB *)VolumeCB->ListEntry.bLink; if( pDeviceExt->Specific.RDR.VolumeListTail != NULL) { pDeviceExt->Specific.RDR.VolumeListTail->ListEntry.fLink = NULL; } } else { ((AFSVolumeCB *)(VolumeCB->ListEntry.fLink))->ListEntry.bLink = VolumeCB->ListEntry.bLink; } if( VolumeCB->ListEntry.bLink == NULL) { pDeviceExt->Specific.RDR.VolumeListHead = (AFSVolumeCB *)VolumeCB->ListEntry.fLink; if( pDeviceExt->Specific.RDR.VolumeListHead != NULL) { pDeviceExt->Specific.RDR.VolumeListHead->ListEntry.bLink = NULL; } } else { ((AFSVolumeCB *)(VolumeCB->ListEntry.bLink))->ListEntry.fLink = VolumeCB->ListEntry.fLink; } } // // Remove any PIOctl objects we have // if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB != NULL) { if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL) { AFSRemoveFcb( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb); } AFSDeleteObjectInfo( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation); AFSExFreePool( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB); } if( BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE)) { // // Release the fid in the service // AFSReleaseFid( &VolumeCB->ObjectInformation.FileId); } // // Free up the memory // if( VolumeCB->NonPagedVcb != NULL) { if( ExIsResourceAcquiredLite( VolumeCB->VolumeLock)) { AFSReleaseResource( VolumeCB->VolumeLock); } ExDeleteResourceLite( &VolumeCB->NonPagedVcb->VolumeLock); ExDeleteResourceLite( &VolumeCB->NonPagedVcb->ObjectInfoTreeLock); AFSExFreePool( VolumeCB->NonPagedVcb); } if( VolumeCB->ObjectInformation.NonPagedInfo != NULL) { ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->DirectoryNodeHdrLock); AFSExFreePool( VolumeCB->ObjectInformation.NonPagedInfo); } if( VolumeCB->DirectoryCB != NULL) { if( VolumeCB->DirectoryCB->NonPaged != NULL) { ExDeleteResourceLite( &VolumeCB->DirectoryCB->NonPaged->Lock); AFSExFreePool( VolumeCB->DirectoryCB->NonPaged); } AFSExFreePool( VolumeCB->DirectoryCB); } AFSExFreePool( VolumeCB); } return ntStatus; }