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 LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
147 AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
148 BOOLEAN bReleaseParentDir = FALSE, bReleaseDir = FALSE;
149 ULONG ulParseFlags = 0;
150 GUID stAuthGroup = {0};
151 ULONG ulNameProcessingFlags = 0;
152 BOOLEAN bOpenedReparsePoint = FALSE;
158 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
159 pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
160 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
161 ulOptions = pIrpSp->Parameters.Create.Options;
162 bNoIntermediateBuffering = BooleanFlagOn( ulOptions, FILE_NO_INTERMEDIATE_BUFFERING);
163 bOpenTargetDirectory = BooleanFlagOn( pIrpSp->Flags, SL_OPEN_TARGET_DIRECTORY);
164 pFileObject = pIrpSp->FileObject;
165 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
167 uniFileName.Length = uniFileName.MaximumLength = 0;
168 uniFileName.Buffer = NULL;
170 uniRootFileName.Length = uniRootFileName.MaximumLength = 0;
171 uniRootFileName.Buffer = NULL;
173 uniParsedFileName.Length = uniParsedFileName.MaximumLength = 0;
174 uniParsedFileName.Buffer = NULL;
176 uniSubstitutedPathName.Buffer = NULL;
177 uniSubstitutedPathName.Length = 0;
179 uniRelativeName.Buffer = NULL;
180 uniRelativeName.Length = 0;
182 if( AFSGlobalRoot == NULL)
184 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
187 RtlZeroMemory( &stAuthGroup,
190 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
191 (ULONGLONG)PsGetCurrentThreadId(),
195 // If we are in shutdown mode then fail the request
198 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
201 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
202 AFS_TRACE_LEVEL_WARNING,
203 "AFSCommonCreate (%p) Open request after shutdown\n",
206 try_return( ntStatus = STATUS_TOO_LATE);
209 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
212 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
214 if( !NT_SUCCESS( ntStatus))
217 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
218 AFS_TRACE_LEVEL_ERROR,
219 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
222 try_return( ntStatus);
227 // Go and parse the name for processing.
228 // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
229 // then we are responsible for releasing the uniRootFileName.Buffer.
232 ntStatus = AFSParseName( Irp,
242 if( !NT_SUCCESS( ntStatus))
245 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
246 uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
247 "AFSCommonCreate (%p) Failed to parse name \"%wZ\" Status %08lX\n",
252 try_return( ntStatus);
256 // Check for STATUS_REPARSE
259 if( ntStatus == STATUS_REPARSE)
263 // Update the information and return
266 Irp->IoStatus.Information = IO_REPARSE;
268 try_return( ntStatus);
271 if ( pParentDirectoryCB != NULL)
274 bReleaseParentDir = TRUE;
278 // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
282 if( pVolumeCB == NULL)
286 // Remove any leading or trailing slashes
289 if( uniFileName.Length >= sizeof( WCHAR) &&
290 uniFileName.Buffer[ (uniFileName.Length/sizeof( WCHAR)) - 1] == L'\\')
293 uniFileName.Length -= sizeof( WCHAR);
296 if( uniFileName.Length >= sizeof( WCHAR) &&
297 uniFileName.Buffer[ 0] == L'\\')
300 uniFileName.Buffer = &uniFileName.Buffer[ 1];
302 uniFileName.Length -= sizeof( WCHAR);
306 // If there is a remaining portion returned for this request then
307 // check if it is for the PIOCtl interface
310 if( uniFileName.Length > 0)
314 // We don't accept any other opens off of the AFS Root
317 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
320 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
323 if( RtlCompareUnicodeString( &AFSPIOCtlName,
329 // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
330 // AFSGlobalRoot->DirectoryCB.
333 ntStatus = AFSOpenIOCtlFcb( Irp,
335 AFSGlobalRoot->DirectoryCB,
339 if( !NT_SUCCESS( ntStatus))
342 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
343 AFS_TRACE_LEVEL_ERROR,
344 "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
348 else if( pParentDirectoryCB != NULL)
351 if( pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
354 ntStatus = AFSOpenSpecialShareFcb( Irp,
360 if( !NT_SUCCESS( ntStatus))
363 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
364 AFS_TRACE_LEVEL_ERROR,
365 "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
371 try_return( ntStatus);
374 ntStatus = AFSOpenAFSRoot( Irp,
378 if( !NT_SUCCESS( ntStatus))
381 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
382 AFS_TRACE_LEVEL_ERROR,
383 "AFSCommonCreate Failed to open root Status %08lX\n",
387 try_return( ntStatus);
391 // We have a reference on the root volume
394 VolumeReferenceReason = AFS_VOLUME_REFERENCE_PARSE_NAME;
396 bReleaseVolume = TRUE;
399 // Attempt to locate the node in the name tree if this is not a target
400 // open and the target is not the root
403 uniComponentName.Length = 0;
404 uniComponentName.Buffer = NULL;
406 if( uniFileName.Length > sizeof( WCHAR) ||
407 uniFileName.Buffer[ 0] != L'\\')
410 if( !AFSValidNameFormat( &uniFileName))
413 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
415 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
416 AFS_TRACE_LEVEL_VERBOSE,
417 "AFSCommonCreate (%p) Invalid name %wZ Status %08lX\n",
422 try_return( ntStatus);
426 // Opening a reparse point directly?
429 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
431 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
433 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
434 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
435 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
438 uniSubstitutedPathName = uniRootFileName;
440 ntStatus = AFSLocateNameEntry( &stAuthGroup,
445 ulNameProcessingFlags,
447 &VolumeReferenceReason,
452 if( !NT_SUCCESS( ntStatus) &&
453 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
456 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
458 uniSubstitutedPathName.Buffer = NULL;
462 // AFSLocateNameEntry released the Parent while walking the
466 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
467 AFS_TRACE_LEVEL_VERBOSE,
468 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
474 // We released any root volume locks in AFSLocateNameEntry on failure
475 // other than STATUS_OBJECT_NAME_NOT_FOUND
478 bReleaseVolume = FALSE;
480 bReleaseParentDir = FALSE;
482 VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
484 try_return( ntStatus);
488 // Check for STATUS_REPARSE
491 if( ntStatus == STATUS_REPARSE)
494 uniSubstitutedPathName.Buffer = NULL;
497 // Update the information and return
500 Irp->IoStatus.Information = IO_REPARSE;
503 // We released the volume lock above
506 bReleaseVolume = FALSE;
508 bReleaseParentDir = FALSE;
510 try_return( ntStatus);
514 // If we re-allocated the name, then update our substitute name
517 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
520 uniSubstitutedPathName = uniRootFileName;
525 uniSubstitutedPathName.Buffer = NULL;
529 // Check for a symlink access
532 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
533 pParentDirectoryCB != NULL)
537 // pParentDirectoryCB DirOpenReferenceCount is still held
540 UNICODE_STRING uniFinalComponent;
542 uniFinalComponent.Length = 0;
543 uniFinalComponent.MaximumLength = 0;
544 uniFinalComponent.Buffer = NULL;
546 AFSRetrieveFinalComponent( &uniFileName,
549 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
552 if( !NT_SUCCESS( ntStatus) &&
553 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
556 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
557 AFS_TRACE_LEVEL_VERBOSE,
558 "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
563 try_return( ntStatus);
570 // AFSLocateNameEntry succeeded. The parent directory reference
571 // has been released and if there is a directory returned, it is
575 bReleaseParentDir = FALSE;
586 // If we have no parent then this is a root open, be sure there is a directory entry
590 else if( pParentDirectoryCB == NULL &&
591 pDirectoryCB == NULL)
594 pDirectoryCB = pVolumeCB->DirectoryCB;
596 lCount = InterlockedIncrement( &pDirectoryCB->DirOpenReferenceCount);
598 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
599 AFS_TRACE_LEVEL_VERBOSE,
600 "AFSCommonCreate Increment0 count on %wZ DE %p Ccb %p Cnt %d\n",
601 &pDirectoryCB->NameInformation.FileName,
609 if( bOpenTargetDirectory)
613 // If we have a directory cb for the entry then dereference it and reference the parent
616 if( pDirectoryCB != NULL)
619 if ( !bReleaseParentDir)
623 // Perform in this order to prevent thrashing
626 lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
628 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
629 AFS_TRACE_LEVEL_VERBOSE,
630 "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
631 &pParentDirectoryCB->NameInformation.FileName,
636 bReleaseParentDir = TRUE;
640 // Do NOT decrement the reference count on the pDirectoryCB yet.
641 // The BackupEntry below might drop the count to zero leaving
642 // the entry subject to being deleted and we need some of the
643 // contents during later processing
646 AFSBackupEntry( pNameArray);
650 // OK, open the target directory
653 if( uniComponentName.Length == 0)
655 AFSRetrieveFinalComponent( &uniFileName,
659 ntStatus = AFSOpenTargetDirectory( Irp,
667 if( !NT_SUCCESS( ntStatus))
670 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
671 AFS_TRACE_LEVEL_ERROR,
672 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
673 &pParentDirectoryCB->NameInformation.FileName,
677 try_return( ntStatus);
680 if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
683 if( pDirectoryCB == NULL ||
684 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
686 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
687 AFS_TRACE_LEVEL_VERBOSE,
688 "AFSCommonCreate (%p) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
692 pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
696 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
697 AFS_TRACE_LEVEL_VERBOSE,
698 "AFSCommonCreate (%p) Opening as reparse point %wZ Type %08lX\n",
701 pDirectoryCB->ObjectInformation->FileType);
703 bOpenedReparsePoint = TRUE;
708 // Based on the options passed in, process the file accordingly.
711 if( ulCreateDisposition == FILE_CREATE ||
712 ( ( ulCreateDisposition == FILE_OPEN_IF ||
713 ulCreateDisposition == FILE_OVERWRITE_IF) &&
714 pDirectoryCB == NULL))
717 if( uniComponentName.Length == 0 ||
718 pDirectoryCB != NULL)
722 // We traversed the entire path so we found each entry,
723 // fail with collision
726 if( pDirectoryCB != NULL)
729 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
730 AFS_TRACE_LEVEL_VERBOSE,
731 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
732 &pDirectoryCB->NameInformation.FileName,
738 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
739 AFS_TRACE_LEVEL_VERBOSE,
740 "AFSCommonCreate Object name collision on create Status %08lX\n",
744 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
748 // OK, go and create the node
751 ntStatus = AFSProcessCreate( Irp,
761 if( !NT_SUCCESS( ntStatus))
764 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
765 AFS_TRACE_LEVEL_ERROR,
766 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
768 &pParentDirectoryCB->NameInformation.FileName,
772 try_return( ntStatus);
776 // We should not have an extra component except for PIOCtl opens
779 if( uniComponentName.Length > 0)
783 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
786 if( RtlCompareUnicodeString( &AFSPIOCtlName,
792 // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
793 // pParentDirectoryCB.
796 ntStatus = AFSOpenIOCtlFcb( Irp,
802 if( !NT_SUCCESS( ntStatus))
805 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
806 AFS_TRACE_LEVEL_ERROR,
807 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
815 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
816 AFS_TRACE_LEVEL_VERBOSE,
817 "AFSCommonCreate (%p) File %wZ name not found\n",
821 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
824 try_return( ntStatus);
828 // For root opens the parent will be NULL
831 if( pParentDirectoryCB == NULL)
835 // Check for the delete on close flag for the root
838 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
841 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
842 AFS_TRACE_LEVEL_ERROR,
843 "AFSCommonCreate (%p) Attempt to open root as delete on close\n",
846 try_return( ntStatus = STATUS_CANNOT_DELETE);
850 // If this is the target directory, then bail
853 if( bOpenTargetDirectory)
856 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
857 AFS_TRACE_LEVEL_ERROR,
858 "AFSCommonCreate (%p) Attempt to open root as target directory\n",
861 try_return( ntStatus = STATUS_INVALID_PARAMETER);
865 // Go and open the root of the volume
868 ntStatus = AFSOpenRoot( Irp,
874 if( !NT_SUCCESS( ntStatus))
877 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
878 AFS_TRACE_LEVEL_ERROR,
879 "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
880 pVolumeCB->ObjectInformation.FileId.Cell,
881 pVolumeCB->ObjectInformation.FileId.Volume,
885 try_return( ntStatus);
889 // At this point if we have no pDirectoryCB it was not found.
892 if( pDirectoryCB == NULL)
895 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
896 AFS_TRACE_LEVEL_ERROR,
897 "AFSCommonCreate Failing access to %wZ Name not found\n",
900 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
903 if( ulCreateDisposition == FILE_OVERWRITE ||
904 ulCreateDisposition == FILE_SUPERSEDE ||
905 ulCreateDisposition == FILE_OVERWRITE_IF)
909 // Go process a file for overwrite or supersede.
912 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
921 if( !NT_SUCCESS( ntStatus))
924 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
925 AFS_TRACE_LEVEL_ERROR,
926 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
927 &pDirectoryCB->NameInformation.FileName,
931 try_return( ntStatus);
935 // Trying to open the file
938 ntStatus = AFSProcessOpen( Irp,
946 if( !NT_SUCCESS( ntStatus))
949 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
950 AFS_TRACE_LEVEL_ERROR,
951 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
952 &pDirectoryCB->NameInformation.FileName,
958 if( NT_SUCCESS( ntStatus) &&
959 ntStatus != STATUS_REPARSE)
965 AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
968 RtlCopyMemory( &pCcb->AuthGroup,
973 // If we have a substitute name, then use it
976 if( uniSubstitutedPathName.Buffer != NULL)
979 pCcb->FullFileName = uniSubstitutedPathName;
981 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
983 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
988 pCcb->FullFileName = uniRootFileName;
990 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
993 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
995 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
999 if( bOpenedReparsePoint)
1001 SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
1004 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1005 AFS_TRACE_LEVEL_VERBOSE,
1006 "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1007 &pCcb->DirectoryCB->NameInformation.FileName,
1010 lCount = pCcb->DirectoryCB->DirOpenReferenceCount);
1012 ASSERT( lCount >= 0);
1014 pCcb->CurrentDirIndex = 0;
1016 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1019 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1023 // Save off the name array for this instance
1026 pCcb->NameArray = pNameArray;
1030 AFSReleaseResource( &pCcb->NPCcb->CcbLock);
1034 // If we make it here then init the FO for the request.
1037 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1038 AFS_TRACE_LEVEL_VERBOSE_2,
1039 "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n",
1045 pFileObject->FsContext = (void *)pFcb;
1047 pFileObject->FsContext2 = (void *)pCcb;
1052 ASSERT( pFcb->OpenHandleCount > 0);
1054 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1057 // For files perform additional processing
1060 switch( pFcb->Header.NodeTypeCode)
1067 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1072 // If the user did not request nobuffering then mark the FO as cacheable
1075 if( bNoIntermediateBuffering)
1078 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1083 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1087 // If the file was opened for execution then we need to set the bit in the FO
1090 if( BooleanFlagOn( *pDesiredAccess,
1094 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1098 // Update the last access time
1101 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1112 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1113 AFS_TRACE_LEVEL_ERROR,
1114 "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n",
1123 if( NT_SUCCESS( ntStatus) &&
1124 ntStatus == STATUS_REPARSE)
1127 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1128 AFS_TRACE_LEVEL_ERROR,
1129 "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n",
1137 // Free up the sub name if we have one
1140 if( uniSubstitutedPathName.Buffer != NULL)
1143 AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
1145 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1150 // Free up the name array ...
1153 if( pNameArray != NULL)
1156 AFSFreeNameArray( pNameArray);
1159 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1162 AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
1168 lCount = AFSVolumeDecrement( pVolumeCB,
1169 VolumeReferenceReason);
1171 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1172 AFS_TRACE_LEVEL_VERBOSE,
1173 "AFSCommonCreate Decrement count on Volume %08lX Reason %u Cnt %d\n",
1175 VolumeReferenceReason,
1183 // Release the reference from AFSLocateNameEntry
1186 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
1188 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1189 AFS_TRACE_LEVEL_VERBOSE,
1190 "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
1191 &pDirectoryCB->NameInformation.FileName,
1196 ASSERT( lCount >= 0);
1199 if ( bReleaseParentDir)
1203 // Release the reference from AFSLocateNameEntry
1206 lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
1208 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1209 AFS_TRACE_LEVEL_VERBOSE,
1210 "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
1211 &pParentDirectoryCB->NameInformation.FileName,
1216 ASSERT( lCount >= 0);
1220 // Setup the Irp for completion, the Information has been set previously
1223 Irp->IoStatus.Status = ntStatus;
1230 AFSOpenAFSRoot( IN PIRP Irp,
1235 NTSTATUS ntStatus = STATUS_SUCCESS;
1242 // Initialize the Ccb for the file.
1245 ntStatus = AFSInitCcb( Ccb,
1246 AFSGlobalRoot->DirectoryCB,
1250 if( !NT_SUCCESS( ntStatus))
1253 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1254 AFS_TRACE_LEVEL_ERROR,
1255 "AFSOpenAFSRoot (%p) Failed to allocate Ccb\n",
1258 try_return( ntStatus);
1262 // Increment the open count on this Fcb
1265 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1267 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1268 AFS_TRACE_LEVEL_VERBOSE,
1269 "AFSOpenAFSRoot Increment count on Fcb %p Cnt %d\n",
1270 AFSGlobalRoot->RootFcb,
1273 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1275 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1276 AFS_TRACE_LEVEL_VERBOSE,
1277 "AFSOpenAFSRoot Increment handle count on Fcb %p Cnt %d\n",
1278 AFSGlobalRoot->RootFcb,
1281 *Fcb = AFSGlobalRoot->RootFcb;
1284 // Return the open result for this file
1287 Irp->IoStatus.Information = FILE_OPENED;
1298 AFSOpenRoot( IN PIRP Irp,
1299 IN AFSVolumeCB *VolumeCB,
1301 OUT AFSFcb **RootFcb,
1305 NTSTATUS ntStatus = STATUS_SUCCESS;
1306 PFILE_OBJECT pFileObject = NULL;
1307 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1308 PACCESS_MASK pDesiredAccess = NULL;
1309 USHORT usShareAccess;
1311 BOOLEAN bAllocatedCcb = FALSE;
1312 BOOLEAN bReleaseFcb = FALSE;
1313 AFSFileOpenCB stOpenCB;
1314 AFSFileOpenResultCB stOpenResultCB;
1315 ULONG ulResultLen = 0;
1321 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1322 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1323 ulOptions = pIrpSp->Parameters.Create.Options;
1325 pFileObject = pIrpSp->FileObject;
1327 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
1330 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
1332 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1333 AFS_TRACE_LEVEL_ERROR,
1334 "AFSOpenRoot (%p) Attempt to open root as file Status %08lX\n",
1338 try_return( ntStatus);
1342 // Check if we should go and retrieve updated information for the node
1345 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1350 if( !NT_SUCCESS( ntStatus))
1353 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1354 AFS_TRACE_LEVEL_ERROR,
1355 "AFSOpenRoot (%p) Failed to validate root entry Status %08lX\n",
1359 try_return( ntStatus);
1363 // Check with the service that we can open the file
1366 RtlZeroMemory( &stOpenCB,
1367 sizeof( AFSFileOpenCB));
1369 stOpenCB.DesiredAccess = *pDesiredAccess;
1371 stOpenCB.ShareAccess = usShareAccess;
1373 stOpenResultCB.GrantedAccess = 0;
1375 ulResultLen = sizeof( AFSFileOpenResultCB);
1377 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1378 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1381 &VolumeCB->ObjectInformation.FileId,
1383 sizeof( AFSFileOpenCB),
1384 (void *)&stOpenResultCB,
1387 if( !NT_SUCCESS( ntStatus))
1390 UNICODE_STRING uniGUID;
1393 uniGUID.MaximumLength = 0;
1394 uniGUID.Buffer = NULL;
1396 if( AuthGroup != NULL)
1398 RtlStringFromGUID( *AuthGroup,
1402 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1403 AFS_TRACE_LEVEL_ERROR,
1404 "AFSOpenRoot (%p) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
1406 VolumeCB->ObjectInformation.FileId.Cell,
1407 VolumeCB->ObjectInformation.FileId.Volume,
1411 if( AuthGroup != NULL)
1413 RtlFreeUnicodeString( &uniGUID);
1416 try_return( ntStatus);
1420 // If the entry is not initialized then do it now
1423 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1426 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1429 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1432 ntStatus = AFSEnumerateDirectory( AuthGroup,
1433 &VolumeCB->ObjectInformation,
1436 if( !NT_SUCCESS( ntStatus))
1439 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1441 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1442 AFS_TRACE_LEVEL_ERROR,
1443 "AFSOpenRoot (%p) Failed to enumerate directory Status %08lX\n",
1447 try_return( ntStatus);
1450 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1453 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1457 // If the root fcb has been initialized then check access otherwise
1458 // init the volume fcb
1461 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1464 if( !NT_SUCCESS( ntStatus))
1467 try_return( ntStatus);
1470 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1472 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1473 AFS_TRACE_LEVEL_VERBOSE,
1474 "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
1481 // If there are current opens on the Fcb, check the access.
1484 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1487 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1490 &VolumeCB->RootFcb->ShareAccess,
1493 if( !NT_SUCCESS( ntStatus))
1496 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1497 AFS_TRACE_LEVEL_ERROR,
1498 "AFSOpenRoot (%p) Access check failure Status %08lX\n",
1502 try_return( ntStatus);
1507 // Initialize the Ccb for the file.
1510 ntStatus = AFSInitCcb( Ccb,
1511 VolumeCB->DirectoryCB,
1515 if( !NT_SUCCESS( ntStatus))
1518 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1519 AFS_TRACE_LEVEL_ERROR,
1520 "AFSOpenRoot (%p) Failed to allocate Ccb Status %08lX\n",
1524 try_return( ntStatus);
1527 bAllocatedCcb = TRUE;
1530 // OK, update the share access on the fileobject
1533 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1536 IoUpdateShareAccess( pFileObject,
1537 &VolumeCB->RootFcb->ShareAccess);
1546 IoSetShareAccess( *pDesiredAccess,
1549 &VolumeCB->RootFcb->ShareAccess);
1553 // Increment the open count on this Fcb
1556 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1558 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1559 AFS_TRACE_LEVEL_VERBOSE,
1560 "AFSOpenRoot Increment handle count on Fcb %p Cnt %d\n",
1565 // Indicate the object is held
1568 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1571 // Return the open result for this file
1574 Irp->IoStatus.Information = FILE_OPENED;
1576 *RootFcb = VolumeCB->RootFcb;
1582 if ( !NT_SUCCESS( ntStatus))
1585 lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount);
1587 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1588 AFS_TRACE_LEVEL_VERBOSE,
1589 "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n",
1594 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1597 if( !NT_SUCCESS( ntStatus))
1609 Irp->IoStatus.Information = 0;
1617 AFSProcessCreate( IN PIRP Irp,
1619 IN AFSVolumeCB *VolumeCB,
1620 IN AFSDirectoryCB *ParentDirCB,
1621 IN PUNICODE_STRING FileName,
1622 IN PUNICODE_STRING ComponentName,
1623 IN PUNICODE_STRING FullFileName,
1628 NTSTATUS ntStatus = STATUS_SUCCESS;
1629 PFILE_OBJECT pFileObject = NULL;
1630 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1631 ULONG ulOptions = 0;
1632 ULONG ulAttributes = 0;
1633 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1634 PACCESS_MASK pDesiredAccess = NULL;
1635 USHORT usShareAccess;
1636 AFSDirectoryCB *pDirEntry = NULL;
1637 AFSObjectInfoCB *pParentObjectInfo = NULL;
1638 AFSObjectInfoCB *pObjectInfo = NULL;
1644 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1645 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1647 pFileObject = pIrpSp->FileObject;
1650 // Extract out the options
1653 ulOptions = pIrpSp->Parameters.Create.Options;
1656 // We pass all attributes they want to apply to the file to the create
1659 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1662 // If this is a directory create then set the attribute correctly
1665 if( ulOptions & FILE_DIRECTORY_FILE)
1668 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1671 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1672 AFS_TRACE_LEVEL_VERBOSE,
1673 "AFSProcessCreate (%p) Creating file %wZ Attributes %08lX\n",
1678 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1681 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1682 AFS_TRACE_LEVEL_ERROR,
1683 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1686 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
1689 pParentObjectInfo = ParentDirCB->ObjectInformation;
1692 // Allocate and insert the direntry into the parent node
1695 ntStatus = AFSCreateDirEntry( AuthGroup,
1703 if( !NT_SUCCESS( ntStatus))
1706 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1707 AFS_TRACE_LEVEL_ERROR,
1708 "AFSProcessCreate (%p) Failed to create directory entry %wZ Status %08lX\n",
1713 try_return( ntStatus);
1716 bFileCreated = TRUE;
1718 pObjectInfo = pDirEntry->ObjectInformation;
1720 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1721 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1724 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1725 AFS_TRACE_LEVEL_VERBOSE,
1726 "AFSProcessCreate (%p) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1728 &pDirEntry->NameInformation.FileName,
1729 pObjectInfo->FileId.Cell,
1730 pObjectInfo->FileId.Volume,
1731 pObjectInfo->FileId.Vnode,
1732 pObjectInfo->FileId.Unique);
1734 ntStatus = AFSEvaluateNode( AuthGroup,
1737 if( !NT_SUCCESS( ntStatus))
1740 if ( ntStatus == STATUS_NOT_A_DIRECTORY)
1743 if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
1746 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1747 AFS_TRACE_LEVEL_ERROR,
1748 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
1750 &pDirEntry->NameInformation.FileName,
1751 pObjectInfo->FileId.Cell,
1752 pObjectInfo->FileId.Volume,
1753 pObjectInfo->FileId.Vnode,
1754 pObjectInfo->FileId.Unique,
1755 pParentObjectInfo->FileId.Cell,
1756 pParentObjectInfo->FileId.Volume,
1757 pParentObjectInfo->FileId.Vnode,
1758 pParentObjectInfo->FileId.Unique,
1761 else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
1764 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1765 AFS_TRACE_LEVEL_ERROR,
1766 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1768 &pDirEntry->NameInformation.FileName,
1769 pObjectInfo->FileId.Cell,
1770 pObjectInfo->FileId.Volume,
1771 pObjectInfo->FileId.Vnode,
1772 pObjectInfo->FileId.Unique,
1773 pParentObjectInfo->FileId.Cell,
1774 pParentObjectInfo->FileId.Volume,
1775 pParentObjectInfo->FileId.Vnode,
1776 pParentObjectInfo->FileId.Unique,
1782 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1783 AFS_TRACE_LEVEL_ERROR,
1784 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1786 &pDirEntry->NameInformation.FileName,
1787 pObjectInfo->FileId.Cell,
1788 pObjectInfo->FileId.Volume,
1789 pObjectInfo->FileId.Vnode,
1790 pObjectInfo->FileId.Unique,
1791 pParentObjectInfo->FileId.Cell,
1792 pParentObjectInfo->FileId.Volume,
1793 pParentObjectInfo->FileId.Vnode,
1794 pParentObjectInfo->FileId.Unique,
1795 pObjectInfo->ParentFileId.Cell,
1796 pObjectInfo->ParentFileId.Volume,
1797 pObjectInfo->ParentFileId.Vnode,
1798 pObjectInfo->ParentFileId.Unique,
1805 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1806 AFS_TRACE_LEVEL_ERROR,
1807 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1809 &pDirEntry->NameInformation.FileName,
1810 pObjectInfo->FileId.Cell,
1811 pObjectInfo->FileId.Volume,
1812 pObjectInfo->FileId.Vnode,
1813 pObjectInfo->FileId.Unique,
1817 try_return( ntStatus);
1820 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1823 ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
1824 AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
1827 // We may have raced and the Fcb is already created
1831 // Allocate and initialize the Fcb for the file.
1834 ntStatus = AFSInitFcb( pDirEntry);
1836 *Fcb = pObjectInfo->Fcb;
1838 if( !NT_SUCCESS( ntStatus))
1841 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1842 AFS_TRACE_LEVEL_ERROR,
1843 "AFSProcessCreate (%p) Failed to initialize fcb %wZ Status %08lX\n",
1848 try_return( ntStatus);
1851 ntStatus = STATUS_SUCCESS;
1854 // Increment the open count on this Fcb
1857 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1859 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1860 AFS_TRACE_LEVEL_VERBOSE,
1861 "AFSProcessCreate Increment count on Fcb %p Cnt %d\n",
1868 // Initialize the Ccb for the file.
1871 ntStatus = AFSInitCcb( Ccb,
1876 if( !NT_SUCCESS( ntStatus))
1879 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1880 AFS_TRACE_LEVEL_ERROR,
1881 "AFSProcessCreate (%p) Failed to initialize ccb %wZ Status %08lX\n",
1886 try_return( ntStatus);
1889 bAllocatedCcb = TRUE;
1892 // If this is a file, update the headers filesizes.
1895 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1899 // Update the sizes with the information passed in
1902 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1903 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1904 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1907 // Notify the system of the addition
1910 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1912 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1913 (ULONG)FILE_ACTION_ADDED);
1915 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1917 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1921 // This is a new directory node so indicate it has been enumerated
1924 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1927 // And the parent directory entry
1930 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1933 // Notify the system of the addition
1936 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1938 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1939 (ULONG)FILE_ACTION_ADDED);
1941 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
1942 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
1943 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
1944 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
1948 // And the parent directory entry
1951 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1954 // Notify the system of the addition
1957 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1959 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1960 (ULONG)FILE_ACTION_ADDED);
1964 // Save off the access for the open
1967 IoSetShareAccess( *pDesiredAccess,
1970 &(*Fcb)->ShareAccess);
1972 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
1974 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1975 AFS_TRACE_LEVEL_VERBOSE,
1976 "AFSProcessCreate Increment handle count on Fcb %p Cnt %d\n",
1981 // Increment the open reference and handle on the parent node
1984 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
1986 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
1987 AFS_TRACE_LEVEL_VERBOSE,
1988 "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
1992 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
1994 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1995 AFS_TRACE_LEVEL_VERBOSE,
1996 "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
2000 if( ulOptions & FILE_DELETE_ON_CLOSE)
2004 // Mark it for delete on close
2007 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2008 AFS_TRACE_LEVEL_VERBOSE,
2009 "AFSProcessCreate (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2014 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2018 // Indicate the object is locked in the service
2021 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2024 // Return the open result for this file
2027 Irp->IoStatus.Information = FILE_CREATED;
2032 // If we created the Fcb we need to release the resources
2038 if( !NT_SUCCESS( ntStatus))
2041 // Decrement the open count on this Fcb
2044 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
2046 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2047 AFS_TRACE_LEVEL_VERBOSE,
2048 "AFSProcessCreate Decrement count on Fcb %p Cnt %d\n",
2053 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2060 // Decrement the reference added during initialization of the DE
2061 // AFSInitCcb allocates its own reference count.
2064 lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
2066 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2067 AFS_TRACE_LEVEL_VERBOSE,
2068 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2069 &pDirEntry->NameInformation.FileName,
2073 ASSERT( lCount >= 0);
2076 if( !NT_SUCCESS( ntStatus))
2082 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2083 AFS_TRACE_LEVEL_VERBOSE,
2084 "AFSProcessCreate Create failed, removing DE %p from parent object %p Status %08lX\n",
2090 // Remove the dir entry from the parent
2093 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2096 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2098 AFSNotifyDelete( pDirEntry,
2103 // Pull the directory entry from the parent
2106 AFSRemoveDirNodeFromParent( pParentObjectInfo,
2108 FALSE); // Leave it in the enum list so the worker cleans it up
2111 // Tag the parent as needing verification
2114 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
2116 pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
2118 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2129 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2142 AFSOpenTargetDirectory( IN PIRP Irp,
2143 IN AFSVolumeCB *VolumeCB,
2144 IN AFSDirectoryCB *ParentDirectoryCB,
2145 IN AFSDirectoryCB *TargetDirectoryCB,
2146 IN UNICODE_STRING *TargetName,
2150 UNREFERENCED_PARAMETER(VolumeCB);
2151 NTSTATUS ntStatus = STATUS_SUCCESS;
2152 PFILE_OBJECT pFileObject = NULL;
2153 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2154 PACCESS_MASK pDesiredAccess = NULL;
2155 USHORT usShareAccess;
2156 BOOLEAN bAllocatedCcb = FALSE;
2157 BOOLEAN bReleaseFcb = FALSE;
2158 AFSObjectInfoCB *pParentObject = NULL;
2159 AFSObjectInfoCB *pGrandParentObject = NULL;
2160 UNICODE_STRING uniTargetName;
2166 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2167 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2169 pFileObject = pIrpSp->FileObject;
2171 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2172 AFS_TRACE_LEVEL_VERBOSE,
2173 "AFSOpenTargetDirectory (%p) Processing file %wZ\n",
2177 pParentObject = ParentDirectoryCB->ObjectInformation;
2179 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2182 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2186 // Make sure we have an Fcb for the access
2189 // Allocate and initialize the Fcb for the file.
2192 ntStatus = AFSInitFcb( ParentDirectoryCB);
2194 *Fcb = pParentObject->Fcb;
2196 if( !NT_SUCCESS( ntStatus))
2199 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2200 AFS_TRACE_LEVEL_ERROR,
2201 "AFSOpenTargetDirectory (%p) Failed to initialize fcb %wZ Status %08lX\n",
2203 &ParentDirectoryCB->NameInformation.FileName,
2206 try_return( ntStatus);
2209 ntStatus = STATUS_SUCCESS;
2212 // Increment the open count on this Fcb
2215 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2217 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2218 AFS_TRACE_LEVEL_VERBOSE,
2219 "AFSOpenTargetDirectory Increment count on Fcb %p Cnt %d\n",
2226 // If there are current opens on the Fcb, check the access.
2229 if( pParentObject->Fcb->OpenHandleCount > 0)
2232 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2235 &pParentObject->Fcb->ShareAccess,
2238 if( !NT_SUCCESS( ntStatus))
2241 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2242 AFS_TRACE_LEVEL_ERROR,
2243 "AFSOpenTargetDirectory (%p) Access check failure %wZ Status %08lX\n",
2245 &ParentDirectoryCB->NameInformation.FileName,
2248 try_return( ntStatus);
2253 // Initialize the Ccb for the file.
2256 ntStatus = AFSInitCcb( Ccb,
2261 if( !NT_SUCCESS( ntStatus))
2264 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2265 AFS_TRACE_LEVEL_ERROR,
2266 "AFSOpenTargetDirectory (%p) Failed to initialize ccb %wZ Status %08lX\n",
2268 &ParentDirectoryCB->NameInformation.FileName,
2271 try_return( ntStatus);
2274 bAllocatedCcb = TRUE;
2276 if( TargetDirectoryCB != NULL &&
2277 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2283 Irp->IoStatus.Information = FILE_EXISTS;
2285 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2290 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2292 uniTargetName = *TargetName;
2296 // Update the filename in the fileobject for rename processing
2299 RtlCopyMemory( pFileObject->FileName.Buffer,
2300 uniTargetName.Buffer,
2301 uniTargetName.Length);
2303 pFileObject->FileName.Length = uniTargetName.Length;
2306 // OK, update the share access on the fileobject
2309 if( pParentObject->Fcb->OpenHandleCount > 0)
2312 IoUpdateShareAccess( pFileObject,
2313 &pParentObject->Fcb->ShareAccess);
2322 IoSetShareAccess( *pDesiredAccess,
2325 &pParentObject->Fcb->ShareAccess);
2328 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2330 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2331 AFS_TRACE_LEVEL_VERBOSE,
2332 "AFSOpenTargetDirectory Increment handle count on Fcb %p Cnt %d\n",
2337 // Increment the open reference and handle on the parent node
2340 if( BooleanFlagOn( pParentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
2343 pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
2344 &pParentObject->ParentFileId);
2346 if ( pGrandParentObject)
2349 lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
2351 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2352 AFS_TRACE_LEVEL_VERBOSE,
2353 "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
2357 lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
2359 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2360 AFS_TRACE_LEVEL_VERBOSE,
2361 "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
2365 AFSReleaseObjectInfo( &pGrandParentObject);
2374 if( !NT_SUCCESS( ntStatus))
2377 // Decrement the open count on this Fcb
2380 lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
2382 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2383 AFS_TRACE_LEVEL_VERBOSE,
2384 "AFSOpenTargetDirectory Decrement count on Fcb %p Cnt %d\n",
2389 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2392 if( !NT_SUCCESS( ntStatus))
2405 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2416 AFSProcessOpen( IN PIRP Irp,
2418 IN AFSVolumeCB *VolumeCB,
2419 IN AFSDirectoryCB *ParentDirCB,
2420 IN AFSDirectoryCB *DirectoryCB,
2424 UNREFERENCED_PARAMETER(VolumeCB);
2425 NTSTATUS ntStatus = STATUS_SUCCESS;
2426 PFILE_OBJECT pFileObject = NULL;
2427 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2428 PACCESS_MASK pDesiredAccess = NULL;
2429 USHORT usShareAccess;
2430 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
2431 ULONG ulOptions = 0;
2432 AFSFileOpenCB stOpenCB;
2433 AFSFileOpenResultCB stOpenResultCB;
2434 ULONG ulResultLen = 0;
2435 AFSObjectInfoCB *pParentObjectInfo = NULL;
2436 AFSObjectInfoCB *pObjectInfo = NULL;
2437 ULONG ulFileAccess = 0;
2438 AFSFileAccessReleaseCB stReleaseFileAccess;
2444 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2445 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2447 pFileObject = pIrpSp->FileObject;
2449 pParentObjectInfo = ParentDirCB->ObjectInformation;
2451 pObjectInfo = DirectoryCB->ObjectInformation;
2453 ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
2454 AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
2457 // Check if the entry is pending a deletion
2460 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2463 ntStatus = STATUS_DELETE_PENDING;
2465 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2466 AFS_TRACE_LEVEL_ERROR,
2467 "AFSProcessOpen (%p) Entry pending delete %wZ Status %08lX\n",
2469 &DirectoryCB->NameInformation.FileName,
2472 try_return( ntStatus);
2476 // Extract out the options
2479 ulOptions = pIrpSp->Parameters.Create.Options;
2482 // Check if we should go and retrieve updated information for the node
2485 ntStatus = AFSValidateEntry( DirectoryCB,
2490 if( !NT_SUCCESS( ntStatus))
2493 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2494 AFS_TRACE_LEVEL_ERROR,
2495 "AFSProcessOpen (%p) Failed to validate entry %wZ Status %08lX\n",
2497 &DirectoryCB->NameInformation.FileName,
2500 try_return( ntStatus);
2504 // If this is marked for delete on close then be sure we can delete the entry
2507 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2510 ntStatus = AFSNotifyDelete( DirectoryCB,
2514 if( !NT_SUCCESS( ntStatus))
2517 ntStatus = STATUS_CANNOT_DELETE;
2519 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2520 AFS_TRACE_LEVEL_ERROR,
2521 "AFSProcessOpen (%p) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2523 &DirectoryCB->NameInformation.FileName,
2526 try_return( ntStatus);
2531 // Be sure we have an Fcb for the current object
2534 ntStatus = AFSInitFcb( DirectoryCB);
2536 if( !NT_SUCCESS( ntStatus))
2539 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2540 AFS_TRACE_LEVEL_ERROR,
2541 "AFSProcessOpen (%p) Failed to init fcb on %wZ Status %08lX\n",
2543 &DirectoryCB->NameInformation.FileName,
2546 try_return( ntStatus);
2549 ntStatus = STATUS_SUCCESS;
2552 // AFSInitFcb returns the Fcb resource held
2558 // Increment the open count on this Fcb
2561 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2563 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2564 AFS_TRACE_LEVEL_VERBOSE,
2565 "AFSProcessOpen Increment2 count on Fcb %p Cnt %d\n",
2570 // Check access on the entry
2573 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2576 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2579 &pObjectInfo->Fcb->ShareAccess,
2582 if( !NT_SUCCESS( ntStatus))
2585 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2586 AFS_TRACE_LEVEL_ERROR,
2587 "AFSProcessOpen (%p) Failed to check share access on %wZ Status %08lX\n",
2589 &DirectoryCB->NameInformation.FileName,
2592 try_return( ntStatus);
2597 // Additional checks
2600 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2604 // If the caller is asking for write access then try to flush the image section
2607 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2608 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2613 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2614 AFS_TRACE_LEVEL_VERBOSE,
2615 "AFSProcessOpen Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
2616 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2617 PsGetCurrentThread());
2619 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2622 bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2625 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2626 AFS_TRACE_LEVEL_VERBOSE,
2627 "AFSProcessOpen Releasing Fcb SectionObject lock %p EXCL %08lX\n",
2628 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2629 PsGetCurrentThread());
2631 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
2636 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2637 STATUS_SHARING_VIOLATION;
2639 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2640 AFS_TRACE_LEVEL_ERROR,
2641 "AFSProcessOpen (%p) Failed to flush image section %wZ Status %08lX\n",
2643 &DirectoryCB->NameInformation.FileName,
2646 try_return( ntStatus);
2650 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2653 ntStatus = STATUS_NOT_A_DIRECTORY;
2655 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2656 AFS_TRACE_LEVEL_ERROR,
2657 "AFSProcessOpen (%p) Attempt to open file as directory %wZ Status %08lX\n",
2659 &DirectoryCB->NameInformation.FileName,
2662 try_return( ntStatus);
2665 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2667 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2668 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2671 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2674 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2676 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2677 AFS_TRACE_LEVEL_ERROR,
2678 "AFSProcessOpen (%p) Attempt to open directory as file %wZ Status %08lX\n",
2680 &DirectoryCB->NameInformation.FileName,
2683 try_return( ntStatus);
2686 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2687 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2688 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2689 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
2696 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2700 // Check with the service that we can open the file
2703 stOpenCB.ParentId = pParentObjectInfo->FileId;
2705 stOpenCB.DesiredAccess = *pDesiredAccess;
2707 stOpenCB.ShareAccess = usShareAccess;
2709 stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2711 stOpenCB.Identifier = (ULONGLONG)pFileObject;
2713 stOpenResultCB.GrantedAccess = 0;
2715 ulResultLen = sizeof( AFSFileOpenResultCB);
2717 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2718 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2720 &DirectoryCB->NameInformation.FileName,
2721 &pObjectInfo->FileId,
2723 sizeof( AFSFileOpenCB),
2724 (void *)&stOpenResultCB,
2727 if( !NT_SUCCESS( ntStatus))
2730 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2731 AFS_TRACE_LEVEL_ERROR,
2732 "AFSProcessOpen (%p) Failed open in service %wZ Status %08lX\n",
2734 &DirectoryCB->NameInformation.FileName,
2737 try_return( ntStatus);
2741 // Save the granted access in case we need to release it below
2744 ulFileAccess = stOpenResultCB.FileAccess;
2747 // Check if there is a conflict
2750 if( !AFSCheckAccess( *pDesiredAccess,
2751 stOpenResultCB.GrantedAccess,
2752 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2755 ntStatus = STATUS_ACCESS_DENIED;
2757 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2758 AFS_TRACE_LEVEL_ERROR,
2759 "AFSProcessOpen (%p) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2762 stOpenResultCB.GrantedAccess,
2763 &DirectoryCB->NameInformation.FileName,
2766 try_return( ntStatus);
2770 // Initialize the Ccb for the file.
2773 ntStatus = AFSInitCcb( Ccb,
2778 if( !NT_SUCCESS( ntStatus))
2781 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2782 AFS_TRACE_LEVEL_ERROR,
2783 "AFSProcessOpen (%p) Failed to initialize ccb %wZ Status %08lX\n",
2785 &DirectoryCB->NameInformation.FileName,
2788 try_return( ntStatus);
2791 bAllocatedCcb = TRUE;
2794 // Perform the access check on the target if this is a mount point or symlink
2797 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2800 IoUpdateShareAccess( pFileObject,
2801 &pObjectInfo->Fcb->ShareAccess);
2810 IoSetShareAccess( *pDesiredAccess,
2813 &pObjectInfo->Fcb->ShareAccess);
2816 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2818 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2819 AFS_TRACE_LEVEL_VERBOSE,
2820 "AFSProcessOpen Increment handle count on Fcb %p Cnt %d\n",
2825 // Increment the open reference and handle on the parent node
2828 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
2830 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2831 AFS_TRACE_LEVEL_VERBOSE,
2832 "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
2836 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
2838 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
2839 AFS_TRACE_LEVEL_VERBOSE,
2840 "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
2844 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2848 // Mark it for delete on close
2851 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2852 AFS_TRACE_LEVEL_VERBOSE,
2853 "AFSProcessOpen (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2856 &DirectoryCB->NameInformation.FileName);
2858 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2862 // Indicate the object is held
2865 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2868 // Return the open result for this file
2871 Irp->IoStatus.Information = FILE_OPENED;
2873 *Fcb = pObjectInfo->Fcb;
2880 if( !NT_SUCCESS( ntStatus))
2883 // Decrement the open count on this Fcb
2886 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2888 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2889 AFS_TRACE_LEVEL_VERBOSE,
2890 "AFSProcessOpen Decrement2 count on Fcb %p Cnt %d\n",
2895 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2898 if( !NT_SUCCESS( ntStatus))
2901 if ( ulFileAccess > 0)
2904 stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2906 stReleaseFileAccess.FileAccess = ulFileAccess;
2908 stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
2910 AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
2911 AFS_REQUEST_FLAG_SYNCHRONOUS,
2913 &DirectoryCB->NameInformation.FileName,
2914 &pObjectInfo->FileId,
2915 (void *)&stReleaseFileAccess,
2916 sizeof( AFSFileAccessReleaseCB),
2931 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2942 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
2944 IN AFSVolumeCB *VolumeCB,
2946 IN AFSDirectoryCB *ParentDirCB,
2947 IN AFSDirectoryCB *DirectoryCB,
2951 UNREFERENCED_PARAMETER(DeviceObject);
2952 NTSTATUS ntStatus = STATUS_SUCCESS;
2953 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2954 PFILE_OBJECT pFileObject = NULL;
2955 LARGE_INTEGER liZero = {0,0};
2956 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
2957 ULONG ulAttributes = 0;
2958 ULONG ulCreateDisposition = 0;
2959 BOOLEAN bAllocatedCcb = FALSE;
2960 BOOLEAN bUserMapped = FALSE;
2961 PACCESS_MASK pDesiredAccess = NULL;
2962 USHORT usShareAccess;
2963 AFSObjectInfoCB *pParentObjectInfo = NULL;
2964 AFSObjectInfoCB *pObjectInfo = NULL;
2966 LARGE_INTEGER liSaveSize;
2967 LARGE_INTEGER liSaveVDL;
2968 LARGE_INTEGER liSaveAlloc;
2973 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2975 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2977 pFileObject = pIrpSp->FileObject;
2979 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
2981 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
2983 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
2986 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2987 AFS_TRACE_LEVEL_ERROR,
2988 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
2990 &DirectoryCB->NameInformation.FileName);
2992 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
2995 pParentObjectInfo = ParentDirCB->ObjectInformation;
2997 pObjectInfo = DirectoryCB->ObjectInformation;
2999 ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
3000 AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
3003 // Check if we should go and retrieve updated information for the node
3006 ntStatus = AFSValidateEntry( DirectoryCB,
3011 if( !NT_SUCCESS( ntStatus))
3014 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3015 AFS_TRACE_LEVEL_ERROR,
3016 "AFSProcessOverwriteSupersede (%p) Failed to validate entry %wZ Status %08lX\n",
3018 &DirectoryCB->NameInformation.FileName,
3021 try_return( ntStatus);
3025 // Be sure we have an Fcb for the object block
3028 ntStatus = AFSInitFcb( DirectoryCB);
3030 *Fcb = pObjectInfo->Fcb;
3032 if( !NT_SUCCESS( ntStatus))
3035 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3036 AFS_TRACE_LEVEL_ERROR,
3037 "AFSProcessOverwriteSupersede (%p) Failed to initialize fcb %wZ Status %08lX\n",
3039 &DirectoryCB->NameInformation.FileName,
3042 try_return( ntStatus);
3045 ntStatus = STATUS_SUCCESS;
3048 // Increment the open count on this Fcb.
3051 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3053 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3054 AFS_TRACE_LEVEL_VERBOSE,
3055 "AFSProcessOverwriteSupersede Increment2 count on Fcb %p Cnt %d\n",
3062 // Check access on the entry
3065 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3068 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3071 &pObjectInfo->Fcb->ShareAccess,
3074 if( !NT_SUCCESS( ntStatus))
3077 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3078 AFS_TRACE_LEVEL_ERROR,
3079 "AFSProcessOverwriteSupersede (%p) Access check failure %wZ Status %08lX\n",
3081 &DirectoryCB->NameInformation.FileName,
3084 try_return( ntStatus);
3088 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3089 AFS_TRACE_LEVEL_VERBOSE,
3090 "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
3091 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3092 PsGetCurrentThread());
3094 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3098 // Before we actually truncate, check to see if the purge
3099 // is going to fail.
3102 bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3105 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3106 AFS_TRACE_LEVEL_VERBOSE,
3107 "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %p EXCL %08lX\n",
3108 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3109 PsGetCurrentThread());
3111 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
3116 ntStatus = STATUS_USER_MAPPED_FILE;
3118 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3119 AFS_TRACE_LEVEL_ERROR,
3120 "AFSProcessOverwriteSupersede (%p) File user mapped %wZ Status %08lX\n",
3122 &DirectoryCB->NameInformation.FileName,
3125 try_return( ntStatus);
3129 // Initialize the Ccb for the file.
3132 ntStatus = AFSInitCcb( Ccb,
3137 if( !NT_SUCCESS( ntStatus))
3140 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3141 AFS_TRACE_LEVEL_ERROR,
3142 "AFSProcessOverwriteSupersede (%p) Failed to initialize ccb %wZ Status %08lX\n",
3144 &DirectoryCB->NameInformation.FileName,
3147 try_return( ntStatus);
3150 bAllocatedCcb = TRUE;
3153 // Set the file length to zero
3156 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3159 bReleasePaging = TRUE;
3161 liSaveSize = pObjectInfo->Fcb->Header.FileSize;
3162 liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
3163 liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
3165 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3166 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3167 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3169 pObjectInfo->EndOfFile.QuadPart = 0;
3170 pObjectInfo->AllocationSize.QuadPart = 0;
3173 // Trim down the extents. We do this BEFORE telling the service
3174 // the file is truncated since there is a potential race between
3175 // a worker thread releasing extents and us trimming
3178 AFSTrimExtents( pObjectInfo->Fcb,
3179 &pObjectInfo->Fcb->Header.FileSize);
3181 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3183 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3185 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3188 // Set the update flag accordingly
3191 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3192 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3193 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3194 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3195 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3197 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3201 if( !NT_SUCCESS( ntStatus))
3204 pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
3205 pObjectInfo->Fcb->Header.FileSize = liSaveSize;
3206 pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
3207 pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
3208 pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
3210 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3211 AFS_TRACE_LEVEL_ERROR,
3212 "AFSProcessOverwriteSupersede (%p) Failed to update file information %wZ Status %08lX\n",
3214 &DirectoryCB->NameInformation.FileName,
3217 try_return( ntStatus);
3220 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3222 if( ulCreateDisposition == FILE_SUPERSEDE)
3225 pObjectInfo->FileAttributes = ulAttributes;
3231 pObjectInfo->FileAttributes |= ulAttributes;
3235 // Save off the access for the open
3238 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3241 IoUpdateShareAccess( pFileObject,
3242 &pObjectInfo->Fcb->ShareAccess);
3251 IoSetShareAccess( *pDesiredAccess,
3254 &pObjectInfo->Fcb->ShareAccess);
3258 // Return the correct action
3261 if( ulCreateDisposition == FILE_SUPERSEDE)
3264 Irp->IoStatus.Information = FILE_SUPERSEDED;
3269 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3272 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3274 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3275 AFS_TRACE_LEVEL_VERBOSE,
3276 "AFSProcessOverwriteSupersede Increment handle count on Fcb %p Cnt %d\n",
3281 // Increment the open reference and handle on the parent node
3284 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3286 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3287 AFS_TRACE_LEVEL_VERBOSE,
3288 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
3292 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3294 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3295 AFS_TRACE_LEVEL_VERBOSE,
3296 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
3300 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3302 bReleaseFcb = FALSE;
3304 *Fcb = pObjectInfo->Fcb;
3307 // Now that the Fcb->Resource has been dropped
3308 // we can call CcSetFileSizes. We are still holding
3309 // the PagingIoResource
3312 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3314 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3316 pFileObject->FsContext2 = (void *)*Ccb;
3318 CcSetFileSizes( pFileObject,
3319 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3326 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3332 if( !NT_SUCCESS( ntStatus))
3335 // Decrement the open count on this Fcb.
3338 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3340 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3341 AFS_TRACE_LEVEL_VERBOSE,
3342 "AFSProcessOverwriteSupersede Decrement2 count on Fcb %p Cnt %d\n",
3347 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3350 if( !NT_SUCCESS( ntStatus))
3363 // Fcb will be freed by AFSPrimaryVolumeWorker thread
3374 AFSControlDeviceCreate( IN PIRP Irp)
3377 NTSTATUS ntStatus = STATUS_SUCCESS;
3382 if ( KernelMode == Irp->RequestorMode) {
3384 // For now, just let the open happen
3386 Irp->IoStatus.Information = FILE_OPENED;
3391 // Not from usermode, All access must be via
3392 // the FS component (which will do the
3395 ntStatus = STATUS_ACCESS_DENIED;
3403 // AFSOpenIOCtlFcb does not release a DirOpenReferenceCount on
3408 AFSOpenIOCtlFcb( IN PIRP Irp,
3410 IN AFSDirectoryCB *ParentDirCB,
3415 NTSTATUS ntStatus = STATUS_SUCCESS;
3416 PFILE_OBJECT pFileObject = NULL;
3417 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3418 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
3419 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3421 AFSObjectInfoCB *pParentObjectInfo = NULL;
3427 pFileObject = pIrpSp->FileObject;
3429 pParentObjectInfo = ParentDirCB->ObjectInformation;
3432 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3435 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3438 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3440 if( !NT_SUCCESS( ntStatus))
3443 try_return( ntStatus);
3448 // Allocate and initialize the Fcb for the file.
3451 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
3453 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3455 if( !NT_SUCCESS( ntStatus))
3458 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3459 AFS_TRACE_LEVEL_ERROR,
3460 "AFSOpenIOCtlFcb (%p) Failed to initialize fcb Status %08lX\n",
3464 try_return( ntStatus);
3467 ntStatus = STATUS_SUCCESS;
3470 // Increment the open reference and handle on the node
3473 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3475 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3476 AFS_TRACE_LEVEL_VERBOSE,
3477 "AFSOpenIOCtlFcb Increment count on Fcb %p Cnt %d\n",
3484 // Initialize the Ccb for the file.
3487 ntStatus = AFSInitCcb( Ccb,
3488 pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
3492 if( !NT_SUCCESS( ntStatus))
3495 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3496 AFS_TRACE_LEVEL_ERROR,
3497 "AFSOpenIOCtlFcb (%p) Failed to initialize ccb Status %08lX\n",
3501 try_return( ntStatus);
3504 bAllocatedCcb = TRUE;
3507 // Set the PIOCtl index
3510 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3512 RtlZeroMemory( &stPIOCtlOpen,
3513 sizeof( AFSPIOCtlOpenCloseRequestCB));
3515 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3517 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3519 RtlZeroMemory( &stFileID,
3520 sizeof( AFSFileID));
3523 // The parent directory FID of the node
3526 stFileID = pParentObjectInfo->FileId;
3529 // Issue the open request to the service
3532 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3533 AFS_REQUEST_FLAG_SYNCHRONOUS,
3537 (void *)&stPIOCtlOpen,
3538 sizeof( AFSPIOCtlOpenCloseRequestCB),
3542 if( !NT_SUCCESS( ntStatus))
3545 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3546 AFS_TRACE_LEVEL_ERROR,
3547 "AFSOpenIOCtlFcb (%p) Failed service open Status %08lX\n",
3551 try_return( ntStatus);
3555 // Increment the handle on the node
3558 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3560 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3561 AFS_TRACE_LEVEL_VERBOSE,
3562 "AFSOpenIOCtlFcb Increment handle count on Fcb %p Cnt %d\n",
3567 // Increment the open reference and handle on the parent node
3570 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3572 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3573 AFS_TRACE_LEVEL_VERBOSE,
3574 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %p Cnt %d\n",
3578 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3580 AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
3581 AFS_TRACE_LEVEL_VERBOSE,
3582 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %p Cnt %d\n",
3587 // Return the open result for this file
3590 Irp->IoStatus.Information = FILE_OPENED;
3595 // If we created the Fcb we need to release the resources
3601 if( !NT_SUCCESS( ntStatus))
3604 // Decrement the open reference and handle on the node
3607 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
3609 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3610 AFS_TRACE_LEVEL_VERBOSE,
3611 "AFSOpenIOCtlFcb Decrement count on Fcb %p Cnt %d\n",
3616 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3619 if( !NT_SUCCESS( ntStatus))
3632 // Fcb will be freed by AFSPrimaryVolumeWorker thread
3643 AFSOpenSpecialShareFcb( IN PIRP Irp,
3645 IN AFSDirectoryCB *DirectoryCB,
3650 NTSTATUS ntStatus = STATUS_SUCCESS;
3651 PFILE_OBJECT pFileObject = NULL;
3652 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3653 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3654 AFSObjectInfoCB *pObjectInfo = NULL;
3655 AFSObjectInfoCB *pParentObjectInfo = NULL;
3656 AFSPipeOpenCloseRequestCB stPipeOpen;
3662 pFileObject = pIrpSp->FileObject;
3664 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3665 AFS_TRACE_LEVEL_VERBOSE_2,
3666 "AFSOpenSpecialShareFcb (%p) Processing Share %wZ open\n",
3668 &DirectoryCB->NameInformation.FileName);
3670 pObjectInfo = DirectoryCB->ObjectInformation;