2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSCreate.cpp
39 #include "AFSCommon.h"
42 // Function: AFSCreate
46 // This function is the dispatch handler for the IRP_MJ_CREATE requests. It makes the determination to
47 // which interface this request is destined.
51 // A status is returned for the function. The Irp completion processing is handled in the specific
56 AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
59 UNREFERENCED_PARAMETER(LibDeviceObject);
60 NTSTATUS ntStatus = STATUS_SUCCESS;
61 IO_STACK_LOCATION *pIrpSp;
62 FILE_OBJECT *pFileObject = NULL;
67 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
68 pFileObject = pIrpSp->FileObject;
70 if( pFileObject == NULL ||
71 pFileObject->FileName.Buffer == NULL)
74 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
75 AFS_TRACE_LEVEL_VERBOSE,
76 "AFSCreate (%p) Processing control device open request\n",
79 ntStatus = AFSControlDeviceCreate( Irp);
81 try_return( ntStatus);
84 if( AFSRDRDeviceObject == NULL)
87 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
88 AFS_TRACE_LEVEL_VERBOSE,
89 "AFSCreate (%p) Invalid request to open before library is initialized\n",
92 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
95 ntStatus = AFSCommonCreate( AFSRDRDeviceObject,
102 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
107 "EXCEPTION - AFSCreate\n");
109 ntStatus = STATUS_ACCESS_DENIED;
111 AFSDumpTraceFilesFnc();
115 // Complete the request
118 AFSCompleteRequest( Irp,
125 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
129 NTSTATUS ntStatus = STATUS_SUCCESS;
130 UNICODE_STRING uniFileName;
131 ULONG ulCreateDisposition = 0;
133 BOOLEAN bNoIntermediateBuffering = FALSE;
134 FILE_OBJECT *pFileObject = NULL;
135 IO_STACK_LOCATION *pIrpSp;
138 AFSDeviceExt *pDeviceExt = NULL;
139 BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
140 PACCESS_MASK pDesiredAccess = NULL;
141 UNICODE_STRING uniComponentName, uniRootFileName, uniParsedFileName;
142 UNICODE_STRING uniSubstitutedPathName;
143 UNICODE_STRING uniRelativeName;
144 AFSNameArrayHdr *pNameArray = NULL;
145 AFSVolumeCB *pVolumeCB = NULL;
146 AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
147 BOOLEAN bReleaseParentDir = FALSE, bReleaseDir = FALSE;
148 ULONG ulParseFlags = 0;
149 GUID stAuthGroup = {0};
150 ULONG ulNameProcessingFlags = 0;
151 BOOLEAN bOpenedReparsePoint = FALSE;
157 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
158 pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
159 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
160 ulOptions = pIrpSp->Parameters.Create.Options;
161 bNoIntermediateBuffering = BooleanFlagOn( ulOptions, FILE_NO_INTERMEDIATE_BUFFERING);
162 bOpenTargetDirectory = BooleanFlagOn( pIrpSp->Flags, SL_OPEN_TARGET_DIRECTORY);
163 pFileObject = pIrpSp->FileObject;
164 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
166 uniFileName.Length = uniFileName.MaximumLength = 0;
167 uniFileName.Buffer = NULL;
169 uniRootFileName.Length = uniRootFileName.MaximumLength = 0;
170 uniRootFileName.Buffer = NULL;
172 uniParsedFileName.Length = uniParsedFileName.MaximumLength = 0;
173 uniParsedFileName.Buffer = NULL;
175 uniSubstitutedPathName.Buffer = NULL;
176 uniSubstitutedPathName.Length = 0;
178 uniRelativeName.Buffer = NULL;
179 uniRelativeName.Length = 0;
181 if( AFSGlobalRoot == NULL)
183 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
186 RtlZeroMemory( &stAuthGroup,
189 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
190 (ULONGLONG)PsGetCurrentThreadId(),
194 // If we are in shutdown mode then fail the request
197 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
200 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
201 AFS_TRACE_LEVEL_WARNING,
202 "AFSCommonCreate (%p) Open request after shutdown\n",
205 try_return( ntStatus = STATUS_TOO_LATE);
208 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
211 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
213 if( !NT_SUCCESS( ntStatus))
216 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
217 AFS_TRACE_LEVEL_ERROR,
218 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
221 try_return( ntStatus);
226 // Go and parse the name for processing.
227 // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
228 // then we are responsible for releasing the uniRootFileName.Buffer.
231 ntStatus = AFSParseName( Irp,
241 if( !NT_SUCCESS( ntStatus))
244 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
245 uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
246 "AFSCommonCreate (%p) Failed to parse name \"%wZ\" Status %08lX\n",
251 try_return( ntStatus);
255 // Check for STATUS_REPARSE
258 if( ntStatus == STATUS_REPARSE)
262 // Update the information and return
265 Irp->IoStatus.Information = IO_REPARSE;
267 try_return( ntStatus);
270 if ( pParentDirectoryCB != NULL)
273 bReleaseParentDir = TRUE;
277 // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
281 if( pVolumeCB == NULL)
285 // Remove any leading or trailing slashes
288 if( uniFileName.Length >= sizeof( WCHAR) &&
289 uniFileName.Buffer[ (uniFileName.Length/sizeof( WCHAR)) - 1] == L'\\')
292 uniFileName.Length -= sizeof( WCHAR);
295 if( uniFileName.Length >= sizeof( WCHAR) &&
296 uniFileName.Buffer[ 0] == L'\\')
299 uniFileName.Buffer = &uniFileName.Buffer[ 1];
301 uniFileName.Length -= sizeof( WCHAR);
305 // If there is a remaining portion returned for this request then
306 // check if it is for the PIOCtl interface
309 if( uniFileName.Length > 0)
313 // We don't accept any other opens off of the AFS Root
316 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
319 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
322 if( RtlCompareUnicodeString( &AFSPIOCtlName,
328 // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
329 // AFSGlobalRoot->DirectoryCB.
332 ntStatus = AFSOpenIOCtlFcb( Irp,
334 AFSGlobalRoot->DirectoryCB,
338 if( !NT_SUCCESS( ntStatus))
341 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
342 AFS_TRACE_LEVEL_ERROR,
343 "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
347 else if( pParentDirectoryCB != NULL)
350 if( pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
353 ntStatus = AFSOpenSpecialShareFcb( Irp,
359 if( !NT_SUCCESS( ntStatus))
362 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
363 AFS_TRACE_LEVEL_ERROR,
364 "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
370 try_return( ntStatus);
373 ntStatus = AFSOpenAFSRoot( Irp,
377 if( !NT_SUCCESS( ntStatus))
380 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
381 AFS_TRACE_LEVEL_ERROR,
382 "AFSCommonCreate Failed to open root Status %08lX\n",
386 try_return( ntStatus);
390 // We have a reference on the root volume
393 bReleaseVolume = TRUE;
396 // Attempt to locate the node in the name tree if this is not a target
397 // open and the target is not the root
400 uniComponentName.Length = 0;
401 uniComponentName.Buffer = NULL;
403 if( uniFileName.Length > sizeof( WCHAR) ||
404 uniFileName.Buffer[ 0] != L'\\')
407 if( !AFSValidNameFormat( &uniFileName))
410 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
412 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
413 AFS_TRACE_LEVEL_VERBOSE,
414 "AFSCommonCreate (%p) Invalid name %wZ Status %08lX\n",
419 try_return( ntStatus);
423 // Opening a reparse point directly?
426 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
428 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
430 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
431 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
432 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
435 uniSubstitutedPathName = uniRootFileName;
437 ntStatus = AFSLocateNameEntry( &stAuthGroup,
442 ulNameProcessingFlags,
448 if( !NT_SUCCESS( ntStatus) &&
449 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
452 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
454 uniSubstitutedPathName.Buffer = NULL;
458 // AFSLocateNameEntry released the Parent while walking the
462 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
463 AFS_TRACE_LEVEL_VERBOSE,
464 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
470 // We released any root volume locks in the above on failure
473 bReleaseVolume = FALSE;
475 bReleaseParentDir = FALSE;
477 try_return( ntStatus);
481 // Check for STATUS_REPARSE
484 if( ntStatus == STATUS_REPARSE)
487 uniSubstitutedPathName.Buffer = NULL;
490 // Update the information and return
493 Irp->IoStatus.Information = IO_REPARSE;
496 // We released the volume lock above
499 bReleaseVolume = FALSE;
501 bReleaseParentDir = FALSE;
503 try_return( ntStatus);
507 // If we re-allocated the name, then update our substitute name
510 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
513 uniSubstitutedPathName = uniRootFileName;
518 uniSubstitutedPathName.Buffer = NULL;
522 // Check for a symlink access
525 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
526 pParentDirectoryCB != NULL)
530 // pParentDirectoryCB DirOpenReferenceCount is still held
533 UNICODE_STRING uniFinalComponent;
535 uniFinalComponent.Length = 0;
536 uniFinalComponent.MaximumLength = 0;
537 uniFinalComponent.Buffer = NULL;
539 AFSRetrieveFinalComponent( &uniFileName,
542 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
545 if( !NT_SUCCESS( ntStatus) &&
546 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
549 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
550 AFS_TRACE_LEVEL_VERBOSE,
551 "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
556 try_return( ntStatus);
563 // AFSLocateNameEntry succeeded. The parent directory reference
564 // has been released and if there is a directory returned, it is
568 bReleaseParentDir = FALSE;
579 // If we have no parent then this is a root open, be sure there is a directory entry
583 else if( pParentDirectoryCB == NULL &&
584 pDirectoryCB == NULL)
587 pDirectoryCB = pVolumeCB->DirectoryCB;
589 lCount = InterlockedIncrement( &pDirectoryCB->DirOpenReferenceCount);
591 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
592 AFS_TRACE_LEVEL_VERBOSE,
593 "AFSCommonCreate Increment0 count on %wZ DE %p Ccb %p Cnt %d\n",
594 &pDirectoryCB->NameInformation.FileName,
602 if( bOpenTargetDirectory)
606 // If we have a directory cb for the entry then dereference it and reference the parent
609 if( pDirectoryCB != NULL)
612 if ( !bReleaseParentDir)
616 // Perform in this order to prevent thrashing
619 lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
621 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
622 AFS_TRACE_LEVEL_VERBOSE,
623 "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
624 &pParentDirectoryCB->NameInformation.FileName,
629 bReleaseParentDir = TRUE;
633 // Do NOT decrement the reference count on the pDirectoryCB yet.
634 // The BackupEntry below might drop the count to zero leaving
635 // the entry subject to being deleted and we need some of the
636 // contents during later processing
639 AFSBackupEntry( pNameArray);
643 // OK, open the target directory
646 if( uniComponentName.Length == 0)
648 AFSRetrieveFinalComponent( &uniFileName,
652 ntStatus = AFSOpenTargetDirectory( Irp,
660 if( !NT_SUCCESS( ntStatus))
663 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
664 AFS_TRACE_LEVEL_ERROR,
665 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
666 &pParentDirectoryCB->NameInformation.FileName,
670 try_return( ntStatus);
673 if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
676 if( pDirectoryCB == NULL ||
677 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
679 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
680 AFS_TRACE_LEVEL_VERBOSE,
681 "AFSCommonCreate (%p) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
685 pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
689 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
690 AFS_TRACE_LEVEL_VERBOSE,
691 "AFSCommonCreate (%p) Opening as reparse point %wZ Type %08lX\n",
694 pDirectoryCB->ObjectInformation->FileType);
696 bOpenedReparsePoint = TRUE;
701 // Based on the options passed in, process the file accordingly.
704 if( ulCreateDisposition == FILE_CREATE ||
705 ( ( ulCreateDisposition == FILE_OPEN_IF ||
706 ulCreateDisposition == FILE_OVERWRITE_IF) &&
707 pDirectoryCB == NULL))
710 if( uniComponentName.Length == 0 ||
711 pDirectoryCB != NULL)
715 // We traversed the entire path so we found each entry,
716 // fail with collision
719 if( pDirectoryCB != NULL)
722 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
723 AFS_TRACE_LEVEL_VERBOSE,
724 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
725 &pDirectoryCB->NameInformation.FileName,
731 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
732 AFS_TRACE_LEVEL_VERBOSE,
733 "AFSCommonCreate Object name collision on create Status %08lX\n",
737 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
741 // OK, go and create the node
744 ntStatus = AFSProcessCreate( Irp,
754 if( !NT_SUCCESS( ntStatus))
757 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
758 AFS_TRACE_LEVEL_ERROR,
759 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
761 &pParentDirectoryCB->NameInformation.FileName,
765 try_return( ntStatus);
769 // We should not have an extra component except for PIOCtl opens
772 if( uniComponentName.Length > 0)
776 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
779 if( RtlCompareUnicodeString( &AFSPIOCtlName,
785 // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
786 // pParentDirectoryCB.
789 ntStatus = AFSOpenIOCtlFcb( Irp,
795 if( !NT_SUCCESS( ntStatus))
798 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
799 AFS_TRACE_LEVEL_ERROR,
800 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
808 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
809 AFS_TRACE_LEVEL_VERBOSE,
810 "AFSCommonCreate (%p) File %wZ name not found\n",
814 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
817 try_return( ntStatus);
821 // For root opens the parent will be NULL
824 if( pParentDirectoryCB == NULL)
828 // Check for the delete on close flag for the root
831 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
834 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
835 AFS_TRACE_LEVEL_ERROR,
836 "AFSCommonCreate (%p) Attempt to open root as delete on close\n",
839 try_return( ntStatus = STATUS_CANNOT_DELETE);
843 // If this is the target directory, then bail
846 if( bOpenTargetDirectory)
849 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
850 AFS_TRACE_LEVEL_ERROR,
851 "AFSCommonCreate (%p) Attempt to open root as target directory\n",
854 try_return( ntStatus = STATUS_INVALID_PARAMETER);
858 // Go and open the root of the volume
861 ntStatus = AFSOpenRoot( Irp,
867 if( !NT_SUCCESS( ntStatus))
870 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
871 AFS_TRACE_LEVEL_ERROR,
872 "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
873 pVolumeCB->ObjectInformation.FileId.Cell,
874 pVolumeCB->ObjectInformation.FileId.Volume,
878 try_return( ntStatus);
882 // At this point if we have no pDirectoryCB it was not found.
885 if( pDirectoryCB == NULL)
888 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
889 AFS_TRACE_LEVEL_ERROR,
890 "AFSCommonCreate Failing access to %wZ Name not found\n",
893 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
896 if( ulCreateDisposition == FILE_OVERWRITE ||
897 ulCreateDisposition == FILE_SUPERSEDE ||
898 ulCreateDisposition == FILE_OVERWRITE_IF)
902 // Go process a file for overwrite or supersede.
905 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
914 if( !NT_SUCCESS( ntStatus))
917 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
918 AFS_TRACE_LEVEL_ERROR,
919 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
920 &pDirectoryCB->NameInformation.FileName,
924 try_return( ntStatus);
928 // Trying to open the file
931 ntStatus = AFSProcessOpen( Irp,
939 if( !NT_SUCCESS( ntStatus))
942 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
943 AFS_TRACE_LEVEL_ERROR,
944 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
945 &pDirectoryCB->NameInformation.FileName,
951 if( NT_SUCCESS( ntStatus) &&
952 ntStatus != STATUS_REPARSE)
958 AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
961 RtlCopyMemory( &pCcb->AuthGroup,
966 // If we have a substitute name, then use it
969 if( uniSubstitutedPathName.Buffer != NULL)
972 pCcb->FullFileName = uniSubstitutedPathName;
974 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
976 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
981 pCcb->FullFileName = uniRootFileName;
983 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
986 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
988 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
992 if( bOpenedReparsePoint)
994 SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
997 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
998 AFS_TRACE_LEVEL_VERBOSE,
999 "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1000 &pCcb->DirectoryCB->NameInformation.FileName,
1003 lCount = pCcb->DirectoryCB->DirOpenReferenceCount);
1005 ASSERT( lCount >= 0);
1007 pCcb->CurrentDirIndex = 0;
1009 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1012 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1016 // Save off the name array for this instance
1019 pCcb->NameArray = pNameArray;
1023 AFSReleaseResource( &pCcb->NPCcb->CcbLock);
1027 // If we make it here then init the FO for the request.
1030 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1031 AFS_TRACE_LEVEL_VERBOSE_2,
1032 "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n",
1038 pFileObject->FsContext = (void *)pFcb;
1040 pFileObject->FsContext2 = (void *)pCcb;
1045 ASSERT( pFcb->OpenHandleCount > 0);
1047 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1050 // For files perform additional processing
1053 switch( pFcb->Header.NodeTypeCode)
1060 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1065 // If the user did not request nobuffering then mark the FO as cacheable
1068 if( bNoIntermediateBuffering)
1071 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1076 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1080 // If the file was opened for execution then we need to set the bit in the FO
1083 if( BooleanFlagOn( *pDesiredAccess,
1087 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1091 // Update the last access time
1094 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1105 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1106 AFS_TRACE_LEVEL_ERROR,
1107 "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n",
1116 if( NT_SUCCESS( ntStatus) &&
1117 ntStatus == STATUS_REPARSE)
1120 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1121 AFS_TRACE_LEVEL_ERROR,
1122 "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n",
1130 // Free up the sub name if we have one
1133 if( uniSubstitutedPathName.Buffer != NULL)
1136 AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
1138 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1143 // Free up the name array ...
1146 if( pNameArray != NULL)
1149 AFSFreeNameArray( pNameArray);
1152 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1155 AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
1161 lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
1163 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1164 AFS_TRACE_LEVEL_VERBOSE,
1165 "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
1174 // Release the reference from AFSLocateNameEntry
1177 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
1179 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1180 AFS_TRACE_LEVEL_VERBOSE,
1181 "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
1182 &pDirectoryCB->NameInformation.FileName,
1187 ASSERT( lCount >= 0);
1190 if ( bReleaseParentDir)
1194 // Release the reference from AFSLocateNameEntry
1197 lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
1199 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1200 AFS_TRACE_LEVEL_VERBOSE,
1201 "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
1202 &pParentDirectoryCB->NameInformation.FileName,
1207 ASSERT( lCount >= 0);
1211 // Setup the Irp for completion, the Information has been set previously
1214 Irp->IoStatus.Status = ntStatus;
1221 AFSOpenAFSRoot( IN PIRP Irp,
1226 NTSTATUS ntStatus = STATUS_SUCCESS;
1233 // Initialize the Ccb for the file.
1236 ntStatus = AFSInitCcb( Ccb,
1237 AFSGlobalRoot->DirectoryCB,
1241 if( !NT_SUCCESS( ntStatus))
1244 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1245 AFS_TRACE_LEVEL_ERROR,
1246 "AFSOpenAFSRoot (%p) Failed to allocate Ccb\n",
1249 try_return( ntStatus);
1253 // Increment the open count on this Fcb
1256 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1258 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1259 AFS_TRACE_LEVEL_VERBOSE,
1260 "AFSOpenAFSRoot Increment count on Fcb %p Cnt %d\n",
1261 AFSGlobalRoot->RootFcb,
1264 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1266 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1267 AFS_TRACE_LEVEL_VERBOSE,
1268 "AFSOpenAFSRoot Increment handle count on Fcb %p Cnt %d\n",
1269 AFSGlobalRoot->RootFcb,
1272 *Fcb = AFSGlobalRoot->RootFcb;
1275 // Return the open result for this file
1278 Irp->IoStatus.Information = FILE_OPENED;
1289 AFSOpenRoot( IN PIRP Irp,
1290 IN AFSVolumeCB *VolumeCB,
1292 OUT AFSFcb **RootFcb,
1296 NTSTATUS ntStatus = STATUS_SUCCESS;
1297 PFILE_OBJECT pFileObject = NULL;
1298 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1299 PACCESS_MASK pDesiredAccess = NULL;
1300 USHORT usShareAccess;
1302 BOOLEAN bAllocatedCcb = FALSE;
1303 BOOLEAN bReleaseFcb = FALSE;
1304 AFSFileOpenCB stOpenCB;
1305 AFSFileOpenResultCB stOpenResultCB;
1306 ULONG ulResultLen = 0;
1312 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1313 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1314 ulOptions = pIrpSp->Parameters.Create.Options;
1316 pFileObject = pIrpSp->FileObject;
1318 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
1321 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
1323 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1324 AFS_TRACE_LEVEL_ERROR,
1325 "AFSOpenRoot (%p) Attempt to open root as file Status %08lX\n",
1329 try_return( ntStatus);
1333 // Check if we should go and retrieve updated information for the node
1336 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1341 if( !NT_SUCCESS( ntStatus))
1344 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1345 AFS_TRACE_LEVEL_ERROR,
1346 "AFSOpenRoot (%p) Failed to validate root entry Status %08lX\n",
1350 try_return( ntStatus);
1354 // Check with the service that we can open the file
1357 RtlZeroMemory( &stOpenCB,
1358 sizeof( AFSFileOpenCB));
1360 stOpenCB.DesiredAccess = *pDesiredAccess;
1362 stOpenCB.ShareAccess = usShareAccess;
1364 stOpenResultCB.GrantedAccess = 0;
1366 ulResultLen = sizeof( AFSFileOpenResultCB);
1368 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1369 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1372 &VolumeCB->ObjectInformation.FileId,
1374 sizeof( AFSFileOpenCB),
1375 (void *)&stOpenResultCB,
1378 if( !NT_SUCCESS( ntStatus))
1381 UNICODE_STRING uniGUID;
1384 uniGUID.MaximumLength = 0;
1385 uniGUID.Buffer = NULL;
1387 if( AuthGroup != NULL)
1389 RtlStringFromGUID( *AuthGroup,
1393 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1394 AFS_TRACE_LEVEL_ERROR,
1395 "AFSOpenRoot (%p) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
1397 VolumeCB->ObjectInformation.FileId.Cell,
1398 VolumeCB->ObjectInformation.FileId.Volume,
1402 if( AuthGroup != NULL)
1404 RtlFreeUnicodeString( &uniGUID);
1407 try_return( ntStatus);
1411 // If the entry is not initialized then do it now
1414 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1417 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1420 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1423 ntStatus = AFSEnumerateDirectory( AuthGroup,
1424 &VolumeCB->ObjectInformation,
1427 if( !NT_SUCCESS( ntStatus))
1430 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1432 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1433 AFS_TRACE_LEVEL_ERROR,
1434 "AFSOpenRoot (%p) Failed to enumerate directory Status %08lX\n",
1438 try_return( ntStatus);
1441 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1444 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1448 // If the root fcb has been initialized then check access otherwise
1449 // init the volume fcb
1452 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1455 if( !NT_SUCCESS( ntStatus))
1458 try_return( ntStatus);
1461 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1463 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1464 AFS_TRACE_LEVEL_VERBOSE,
1465 "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
1472 // If there are current opens on the Fcb, check the access.
1475 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1478 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1481 &VolumeCB->RootFcb->ShareAccess,
1484 if( !NT_SUCCESS( ntStatus))
1487 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1488 AFS_TRACE_LEVEL_ERROR,
1489 "AFSOpenRoot (%p) Access check failure Status %08lX\n",
1493 try_return( ntStatus);
1498 // Initialize the Ccb for the file.
1501 ntStatus = AFSInitCcb( Ccb,
1502 VolumeCB->DirectoryCB,
1506 if( !NT_SUCCESS( ntStatus))
1509 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1510 AFS_TRACE_LEVEL_ERROR,
1511 "AFSOpenRoot (%p) Failed to allocate Ccb Status %08lX\n",
1515 try_return( ntStatus);
1518 bAllocatedCcb = TRUE;
1521 // OK, update the share access on the fileobject
1524 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1527 IoUpdateShareAccess( pFileObject,
1528 &VolumeCB->RootFcb->ShareAccess);
1537 IoSetShareAccess( *pDesiredAccess,
1540 &VolumeCB->RootFcb->ShareAccess);
1544 // Increment the open count on this Fcb
1547 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1549 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1550 AFS_TRACE_LEVEL_VERBOSE,
1551 "AFSOpenRoot Increment handle count on Fcb %p Cnt %d\n",
1556 // Indicate the object is held
1559 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1562 // Return the open result for this file
1565 Irp->IoStatus.Information = FILE_OPENED;
1567 *RootFcb = VolumeCB->RootFcb;
1573 if ( !NT_SUCCESS( ntStatus))
1576 lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount);
1578 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1579 AFS_TRACE_LEVEL_VERBOSE,
1580 "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n",
1585 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1588 if( !NT_SUCCESS( ntStatus))
1600 Irp->IoStatus.Information = 0;
1608 AFSProcessCreate( IN PIRP Irp,
1610 IN AFSVolumeCB *VolumeCB,
1611 IN AFSDirectoryCB *ParentDirCB,
1612 IN PUNICODE_STRING FileName,
1613 IN PUNICODE_STRING ComponentName,
1614 IN PUNICODE_STRING FullFileName,
1619 NTSTATUS ntStatus = STATUS_SUCCESS;
1620 PFILE_OBJECT pFileObject = NULL;
1621 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1622 ULONG ulOptions = 0;
1623 ULONG ulAttributes = 0;
1624 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1625 PACCESS_MASK pDesiredAccess = NULL;
1626 USHORT usShareAccess;
1627 AFSDirectoryCB *pDirEntry = NULL;
1628 AFSObjectInfoCB *pParentObjectInfo = NULL;
1629 AFSObjectInfoCB *pObjectInfo = NULL;
1635 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1636 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1638 pFileObject = pIrpSp->FileObject;
1641 // Extract out the options
1644 ulOptions = pIrpSp->Parameters.Create.Options;
1647 // We pass all attributes they want to apply to the file to the create
1650 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1653 // If this is a directory create then set the attribute correctly
1656 if( ulOptions & FILE_DIRECTORY_FILE)
1659 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1662 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1663 AFS_TRACE_LEVEL_VERBOSE,
1664 "AFSProcessCreate (%p) Creating file %wZ Attributes %08lX\n",
1669 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1672 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1673 AFS_TRACE_LEVEL_ERROR,
1674 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1677 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
1680 pParentObjectInfo = ParentDirCB->ObjectInformation;
1683 // Allocate and insert the direntry into the parent node
1686 ntStatus = AFSCreateDirEntry( AuthGroup,
1694 if( !NT_SUCCESS( ntStatus))
1697 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1698 AFS_TRACE_LEVEL_ERROR,
1699 "AFSProcessCreate (%p) Failed to create directory entry %wZ Status %08lX\n",
1704 try_return( ntStatus);
1707 bFileCreated = TRUE;
1709 pObjectInfo = pDirEntry->ObjectInformation;
1711 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1712 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1715 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1716 AFS_TRACE_LEVEL_VERBOSE,
1717 "AFSProcessCreate (%p) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1719 &pDirEntry->NameInformation.FileName,
1720 pObjectInfo->FileId.Cell,
1721 pObjectInfo->FileId.Volume,
1722 pObjectInfo->FileId.Vnode,
1723 pObjectInfo->FileId.Unique);
1725 ntStatus = AFSEvaluateNode( AuthGroup,
1728 if( !NT_SUCCESS( ntStatus))
1731 if ( ntStatus == STATUS_NOT_A_DIRECTORY)
1734 if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
1737 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1738 AFS_TRACE_LEVEL_ERROR,
1739 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
1741 &pDirEntry->NameInformation.FileName,
1742 pObjectInfo->FileId.Cell,
1743 pObjectInfo->FileId.Volume,
1744 pObjectInfo->FileId.Vnode,
1745 pObjectInfo->FileId.Unique,
1746 pParentObjectInfo->FileId.Cell,
1747 pParentObjectInfo->FileId.Volume,
1748 pParentObjectInfo->FileId.Vnode,
1749 pParentObjectInfo->FileId.Unique,
1752 else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
1755 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1756 AFS_TRACE_LEVEL_ERROR,
1757 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1759 &pDirEntry->NameInformation.FileName,
1760 pObjectInfo->FileId.Cell,
1761 pObjectInfo->FileId.Volume,
1762 pObjectInfo->FileId.Vnode,
1763 pObjectInfo->FileId.Unique,
1764 pParentObjectInfo->FileId.Cell,
1765 pParentObjectInfo->FileId.Volume,
1766 pParentObjectInfo->FileId.Vnode,
1767 pParentObjectInfo->FileId.Unique,
1773 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1774 AFS_TRACE_LEVEL_ERROR,
1775 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1777 &pDirEntry->NameInformation.FileName,
1778 pObjectInfo->FileId.Cell,
1779 pObjectInfo->FileId.Volume,
1780 pObjectInfo->FileId.Vnode,
1781 pObjectInfo->FileId.Unique,
1782 pParentObjectInfo->FileId.Cell,
1783 pParentObjectInfo->FileId.Volume,
1784 pParentObjectInfo->FileId.Vnode,
1785 pParentObjectInfo->FileId.Unique,
1786 pObjectInfo->ParentFileId.Cell,
1787 pObjectInfo->ParentFileId.Volume,
1788 pObjectInfo->ParentFileId.Vnode,
1789 pObjectInfo->ParentFileId.Unique,
1796 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1797 AFS_TRACE_LEVEL_ERROR,
1798 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1800 &pDirEntry->NameInformation.FileName,
1801 pObjectInfo->FileId.Cell,
1802 pObjectInfo->FileId.Volume,
1803 pObjectInfo->FileId.Vnode,
1804 pObjectInfo->FileId.Unique,
1808 try_return( ntStatus);
1811 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1814 ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
1815 AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
1818 // We may have raced and the Fcb is already created
1822 // Allocate and initialize the Fcb for the file.
1825 ntStatus = AFSInitFcb( pDirEntry);
1827 *Fcb = pObjectInfo->Fcb;
1829 if( !NT_SUCCESS( ntStatus))
1832 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1833 AFS_TRACE_LEVEL_ERROR,
1834 "AFSProcessCreate (%p) Failed to initialize fcb %wZ Status %08lX\n",
1839 try_return( ntStatus);
1842 ntStatus = STATUS_SUCCESS;
1845 // Increment the open count on this Fcb
1848 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1850 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1851 AFS_TRACE_LEVEL_VERBOSE,
1852 "AFSProcessCreate Increment count on Fcb %p Cnt %d\n",
1859 // Initialize the Ccb for the file.
1862 ntStatus = AFSInitCcb( Ccb,
1867 if( !NT_SUCCESS( ntStatus))
1870 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1871 AFS_TRACE_LEVEL_ERROR,
1872 "AFSProcessCreate (%p) Failed to initialize ccb %wZ Status %08lX\n",
1877 try_return( ntStatus);
1880 bAllocatedCcb = TRUE;
1883 // If this is a file, update the headers filesizes.
1886 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1890 // Update the sizes with the information passed in
1893 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1894 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1895 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1898 // Notify the system of the addition
1901 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1903 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1904 (ULONG)FILE_ACTION_ADDED);
1906 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1908 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1912 // This is a new directory node so indicate it has been enumerated
1915 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1918 // And the parent directory entry
1921 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1924 // Notify the system of the addition
1927 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1929 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1930 (ULONG)FILE_ACTION_ADDED);
1932 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
1933 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
1934 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
1935 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
1939 // And the parent directory entry
1942 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1945 // Notify the system of the addition
1948 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1950 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1951 (ULONG)FILE_ACTION_ADDED);
1955 // Save off the access for the open
1958 IoSetShareAccess( *pDesiredAccess,
1961 &(*Fcb)->ShareAccess);
1963 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
1965 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1966 AFS_TRACE_LEVEL_VERBOSE,
1967 "AFSProcessCreate Increment handle count on Fcb %p Cnt %d\n",
1972 // Increment the open reference and handle on the parent node
1975 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
1977 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
1978 AFS_TRACE_LEVEL_VERBOSE,
1979 "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
1983 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
1985 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1986 AFS_TRACE_LEVEL_VERBOSE,
1987 "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
1991 if( ulOptions & FILE_DELETE_ON_CLOSE)
1995 // Mark it for delete on close
1998 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1999 AFS_TRACE_LEVEL_VERBOSE,
2000 "AFSProcessCreate (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2005 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2009 // Indicate the object is locked in the service
2012 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2015 // Return the open result for this file
2018 Irp->IoStatus.Information = FILE_CREATED;
2023 // If we created the Fcb we need to release the resources
2029 if( !NT_SUCCESS( ntStatus))
2032 // Decrement the open count on this Fcb
2035 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
2037 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2038 AFS_TRACE_LEVEL_VERBOSE,
2039 "AFSProcessCreate Decrement count on Fcb %p Cnt %d\n",
2044 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2051 // Decrement the reference added during initialization of the DE
2052 // AFSInitCcb allocates its own reference count.
2055 lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
2057 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2058 AFS_TRACE_LEVEL_VERBOSE,
2059 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2060 &pDirEntry->NameInformation.FileName,
2064 ASSERT( lCount >= 0);
2067 if( !NT_SUCCESS( ntStatus))
2073 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2074 AFS_TRACE_LEVEL_VERBOSE,
2075 "AFSProcessCreate Create failed, removing DE %p from parent object %p Status %08lX\n",
2081 // Remove the dir entry from the parent
2084 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2087 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2089 AFSNotifyDelete( pDirEntry,
2094 // Pull the directory entry from the parent
2097 AFSRemoveDirNodeFromParent( pParentObjectInfo,
2099 FALSE); // Leave it in the enum list so the worker cleans it up
2102 // Tag the parent as needing verification
2105 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
2107 pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
2109 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2120 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2133 AFSOpenTargetDirectory( IN PIRP Irp,
2134 IN AFSVolumeCB *VolumeCB,
2135 IN AFSDirectoryCB *ParentDirectoryCB,
2136 IN AFSDirectoryCB *TargetDirectoryCB,
2137 IN UNICODE_STRING *TargetName,
2141 UNREFERENCED_PARAMETER(VolumeCB);
2142 NTSTATUS ntStatus = STATUS_SUCCESS;
2143 PFILE_OBJECT pFileObject = NULL;
2144 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2145 PACCESS_MASK pDesiredAccess = NULL;
2146 USHORT usShareAccess;
2147 BOOLEAN bAllocatedCcb = FALSE;
2148 BOOLEAN bReleaseFcb = FALSE;
2149 AFSObjectInfoCB *pParentObject = NULL;
2150 AFSObjectInfoCB *pGrandParentObject = NULL;
2151 UNICODE_STRING uniTargetName;
2157 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2158 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2160 pFileObject = pIrpSp->FileObject;
2162 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2163 AFS_TRACE_LEVEL_VERBOSE,
2164 "AFSOpenTargetDirectory (%p) Processing file %wZ\n",
2168 pParentObject = ParentDirectoryCB->ObjectInformation;
2170 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2173 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2177 // Make sure we have an Fcb for the access
2180 // Allocate and initialize the Fcb for the file.
2183 ntStatus = AFSInitFcb( ParentDirectoryCB);
2185 *Fcb = pParentObject->Fcb;
2187 if( !NT_SUCCESS( ntStatus))
2190 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2191 AFS_TRACE_LEVEL_ERROR,
2192 "AFSOpenTargetDirectory (%p) Failed to initialize fcb %wZ Status %08lX\n",
2194 &ParentDirectoryCB->NameInformation.FileName,
2197 try_return( ntStatus);
2200 ntStatus = STATUS_SUCCESS;
2203 // Increment the open count on this Fcb
2206 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2208 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2209 AFS_TRACE_LEVEL_VERBOSE,
2210 "AFSOpenTargetDirectory Increment count on Fcb %p Cnt %d\n",
2217 // If there are current opens on the Fcb, check the access.
2220 if( pParentObject->Fcb->OpenHandleCount > 0)
2223 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2226 &pParentObject->Fcb->ShareAccess,
2229 if( !NT_SUCCESS( ntStatus))
2232 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2233 AFS_TRACE_LEVEL_ERROR,
2234 "AFSOpenTargetDirectory (%p) Access check failure %wZ Status %08lX\n",
2236 &ParentDirectoryCB->NameInformation.FileName,
2239 try_return( ntStatus);
2244 // Initialize the Ccb for the file.
2247 ntStatus = AFSInitCcb( Ccb,
2252 if( !NT_SUCCESS( ntStatus))
2255 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2256 AFS_TRACE_LEVEL_ERROR,
2257 "AFSOpenTargetDirectory (%p) Failed to initialize ccb %wZ Status %08lX\n",
2259 &ParentDirectoryCB->NameInformation.FileName,
2262 try_return( ntStatus);
2265 bAllocatedCcb = TRUE;
2267 if( TargetDirectoryCB != NULL &&
2268 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2274 Irp->IoStatus.Information = FILE_EXISTS;
2276 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2281 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2283 uniTargetName = *TargetName;
2287 // Update the filename in the fileobject for rename processing
2290 RtlCopyMemory( pFileObject->FileName.Buffer,
2291 uniTargetName.Buffer,
2292 uniTargetName.Length);
2294 pFileObject->FileName.Length = uniTargetName.Length;
2297 // OK, update the share access on the fileobject
2300 if( pParentObject->Fcb->OpenHandleCount > 0)
2303 IoUpdateShareAccess( pFileObject,
2304 &pParentObject->Fcb->ShareAccess);
2313 IoSetShareAccess( *pDesiredAccess,
2316 &pParentObject->Fcb->ShareAccess);
2319 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2321 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2322 AFS_TRACE_LEVEL_VERBOSE,
2323 "AFSOpenTargetDirectory Increment handle count on Fcb %p Cnt %d\n",
2328 // Increment the open reference and handle on the parent node
2331 if( BooleanFlagOn( pParentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
2334 pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
2335 &pParentObject->ParentFileId);
2337 if ( pGrandParentObject)
2340 lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
2342 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2343 AFS_TRACE_LEVEL_VERBOSE,
2344 "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
2348 lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
2350 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2351 AFS_TRACE_LEVEL_VERBOSE,
2352 "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
2356 AFSReleaseObjectInfo( &pGrandParentObject);
2365 if( !NT_SUCCESS( ntStatus))
2368 // Decrement the open count on this Fcb
2371 lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
2373 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2374 AFS_TRACE_LEVEL_VERBOSE,
2375 "AFSOpenTargetDirectory Decrement count on Fcb %p Cnt %d\n",
2380 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2383 if( !NT_SUCCESS( ntStatus))
2396 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2407 AFSProcessOpen( IN PIRP Irp,
2409 IN AFSVolumeCB *VolumeCB,
2410 IN AFSDirectoryCB *ParentDirCB,
2411 IN AFSDirectoryCB *DirectoryCB,
2415 UNREFERENCED_PARAMETER(VolumeCB);
2416 NTSTATUS ntStatus = STATUS_SUCCESS;
2417 PFILE_OBJECT pFileObject = NULL;
2418 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2419 PACCESS_MASK pDesiredAccess = NULL;
2420 USHORT usShareAccess;
2421 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
2422 ULONG ulOptions = 0;
2423 AFSFileOpenCB stOpenCB;
2424 AFSFileOpenResultCB stOpenResultCB;
2425 ULONG ulResultLen = 0;
2426 AFSObjectInfoCB *pParentObjectInfo = NULL;
2427 AFSObjectInfoCB *pObjectInfo = NULL;
2428 ULONG ulFileAccess = 0;
2429 AFSFileAccessReleaseCB stReleaseFileAccess;
2435 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2436 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2438 pFileObject = pIrpSp->FileObject;
2440 pParentObjectInfo = ParentDirCB->ObjectInformation;
2442 pObjectInfo = DirectoryCB->ObjectInformation;
2444 ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
2445 AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
2448 // Check if the entry is pending a deletion
2451 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2454 ntStatus = STATUS_DELETE_PENDING;
2456 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2457 AFS_TRACE_LEVEL_ERROR,
2458 "AFSProcessOpen (%p) Entry pending delete %wZ Status %08lX\n",
2460 &DirectoryCB->NameInformation.FileName,
2463 try_return( ntStatus);
2467 // Extract out the options
2470 ulOptions = pIrpSp->Parameters.Create.Options;
2473 // Check if we should go and retrieve updated information for the node
2476 ntStatus = AFSValidateEntry( DirectoryCB,
2481 if( !NT_SUCCESS( ntStatus))
2484 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2485 AFS_TRACE_LEVEL_ERROR,
2486 "AFSProcessOpen (%p) Failed to validate entry %wZ Status %08lX\n",
2488 &DirectoryCB->NameInformation.FileName,
2491 try_return( ntStatus);
2495 // If this is marked for delete on close then be sure we can delete the entry
2498 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2501 ntStatus = AFSNotifyDelete( DirectoryCB,
2505 if( !NT_SUCCESS( ntStatus))
2508 ntStatus = STATUS_CANNOT_DELETE;
2510 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2511 AFS_TRACE_LEVEL_ERROR,
2512 "AFSProcessOpen (%p) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2514 &DirectoryCB->NameInformation.FileName,
2517 try_return( ntStatus);
2522 // Be sure we have an Fcb for the current object
2525 ntStatus = AFSInitFcb( DirectoryCB);
2527 if( !NT_SUCCESS( ntStatus))
2530 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2531 AFS_TRACE_LEVEL_ERROR,
2532 "AFSProcessOpen (%p) Failed to init fcb on %wZ Status %08lX\n",
2534 &DirectoryCB->NameInformation.FileName,
2537 try_return( ntStatus);
2540 ntStatus = STATUS_SUCCESS;
2543 // AFSInitFcb returns the Fcb resource held
2549 // Increment the open count on this Fcb
2552 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2554 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2555 AFS_TRACE_LEVEL_VERBOSE,
2556 "AFSProcessOpen Increment2 count on Fcb %p Cnt %d\n",
2561 // Check access on the entry
2564 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2567 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2570 &pObjectInfo->Fcb->ShareAccess,
2573 if( !NT_SUCCESS( ntStatus))
2576 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2577 AFS_TRACE_LEVEL_ERROR,
2578 "AFSProcessOpen (%p) Failed to check share access on %wZ Status %08lX\n",
2580 &DirectoryCB->NameInformation.FileName,
2583 try_return( ntStatus);
2588 // Additional checks
2591 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2595 // If the caller is asking for write access then try to flush the image section
2598 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2599 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2604 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2605 AFS_TRACE_LEVEL_VERBOSE,
2606 "AFSProcessOpen Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
2607 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2608 PsGetCurrentThread());
2610 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2613 bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2616 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2617 AFS_TRACE_LEVEL_VERBOSE,
2618 "AFSProcessOpen Releasing Fcb SectionObject lock %p EXCL %08lX\n",
2619 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2620 PsGetCurrentThread());
2622 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
2627 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2628 STATUS_SHARING_VIOLATION;
2630 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2631 AFS_TRACE_LEVEL_ERROR,
2632 "AFSProcessOpen (%p) Failed to flush image section %wZ Status %08lX\n",
2634 &DirectoryCB->NameInformation.FileName,
2637 try_return( ntStatus);
2641 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2644 ntStatus = STATUS_NOT_A_DIRECTORY;
2646 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2647 AFS_TRACE_LEVEL_ERROR,
2648 "AFSProcessOpen (%p) Attempt to open file as directory %wZ Status %08lX\n",
2650 &DirectoryCB->NameInformation.FileName,
2653 try_return( ntStatus);
2656 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2658 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2659 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2662 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2665 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2667 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2668 AFS_TRACE_LEVEL_ERROR,
2669 "AFSProcessOpen (%p) Attempt to open directory as file %wZ Status %08lX\n",
2671 &DirectoryCB->NameInformation.FileName,
2674 try_return( ntStatus);
2677 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2678 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2679 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2680 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
2687 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2691 // Check with the service that we can open the file
2694 stOpenCB.ParentId = pParentObjectInfo->FileId;
2696 stOpenCB.DesiredAccess = *pDesiredAccess;
2698 stOpenCB.ShareAccess = usShareAccess;
2700 stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2702 stOpenCB.Identifier = (ULONGLONG)pFileObject;
2704 stOpenResultCB.GrantedAccess = 0;
2706 ulResultLen = sizeof( AFSFileOpenResultCB);
2708 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2709 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2711 &DirectoryCB->NameInformation.FileName,
2712 &pObjectInfo->FileId,
2714 sizeof( AFSFileOpenCB),
2715 (void *)&stOpenResultCB,
2718 if( !NT_SUCCESS( ntStatus))
2721 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2722 AFS_TRACE_LEVEL_ERROR,
2723 "AFSProcessOpen (%p) Failed open in service %wZ Status %08lX\n",
2725 &DirectoryCB->NameInformation.FileName,
2728 try_return( ntStatus);
2732 // Save the granted access in case we need to release it below
2735 ulFileAccess = stOpenResultCB.FileAccess;
2738 // Check if there is a conflict
2741 if( !AFSCheckAccess( *pDesiredAccess,
2742 stOpenResultCB.GrantedAccess,
2743 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2746 ntStatus = STATUS_ACCESS_DENIED;
2748 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2749 AFS_TRACE_LEVEL_ERROR,
2750 "AFSProcessOpen (%p) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2753 stOpenResultCB.GrantedAccess,
2754 &DirectoryCB->NameInformation.FileName,
2757 try_return( ntStatus);
2761 // Initialize the Ccb for the file.
2764 ntStatus = AFSInitCcb( Ccb,
2769 if( !NT_SUCCESS( ntStatus))
2772 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2773 AFS_TRACE_LEVEL_ERROR,
2774 "AFSProcessOpen (%p) Failed to initialize ccb %wZ Status %08lX\n",
2776 &DirectoryCB->NameInformation.FileName,
2779 try_return( ntStatus);
2782 bAllocatedCcb = TRUE;
2785 // Perform the access check on the target if this is a mount point or symlink
2788 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2791 IoUpdateShareAccess( pFileObject,
2792 &pObjectInfo->Fcb->ShareAccess);
2801 IoSetShareAccess( *pDesiredAccess,
2804 &pObjectInfo->Fcb->ShareAccess);
2807 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2809 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2810 AFS_TRACE_LEVEL_VERBOSE,
2811 "AFSProcessOpen Increment handle count on Fcb %p Cnt %d\n",
2816 // Increment the open reference and handle on the parent node
2819 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
2821 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2822 AFS_TRACE_LEVEL_VERBOSE,
2823 "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
2827 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
2829 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2830 AFS_TRACE_LEVEL_VERBOSE,
2831 "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
2835 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2839 // Mark it for delete on close
2842 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2843 AFS_TRACE_LEVEL_VERBOSE,
2844 "AFSProcessOpen (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2847 &DirectoryCB->NameInformation.FileName);
2849 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2853 // Indicate the object is held
2856 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2859 // Return the open result for this file
2862 Irp->IoStatus.Information = FILE_OPENED;
2864 *Fcb = pObjectInfo->Fcb;
2871 if( !NT_SUCCESS( ntStatus))
2874 // Decrement the open count on this Fcb
2877 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2879 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2880 AFS_TRACE_LEVEL_VERBOSE,
2881 "AFSProcessOpen Decrement2 count on Fcb %p Cnt %d\n",
2886 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2889 if( !NT_SUCCESS( ntStatus))
2892 if ( ulFileAccess > 0)
2895 stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2897 stReleaseFileAccess.FileAccess = ulFileAccess;
2899 stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
2901 AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
2902 AFS_REQUEST_FLAG_SYNCHRONOUS,
2904 &DirectoryCB->NameInformation.FileName,
2905 &pObjectInfo->FileId,
2906 (void *)&stReleaseFileAccess,
2907 sizeof( AFSFileAccessReleaseCB),
2922 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2933 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
2935 IN AFSVolumeCB *VolumeCB,
2937 IN AFSDirectoryCB *ParentDirCB,
2938 IN AFSDirectoryCB *DirectoryCB,
2942 UNREFERENCED_PARAMETER(DeviceObject);
2943 NTSTATUS ntStatus = STATUS_SUCCESS;
2944 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2945 PFILE_OBJECT pFileObject = NULL;
2946 LARGE_INTEGER liZero = {0,0};
2947 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
2948 ULONG ulAttributes = 0;
2949 ULONG ulCreateDisposition = 0;
2950 BOOLEAN bAllocatedCcb = FALSE;
2951 BOOLEAN bUserMapped = FALSE;
2952 PACCESS_MASK pDesiredAccess = NULL;
2953 USHORT usShareAccess;
2954 AFSObjectInfoCB *pParentObjectInfo = NULL;
2955 AFSObjectInfoCB *pObjectInfo = NULL;
2957 LARGE_INTEGER liSaveSize;
2958 LARGE_INTEGER liSaveVDL;
2959 LARGE_INTEGER liSaveAlloc;
2964 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2966 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2968 pFileObject = pIrpSp->FileObject;
2970 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
2972 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
2974 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
2977 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2978 AFS_TRACE_LEVEL_ERROR,
2979 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
2981 &DirectoryCB->NameInformation.FileName);
2983 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
2986 pParentObjectInfo = ParentDirCB->ObjectInformation;
2988 pObjectInfo = DirectoryCB->ObjectInformation;
2990 ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
2991 AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
2994 // Check if we should go and retrieve updated information for the node
2997 ntStatus = AFSValidateEntry( DirectoryCB,
3002 if( !NT_SUCCESS( ntStatus))
3005 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3006 AFS_TRACE_LEVEL_ERROR,
3007 "AFSProcessOverwriteSupersede (%p) Failed to validate entry %wZ Status %08lX\n",
3009 &DirectoryCB->NameInformation.FileName,
3012 try_return( ntStatus);
3016 // Be sure we have an Fcb for the object block
3019 ntStatus = AFSInitFcb( DirectoryCB);
3021 *Fcb = pObjectInfo->Fcb;
3023 if( !NT_SUCCESS( ntStatus))
3026 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3027 AFS_TRACE_LEVEL_ERROR,
3028 "AFSProcessOverwriteSupersede (%p) Failed to initialize fcb %wZ Status %08lX\n",
3030 &DirectoryCB->NameInformation.FileName,
3033 try_return( ntStatus);
3036 ntStatus = STATUS_SUCCESS;
3039 // Increment the open count on this Fcb.
3042 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3044 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3045 AFS_TRACE_LEVEL_VERBOSE,
3046 "AFSProcessOverwriteSupersede Increment2 count on Fcb %p Cnt %d\n",
3053 // Check access on the entry
3056 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3059 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3062 &pObjectInfo->Fcb->ShareAccess,
3065 if( !NT_SUCCESS( ntStatus))
3068 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3069 AFS_TRACE_LEVEL_ERROR,
3070 "AFSProcessOverwriteSupersede (%p) Access check failure %wZ Status %08lX\n",
3072 &DirectoryCB->NameInformation.FileName,
3075 try_return( ntStatus);
3079 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3080 AFS_TRACE_LEVEL_VERBOSE,
3081 "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
3082 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3083 PsGetCurrentThread());
3085 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3089 // Before we actually truncate, check to see if the purge
3090 // is going to fail.
3093 bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3096 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3097 AFS_TRACE_LEVEL_VERBOSE,
3098 "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %p EXCL %08lX\n",
3099 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3100 PsGetCurrentThread());
3102 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
3107 ntStatus = STATUS_USER_MAPPED_FILE;
3109 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3110 AFS_TRACE_LEVEL_ERROR,
3111 "AFSProcessOverwriteSupersede (%p) File user mapped %wZ Status %08lX\n",
3113 &DirectoryCB->NameInformation.FileName,
3116 try_return( ntStatus);
3120 // Initialize the Ccb for the file.
3123 ntStatus = AFSInitCcb( Ccb,
3128 if( !NT_SUCCESS( ntStatus))
3131 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3132 AFS_TRACE_LEVEL_ERROR,
3133 "AFSProcessOverwriteSupersede (%p) Failed to initialize ccb %wZ Status %08lX\n",
3135 &DirectoryCB->NameInformation.FileName,
3138 try_return( ntStatus);
3141 bAllocatedCcb = TRUE;
3144 // Set the file length to zero
3147 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3150 bReleasePaging = TRUE;
3152 liSaveSize = pObjectInfo->Fcb->Header.FileSize;
3153 liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
3154 liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
3156 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3157 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3158 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3160 pObjectInfo->EndOfFile.QuadPart = 0;
3161 pObjectInfo->AllocationSize.QuadPart = 0;
3164 // Trim down the extents. We do this BEFORE telling the service
3165 // the file is truncated since there is a potential race between
3166 // a worker thread releasing extents and us trimming
3169 AFSTrimExtents( pObjectInfo->Fcb,
3170 &pObjectInfo->Fcb->Header.FileSize);
3172 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3174 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3176 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3179 // Set the update flag accordingly
3182 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3183 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3184 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3185 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3186 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3188 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3192 if( !NT_SUCCESS( ntStatus))
3195 pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
3196 pObjectInfo->Fcb->Header.FileSize = liSaveSize;
3197 pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
3198 pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
3199 pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
3201 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3202 AFS_TRACE_LEVEL_ERROR,
3203 "AFSProcessOverwriteSupersede (%p) Failed to update file information %wZ Status %08lX\n",
3205 &DirectoryCB->NameInformation.FileName,
3208 try_return( ntStatus);
3211 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3213 if( ulCreateDisposition == FILE_SUPERSEDE)
3216 pObjectInfo->FileAttributes = ulAttributes;
3222 pObjectInfo->FileAttributes |= ulAttributes;
3226 // Save off the access for the open
3229 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3232 IoUpdateShareAccess( pFileObject,
3233 &pObjectInfo->Fcb->ShareAccess);
3242 IoSetShareAccess( *pDesiredAccess,
3245 &pObjectInfo->Fcb->ShareAccess);
3249 // Return the correct action
3252 if( ulCreateDisposition == FILE_SUPERSEDE)
3255 Irp->IoStatus.Information = FILE_SUPERSEDED;
3260 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3263 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3265 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3266 AFS_TRACE_LEVEL_VERBOSE,
3267 "AFSProcessOverwriteSupersede Increment handle count on Fcb %p Cnt %d\n",
3272 // Increment the open reference and handle on the parent node
3275 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3277 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3278 AFS_TRACE_LEVEL_VERBOSE,
3279 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
3283 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3285 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3286 AFS_TRACE_LEVEL_VERBOSE,
3287 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
3291 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3293 bReleaseFcb = FALSE;
3295 *Fcb = pObjectInfo->Fcb;
3298 // Now that the Fcb->Resource has been dropped
3299 // we can call CcSetFileSizes. We are still holding
3300 // the PagingIoResource
3303 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3305 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3307 pFileObject->FsContext2 = (void *)*Ccb;
3309 CcSetFileSizes( pFileObject,
3310 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3317 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3323 if( !NT_SUCCESS( ntStatus))
3326 // Decrement the open count on this Fcb.
3329 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3331 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3332 AFS_TRACE_LEVEL_VERBOSE,
3333 "AFSProcessOverwriteSupersede Decrement2 count on Fcb %p Cnt %d\n",
3338 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3341 if( !NT_SUCCESS( ntStatus))
3354 // Fcb will be freed by AFSPrimaryVolumeWorker thread
3365 AFSControlDeviceCreate( IN PIRP Irp)
3368 NTSTATUS ntStatus = STATUS_SUCCESS;
3373 if ( KernelMode == Irp->RequestorMode) {
3375 // For now, just let the open happen
3377 Irp->IoStatus.Information = FILE_OPENED;
3382 // Not from usermode, All access must be via
3383 // the FS component (which will do the
3386 ntStatus = STATUS_ACCESS_DENIED;
3394 // AFSOpenIOCtlFcb does not release a DirOpenReferenceCount on
3399 AFSOpenIOCtlFcb( IN PIRP Irp,
3401 IN AFSDirectoryCB *ParentDirCB,
3406 NTSTATUS ntStatus = STATUS_SUCCESS;
3407 PFILE_OBJECT pFileObject = NULL;
3408 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3409 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
3410 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3412 AFSObjectInfoCB *pParentObjectInfo = NULL;
3418 pFileObject = pIrpSp->FileObject;
3420 pParentObjectInfo = ParentDirCB->ObjectInformation;
3423 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3426 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3429 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3431 if( !NT_SUCCESS( ntStatus))
3434 try_return( ntStatus);
3439 // Allocate and initialize the Fcb for the file.
3442 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
3444 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3446 if( !NT_SUCCESS( ntStatus))
3449 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3450 AFS_TRACE_LEVEL_ERROR,
3451 "AFSOpenIOCtlFcb (%p) Failed to initialize fcb Status %08lX\n",
3455 try_return( ntStatus);
3458 ntStatus = STATUS_SUCCESS;
3461 // Increment the open reference and handle on the node
3464 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3466 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3467 AFS_TRACE_LEVEL_VERBOSE,
3468 "AFSOpenIOCtlFcb Increment count on Fcb %p Cnt %d\n",
3475 // Initialize the Ccb for the file.
3478 ntStatus = AFSInitCcb( Ccb,
3479 pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
3483 if( !NT_SUCCESS( ntStatus))
3486 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3487 AFS_TRACE_LEVEL_ERROR,
3488 "AFSOpenIOCtlFcb (%p) Failed to initialize ccb Status %08lX\n",
3492 try_return( ntStatus);
3495 bAllocatedCcb = TRUE;
3498 // Set the PIOCtl index
3501 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3503 RtlZeroMemory( &stPIOCtlOpen,
3504 sizeof( AFSPIOCtlOpenCloseRequestCB));
3506 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3508 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3510 RtlZeroMemory( &stFileID,
3511 sizeof( AFSFileID));
3514 // The parent directory FID of the node
3517 stFileID = pParentObjectInfo->FileId;
3520 // Issue the open request to the service
3523 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3524 AFS_REQUEST_FLAG_SYNCHRONOUS,
3528 (void *)&stPIOCtlOpen,
3529 sizeof( AFSPIOCtlOpenCloseRequestCB),
3533 if( !NT_SUCCESS( ntStatus))
3536 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3537 AFS_TRACE_LEVEL_ERROR,
3538 "AFSOpenIOCtlFcb (%p) Failed service open Status %08lX\n",
3542 try_return( ntStatus);
3546 // Increment the handle on the node
3549 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3551 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3552 AFS_TRACE_LEVEL_VERBOSE,
3553 "AFSOpenIOCtlFcb Increment handle count on Fcb %p Cnt %d\n",
3558 // Increment the open reference and handle on the parent node
3561 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3563 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3564 AFS_TRACE_LEVEL_VERBOSE,
3565 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %p Cnt %d\n",
3569 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3571 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3572 AFS_TRACE_LEVEL_VERBOSE,
3573 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %p Cnt %d\n",
3578 // Return the open result for this file
3581 Irp->IoStatus.Information = FILE_OPENED;
3586 // If we created the Fcb we need to release the resources
3592 if( !NT_SUCCESS( ntStatus))
3595 // Decrement the open reference and handle on the node
3598 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
3600 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3601 AFS_TRACE_LEVEL_VERBOSE,
3602 "AFSOpenIOCtlFcb Decrement count on Fcb %p Cnt %d\n",
3607 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3610 if( !NT_SUCCESS( ntStatus))
3623 // Fcb will be freed by AFSPrimaryVolumeWorker thread
3634 AFSOpenSpecialShareFcb( IN PIRP Irp,
3636 IN AFSDirectoryCB *DirectoryCB,
3641 NTSTATUS ntStatus = STATUS_SUCCESS;
3642 PFILE_OBJECT pFileObject = NULL;
3643 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3644 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3645 AFSObjectInfoCB *pObjectInfo = NULL;
3646 AFSObjectInfoCB *pParentObjectInfo = NULL;
3647 AFSPipeOpenCloseRequestCB stPipeOpen;
3653 pFileObject = pIrpSp->FileObject;
3655 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3656 AFS_TRACE_LEVEL_VERBOSE_2,
3657 "AFSOpenSpecialShareFcb (%p) Processing Share %wZ open\n",
3659 &DirectoryCB->NameInformation.FileName);
3661 pObjectInfo = DirectoryCB->ObjectInformation;
3663 if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
3666 pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
3667 &pObjectInfo->ParentFileId);
3670 if( DirectoryCB->ObjectInformation->Fcb == NULL)