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(),
191 // If we are in shutdown mode then fail the request
194 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
197 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
198 AFS_TRACE_LEVEL_WARNING,
199 "AFSCommonCreate (%08lX) Open request after shutdown\n",
202 try_return( ntStatus = STATUS_TOO_LATE);
205 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
208 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
210 if( !NT_SUCCESS( ntStatus))
213 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
214 AFS_TRACE_LEVEL_ERROR,
215 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
218 try_return( ntStatus);
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 AFSOpenAFSRoot( 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 "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
1288 try_return( ntStatus);
1295 (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
1298 // Increment the open count on this Fcb
1301 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1303 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1304 AFS_TRACE_LEVEL_VERBOSE,
1305 "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
1306 AFSGlobalRoot->RootFcb,
1309 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1311 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1312 AFS_TRACE_LEVEL_VERBOSE,
1313 "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
1314 AFSGlobalRoot->RootFcb,
1317 *Fcb = AFSGlobalRoot->RootFcb;
1320 // Return the open result for this file
1323 Irp->IoStatus.Information = FILE_OPENED;
1334 AFSOpenRoot( IN PIRP Irp,
1335 IN AFSVolumeCB *VolumeCB,
1337 OUT AFSFcb **RootFcb,
1341 NTSTATUS ntStatus = STATUS_SUCCESS;
1342 PFILE_OBJECT pFileObject = NULL;
1343 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1344 PACCESS_MASK pDesiredAccess = NULL;
1345 USHORT usShareAccess;
1347 BOOLEAN bAllocatedCcb = FALSE;
1348 BOOLEAN bReleaseFcb = FALSE;
1349 AFSFileOpenCB stOpenCB;
1350 AFSFileOpenResultCB stOpenResultCB;
1351 ULONG ulResultLen = 0;
1357 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1358 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1359 ulOptions = pIrpSp->Parameters.Create.Options;
1361 pFileObject = pIrpSp->FileObject;
1363 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
1366 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
1368 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1369 AFS_TRACE_LEVEL_ERROR,
1370 "AFSOpenRoot (%08lX) Attempt to open root as file Status %08lX\n",
1374 try_return( ntStatus);
1378 // Check if we should go and retrieve updated information for the node
1381 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1386 if( !NT_SUCCESS( ntStatus))
1389 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1390 AFS_TRACE_LEVEL_ERROR,
1391 "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
1395 try_return( ntStatus);
1399 // Check with the service that we can open the file
1402 RtlZeroMemory( &stOpenCB,
1403 sizeof( AFSFileOpenCB));
1405 stOpenCB.DesiredAccess = *pDesiredAccess;
1407 stOpenCB.ShareAccess = usShareAccess;
1409 stOpenResultCB.GrantedAccess = 0;
1411 ulResultLen = sizeof( AFSFileOpenResultCB);
1413 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1414 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1417 &VolumeCB->ObjectInformation.FileId,
1419 sizeof( AFSFileOpenCB),
1420 (void *)&stOpenResultCB,
1423 if( !NT_SUCCESS( ntStatus))
1426 UNICODE_STRING uniGUID;
1429 uniGUID.MaximumLength = 0;
1430 uniGUID.Buffer = NULL;
1432 if( AuthGroup != NULL)
1434 RtlStringFromGUID( *AuthGroup,
1438 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1439 AFS_TRACE_LEVEL_ERROR,
1440 "AFSOpenRoot (%08lX) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
1442 VolumeCB->ObjectInformation.FileId.Cell,
1443 VolumeCB->ObjectInformation.FileId.Volume,
1447 if( AuthGroup != NULL)
1449 RtlFreeUnicodeString( &uniGUID);
1452 try_return( ntStatus);
1456 // If the entry is not initialized then do it now
1459 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1462 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1465 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1468 ntStatus = AFSEnumerateDirectory( AuthGroup,
1469 &VolumeCB->ObjectInformation,
1472 if( !NT_SUCCESS( ntStatus))
1475 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1477 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1478 AFS_TRACE_LEVEL_ERROR,
1479 "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
1483 try_return( ntStatus);
1486 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1489 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1493 // If the root fcb has been initialized then check access otherwise
1494 // init the volume fcb
1497 if( VolumeCB->RootFcb == NULL)
1500 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1503 if( !NT_SUCCESS( ntStatus))
1506 try_return( ntStatus);
1512 AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
1519 // If there are current opens on the Fcb, check the access.
1522 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1525 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1528 &VolumeCB->RootFcb->ShareAccess,
1531 if( !NT_SUCCESS( ntStatus))
1534 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1535 AFS_TRACE_LEVEL_ERROR,
1536 "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
1540 try_return( ntStatus);
1545 // Initialize the Ccb for the file.
1548 ntStatus = AFSInitCcb( Ccb);
1550 if( !NT_SUCCESS( ntStatus))
1553 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1554 AFS_TRACE_LEVEL_ERROR,
1555 "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
1559 try_return( ntStatus);
1562 bAllocatedCcb = TRUE;
1568 (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
1570 (*Ccb)->GrantedAccess = *pDesiredAccess;
1573 // OK, update the share access on the fileobject
1576 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1579 IoUpdateShareAccess( pFileObject,
1580 &VolumeCB->RootFcb->ShareAccess);
1589 IoSetShareAccess( *pDesiredAccess,
1592 &VolumeCB->RootFcb->ShareAccess);
1596 // Increment the open count on this Fcb
1599 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1601 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1602 AFS_TRACE_LEVEL_VERBOSE,
1603 "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
1607 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1609 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1610 AFS_TRACE_LEVEL_VERBOSE,
1611 "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
1616 // Indicate the object is held
1619 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1622 // Return the open result for this file
1625 Irp->IoStatus.Information = FILE_OPENED;
1627 *RootFcb = VolumeCB->RootFcb;
1634 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1637 if( !NT_SUCCESS( ntStatus))
1649 Irp->IoStatus.Information = 0;
1657 AFSProcessCreate( IN PIRP Irp,
1659 IN AFSVolumeCB *VolumeCB,
1660 IN AFSDirectoryCB *ParentDirCB,
1661 IN PUNICODE_STRING FileName,
1662 IN PUNICODE_STRING ComponentName,
1663 IN PUNICODE_STRING FullFileName,
1668 NTSTATUS ntStatus = STATUS_SUCCESS;
1669 PFILE_OBJECT pFileObject = NULL;
1670 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1671 ULONG ulOptions = 0;
1672 ULONG ulShareMode = 0;
1674 ULONG ulAttributes = 0;
1675 LARGE_INTEGER liAllocationSize = {0,0};
1676 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1677 BOOLEAN bAllocatedFcb = FALSE;
1678 PACCESS_MASK pDesiredAccess = NULL;
1679 USHORT usShareAccess;
1680 AFSDirectoryCB *pDirEntry = NULL;
1681 AFSObjectInfoCB *pParentObjectInfo = NULL;
1682 AFSObjectInfoCB *pObjectInfo = NULL;
1688 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1689 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1691 pFileObject = pIrpSp->FileObject;
1694 // Extract out the options
1697 ulOptions = pIrpSp->Parameters.Create.Options;
1700 // We pass all attributes they want to apply to the file to the create
1703 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1706 // If this is a directory create then set the attribute correctly
1709 if( ulOptions & FILE_DIRECTORY_FILE)
1712 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1715 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1716 AFS_TRACE_LEVEL_VERBOSE,
1717 "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
1722 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1725 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1726 AFS_TRACE_LEVEL_ERROR,
1727 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1730 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
1733 pParentObjectInfo = ParentDirCB->ObjectInformation;
1736 // Allocate and insert the direntry into the parent node
1739 ntStatus = AFSCreateDirEntry( AuthGroup,
1747 if( !NT_SUCCESS( ntStatus))
1750 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1751 AFS_TRACE_LEVEL_ERROR,
1752 "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
1757 try_return( ntStatus);
1760 bFileCreated = TRUE;
1762 pObjectInfo = pDirEntry->ObjectInformation;
1764 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1765 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1768 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1769 AFS_TRACE_LEVEL_VERBOSE,
1770 "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1772 &pDirEntry->NameInformation.FileName,
1773 pObjectInfo->FileId.Cell,
1774 pObjectInfo->FileId.Volume,
1775 pObjectInfo->FileId.Vnode,
1776 pObjectInfo->FileId.Unique);
1778 ntStatus = AFSEvaluateNode( AuthGroup,
1781 if( !NT_SUCCESS( ntStatus))
1784 if ( ntStatus == STATUS_NOT_A_DIRECTORY)
1787 if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
1790 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1791 AFS_TRACE_LEVEL_ERROR,
1792 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1794 &pDirEntry->NameInformation.FileName,
1795 pObjectInfo->FileId.Cell,
1796 pObjectInfo->FileId.Volume,
1797 pObjectInfo->FileId.Vnode,
1798 pObjectInfo->FileId.Unique,
1799 pParentObjectInfo->FileId.Cell,
1800 pParentObjectInfo->FileId.Volume,
1801 pParentObjectInfo->FileId.Vnode,
1802 pParentObjectInfo->FileId.Unique,
1805 else if ( pObjectInfo->ParentObjectInformation == NULL)
1808 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1809 AFS_TRACE_LEVEL_ERROR,
1810 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
1812 &pDirEntry->NameInformation.FileName,
1813 pObjectInfo->FileId.Cell,
1814 pObjectInfo->FileId.Volume,
1815 pObjectInfo->FileId.Vnode,
1816 pObjectInfo->FileId.Unique,
1817 pParentObjectInfo->FileId.Cell,
1818 pParentObjectInfo->FileId.Volume,
1819 pParentObjectInfo->FileId.Vnode,
1820 pParentObjectInfo->FileId.Unique,
1826 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1827 AFS_TRACE_LEVEL_ERROR,
1828 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1830 &pDirEntry->NameInformation.FileName,
1831 pObjectInfo->FileId.Cell,
1832 pObjectInfo->FileId.Volume,
1833 pObjectInfo->FileId.Vnode,
1834 pObjectInfo->FileId.Unique,
1835 pParentObjectInfo->FileId.Cell,
1836 pParentObjectInfo->FileId.Volume,
1837 pParentObjectInfo->FileId.Vnode,
1838 pParentObjectInfo->FileId.Unique,
1839 pObjectInfo->ParentObjectInformation->FileId.Cell,
1840 pObjectInfo->ParentObjectInformation->FileId.Volume,
1841 pObjectInfo->ParentObjectInformation->FileId.Vnode,
1842 pObjectInfo->ParentObjectInformation->FileId.Unique,
1849 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1850 AFS_TRACE_LEVEL_ERROR,
1851 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1853 &pDirEntry->NameInformation.FileName,
1854 pObjectInfo->FileId.Cell,
1855 pObjectInfo->FileId.Volume,
1856 pObjectInfo->FileId.Vnode,
1857 pObjectInfo->FileId.Unique,
1861 try_return( ntStatus);
1864 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1868 // We may have raced and the Fcb is already created
1871 if( pObjectInfo->Fcb != NULL)
1874 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1875 AFS_TRACE_LEVEL_VERBOSE,
1876 "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
1880 *Fcb = pObjectInfo->Fcb;
1882 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
1889 // Allocate and initialize the Fcb for the file.
1892 ntStatus = AFSInitFcb( pDirEntry);
1894 *Fcb = pObjectInfo->Fcb;
1896 if( !NT_SUCCESS( ntStatus))
1899 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1900 AFS_TRACE_LEVEL_ERROR,
1901 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
1906 try_return( ntStatus);
1909 if ( ntStatus != STATUS_REPARSE)
1912 bAllocatedFcb = TRUE;
1915 ntStatus = STATUS_SUCCESS;
1919 // Increment the open count on this Fcb
1922 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1924 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1925 AFS_TRACE_LEVEL_VERBOSE,
1926 "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
1933 // Initialize the Ccb for the file.
1936 ntStatus = AFSInitCcb( Ccb);
1938 if( !NT_SUCCESS( ntStatus))
1941 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1942 AFS_TRACE_LEVEL_ERROR,
1943 "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
1948 try_return( ntStatus);
1951 bAllocatedCcb = TRUE;
1954 // Initialize the Ccb
1957 (*Ccb)->DirectoryCB = pDirEntry;
1959 (*Ccb)->GrantedAccess = *pDesiredAccess;
1962 // If this is a file, update the headers filesizes.
1965 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1969 // Update the sizes with the information passed in
1972 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1973 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1974 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1977 // Notify the system of the addition
1980 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1982 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1983 (ULONG)FILE_ACTION_ADDED);
1985 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1987 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1991 // This is a new directory node so indicate it has been enumerated
1994 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1997 // And the parent directory entry
2000 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
2003 // Notify the system of the addition
2006 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2008 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2009 (ULONG)FILE_ACTION_ADDED);
2011 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2012 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2013 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2014 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
2018 // And the parent directory entry
2021 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
2024 // Notify the system of the addition
2027 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2029 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2030 (ULONG)FILE_ACTION_ADDED);
2034 // Save off the access for the open
2037 IoSetShareAccess( *pDesiredAccess,
2040 &(*Fcb)->ShareAccess);
2042 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
2044 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2045 AFS_TRACE_LEVEL_VERBOSE,
2046 "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
2051 // Increment the open reference and handle on the parent node
2054 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2056 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2057 AFS_TRACE_LEVEL_VERBOSE,
2058 "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
2059 pObjectInfo->ParentObjectInformation,
2062 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2064 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2065 AFS_TRACE_LEVEL_VERBOSE,
2066 "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
2067 pObjectInfo->ParentObjectInformation,
2070 if( ulOptions & FILE_DELETE_ON_CLOSE)
2074 // Mark it for delete on close
2077 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2078 AFS_TRACE_LEVEL_VERBOSE,
2079 "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2084 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2088 // Indicate the object is locked in the service
2091 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2094 // Return the open result for this file
2097 Irp->IoStatus.Information = FILE_CREATED;
2102 // If we created the Fcb we need to release the resources
2108 if( !NT_SUCCESS( ntStatus))
2111 // Decrement the open count on this Fcb
2114 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
2116 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2117 AFS_TRACE_LEVEL_VERBOSE,
2118 "AFSProcessCreate Decrement count on Fcb %08lX Cnt %d\n",
2123 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2126 if( !NT_SUCCESS( ntStatus))
2132 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2133 AFS_TRACE_LEVEL_VERBOSE,
2134 "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
2140 // Remove the dir entry from the parent
2143 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2146 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2148 AFSNotifyDelete( pDirEntry,
2153 // Decrement the reference added during initialization of the DE
2156 lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
2158 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2159 AFS_TRACE_LEVEL_VERBOSE,
2160 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2161 &pDirEntry->NameInformation.FileName,
2166 // Pull the directory entry from the parent
2169 AFSRemoveDirNodeFromParent( pParentObjectInfo,
2171 FALSE); // Leave it in the enum list so the worker cleans it up
2174 // Tag the parent as needing verification
2177 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
2179 pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
2181 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2194 AFSRemoveFcb( &pObjectInfo->Fcb);
2207 AFSOpenTargetDirectory( IN PIRP Irp,
2208 IN AFSVolumeCB *VolumeCB,
2209 IN AFSDirectoryCB *ParentDirectoryCB,
2210 IN AFSDirectoryCB *TargetDirectoryCB,
2211 IN UNICODE_STRING *TargetName,
2216 NTSTATUS ntStatus = STATUS_SUCCESS;
2217 PFILE_OBJECT pFileObject = NULL;
2218 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2219 PACCESS_MASK pDesiredAccess = NULL;
2220 USHORT usShareAccess;
2221 BOOLEAN bAllocatedCcb = FALSE;
2222 BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2223 AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
2224 UNICODE_STRING uniTargetName;
2230 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2231 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2233 pFileObject = pIrpSp->FileObject;
2235 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2236 AFS_TRACE_LEVEL_VERBOSE,
2237 "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
2241 pParentObject = ParentDirectoryCB->ObjectInformation;
2243 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2246 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2250 // Make sure we have an Fcb for the access
2253 if( pParentObject->Fcb != NULL)
2256 *Fcb = pParentObject->Fcb;
2258 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
2265 // Allocate and initialize the Fcb for the file.
2268 ntStatus = AFSInitFcb( ParentDirectoryCB);
2270 *Fcb = pParentObject->Fcb;
2272 if( !NT_SUCCESS( ntStatus))
2275 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2276 AFS_TRACE_LEVEL_ERROR,
2277 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2279 &ParentDirectoryCB->NameInformation.FileName,
2282 try_return( ntStatus);
2285 if ( ntStatus == STATUS_REPARSE)
2288 bAllocatedFcb = TRUE;
2291 ntStatus = STATUS_SUCCESS;
2295 // Increment the open count on this Fcb
2298 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2300 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2301 AFS_TRACE_LEVEL_VERBOSE,
2302 "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
2309 // If there are current opens on the Fcb, check the access.
2312 if( pParentObject->Fcb->OpenHandleCount > 0)
2315 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2318 &pParentObject->Fcb->ShareAccess,
2321 if( !NT_SUCCESS( ntStatus))
2324 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2325 AFS_TRACE_LEVEL_ERROR,
2326 "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
2328 &ParentDirectoryCB->NameInformation.FileName,
2331 try_return( ntStatus);
2336 // Initialize the Ccb for the file.
2339 ntStatus = AFSInitCcb( Ccb);
2341 if( !NT_SUCCESS( ntStatus))
2344 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2345 AFS_TRACE_LEVEL_ERROR,
2346 "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2348 &ParentDirectoryCB->NameInformation.FileName,
2351 try_return( ntStatus);
2354 bAllocatedCcb = TRUE;
2357 // Initialize the Ccb
2360 (*Ccb)->DirectoryCB = ParentDirectoryCB;
2362 (*Ccb)->GrantedAccess = *pDesiredAccess;
2364 if( TargetDirectoryCB != NULL &&
2365 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2371 Irp->IoStatus.Information = FILE_EXISTS;
2373 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2378 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2380 uniTargetName = *TargetName;
2384 // Update the filename in the fileobject for rename processing
2387 RtlCopyMemory( pFileObject->FileName.Buffer,
2388 uniTargetName.Buffer,
2389 uniTargetName.Length);
2391 pFileObject->FileName.Length = uniTargetName.Length;
2394 // OK, update the share access on the fileobject
2397 if( pParentObject->Fcb->OpenHandleCount > 0)
2400 IoUpdateShareAccess( pFileObject,
2401 &pParentObject->Fcb->ShareAccess);
2410 IoSetShareAccess( *pDesiredAccess,
2413 &pParentObject->Fcb->ShareAccess);
2416 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2418 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2419 AFS_TRACE_LEVEL_VERBOSE,
2420 "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
2425 // Increment the open reference and handle on the parent node
2428 if( pParentObject->ParentObjectInformation != NULL)
2431 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2433 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2434 AFS_TRACE_LEVEL_VERBOSE,
2435 "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
2436 pParentObject->ParentObjectInformation,
2439 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2441 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2442 AFS_TRACE_LEVEL_VERBOSE,
2443 "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
2444 pParentObject->ParentObjectInformation,
2453 if( !NT_SUCCESS( ntStatus))
2456 // Decrement the open count on this Fcb
2459 lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
2461 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2462 AFS_TRACE_LEVEL_VERBOSE,
2463 "AFSOpenTargetDirectory Decrement count on Fcb %08lX Cnt %d\n",
2468 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2471 if( !NT_SUCCESS( ntStatus))
2486 AFSRemoveFcb( &pParentObject->Fcb);
2497 AFSProcessOpen( IN PIRP Irp,
2499 IN AFSVolumeCB *VolumeCB,
2500 IN AFSDirectoryCB *ParentDirCB,
2501 IN AFSDirectoryCB *DirectoryCB,
2506 NTSTATUS ntStatus = STATUS_SUCCESS;
2507 PFILE_OBJECT pFileObject = NULL;
2508 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2509 PACCESS_MASK pDesiredAccess = NULL;
2510 USHORT usShareAccess;
2511 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2512 ULONG ulAdditionalFlags = 0, ulOptions = 0;
2513 AFSFileOpenCB stOpenCB;
2514 AFSFileOpenResultCB stOpenResultCB;
2515 ULONG ulResultLen = 0;
2516 AFSObjectInfoCB *pParentObjectInfo = NULL;
2517 AFSObjectInfoCB *pObjectInfo = NULL;
2518 ULONG ulFileAccess = 0;
2519 AFSFileAccessReleaseCB stReleaseFileAccess;
2525 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2526 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2528 pFileObject = pIrpSp->FileObject;
2530 pParentObjectInfo = ParentDirCB->ObjectInformation;
2532 pObjectInfo = DirectoryCB->ObjectInformation;
2535 // Check if the entry is pending a deletion
2538 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2541 ntStatus = STATUS_DELETE_PENDING;
2543 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2544 AFS_TRACE_LEVEL_ERROR,
2545 "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
2547 &DirectoryCB->NameInformation.FileName,
2550 try_return( ntStatus);
2554 // Extract out the options
2557 ulOptions = pIrpSp->Parameters.Create.Options;
2560 // Check if we should go and retrieve updated information for the node
2563 ntStatus = AFSValidateEntry( DirectoryCB,
2568 if( !NT_SUCCESS( ntStatus))
2571 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2572 AFS_TRACE_LEVEL_ERROR,
2573 "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
2575 &DirectoryCB->NameInformation.FileName,
2578 try_return( ntStatus);
2582 // If this is marked for delete on close then be sure we can delete the entry
2585 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2588 ntStatus = AFSNotifyDelete( DirectoryCB,
2592 if( !NT_SUCCESS( ntStatus))
2595 ntStatus = STATUS_CANNOT_DELETE;
2597 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2598 AFS_TRACE_LEVEL_ERROR,
2599 "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2601 &DirectoryCB->NameInformation.FileName,
2604 try_return( ntStatus);
2609 // Be sure we have an Fcb for the current object
2612 if( pObjectInfo->Fcb == NULL)
2615 ntStatus = AFSInitFcb( DirectoryCB);
2617 if( !NT_SUCCESS( ntStatus))
2620 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2621 AFS_TRACE_LEVEL_ERROR,
2622 "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
2624 &DirectoryCB->NameInformation.FileName,
2627 try_return( ntStatus);
2630 if ( ntStatus != STATUS_REPARSE)
2633 bAllocatedFcb = TRUE;
2636 ntStatus = STATUS_SUCCESS;
2641 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2646 // Increment the open count on this Fcb
2649 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2651 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2652 AFS_TRACE_LEVEL_VERBOSE,
2653 "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
2660 // Check access on the entry
2663 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2666 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2669 &pObjectInfo->Fcb->ShareAccess,
2672 if( !NT_SUCCESS( ntStatus))
2675 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2676 AFS_TRACE_LEVEL_ERROR,
2677 "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
2679 &DirectoryCB->NameInformation.FileName,
2682 try_return( ntStatus);
2687 // Additional checks
2690 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2694 // If the caller is asking for write access then try to flush the image section
2697 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2698 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2701 if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2705 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2706 STATUS_SHARING_VIOLATION;
2708 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2709 AFS_TRACE_LEVEL_ERROR,
2710 "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
2712 &DirectoryCB->NameInformation.FileName,
2715 try_return( ntStatus);
2719 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2722 ntStatus = STATUS_NOT_A_DIRECTORY;
2724 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2725 AFS_TRACE_LEVEL_ERROR,
2726 "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
2728 &DirectoryCB->NameInformation.FileName,
2731 try_return( ntStatus);
2734 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2736 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2737 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2740 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2743 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2745 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2746 AFS_TRACE_LEVEL_ERROR,
2747 "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
2749 &DirectoryCB->NameInformation.FileName,
2752 try_return( ntStatus);
2755 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2756 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2757 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2758 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
2765 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2769 // Check with the service that we can open the file
2772 stOpenCB.ParentId = pParentObjectInfo->FileId;
2774 stOpenCB.DesiredAccess = *pDesiredAccess;
2776 stOpenCB.ShareAccess = usShareAccess;
2778 stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2780 stOpenCB.Identifier = (ULONGLONG)pFileObject;
2782 stOpenResultCB.GrantedAccess = 0;
2784 ulResultLen = sizeof( AFSFileOpenResultCB);
2786 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2787 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2789 &DirectoryCB->NameInformation.FileName,
2790 &pObjectInfo->FileId,
2792 sizeof( AFSFileOpenCB),
2793 (void *)&stOpenResultCB,
2796 if( !NT_SUCCESS( ntStatus))
2799 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2800 AFS_TRACE_LEVEL_ERROR,
2801 "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
2803 &DirectoryCB->NameInformation.FileName,
2806 try_return( ntStatus);
2810 // Save the granted access in case we need to release it below
2813 ulFileAccess = stOpenResultCB.FileAccess;
2816 // Check if there is a conflict
2819 if( !AFSCheckAccess( *pDesiredAccess,
2820 stOpenResultCB.GrantedAccess,
2821 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2824 ntStatus = STATUS_ACCESS_DENIED;
2826 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2827 AFS_TRACE_LEVEL_ERROR,
2828 "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2831 stOpenResultCB.GrantedAccess,
2832 &DirectoryCB->NameInformation.FileName,
2835 try_return( ntStatus);
2839 // Initialize the Ccb for the file.
2842 ntStatus = AFSInitCcb( Ccb);
2844 if( !NT_SUCCESS( ntStatus))
2847 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2848 AFS_TRACE_LEVEL_ERROR,
2849 "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2851 &DirectoryCB->NameInformation.FileName,
2854 try_return( ntStatus);
2857 bAllocatedCcb = TRUE;
2859 (*Ccb)->DirectoryCB = DirectoryCB;
2861 (*Ccb)->FileAccess = ulFileAccess;
2863 (*Ccb)->GrantedAccess = *pDesiredAccess;
2866 // Perform the access check on the target if this is a mount point or symlink
2869 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2872 IoUpdateShareAccess( pFileObject,
2873 &pObjectInfo->Fcb->ShareAccess);
2882 IoSetShareAccess( *pDesiredAccess,
2885 &pObjectInfo->Fcb->ShareAccess);
2888 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2890 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2891 AFS_TRACE_LEVEL_VERBOSE,
2892 "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
2897 // Increment the open reference and handle on the parent node
2900 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2902 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2903 AFS_TRACE_LEVEL_VERBOSE,
2904 "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
2905 pObjectInfo->ParentObjectInformation,
2908 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2910 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2911 AFS_TRACE_LEVEL_VERBOSE,
2912 "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
2913 pObjectInfo->ParentObjectInformation,
2916 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2920 // Mark it for delete on close
2923 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2924 AFS_TRACE_LEVEL_VERBOSE,
2925 "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2928 &DirectoryCB->NameInformation.FileName);
2930 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2934 // Indicate the object is held
2937 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2940 // Return the open result for this file
2943 Irp->IoStatus.Information = FILE_OPENED;
2945 *Fcb = pObjectInfo->Fcb;
2952 if( !NT_SUCCESS( ntStatus))
2955 // Decrement the open count on this Fcb
2958 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2960 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2961 AFS_TRACE_LEVEL_VERBOSE,
2962 "AFSProcessOpen Decrement2 count on Fcb %08lX Cnt %d\n",
2967 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2970 if( !NT_SUCCESS( ntStatus))
2973 if ( ulFileAccess > 0)
2976 stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2978 stReleaseFileAccess.FileAccess = ulFileAccess;
2980 stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
2982 AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
2983 AFS_REQUEST_FLAG_SYNCHRONOUS,
2985 &DirectoryCB->NameInformation.FileName,
2986 &pObjectInfo->FileId,
2987 (void *)&stReleaseFileAccess,
2988 sizeof( AFSFileAccessReleaseCB),
3005 AFSRemoveFcb( &pObjectInfo->Fcb);
3016 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
3018 IN AFSVolumeCB *VolumeCB,
3020 IN AFSDirectoryCB *ParentDirCB,
3021 IN AFSDirectoryCB *DirectoryCB,
3026 NTSTATUS ntStatus = STATUS_SUCCESS;
3027 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3028 PFILE_OBJECT pFileObject = NULL;
3029 LARGE_INTEGER liZero = {0,0};
3030 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
3031 ULONG ulAttributes = 0;
3032 LARGE_INTEGER liTime;
3033 ULONG ulCreateDisposition = 0;
3034 BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3035 PACCESS_MASK pDesiredAccess = NULL;
3036 USHORT usShareAccess;
3037 AFSObjectInfoCB *pParentObjectInfo = NULL;
3038 AFSObjectInfoCB *pObjectInfo = NULL;
3044 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
3045 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
3047 pFileObject = pIrpSp->FileObject;
3049 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
3051 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
3053 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
3056 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3057 AFS_TRACE_LEVEL_ERROR,
3058 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
3060 &DirectoryCB->NameInformation.FileName);
3062 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
3065 pParentObjectInfo = ParentDirCB->ObjectInformation;
3067 pObjectInfo = DirectoryCB->ObjectInformation;
3070 // Check if we should go and retrieve updated information for the node
3073 ntStatus = AFSValidateEntry( DirectoryCB,
3078 if( !NT_SUCCESS( ntStatus))
3081 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3082 AFS_TRACE_LEVEL_ERROR,
3083 "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
3085 &DirectoryCB->NameInformation.FileName,
3088 try_return( ntStatus);
3092 // Be sure we have an Fcb for the object block
3095 if( pObjectInfo->Fcb == NULL)
3098 ntStatus = AFSInitFcb( DirectoryCB);
3100 *Fcb = pObjectInfo->Fcb;
3102 if( !NT_SUCCESS( ntStatus))
3105 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3106 AFS_TRACE_LEVEL_ERROR,
3107 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
3109 &DirectoryCB->NameInformation.FileName,
3112 try_return( ntStatus);
3115 if ( ntStatus != STATUS_REPARSE)
3118 bAllocatedFcb = TRUE;
3121 ntStatus = STATUS_SUCCESS;
3126 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
3131 // Increment the open count on this Fcb.
3134 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3136 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3137 AFS_TRACE_LEVEL_VERBOSE,
3138 "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
3145 // Check access on the entry
3148 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3151 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3154 &pObjectInfo->Fcb->ShareAccess,
3157 if( !NT_SUCCESS( ntStatus))
3160 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3161 AFS_TRACE_LEVEL_ERROR,
3162 "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
3164 &DirectoryCB->NameInformation.FileName,
3167 try_return( ntStatus);
3172 // Before we actually truncate, check to see if the purge
3173 // is going to fail.
3176 if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3180 ntStatus = STATUS_USER_MAPPED_FILE;
3182 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3183 AFS_TRACE_LEVEL_ERROR,
3184 "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
3186 &DirectoryCB->NameInformation.FileName,
3189 try_return( ntStatus);
3193 // Initialize the Ccb for the file.
3196 ntStatus = AFSInitCcb( Ccb);
3198 if( !NT_SUCCESS( ntStatus))
3201 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3202 AFS_TRACE_LEVEL_ERROR,
3203 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
3205 &DirectoryCB->NameInformation.FileName,
3208 try_return( ntStatus);
3211 bAllocatedCcb = TRUE;
3214 // Initialize the Ccb
3217 (*Ccb)->DirectoryCB = DirectoryCB;
3219 (*Ccb)->GrantedAccess = *pDesiredAccess;
3222 // Need to purge any data currently in the cache
3225 CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3230 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3231 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3232 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3234 pObjectInfo->EndOfFile.QuadPart = 0;
3235 pObjectInfo->AllocationSize.QuadPart = 0;
3238 // Trim down the extents. We do this BEFORE telling the service
3239 // the file is truncated since there is a potential race between
3240 // a worker thread releasing extents and us trimming
3243 AFSTrimExtents( pObjectInfo->Fcb,
3244 &pObjectInfo->Fcb->Header.FileSize);
3246 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3248 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3250 //KeQuerySystemTime( &pObjectInfo->CreationTime);
3252 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3254 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3258 if( !NT_SUCCESS( ntStatus))
3261 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3262 AFS_TRACE_LEVEL_ERROR,
3263 "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
3265 &DirectoryCB->NameInformation.FileName,
3268 try_return( ntStatus);
3271 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3274 bReleasePaging = TRUE;
3276 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3278 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3280 pFileObject->FsContext2 = (void *)*Ccb;
3283 // Set the update flag accordingly
3286 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3287 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3288 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3289 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3290 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3292 CcSetFileSizes( pFileObject,
3293 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3295 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3297 bReleasePaging = FALSE;
3299 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3301 if( ulCreateDisposition == FILE_SUPERSEDE)
3304 pObjectInfo->FileAttributes = ulAttributes;
3310 pObjectInfo->FileAttributes |= ulAttributes;
3314 // Save off the access for the open
3317 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3320 IoUpdateShareAccess( pFileObject,
3321 &pObjectInfo->Fcb->ShareAccess);
3330 IoSetShareAccess( *pDesiredAccess,
3333 &pObjectInfo->Fcb->ShareAccess);
3337 // Return the correct action
3340 if( ulCreateDisposition == FILE_SUPERSEDE)
3343 Irp->IoStatus.Information = FILE_SUPERSEDED;
3348 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3351 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3353 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3354 AFS_TRACE_LEVEL_VERBOSE,
3355 "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
3360 // Increment the open reference and handle on the parent node
3363 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3365 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3366 AFS_TRACE_LEVEL_VERBOSE,
3367 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
3368 pObjectInfo->ParentObjectInformation,
3371 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3373 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3374 AFS_TRACE_LEVEL_VERBOSE,
3375 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
3376 pObjectInfo->ParentObjectInformation,
3379 *Fcb = pObjectInfo->Fcb;
3386 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3392 if( !NT_SUCCESS( ntStatus))
3395 // Decrement the open count on this Fcb.
3398 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3400 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3401 AFS_TRACE_LEVEL_VERBOSE,
3402 "AFSProcessOverwriteSupersede Decrement2 count on Fcb %08lX Cnt %d\n",
3407 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3410 if( !NT_SUCCESS( ntStatus))
3425 AFSRemoveFcb( &pObjectInfo->Fcb);
3436 AFSControlDeviceCreate( IN PIRP Irp)
3439 NTSTATUS ntStatus = STATUS_SUCCESS;
3445 // For now, jsut let the open happen
3448 Irp->IoStatus.Information = FILE_OPENED;
3455 AFSOpenIOCtlFcb( IN PIRP Irp,
3457 IN AFSDirectoryCB *ParentDirCB,
3462 NTSTATUS ntStatus = STATUS_SUCCESS;
3463 PFILE_OBJECT pFileObject = NULL;
3464 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3465 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3466 UNICODE_STRING uniFullFileName;
3467 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3469 AFSObjectInfoCB *pParentObjectInfo = NULL;
3475 pFileObject = pIrpSp->FileObject;
3477 pParentObjectInfo = ParentDirCB->ObjectInformation;
3480 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3483 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3486 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3488 if( !NT_SUCCESS( ntStatus))
3491 try_return( ntStatus);
3495 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
3499 // Allocate and initialize the Fcb for the file.
3502 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
3504 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3506 if( !NT_SUCCESS( ntStatus))
3509 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3510 AFS_TRACE_LEVEL_ERROR,
3511 "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3515 try_return( ntStatus);
3518 if ( ntStatus != STATUS_REPARSE)
3521 bAllocatedFcb = TRUE;
3524 ntStatus = STATUS_SUCCESS;
3529 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3531 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3536 // Increment the open reference and handle on the node
3539 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3541 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3542 AFS_TRACE_LEVEL_VERBOSE,
3543 "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
3550 // Initialize the Ccb for the file.
3553 ntStatus = AFSInitCcb( Ccb);
3555 if( !NT_SUCCESS( ntStatus))
3558 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3559 AFS_TRACE_LEVEL_ERROR,
3560 "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3564 try_return( ntStatus);
3567 bAllocatedCcb = TRUE;
3573 (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
3576 // Set the PIOCtl index
3579 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3581 RtlZeroMemory( &stPIOCtlOpen,
3582 sizeof( AFSPIOCtlOpenCloseRequestCB));
3584 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3586 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3588 RtlZeroMemory( &stFileID,
3589 sizeof( AFSFileID));
3592 // The parent directory FID of the node
3595 stFileID = pParentObjectInfo->FileId;
3598 // Issue the open request to the service
3601 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3602 AFS_REQUEST_FLAG_SYNCHRONOUS,
3606 (void *)&stPIOCtlOpen,
3607 sizeof( AFSPIOCtlOpenCloseRequestCB),
3611 if( !NT_SUCCESS( ntStatus))
3614 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3615 AFS_TRACE_LEVEL_ERROR,
3616 "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
3620 try_return( ntStatus);
3624 // Reference the directory entry
3627 lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
3629 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3630 AFS_TRACE_LEVEL_VERBOSE,
3631 "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
3632 &(*Ccb)->DirectoryCB->NameInformation.FileName,
3633 (*Ccb)->DirectoryCB,
3638 // Increment the handle on the node
3641 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3643 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3644 AFS_TRACE_LEVEL_VERBOSE,
3645 "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
3650 // Increment the open reference and handle on the parent node
3653 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3655 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3656 AFS_TRACE_LEVEL_VERBOSE,
3657 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3661 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3663 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3664 AFS_TRACE_LEVEL_VERBOSE,
3665 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3670 // Return the open result for this file
3673 Irp->IoStatus.Information = FILE_OPENED;
3678 //Dereference the passed in parent since the returned dir entry
3679 // is already referenced
3682 lCount = InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
3684 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3685 AFS_TRACE_LEVEL_VERBOSE,
3686 "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3687 &ParentDirCB->NameInformation.FileName,
3693 // If we created the Fcb we need to release the resources
3699 if( !NT_SUCCESS( ntStatus))
3702 // Decrement the open reference and handle on the node
3705 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
3707 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3708 AFS_TRACE_LEVEL_VERBOSE,
3709 "AFSOpenIOCtlFcb Decrement count on Fcb %08lX Cnt %d\n",
3714 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3717 if( !NT_SUCCESS( ntStatus))
3733 // Need to tear down this Fcb since it is not in the tree for the worker thread
3736 AFSRemoveFcb( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
3747 AFSOpenSpecialShareFcb( IN PIRP Irp,
3749 IN AFSDirectoryCB *DirectoryCB,
3754 NTSTATUS ntStatus = STATUS_SUCCESS;
3755 PFILE_OBJECT pFileObject = NULL;
3756 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3757 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3758 AFSObjectInfoCB *pParentObjectInfo = NULL;
3759 AFSPipeOpenCloseRequestCB stPipeOpen;
3765 pFileObject = pIrpSp->FileObject;
3767 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3768 AFS_TRACE_LEVEL_VERBOSE_2,
3769 "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
3771 &DirectoryCB->NameInformation.FileName);
3773 pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
3775 if( DirectoryCB->ObjectInformation->Fcb == NULL)
3779 // Allocate and initialize the Fcb for the file.
3782 ntStatus = AFSInitFcb( DirectoryCB);
3784 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3786 if( !NT_SUCCESS( ntStatus))
3789 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3790 AFS_TRACE_LEVEL_ERROR,
3791 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3795 try_return( ntStatus);
3798 if ( ntStatus != STATUS_REPARSE)
3801 bAllocateFcb = TRUE;
3804 ntStatus = STATUS_SUCCESS;
3809 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3811 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3816 // Increment the open count on this Fcb
3819 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3821 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3822 AFS_TRACE_LEVEL_VERBOSE,
3823 "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
3830 // Initialize the Ccb for the file.
3833 ntStatus = AFSInitCcb( Ccb);
3835 if( !NT_SUCCESS( ntStatus))
3838 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3839 AFS_TRACE_LEVEL_ERROR,
3840 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3844 try_return( ntStatus);
3847 bAllocatedCcb = TRUE;
3853 (*Ccb)->DirectoryCB = DirectoryCB;
3856 // Call the service to open the share
3859 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3861 RtlZeroMemory( &stPipeOpen,
3862 sizeof( AFSPipeOpenCloseRequestCB));
3864 stPipeOpen.RequestId = (*Ccb)->RequestID;
3866 stPipeOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3869 // Issue the open request to the service
3872 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_OPEN,
3873 AFS_REQUEST_FLAG_SYNCHRONOUS,
3875 &DirectoryCB->NameInformation.FileName,
3877 (void *)&stPipeOpen,
3878 sizeof( AFSPipeOpenCloseRequestCB),
3882 if( !NT_SUCCESS( ntStatus))
3885 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3886 AFS_TRACE_LEVEL_ERROR,
3887 "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
3891 try_return( ntStatus);
3894 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3896 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3897 AFS_TRACE_LEVEL_VERBOSE,
3898 "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
3903 // Increment the open reference and handle on the parent node
3906 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3908 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3909 AFS_TRACE_LEVEL_VERBOSE,
3910 "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3914 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3916 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3917 AFS_TRACE_LEVEL_VERBOSE,
3918 "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3923 // Return the open result for this file
3926 Irp->IoStatus.Information = FILE_OPENED;
3933 if( !NT_SUCCESS( ntStatus))
3936 // Decrement the open count on this Fcb
3939 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
3941 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3942 AFS_TRACE_LEVEL_VERBOSE,
3943 "AFSOpenSpecialShareFcb Decrement count on Fcb %08lX Cnt %d\n",
3948 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3951 if( !NT_SUCCESS( ntStatus))
3967 // Need to tear down this Fcb since it is not in the tree for the worker thread
3970 AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);