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,
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 (%08lX) 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 (%08lX) Invalid request to open before library is initialized\n",
92 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
95 ntStatus = AFSCommonCreate( AFSRDRDeviceObject,
102 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
107 "EXCEPTION - AFSCreate\n");
109 ntStatus = STATUS_ACCESS_DENIED;
113 // Complete the request
116 AFSCompleteRequest( Irp,
123 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
127 NTSTATUS ntStatus = STATUS_SUCCESS;
128 UNICODE_STRING uniFileName;
129 ULONG ulCreateDisposition = 0;
131 BOOLEAN bNoIntermediateBuffering = FALSE;
132 FILE_OBJECT *pFileObject = NULL;
133 IO_STACK_LOCATION *pIrpSp;
136 AFSDeviceExt *pDeviceExt = NULL;
137 BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
138 PACCESS_MASK pDesiredAccess = NULL;
139 UNICODE_STRING uniComponentName, uniPathName, uniRootFileName, uniParsedFileName;
140 UNICODE_STRING uniSubstitutedPathName;
141 UNICODE_STRING uniRelativeName;
142 AFSNameArrayHdr *pNameArray = NULL;
143 AFSVolumeCB *pVolumeCB = NULL;
144 AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
145 ULONG ulParseFlags = 0;
147 ULONG ulNameProcessingFlags = 0;
148 BOOLEAN bOpenedReparsePoint = FALSE;
154 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
155 pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
156 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
157 ulOptions = pIrpSp->Parameters.Create.Options;
158 bNoIntermediateBuffering = BooleanFlagOn( ulOptions, FILE_NO_INTERMEDIATE_BUFFERING);
159 bOpenTargetDirectory = BooleanFlagOn( pIrpSp->Flags, SL_OPEN_TARGET_DIRECTORY);
160 pFileObject = pIrpSp->FileObject;
161 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
163 uniFileName.Length = uniFileName.MaximumLength = 0;
164 uniFileName.Buffer = NULL;
166 uniRootFileName.Length = uniRootFileName.MaximumLength = 0;
167 uniRootFileName.Buffer = NULL;
169 uniParsedFileName.Length = uniParsedFileName.MaximumLength = 0;
170 uniParsedFileName.Buffer = NULL;
172 uniSubstitutedPathName.Buffer = NULL;
173 uniSubstitutedPathName.Length = 0;
175 uniRelativeName.Buffer = NULL;
176 uniRelativeName.Length = 0;
178 if( AFSGlobalRoot == NULL)
180 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
183 RtlZeroMemory( &stAuthGroup,
186 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
187 (ULONGLONG)PsGetCurrentThreadId(),
190 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
193 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
195 if( !NT_SUCCESS( ntStatus))
198 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
199 AFS_TRACE_LEVEL_ERROR,
200 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
203 try_return( ntStatus);
208 // If we are in shutdown mode then fail the request
211 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
214 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
215 AFS_TRACE_LEVEL_WARNING,
216 "AFSCommonCreate (%08lX) Open request after shutdown\n",
219 try_return( ntStatus = STATUS_TOO_LATE);
223 // Go and parse the name for processing.
224 // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
225 // then we are responsible for releasing the uniRootFileName.Buffer.
228 ntStatus = AFSParseName( Irp,
238 if( !NT_SUCCESS( ntStatus))
241 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
242 uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
243 "AFSCommonCreate (%08lX) Failed to parse name \"%wZ\" Status %08lX\n",
248 try_return( ntStatus);
252 // Check for STATUS_REPARSE
255 if( ntStatus == STATUS_REPARSE)
259 // Update the information and return
262 Irp->IoStatus.Information = IO_REPARSE;
264 try_return( ntStatus);
268 // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
272 if( pVolumeCB == NULL)
276 // Remove any leading or trailing slashes
279 if( uniFileName.Length >= sizeof( WCHAR) &&
280 uniFileName.Buffer[ (uniFileName.Length/sizeof( WCHAR)) - 1] == L'\\')
283 uniFileName.Length -= sizeof( WCHAR);
286 if( uniFileName.Length >= sizeof( WCHAR) &&
287 uniFileName.Buffer[ 0] == L'\\')
290 uniFileName.Buffer = &uniFileName.Buffer[ 1];
292 uniFileName.Length -= sizeof( WCHAR);
296 // If there is a remaining portion returned for this request then
297 // check if it is for the PIOCtl interface
300 if( uniFileName.Length > 0)
304 // We don't accept any other opens off of the AFS Root
307 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
310 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
313 if( RtlCompareUnicodeString( &AFSPIOCtlName,
318 ntStatus = AFSOpenIOCtlFcb( Irp,
320 AFSGlobalRoot->DirectoryCB,
324 if( !NT_SUCCESS( ntStatus))
327 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
328 AFS_TRACE_LEVEL_ERROR,
329 "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
333 else if( pParentDirectoryCB != NULL &&
334 pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
337 ntStatus = AFSOpenSpecialShareFcb( Irp,
343 if( !NT_SUCCESS( ntStatus))
346 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
347 AFS_TRACE_LEVEL_ERROR,
348 "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
353 try_return( ntStatus);
356 ntStatus = AFSOpenAFSRoot( Irp,
360 if( !NT_SUCCESS( ntStatus))
363 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
364 AFS_TRACE_LEVEL_ERROR,
365 "AFSCommonCreate Failed to open root Status %08lX\n",
368 lCount = InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
370 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
371 AFS_TRACE_LEVEL_VERBOSE,
372 "AFSCommonCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
373 &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
374 AFSGlobalRoot->DirectoryCB,
379 try_return( ntStatus);
383 // We have a reference on the root volume
386 bReleaseVolume = TRUE;
389 // Attempt to locate the node in the name tree if this is not a target
390 // open and the target is not the root
393 uniComponentName.Length = 0;
394 uniComponentName.Buffer = NULL;
396 if( uniFileName.Length > sizeof( WCHAR) ||
397 uniFileName.Buffer[ 0] != L'\\')
400 if( !AFSValidNameFormat( &uniFileName))
403 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
405 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
406 AFS_TRACE_LEVEL_VERBOSE,
407 "AFSCommonCreate (%08lX) Invalid name %wZ Status %08lX\n",
412 try_return( ntStatus);
416 // Opening a reparse point directly?
419 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
421 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
423 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
424 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
425 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
428 uniSubstitutedPathName = uniRootFileName;
430 ntStatus = AFSLocateNameEntry( &stAuthGroup,
435 ulNameProcessingFlags,
441 if( !NT_SUCCESS( ntStatus) &&
442 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
445 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
447 uniSubstitutedPathName.Buffer = NULL;
451 // The routine above released the root while walking the
455 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
456 AFS_TRACE_LEVEL_VERBOSE,
457 "AFSCommonCreate (%08lX) Failed to locate name entry for %wZ Status %08lX\n",
463 // We released any root volume locks in the above on failure
466 bReleaseVolume = FALSE;
468 try_return( ntStatus);
472 // Check for STATUS_REPARSE
475 if( ntStatus == STATUS_REPARSE)
478 uniSubstitutedPathName.Buffer = NULL;
481 // Update the information and return
484 Irp->IoStatus.Information = IO_REPARSE;
487 // We released the volume lock above
490 bReleaseVolume = FALSE;
492 try_return( ntStatus);
496 // If we re-allocated the name, then update our substitute name
499 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
502 uniSubstitutedPathName = uniRootFileName;
507 uniSubstitutedPathName.Buffer = NULL;
511 // Check for a symlink access
514 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
515 pParentDirectoryCB != NULL)
518 UNICODE_STRING uniFinalComponent;
520 uniFinalComponent.Length = 0;
521 uniFinalComponent.MaximumLength = 0;
522 uniFinalComponent.Buffer = NULL;
524 AFSRetrieveFinalComponent( &uniFileName,
527 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
530 if( !NT_SUCCESS( ntStatus) &&
531 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
534 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
535 AFS_TRACE_LEVEL_VERBOSE,
536 "AFSCommonCreate (%08lX) Failing access to symlink %wZ Status %08lX\n",
541 try_return( ntStatus);
547 // If we have no parent then this is a root open, be sure there is a directory entry
551 else if( pParentDirectoryCB == NULL &&
552 pDirectoryCB == NULL)
555 pDirectoryCB = pVolumeCB->DirectoryCB;
558 if( bOpenTargetDirectory)
562 // If we have a directory cb for the entry then dereference it and reference the parent
565 if( pDirectoryCB != NULL)
569 // Perform in this order to prevent thrashing
572 lCount = InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
574 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
575 AFS_TRACE_LEVEL_VERBOSE,
576 "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
577 &pParentDirectoryCB->NameInformation.FileName,
583 // Do NOT decrement the reference count on the pDirectoryCB yet.
584 // The BackupEntry below might drop the count to zero leaving
585 // the entry subject to being deleted and we need some of the
586 // contents during later processing
589 AFSBackupEntry( pNameArray);
593 // OK, open the target directory
596 if( uniComponentName.Length == 0)
598 AFSRetrieveFinalComponent( &uniFileName,
602 ntStatus = AFSOpenTargetDirectory( Irp,
609 if( pDirectoryCB != NULL)
612 // It is now safe to drop the Reference Count
614 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
616 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
617 AFS_TRACE_LEVEL_VERBOSE,
618 "AFSCommonCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
619 &pDirectoryCB->NameInformation.FileName,
625 if( !NT_SUCCESS( ntStatus))
628 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
629 AFS_TRACE_LEVEL_ERROR,
630 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
631 &pParentDirectoryCB->NameInformation.FileName,
635 // Decrement the reference on the parent
638 lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
640 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
641 AFS_TRACE_LEVEL_VERBOSE,
642 "AFSCommonCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
643 &pParentDirectoryCB->NameInformation.FileName,
649 try_return( ntStatus);
652 if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
655 if( pDirectoryCB == NULL ||
656 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
658 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
659 AFS_TRACE_LEVEL_VERBOSE,
660 "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
664 pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
668 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
669 AFS_TRACE_LEVEL_VERBOSE,
670 "AFSCommonCreate (%08lX) Opening as reparse point %wZ Type %08lX\n",
673 pDirectoryCB->ObjectInformation->FileType);
675 bOpenedReparsePoint = TRUE;
680 // Based on the options passed in, process the file accordingly.
683 if( ulCreateDisposition == FILE_CREATE ||
684 ( ( ulCreateDisposition == FILE_OPEN_IF ||
685 ulCreateDisposition == FILE_OVERWRITE_IF) &&
686 pDirectoryCB == NULL))
689 if( uniComponentName.Length == 0 ||
690 pDirectoryCB != NULL)
694 // We traversed the entire path so we found each entry,
695 // fail with collision
698 if( pDirectoryCB != NULL)
701 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
702 AFS_TRACE_LEVEL_VERBOSE,
703 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
704 &pDirectoryCB->NameInformation.FileName,
707 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
709 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
710 AFS_TRACE_LEVEL_VERBOSE,
711 "AFSCommonCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
712 &pDirectoryCB->NameInformation.FileName,
720 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
721 AFS_TRACE_LEVEL_VERBOSE,
722 "AFSCommonCreate Object name collision on create Status %08lX\n",
725 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
727 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
728 AFS_TRACE_LEVEL_VERBOSE,
729 "AFSCommonCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
730 &pParentDirectoryCB->NameInformation.FileName,
733 pParentDirectoryCB->OpenReferenceCount);
736 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
740 // OK, go and create the node
743 ntStatus = AFSProcessCreate( Irp,
753 if( !NT_SUCCESS( ntStatus))
756 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
757 AFS_TRACE_LEVEL_ERROR,
758 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
760 &pParentDirectoryCB->NameInformation.FileName,
765 // Dereference the parent entry
768 lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
770 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
771 AFS_TRACE_LEVEL_VERBOSE,
772 "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
773 &pParentDirectoryCB->NameInformation.FileName,
778 try_return( ntStatus);
782 // We should not have an extra component except for PIOCtl opens
785 if( uniComponentName.Length > 0)
789 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
792 if( RtlCompareUnicodeString( &AFSPIOCtlName,
797 ntStatus = AFSOpenIOCtlFcb( Irp,
803 if( !NT_SUCCESS( ntStatus))
806 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
807 AFS_TRACE_LEVEL_ERROR,
808 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
816 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
817 AFS_TRACE_LEVEL_VERBOSE,
818 "AFSCommonCreate (%08lX) File %wZ name not found\n",
822 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
825 if( !NT_SUCCESS( ntStatus))
829 // Dereference the parent entry
832 if( pDirectoryCB != NULL)
835 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
837 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
838 AFS_TRACE_LEVEL_VERBOSE,
839 "AFSCommonCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
840 &pDirectoryCB->NameInformation.FileName,
848 lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
850 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
851 AFS_TRACE_LEVEL_VERBOSE,
852 "AFSCommonCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
853 &pParentDirectoryCB->NameInformation.FileName,
860 try_return( ntStatus);
864 // For root opens the parent will be NULL
867 if( pParentDirectoryCB == NULL)
871 // Check for the delete on close flag for the root
874 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
877 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
878 AFS_TRACE_LEVEL_ERROR,
879 "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
882 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
884 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
885 AFS_TRACE_LEVEL_VERBOSE,
886 "AFSCommonCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
887 &pDirectoryCB->NameInformation.FileName,
892 try_return( ntStatus = STATUS_CANNOT_DELETE);
896 // If this is the target directory, then bail
899 if( bOpenTargetDirectory)
902 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
903 AFS_TRACE_LEVEL_ERROR,
904 "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
907 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
909 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
910 AFS_TRACE_LEVEL_VERBOSE,
911 "AFSCommonCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
912 &pDirectoryCB->NameInformation.FileName,
917 try_return( ntStatus = STATUS_INVALID_PARAMETER);
921 // Go and open the root of the volume
924 ntStatus = AFSOpenRoot( Irp,
930 if( !NT_SUCCESS( ntStatus))
933 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
934 AFS_TRACE_LEVEL_ERROR,
935 "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
936 pVolumeCB->ObjectInformation.FileId.Cell,
937 pVolumeCB->ObjectInformation.FileId.Volume,
940 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
942 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
943 AFS_TRACE_LEVEL_VERBOSE,
944 "AFSCommonCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
945 &pDirectoryCB->NameInformation.FileName,
951 try_return( ntStatus);
955 // At this point if we have no pDirectoryCB it was not found.
958 if( pDirectoryCB == NULL)
961 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
962 AFS_TRACE_LEVEL_ERROR,
963 "AFSCommonCreate Failing access to %wZ\n",
966 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
969 if( ulCreateDisposition == FILE_OVERWRITE ||
970 ulCreateDisposition == FILE_SUPERSEDE ||
971 ulCreateDisposition == FILE_OVERWRITE_IF)
975 // Go process a file for overwrite or supersede.
978 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
987 if( !NT_SUCCESS( ntStatus))
990 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
991 AFS_TRACE_LEVEL_ERROR,
992 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
993 &pDirectoryCB->NameInformation.FileName,
996 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
998 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
999 AFS_TRACE_LEVEL_VERBOSE,
1000 "AFSCommonCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
1001 &pDirectoryCB->NameInformation.FileName,
1007 try_return( ntStatus);
1011 // Trying to open the file
1014 ntStatus = AFSProcessOpen( Irp,
1022 if( !NT_SUCCESS( ntStatus))
1025 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1026 AFS_TRACE_LEVEL_ERROR,
1027 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
1028 &pDirectoryCB->NameInformation.FileName,
1031 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
1033 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1034 AFS_TRACE_LEVEL_VERBOSE,
1035 "AFSCommonCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
1036 &pDirectoryCB->NameInformation.FileName,
1044 if( NT_SUCCESS( ntStatus) &&
1045 ntStatus != STATUS_REPARSE)
1051 RtlCopyMemory( &pCcb->AuthGroup,
1056 // If we have a substitute name, then use it
1059 if( uniSubstitutedPathName.Buffer != NULL)
1062 pCcb->FullFileName = uniSubstitutedPathName;
1064 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1066 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1071 pCcb->FullFileName = uniRootFileName;
1073 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1076 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1078 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1082 if( bOpenedReparsePoint)
1084 SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
1087 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1088 AFS_TRACE_LEVEL_VERBOSE,
1089 "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1090 &pCcb->DirectoryCB->NameInformation.FileName,
1093 pCcb->DirectoryCB->OpenReferenceCount);
1095 ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
1097 pCcb->CurrentDirIndex = 0;
1099 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1102 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1106 // Save off the name array for this instance
1109 pCcb->NameArray = pNameArray;
1115 // If we make it here then init the FO for the request.
1118 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1119 AFS_TRACE_LEVEL_VERBOSE_2,
1120 "AFSCommonCreate (%08lX) FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1126 pFileObject->FsContext = (void *)pFcb;
1128 pFileObject->FsContext2 = (void *)pCcb;
1133 ASSERT( pFcb->OpenHandleCount > 0);
1135 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1138 // For files perform additional processing
1141 if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
1143 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1147 // If the user did not request nobuffering then mark the FO as cacheable
1150 if( bNoIntermediateBuffering)
1153 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1158 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1162 // If the file was opened for execution then we need to set the bit in the FO
1165 if( BooleanFlagOn( *pDesiredAccess,
1169 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1173 // Update the last access time
1176 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1187 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1188 AFS_TRACE_LEVEL_ERROR,
1189 "AFSCommonCreate (%08lX) Returning with NULL Fcb FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1198 if( NT_SUCCESS( ntStatus) &&
1199 ntStatus == STATUS_REPARSE)
1202 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1203 AFS_TRACE_LEVEL_ERROR,
1204 "AFSCommonCreate (%08lX) STATUS_REPARSE FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1212 // Free up the sub name if we have one
1215 if( uniSubstitutedPathName.Buffer != NULL)
1218 AFSExFreePool( uniSubstitutedPathName.Buffer);
1220 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1225 // Free up the name array ...
1228 if( pNameArray != NULL)
1231 AFSFreeNameArray( pNameArray);
1234 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1237 AFSExFreePool( uniRootFileName.Buffer);
1243 lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
1245 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1246 AFS_TRACE_LEVEL_VERBOSE,
1247 "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
1253 // Setup the Irp for completion, the Information has been set previously
1256 Irp->IoStatus.Status = ntStatus;
1263 AFSOpenRedirector( IN PIRP Irp,
1268 NTSTATUS ntStatus = STATUS_SUCCESS;
1275 // Initialize the Ccb for the file.
1278 ntStatus = AFSInitCcb( Ccb);
1280 if( !NT_SUCCESS( ntStatus))
1283 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1284 AFS_TRACE_LEVEL_ERROR,
1285 "AFSOpenRedirector (%08lX) Failed to allocate Ccb\n",
1288 try_return( ntStatus);
1295 (*Ccb)->DirectoryCB = AFSRedirectorRoot->DirectoryCB;
1298 // Increment the open count on this Fcb
1301 lCount = InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenReferenceCount);
1303 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1304 AFS_TRACE_LEVEL_VERBOSE,
1305 "AFSOpenRedirector Increment count on Fcb %08lX Cnt %d\n",
1306 AFSRedirectorRoot->RootFcb,
1309 lCount = InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenHandleCount);
1311 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1312 AFS_TRACE_LEVEL_VERBOSE,
1313 "AFSOpenRedirector Increment handle count on Fcb %08lX Cnt %d\n",
1314 AFSRedirectorRoot->RootFcb,
1317 *Fcb = AFSRedirectorRoot->RootFcb;
1319 lCount = InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
1322 // Return the open result for this file
1325 Irp->IoStatus.Information = FILE_OPENED;
1336 AFSOpenAFSRoot( IN PIRP Irp,
1341 NTSTATUS ntStatus = STATUS_SUCCESS;
1348 // Initialize the Ccb for the file.
1351 ntStatus = AFSInitCcb( Ccb);
1353 if( !NT_SUCCESS( ntStatus))
1356 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1357 AFS_TRACE_LEVEL_ERROR,
1358 "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
1361 try_return( ntStatus);
1368 (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
1371 // Increment the open count on this Fcb
1374 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1376 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1377 AFS_TRACE_LEVEL_VERBOSE,
1378 "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
1379 AFSGlobalRoot->RootFcb,
1382 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1384 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1385 AFS_TRACE_LEVEL_VERBOSE,
1386 "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
1387 AFSGlobalRoot->RootFcb,
1390 *Fcb = AFSGlobalRoot->RootFcb;
1393 // Return the open result for this file
1396 Irp->IoStatus.Information = FILE_OPENED;
1407 AFSOpenRoot( IN PIRP Irp,
1408 IN AFSVolumeCB *VolumeCB,
1410 OUT AFSFcb **RootFcb,
1414 NTSTATUS ntStatus = STATUS_SUCCESS;
1415 PFILE_OBJECT pFileObject = NULL;
1416 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1417 PACCESS_MASK pDesiredAccess = NULL;
1418 USHORT usShareAccess;
1419 BOOLEAN bAllocatedCcb = FALSE;
1420 BOOLEAN bReleaseFcb = FALSE;
1421 AFSFileOpenCB stOpenCB;
1422 AFSFileOpenResultCB stOpenResultCB;
1423 ULONG ulResultLen = 0;
1429 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1430 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1432 pFileObject = pIrpSp->FileObject;
1435 // Check if we should go and retrieve updated information for the node
1438 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1443 if( !NT_SUCCESS( ntStatus))
1446 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1447 AFS_TRACE_LEVEL_ERROR,
1448 "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
1452 try_return( ntStatus);
1456 // Check with the service that we can open the file
1459 RtlZeroMemory( &stOpenCB,
1460 sizeof( AFSFileOpenCB));
1462 stOpenCB.DesiredAccess = *pDesiredAccess;
1464 stOpenCB.ShareAccess = usShareAccess;
1466 stOpenResultCB.GrantedAccess = 0;
1468 ulResultLen = sizeof( AFSFileOpenResultCB);
1470 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1471 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1474 &VolumeCB->ObjectInformation.FileId,
1476 sizeof( AFSFileOpenCB),
1477 (void *)&stOpenResultCB,
1480 if( !NT_SUCCESS( ntStatus))
1483 UNICODE_STRING uniGUID;
1486 uniGUID.MaximumLength = 0;
1487 uniGUID.Buffer = NULL;
1489 if( AuthGroup != NULL)
1491 RtlStringFromGUID( *AuthGroup,
1495 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1496 AFS_TRACE_LEVEL_ERROR,
1497 "AFSOpenRoot (%08lX) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
1499 VolumeCB->ObjectInformation.FileId.Cell,
1500 VolumeCB->ObjectInformation.FileId.Volume,
1504 if( AuthGroup != NULL)
1506 RtlFreeUnicodeString( &uniGUID);
1509 try_return( ntStatus);
1513 // If the entry is not initialized then do it now
1516 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1519 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1522 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1525 ntStatus = AFSEnumerateDirectory( AuthGroup,
1526 &VolumeCB->ObjectInformation,
1529 if( !NT_SUCCESS( ntStatus))
1532 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1534 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1535 AFS_TRACE_LEVEL_ERROR,
1536 "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
1540 try_return( ntStatus);
1543 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1546 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1550 // If the root fcb has been initialized then check access otherwise
1551 // init the volume fcb
1554 if( VolumeCB->RootFcb == NULL)
1557 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1560 if( !NT_SUCCESS( ntStatus))
1563 try_return( ntStatus);
1569 AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
1576 // If there are current opens on the Fcb, check the access.
1579 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1582 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1585 &VolumeCB->RootFcb->ShareAccess,
1588 if( !NT_SUCCESS( ntStatus))
1591 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1592 AFS_TRACE_LEVEL_ERROR,
1593 "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
1597 try_return( ntStatus);
1602 // Initialize the Ccb for the file.
1605 ntStatus = AFSInitCcb( Ccb);
1607 if( !NT_SUCCESS( ntStatus))
1610 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1611 AFS_TRACE_LEVEL_ERROR,
1612 "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
1616 try_return( ntStatus);
1619 bAllocatedCcb = TRUE;
1625 (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
1627 (*Ccb)->GrantedAccess = *pDesiredAccess;
1630 // OK, update the share access on the fileobject
1633 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1636 IoUpdateShareAccess( pFileObject,
1637 &VolumeCB->RootFcb->ShareAccess);
1646 IoSetShareAccess( *pDesiredAccess,
1649 &VolumeCB->RootFcb->ShareAccess);
1653 // Increment the open count on this Fcb
1656 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1658 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1659 AFS_TRACE_LEVEL_VERBOSE,
1660 "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
1664 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1666 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1667 AFS_TRACE_LEVEL_VERBOSE,
1668 "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
1673 // Indicate the object is held
1676 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1679 // Return the open result for this file
1682 Irp->IoStatus.Information = FILE_OPENED;
1684 *RootFcb = VolumeCB->RootFcb;
1691 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1694 if( !NT_SUCCESS( ntStatus))
1706 Irp->IoStatus.Information = 0;
1714 AFSProcessCreate( IN PIRP Irp,
1716 IN AFSVolumeCB *VolumeCB,
1717 IN AFSDirectoryCB *ParentDirCB,
1718 IN PUNICODE_STRING FileName,
1719 IN PUNICODE_STRING ComponentName,
1720 IN PUNICODE_STRING FullFileName,
1725 NTSTATUS ntStatus = STATUS_SUCCESS;
1726 PFILE_OBJECT pFileObject = NULL;
1727 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1728 ULONG ulOptions = 0;
1729 ULONG ulShareMode = 0;
1731 ULONG ulAttributes = 0;
1732 LARGE_INTEGER liAllocationSize = {0,0};
1733 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1734 BOOLEAN bAllocatedFcb = FALSE;
1735 PACCESS_MASK pDesiredAccess = NULL;
1736 USHORT usShareAccess;
1737 AFSDirectoryCB *pDirEntry = NULL;
1738 AFSObjectInfoCB *pParentObjectInfo = NULL;
1739 AFSObjectInfoCB *pObjectInfo = NULL;
1745 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1746 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1748 pFileObject = pIrpSp->FileObject;
1751 // Extract out the options
1754 ulOptions = pIrpSp->Parameters.Create.Options;
1757 // We pass all attributes they want to apply to the file to the create
1760 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1763 // If this is a directory create then set the attribute correctly
1766 if( ulOptions & FILE_DIRECTORY_FILE)
1769 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1772 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1773 AFS_TRACE_LEVEL_VERBOSE,
1774 "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
1779 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1782 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1783 AFS_TRACE_LEVEL_ERROR,
1784 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1787 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
1790 pParentObjectInfo = ParentDirCB->ObjectInformation;
1793 // Allocate and insert the direntry into the parent node
1796 ntStatus = AFSCreateDirEntry( AuthGroup,
1804 if( !NT_SUCCESS( ntStatus))
1807 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1808 AFS_TRACE_LEVEL_ERROR,
1809 "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
1814 try_return( ntStatus);
1817 bFileCreated = TRUE;
1819 pObjectInfo = pDirEntry->ObjectInformation;
1821 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1822 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1825 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1826 AFS_TRACE_LEVEL_VERBOSE,
1827 "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1829 &pDirEntry->NameInformation.FileName,
1830 pObjectInfo->FileId.Cell,
1831 pObjectInfo->FileId.Volume,
1832 pObjectInfo->FileId.Vnode,
1833 pObjectInfo->FileId.Unique);
1835 ntStatus = AFSEvaluateNode( AuthGroup,
1838 if( !NT_SUCCESS( ntStatus))
1841 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1842 AFS_TRACE_LEVEL_ERROR,
1843 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1845 &pDirEntry->NameInformation.FileName,
1846 pObjectInfo->FileId.Cell,
1847 pObjectInfo->FileId.Volume,
1848 pObjectInfo->FileId.Vnode,
1849 pObjectInfo->FileId.Unique,
1852 try_return( ntStatus);
1855 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1859 // We may have raced and the Fcb is already created
1862 if( pObjectInfo->Fcb != NULL)
1865 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1866 AFS_TRACE_LEVEL_VERBOSE,
1867 "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
1871 *Fcb = pObjectInfo->Fcb;
1873 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
1880 // Allocate and initialize the Fcb for the file.
1883 ntStatus = AFSInitFcb( pDirEntry,
1886 if( !NT_SUCCESS( ntStatus))
1889 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1890 AFS_TRACE_LEVEL_ERROR,
1891 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
1896 try_return( ntStatus);
1899 bAllocatedFcb = TRUE;
1905 // Initialize the Ccb for the file.
1908 ntStatus = AFSInitCcb( Ccb);
1910 if( !NT_SUCCESS( ntStatus))
1913 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1914 AFS_TRACE_LEVEL_ERROR,
1915 "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
1920 try_return( ntStatus);
1923 bAllocatedCcb = TRUE;
1926 // Initialize the Ccb
1929 (*Ccb)->DirectoryCB = pDirEntry;
1931 (*Ccb)->GrantedAccess = *pDesiredAccess;
1934 // If this is a file, update the headers filesizes.
1937 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1941 // Update the sizes with the information passed in
1944 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1945 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1946 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1949 // Notify the system of the addition
1952 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1954 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1955 (ULONG)FILE_ACTION_ADDED);
1957 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1959 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1963 // This is a new directory node so indicate it has been enumerated
1966 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1969 // And the parent directory entry
1972 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1975 // Notify the system of the addition
1978 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1980 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1981 (ULONG)FILE_ACTION_ADDED);
1983 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
1984 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
1985 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
1986 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
1990 // And the parent directory entry
1993 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1996 // Notify the system of the addition
1999 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2001 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2002 (ULONG)FILE_ACTION_ADDED);
2006 // Save off the access for the open
2009 IoSetShareAccess( *pDesiredAccess,
2012 &(*Fcb)->ShareAccess);
2015 // Increment the open count on this Fcb
2018 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
2020 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2021 AFS_TRACE_LEVEL_VERBOSE,
2022 "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
2026 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
2028 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2029 AFS_TRACE_LEVEL_VERBOSE,
2030 "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
2035 // Increment the open reference and handle on the parent node
2038 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2040 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2041 AFS_TRACE_LEVEL_VERBOSE,
2042 "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
2043 pObjectInfo->ParentObjectInformation,
2046 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2048 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2049 AFS_TRACE_LEVEL_VERBOSE,
2050 "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
2051 pObjectInfo->ParentObjectInformation,
2054 if( ulOptions & FILE_DELETE_ON_CLOSE)
2058 // Mark it for delete on close
2061 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2062 AFS_TRACE_LEVEL_VERBOSE,
2063 "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2068 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2072 // Indicate the object is locked in the service
2075 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2078 // Return the open result for this file
2081 Irp->IoStatus.Information = FILE_CREATED;
2086 // If we created the Fcb we need to release the resources
2092 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2095 if( !NT_SUCCESS( ntStatus))
2101 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2102 AFS_TRACE_LEVEL_VERBOSE,
2103 "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
2109 // Remove the dir entry from the parent
2112 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2115 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2118 // Decrement the reference added during initialization of the DE
2121 lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
2123 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2124 AFS_TRACE_LEVEL_VERBOSE,
2125 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2126 &pDirEntry->NameInformation.FileName,
2131 // Pull the directory entry from the parent
2134 AFSRemoveDirNodeFromParent( pParentObjectInfo,
2136 FALSE); // Leave it in the enum list so the worker cleans it up
2138 AFSNotifyDelete( pDirEntry,
2143 // Tag the parent as needing verification
2146 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
2148 pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
2150 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2163 AFSRemoveFcb( pObjectInfo->Fcb);
2165 pObjectInfo->Fcb = NULL;
2178 AFSOpenTargetDirectory( IN PIRP Irp,
2179 IN AFSVolumeCB *VolumeCB,
2180 IN AFSDirectoryCB *ParentDirectoryCB,
2181 IN AFSDirectoryCB *TargetDirectoryCB,
2182 IN UNICODE_STRING *TargetName,
2187 NTSTATUS ntStatus = STATUS_SUCCESS;
2188 PFILE_OBJECT pFileObject = NULL;
2189 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2190 PACCESS_MASK pDesiredAccess = NULL;
2191 USHORT usShareAccess;
2192 BOOLEAN bAllocatedCcb = FALSE;
2193 BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2194 AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
2195 UNICODE_STRING uniTargetName;
2201 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2202 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2204 pFileObject = pIrpSp->FileObject;
2206 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2207 AFS_TRACE_LEVEL_VERBOSE,
2208 "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
2212 pParentObject = ParentDirectoryCB->ObjectInformation;
2214 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2217 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2221 // Make sure we have an Fcb for the access
2224 if( pParentObject->Fcb != NULL)
2227 *Fcb = pParentObject->Fcb;
2229 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
2236 // Allocate and initialize the Fcb for the file.
2239 ntStatus = AFSInitFcb( ParentDirectoryCB,
2242 if( !NT_SUCCESS( ntStatus))
2245 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2246 AFS_TRACE_LEVEL_ERROR,
2247 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2249 &ParentDirectoryCB->NameInformation.FileName,
2252 try_return( ntStatus);
2255 bAllocatedFcb = TRUE;
2261 // If there are current opens on the Fcb, check the access.
2264 if( pParentObject->Fcb->OpenHandleCount > 0)
2267 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2270 &pParentObject->Fcb->ShareAccess,
2273 if( !NT_SUCCESS( ntStatus))
2276 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2277 AFS_TRACE_LEVEL_ERROR,
2278 "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
2280 &ParentDirectoryCB->NameInformation.FileName,
2283 try_return( ntStatus);
2288 // Initialize the Ccb for the file.
2291 ntStatus = AFSInitCcb( Ccb);
2293 if( !NT_SUCCESS( ntStatus))
2296 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2297 AFS_TRACE_LEVEL_ERROR,
2298 "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2300 &ParentDirectoryCB->NameInformation.FileName,
2303 try_return( ntStatus);
2306 bAllocatedCcb = TRUE;
2309 // Initialize the Ccb
2312 (*Ccb)->DirectoryCB = ParentDirectoryCB;
2314 (*Ccb)->GrantedAccess = *pDesiredAccess;
2316 if( TargetDirectoryCB != NULL &&
2317 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2323 Irp->IoStatus.Information = FILE_EXISTS;
2325 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2330 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2332 uniTargetName = *TargetName;
2336 // Update the filename in the fileobject for rename processing
2339 RtlCopyMemory( pFileObject->FileName.Buffer,
2340 uniTargetName.Buffer,
2341 uniTargetName.Length);
2343 pFileObject->FileName.Length = uniTargetName.Length;
2346 // OK, update the share access on the fileobject
2349 if( pParentObject->Fcb->OpenHandleCount > 0)
2352 IoUpdateShareAccess( pFileObject,
2353 &pParentObject->Fcb->ShareAccess);
2362 IoSetShareAccess( *pDesiredAccess,
2365 &pParentObject->Fcb->ShareAccess);
2369 // Increment the open count on this Fcb
2372 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2374 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2375 AFS_TRACE_LEVEL_VERBOSE,
2376 "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
2380 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2382 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2383 AFS_TRACE_LEVEL_VERBOSE,
2384 "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
2389 // Increment the open reference and handle on the parent node
2392 if( pParentObject->ParentObjectInformation != NULL)
2395 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2397 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2398 AFS_TRACE_LEVEL_VERBOSE,
2399 "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
2400 pParentObject->ParentObjectInformation,
2403 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2405 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2406 AFS_TRACE_LEVEL_VERBOSE,
2407 "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
2408 pParentObject->ParentObjectInformation,
2417 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2420 if( !NT_SUCCESS( ntStatus))
2435 AFSRemoveFcb( pParentObject->Fcb);
2437 pParentObject->Fcb = NULL;
2448 AFSProcessOpen( IN PIRP Irp,
2450 IN AFSVolumeCB *VolumeCB,
2451 IN AFSDirectoryCB *ParentDirCB,
2452 IN AFSDirectoryCB *DirectoryCB,
2457 NTSTATUS ntStatus = STATUS_SUCCESS;
2458 PFILE_OBJECT pFileObject = NULL;
2459 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2460 PACCESS_MASK pDesiredAccess = NULL;
2461 USHORT usShareAccess;
2462 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2463 ULONG ulAdditionalFlags = 0, ulOptions = 0;
2464 AFSFileOpenCB stOpenCB;
2465 AFSFileOpenResultCB stOpenResultCB;
2466 ULONG ulResultLen = 0;
2467 AFSObjectInfoCB *pParentObjectInfo = NULL;
2468 AFSObjectInfoCB *pObjectInfo = NULL;
2469 ULONG ulFileAccess = 0;
2470 AFSFileAccessReleaseCB stReleaseFileAccess;
2476 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2477 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2479 pFileObject = pIrpSp->FileObject;
2481 pParentObjectInfo = ParentDirCB->ObjectInformation;
2483 pObjectInfo = DirectoryCB->ObjectInformation;
2486 // Check if the entry is pending a deletion
2489 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2492 ntStatus = STATUS_DELETE_PENDING;
2494 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2495 AFS_TRACE_LEVEL_ERROR,
2496 "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
2498 &DirectoryCB->NameInformation.FileName,
2501 try_return( ntStatus);
2505 // Extract out the options
2508 ulOptions = pIrpSp->Parameters.Create.Options;
2511 // Check if we should go and retrieve updated information for the node
2514 ntStatus = AFSValidateEntry( DirectoryCB,
2519 if( !NT_SUCCESS( ntStatus))
2522 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2523 AFS_TRACE_LEVEL_ERROR,
2524 "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
2526 &DirectoryCB->NameInformation.FileName,
2529 try_return( ntStatus);
2533 // If this is marked for delete on close then be sure we can delete the entry
2536 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2539 ntStatus = AFSNotifyDelete( DirectoryCB,
2543 if( !NT_SUCCESS( ntStatus))
2546 ntStatus = STATUS_CANNOT_DELETE;
2548 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2549 AFS_TRACE_LEVEL_ERROR,
2550 "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2552 &DirectoryCB->NameInformation.FileName,
2555 try_return( ntStatus);
2560 // Be sure we have an Fcb for the current object
2563 if( pObjectInfo->Fcb == NULL)
2566 ntStatus = AFSInitFcb( DirectoryCB,
2569 if( !NT_SUCCESS( ntStatus))
2572 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2573 AFS_TRACE_LEVEL_ERROR,
2574 "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
2576 &DirectoryCB->NameInformation.FileName,
2579 try_return( ntStatus);
2582 bAllocatedFcb = TRUE;
2587 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2594 // Reference the Fcb so it won't go away while we call into the service for processing
2597 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2599 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2600 AFS_TRACE_LEVEL_VERBOSE,
2601 "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
2606 // Check access on the entry
2609 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2612 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2615 &pObjectInfo->Fcb->ShareAccess,
2618 if( !NT_SUCCESS( ntStatus))
2621 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2622 AFS_TRACE_LEVEL_ERROR,
2623 "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
2625 &DirectoryCB->NameInformation.FileName,
2628 try_return( ntStatus);
2633 // Additional checks
2636 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2640 // If the caller is asking for write access then try to flush the image section
2643 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2644 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2647 if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2651 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2652 STATUS_SHARING_VIOLATION;
2654 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2655 AFS_TRACE_LEVEL_ERROR,
2656 "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
2658 &DirectoryCB->NameInformation.FileName,
2661 try_return( ntStatus);
2665 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2668 ntStatus = STATUS_NOT_A_DIRECTORY;
2670 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2671 AFS_TRACE_LEVEL_ERROR,
2672 "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
2674 &DirectoryCB->NameInformation.FileName,
2677 try_return( ntStatus);
2680 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2682 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2683 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2686 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2689 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2691 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2692 AFS_TRACE_LEVEL_ERROR,
2693 "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
2695 &DirectoryCB->NameInformation.FileName,
2698 try_return( ntStatus);
2701 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2702 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2703 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2704 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
2711 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2715 // Check with the service that we can open the file
2718 stOpenCB.ParentId = pParentObjectInfo->FileId;
2720 stOpenCB.DesiredAccess = *pDesiredAccess;
2722 stOpenCB.ShareAccess = usShareAccess;
2724 stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2726 stOpenCB.Identifier = (ULONGLONG)pFileObject;
2728 stOpenResultCB.GrantedAccess = 0;
2730 ulResultLen = sizeof( AFSFileOpenResultCB);
2732 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2733 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2735 &DirectoryCB->NameInformation.FileName,
2736 &pObjectInfo->FileId,
2738 sizeof( AFSFileOpenCB),
2739 (void *)&stOpenResultCB,
2742 if( !NT_SUCCESS( ntStatus))
2745 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2746 AFS_TRACE_LEVEL_ERROR,
2747 "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
2749 &DirectoryCB->NameInformation.FileName,
2752 try_return( ntStatus);
2756 // Save the granted access in case we need to release it below
2759 ulFileAccess = stOpenResultCB.FileAccess;
2762 // Check if there is a conflict
2765 if( !AFSCheckAccess( *pDesiredAccess,
2766 stOpenResultCB.GrantedAccess,
2767 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2770 ntStatus = STATUS_ACCESS_DENIED;
2772 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2773 AFS_TRACE_LEVEL_ERROR,
2774 "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2777 stOpenResultCB.GrantedAccess,
2778 &DirectoryCB->NameInformation.FileName,
2781 try_return( ntStatus);
2785 // Initialize the Ccb for the file.
2788 ntStatus = AFSInitCcb( Ccb);
2790 if( !NT_SUCCESS( ntStatus))
2793 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2794 AFS_TRACE_LEVEL_ERROR,
2795 "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2797 &DirectoryCB->NameInformation.FileName,
2800 try_return( ntStatus);
2803 bAllocatedCcb = TRUE;
2805 (*Ccb)->DirectoryCB = DirectoryCB;
2807 (*Ccb)->FileAccess = ulFileAccess;
2809 (*Ccb)->GrantedAccess = *pDesiredAccess;
2812 // Perform the access check on the target if this is a mount point or symlink
2815 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2818 IoUpdateShareAccess( pFileObject,
2819 &pObjectInfo->Fcb->ShareAccess);
2828 IoSetShareAccess( *pDesiredAccess,
2831 &pObjectInfo->Fcb->ShareAccess);
2835 // Increment the open count on this Fcb
2838 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2840 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2841 AFS_TRACE_LEVEL_VERBOSE,
2842 "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
2846 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2848 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2849 AFS_TRACE_LEVEL_VERBOSE,
2850 "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
2855 // Increment the open reference and handle on the parent node
2858 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2860 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2861 AFS_TRACE_LEVEL_VERBOSE,
2862 "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
2863 pObjectInfo->ParentObjectInformation,
2866 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2868 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2869 AFS_TRACE_LEVEL_VERBOSE,
2870 "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
2871 pObjectInfo->ParentObjectInformation,
2874 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2878 // Mark it for delete on close
2881 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2882 AFS_TRACE_LEVEL_VERBOSE,
2883 "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2886 &DirectoryCB->NameInformation.FileName);
2888 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2892 // Indicate the object is held
2895 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2898 // Return the open result for this file
2901 Irp->IoStatus.Information = FILE_OPENED;
2903 *Fcb = pObjectInfo->Fcb;
2911 // Remove the reference we added initially
2914 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2916 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2917 AFS_TRACE_LEVEL_VERBOSE,
2918 "AFSProcessOpen Decrement count on Fcb %08lX Cnt %d\n",
2922 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2925 if( !NT_SUCCESS( ntStatus))
2928 if ( ulFileAccess > 0)
2931 stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2933 stReleaseFileAccess.FileAccess = ulFileAccess;
2935 stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
2937 AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
2938 AFS_REQUEST_FLAG_SYNCHRONOUS,
2940 &DirectoryCB->NameInformation.FileName,
2941 &pObjectInfo->FileId,
2942 (void *)&stReleaseFileAccess,
2943 sizeof( AFSFileAccessReleaseCB),
2960 AFSRemoveFcb( pObjectInfo->Fcb);
2962 pObjectInfo->Fcb = NULL;
2973 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
2975 IN AFSVolumeCB *VolumeCB,
2977 IN AFSDirectoryCB *ParentDirCB,
2978 IN AFSDirectoryCB *DirectoryCB,
2983 NTSTATUS ntStatus = STATUS_SUCCESS;
2984 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2985 PFILE_OBJECT pFileObject = NULL;
2986 LARGE_INTEGER liZero = {0,0};
2987 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
2988 ULONG ulAttributes = 0;
2989 LARGE_INTEGER liTime;
2990 ULONG ulCreateDisposition = 0;
2991 BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
2992 PACCESS_MASK pDesiredAccess = NULL;
2993 USHORT usShareAccess;
2994 AFSObjectInfoCB *pParentObjectInfo = NULL;
2995 AFSObjectInfoCB *pObjectInfo = NULL;
3001 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
3002 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
3004 pFileObject = pIrpSp->FileObject;
3006 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
3008 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
3010 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
3013 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3014 AFS_TRACE_LEVEL_ERROR,
3015 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
3017 &DirectoryCB->NameInformation.FileName);
3019 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
3022 pParentObjectInfo = ParentDirCB->ObjectInformation;
3024 pObjectInfo = DirectoryCB->ObjectInformation;
3027 // Check if we should go and retrieve updated information for the node
3030 ntStatus = AFSValidateEntry( DirectoryCB,
3035 if( !NT_SUCCESS( ntStatus))
3038 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3039 AFS_TRACE_LEVEL_ERROR,
3040 "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
3042 &DirectoryCB->NameInformation.FileName,
3045 try_return( ntStatus);
3049 // Be sure we have an Fcb for the object block
3052 if( pObjectInfo->Fcb == NULL)
3055 ntStatus = AFSInitFcb( DirectoryCB,
3058 if( !NT_SUCCESS( ntStatus))
3061 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3062 AFS_TRACE_LEVEL_ERROR,
3063 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
3065 &DirectoryCB->NameInformation.FileName,
3068 try_return( ntStatus);
3071 bAllocatedFcb = TRUE;
3076 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
3083 // Reference the Fcb so it won't go away while processing the request
3086 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3088 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3089 AFS_TRACE_LEVEL_VERBOSE,
3090 "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
3095 // Check access on the entry
3098 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3101 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3104 &pObjectInfo->Fcb->ShareAccess,
3107 if( !NT_SUCCESS( ntStatus))
3110 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3111 AFS_TRACE_LEVEL_ERROR,
3112 "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
3114 &DirectoryCB->NameInformation.FileName,
3117 try_return( ntStatus);
3122 // Before we actually truncate, check to see if the purge
3123 // is going to fail.
3126 if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3130 ntStatus = STATUS_USER_MAPPED_FILE;
3132 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3133 AFS_TRACE_LEVEL_ERROR,
3134 "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
3136 &DirectoryCB->NameInformation.FileName,
3139 try_return( ntStatus);
3143 // Initialize the Ccb for the file.
3146 ntStatus = AFSInitCcb( Ccb);
3148 if( !NT_SUCCESS( ntStatus))
3151 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3152 AFS_TRACE_LEVEL_ERROR,
3153 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
3155 &DirectoryCB->NameInformation.FileName,
3158 try_return( ntStatus);
3161 bAllocatedCcb = TRUE;
3164 // Initialize the Ccb
3167 (*Ccb)->DirectoryCB = DirectoryCB;
3169 (*Ccb)->GrantedAccess = *pDesiredAccess;
3172 // Need to purge any data currently in the cache
3175 CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3180 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3181 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3182 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3184 pObjectInfo->EndOfFile.QuadPart = 0;
3185 pObjectInfo->AllocationSize.QuadPart = 0;
3188 // Trim down the extents. We do this BEFORE telling the service
3189 // the file is truncated since there is a potential race between
3190 // a worker thread releasing extents and us trimming
3193 AFSTrimExtents( pObjectInfo->Fcb,
3194 &pObjectInfo->Fcb->Header.FileSize);
3196 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3198 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3200 //KeQuerySystemTime( &pObjectInfo->CreationTime);
3202 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3204 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3208 if( !NT_SUCCESS( ntStatus))
3211 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3212 AFS_TRACE_LEVEL_ERROR,
3213 "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
3215 &DirectoryCB->NameInformation.FileName,
3218 try_return( ntStatus);
3221 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3224 bReleasePaging = TRUE;
3226 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3228 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3230 pFileObject->FsContext2 = (void *)*Ccb;
3233 // Set the update flag accordingly
3236 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3237 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3238 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3239 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3240 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3242 CcSetFileSizes( pFileObject,
3243 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3245 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3247 bReleasePaging = FALSE;
3249 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3251 if( ulCreateDisposition == FILE_SUPERSEDE)
3254 pObjectInfo->FileAttributes = ulAttributes;
3260 pObjectInfo->FileAttributes |= ulAttributes;
3264 // Save off the access for the open
3267 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3270 IoUpdateShareAccess( pFileObject,
3271 &pObjectInfo->Fcb->ShareAccess);
3280 IoSetShareAccess( *pDesiredAccess,
3283 &pObjectInfo->Fcb->ShareAccess);
3287 // Return the correct action
3290 if( ulCreateDisposition == FILE_SUPERSEDE)
3293 Irp->IoStatus.Information = FILE_SUPERSEDED;
3298 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3302 // Increment the open count on this Fcb.
3305 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3307 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3308 AFS_TRACE_LEVEL_VERBOSE,
3309 "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
3313 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3315 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3316 AFS_TRACE_LEVEL_VERBOSE,
3317 "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
3322 // Increment the open reference and handle on the parent node
3325 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3327 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3328 AFS_TRACE_LEVEL_VERBOSE,
3329 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
3330 pObjectInfo->ParentObjectInformation,
3333 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3335 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3336 AFS_TRACE_LEVEL_VERBOSE,
3337 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
3338 pObjectInfo->ParentObjectInformation,
3341 *Fcb = pObjectInfo->Fcb;
3348 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3355 // Remove the reference we added above to prevent tear down
3358 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3360 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3361 AFS_TRACE_LEVEL_VERBOSE,
3362 "AFSProcessOverwriteSupersede Decrement count on Fcb %08lX Cnt %d\n",
3366 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3369 if( !NT_SUCCESS( ntStatus))
3384 AFSRemoveFcb( pObjectInfo->Fcb);
3386 pObjectInfo->Fcb = NULL;
3397 AFSControlDeviceCreate( IN PIRP Irp)
3400 NTSTATUS ntStatus = STATUS_SUCCESS;
3406 // For now, jsut let the open happen
3409 Irp->IoStatus.Information = FILE_OPENED;
3416 AFSOpenIOCtlFcb( IN PIRP Irp,
3418 IN AFSDirectoryCB *ParentDirCB,
3423 NTSTATUS ntStatus = STATUS_SUCCESS;
3424 PFILE_OBJECT pFileObject = NULL;
3425 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3426 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3427 UNICODE_STRING uniFullFileName;
3428 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3430 AFSObjectInfoCB *pParentObjectInfo = NULL;
3436 pFileObject = pIrpSp->FileObject;
3438 pParentObjectInfo = ParentDirCB->ObjectInformation;
3441 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3444 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3447 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3449 if( !NT_SUCCESS( ntStatus))
3452 try_return( ntStatus);
3456 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
3460 // Allocate and initialize the Fcb for the file.
3463 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
3466 if( !NT_SUCCESS( ntStatus))
3469 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3470 AFS_TRACE_LEVEL_ERROR,
3471 "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3475 try_return( ntStatus);
3478 bAllocatedFcb = TRUE;
3483 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3485 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3492 // Initialize the Ccb for the file.
3495 ntStatus = AFSInitCcb( Ccb);
3497 if( !NT_SUCCESS( ntStatus))
3500 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3501 AFS_TRACE_LEVEL_ERROR,
3502 "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3506 try_return( ntStatus);
3509 bAllocatedCcb = TRUE;
3515 (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
3518 // Set the PIOCtl index
3521 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3523 RtlZeroMemory( &stPIOCtlOpen,
3524 sizeof( AFSPIOCtlOpenCloseRequestCB));
3526 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3528 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3530 RtlZeroMemory( &stFileID,
3531 sizeof( AFSFileID));
3534 // The parent directory FID of the node
3537 stFileID = pParentObjectInfo->FileId;
3540 // Issue the open request to the service
3543 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3544 AFS_REQUEST_FLAG_SYNCHRONOUS,
3548 (void *)&stPIOCtlOpen,
3549 sizeof( AFSPIOCtlOpenCloseRequestCB),
3553 if( !NT_SUCCESS( ntStatus))
3556 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3557 AFS_TRACE_LEVEL_ERROR,
3558 "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
3562 try_return( ntStatus);
3566 // Reference the directory entry
3569 lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
3571 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3572 AFS_TRACE_LEVEL_VERBOSE,
3573 "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
3574 &(*Ccb)->DirectoryCB->NameInformation.FileName,
3575 (*Ccb)->DirectoryCB,
3580 // Increment the open reference and handle on the node
3583 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3585 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3586 AFS_TRACE_LEVEL_VERBOSE,
3587 "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
3591 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3593 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3594 AFS_TRACE_LEVEL_VERBOSE,
3595 "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
3600 // Increment the open reference and handle on the parent node
3603 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3605 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3606 AFS_TRACE_LEVEL_VERBOSE,
3607 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3611 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3613 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3614 AFS_TRACE_LEVEL_VERBOSE,
3615 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3620 // Return the open result for this file
3623 Irp->IoStatus.Information = FILE_OPENED;
3628 //Dereference the passed in parent since the returned dir entry
3629 // is already referenced
3632 lCount = InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
3634 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3635 AFS_TRACE_LEVEL_VERBOSE,
3636 "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3637 &ParentDirCB->NameInformation.FileName,
3643 // If we created the Fcb we need to release the resources
3649 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3652 if( !NT_SUCCESS( ntStatus))
3668 // Need to tear down this Fcb since it is not in the tree for the worker thread
3671 AFSRemoveFcb( *Fcb);
3673 pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
3686 AFSOpenSpecialShareFcb( IN PIRP Irp,
3688 IN AFSDirectoryCB *DirectoryCB,
3693 NTSTATUS ntStatus = STATUS_SUCCESS;
3694 PFILE_OBJECT pFileObject = NULL;
3695 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3696 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3697 AFSObjectInfoCB *pParentObjectInfo = NULL;
3698 AFSPipeOpenCloseRequestCB stPipeOpen;
3704 pFileObject = pIrpSp->FileObject;
3706 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3707 AFS_TRACE_LEVEL_VERBOSE_2,
3708 "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
3710 &DirectoryCB->NameInformation.FileName);
3712 pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
3714 if( DirectoryCB->ObjectInformation->Fcb == NULL)
3718 // Allocate and initialize the Fcb for the file.
3721 ntStatus = AFSInitFcb( DirectoryCB,
3724 if( !NT_SUCCESS( ntStatus))
3727 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3728 AFS_TRACE_LEVEL_ERROR,
3729 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3733 try_return( ntStatus);
3736 bAllocateFcb = TRUE;
3741 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3743 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3750 // Initialize the Ccb for the file.
3753 ntStatus = AFSInitCcb( Ccb);
3755 if( !NT_SUCCESS( ntStatus))
3758 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3759 AFS_TRACE_LEVEL_ERROR,
3760 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3764 try_return( ntStatus);
3767 bAllocatedCcb = TRUE;
3773 (*Ccb)->DirectoryCB = DirectoryCB;
3776 // Call the service to open the share
3779 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3781 RtlZeroMemory( &stPipeOpen,
3782 sizeof( AFSPipeOpenCloseRequestCB));
3784 stPipeOpen.RequestId = (*Ccb)->RequestID;
3786 stPipeOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3789 // Issue the open request to the service
3792 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_OPEN,
3793 AFS_REQUEST_FLAG_SYNCHRONOUS,
3795 &DirectoryCB->NameInformation.FileName,
3797 (void *)&stPipeOpen,
3798 sizeof( AFSPipeOpenCloseRequestCB),
3802 if( !NT_SUCCESS( ntStatus))
3805 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3806 AFS_TRACE_LEVEL_ERROR,
3807 "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
3811 try_return( ntStatus);
3815 // Increment the open count on this Fcb
3818 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3820 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3821 AFS_TRACE_LEVEL_VERBOSE,
3822 "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
3826 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3828 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3829 AFS_TRACE_LEVEL_VERBOSE,
3830 "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
3835 // Increment the open reference and handle on the parent node
3838 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3840 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3841 AFS_TRACE_LEVEL_VERBOSE,
3842 "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3846 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3848 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3849 AFS_TRACE_LEVEL_VERBOSE,
3850 "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3855 // Return the open result for this file
3858 Irp->IoStatus.Information = FILE_OPENED;
3865 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3868 if( !NT_SUCCESS( ntStatus))
3884 // Need to tear down this Fcb since it is not in the tree for the worker thread
3887 AFSRemoveFcb( *Fcb);
3889 DirectoryCB->ObjectInformation->Fcb = NULL;