2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSCreate.cpp
39 #include "AFSCommon.h"
42 // Function: AFSCreate
46 // This function is the dispatch handler for the IRP_MJ_CREATE requests. It makes the determination to
47 // which interface this request is destined.
51 // A status is returned for the function. The Irp completion processing is handled in the specific
56 AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
59 UNREFERENCED_PARAMETER(LibDeviceObject);
60 NTSTATUS ntStatus = STATUS_SUCCESS;
61 IO_STACK_LOCATION *pIrpSp;
62 FILE_OBJECT *pFileObject = NULL;
67 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
68 pFileObject = pIrpSp->FileObject;
70 if( pFileObject == NULL ||
71 pFileObject->FileName.Buffer == NULL)
74 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
75 AFS_TRACE_LEVEL_VERBOSE,
76 "AFSCreate (%p) Processing control device open request\n",
79 ntStatus = AFSControlDeviceCreate( Irp);
81 try_return( ntStatus);
84 if( AFSRDRDeviceObject == NULL)
87 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
88 AFS_TRACE_LEVEL_VERBOSE,
89 "AFSCreate (%p) Invalid request to open before library is initialized\n",
92 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
95 ntStatus = AFSCommonCreate( AFSRDRDeviceObject,
102 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
107 "EXCEPTION - AFSCreate\n");
109 ntStatus = STATUS_ACCESS_DENIED;
111 AFSDumpTraceFilesFnc();
115 // Complete the request
118 AFSCompleteRequest( Irp,
125 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
129 NTSTATUS ntStatus = STATUS_SUCCESS;
130 UNICODE_STRING uniFileName;
131 ULONG ulCreateDisposition = 0;
133 BOOLEAN bNoIntermediateBuffering = FALSE;
134 FILE_OBJECT *pFileObject = NULL;
135 IO_STACK_LOCATION *pIrpSp;
138 AFSDeviceExt *pDeviceExt = NULL;
139 BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
140 PACCESS_MASK pDesiredAccess = NULL;
141 UNICODE_STRING uniComponentName, uniRootFileName, uniParsedFileName;
142 UNICODE_STRING uniSubstitutedPathName;
143 UNICODE_STRING uniRelativeName;
144 AFSNameArrayHdr *pNameArray = NULL;
145 AFSVolumeCB *pVolumeCB = NULL;
146 AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
147 ULONG ulParseFlags = 0;
148 GUID stAuthGroup = {0};
149 ULONG ulNameProcessingFlags = 0;
150 BOOLEAN bOpenedReparsePoint = FALSE;
156 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
157 pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
158 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
159 ulOptions = pIrpSp->Parameters.Create.Options;
160 bNoIntermediateBuffering = BooleanFlagOn( ulOptions, FILE_NO_INTERMEDIATE_BUFFERING);
161 bOpenTargetDirectory = BooleanFlagOn( pIrpSp->Flags, SL_OPEN_TARGET_DIRECTORY);
162 pFileObject = pIrpSp->FileObject;
163 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
165 uniFileName.Length = uniFileName.MaximumLength = 0;
166 uniFileName.Buffer = NULL;
168 uniRootFileName.Length = uniRootFileName.MaximumLength = 0;
169 uniRootFileName.Buffer = NULL;
171 uniParsedFileName.Length = uniParsedFileName.MaximumLength = 0;
172 uniParsedFileName.Buffer = NULL;
174 uniSubstitutedPathName.Buffer = NULL;
175 uniSubstitutedPathName.Length = 0;
177 uniRelativeName.Buffer = NULL;
178 uniRelativeName.Length = 0;
180 if( AFSGlobalRoot == NULL)
182 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
185 RtlZeroMemory( &stAuthGroup,
188 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
189 (ULONGLONG)PsGetCurrentThreadId(),
193 // If we are in shutdown mode then fail the request
196 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
199 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
200 AFS_TRACE_LEVEL_WARNING,
201 "AFSCommonCreate (%p) Open request after shutdown\n",
204 try_return( ntStatus = STATUS_TOO_LATE);
207 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
210 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
212 if( !NT_SUCCESS( ntStatus))
215 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
216 AFS_TRACE_LEVEL_ERROR,
217 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
220 try_return( ntStatus);
225 // Go and parse the name for processing.
226 // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
227 // then we are responsible for releasing the uniRootFileName.Buffer.
230 ntStatus = AFSParseName( Irp,
240 if( !NT_SUCCESS( ntStatus))
243 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
244 uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
245 "AFSCommonCreate (%p) Failed to parse name \"%wZ\" Status %08lX\n",
250 try_return( ntStatus);
254 // Check for STATUS_REPARSE
257 if( ntStatus == STATUS_REPARSE)
261 // Update the information and return
264 Irp->IoStatus.Information = IO_REPARSE;
266 try_return( ntStatus);
270 // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
274 if( pVolumeCB == NULL)
278 // Remove any leading or trailing slashes
281 if( uniFileName.Length >= sizeof( WCHAR) &&
282 uniFileName.Buffer[ (uniFileName.Length/sizeof( WCHAR)) - 1] == L'\\')
285 uniFileName.Length -= sizeof( WCHAR);
288 if( uniFileName.Length >= sizeof( WCHAR) &&
289 uniFileName.Buffer[ 0] == L'\\')
292 uniFileName.Buffer = &uniFileName.Buffer[ 1];
294 uniFileName.Length -= sizeof( WCHAR);
298 // If there is a remaining portion returned for this request then
299 // check if it is for the PIOCtl interface
302 if( uniFileName.Length > 0)
306 // We don't accept any other opens off of the AFS Root
309 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
312 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
315 if( RtlCompareUnicodeString( &AFSPIOCtlName,
320 ntStatus = AFSOpenIOCtlFcb( Irp,
322 AFSGlobalRoot->DirectoryCB,
326 if( !NT_SUCCESS( ntStatus))
329 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
330 AFS_TRACE_LEVEL_ERROR,
331 "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
335 else if( pParentDirectoryCB != NULL &&
336 pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
339 ntStatus = AFSOpenSpecialShareFcb( Irp,
345 if( !NT_SUCCESS( ntStatus))
348 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
349 AFS_TRACE_LEVEL_ERROR,
350 "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
355 try_return( ntStatus);
358 ntStatus = AFSOpenAFSRoot( Irp,
362 if( !NT_SUCCESS( ntStatus))
365 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
366 AFS_TRACE_LEVEL_ERROR,
367 "AFSCommonCreate Failed to open root Status %08lX\n",
370 lCount = InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
372 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
373 AFS_TRACE_LEVEL_VERBOSE,
374 "AFSCommonCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
375 &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
376 AFSGlobalRoot->DirectoryCB,
380 ASSERT( lCount >= 0);
383 try_return( ntStatus);
387 // We have a reference on the root volume
390 bReleaseVolume = TRUE;
393 // Attempt to locate the node in the name tree if this is not a target
394 // open and the target is not the root
397 uniComponentName.Length = 0;
398 uniComponentName.Buffer = NULL;
400 if( uniFileName.Length > sizeof( WCHAR) ||
401 uniFileName.Buffer[ 0] != L'\\')
404 if( !AFSValidNameFormat( &uniFileName))
407 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
409 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
410 AFS_TRACE_LEVEL_VERBOSE,
411 "AFSCommonCreate (%p) Invalid name %wZ Status %08lX\n",
416 try_return( ntStatus);
420 // Opening a reparse point directly?
423 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
425 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
427 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
428 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
429 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
432 uniSubstitutedPathName = uniRootFileName;
434 ntStatus = AFSLocateNameEntry( &stAuthGroup,
439 ulNameProcessingFlags,
445 if( !NT_SUCCESS( ntStatus) &&
446 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
449 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
451 uniSubstitutedPathName.Buffer = NULL;
455 // The routine above released the root while walking the
459 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
460 AFS_TRACE_LEVEL_VERBOSE,
461 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
467 // We released any root volume locks in the above on failure
470 bReleaseVolume = FALSE;
472 try_return( ntStatus);
476 // Check for STATUS_REPARSE
479 if( ntStatus == STATUS_REPARSE)
482 uniSubstitutedPathName.Buffer = NULL;
485 // Update the information and return
488 Irp->IoStatus.Information = IO_REPARSE;
491 // We released the volume lock above
494 bReleaseVolume = FALSE;
496 try_return( ntStatus);
500 // If we re-allocated the name, then update our substitute name
503 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
506 uniSubstitutedPathName = uniRootFileName;
511 uniSubstitutedPathName.Buffer = NULL;
515 // Check for a symlink access
518 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
519 pParentDirectoryCB != NULL)
522 UNICODE_STRING uniFinalComponent;
524 uniFinalComponent.Length = 0;
525 uniFinalComponent.MaximumLength = 0;
526 uniFinalComponent.Buffer = NULL;
528 AFSRetrieveFinalComponent( &uniFileName,
531 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
534 if( !NT_SUCCESS( ntStatus) &&
535 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
538 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
539 AFS_TRACE_LEVEL_VERBOSE,
540 "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
545 try_return( ntStatus);
551 // If we have no parent then this is a root open, be sure there is a directory entry
555 else if( pParentDirectoryCB == NULL &&
556 pDirectoryCB == NULL)
559 pDirectoryCB = pVolumeCB->DirectoryCB;
562 if( bOpenTargetDirectory)
566 // If we have a directory cb for the entry then dereference it and reference the parent
569 if( pDirectoryCB != NULL)
573 // Perform in this order to prevent thrashing
576 lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
578 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
579 AFS_TRACE_LEVEL_VERBOSE,
580 "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
581 &pParentDirectoryCB->NameInformation.FileName,
587 // Do NOT decrement the reference count on the pDirectoryCB yet.
588 // The BackupEntry below might drop the count to zero leaving
589 // the entry subject to being deleted and we need some of the
590 // contents during later processing
593 AFSBackupEntry( pNameArray);
597 // OK, open the target directory
600 if( uniComponentName.Length == 0)
602 AFSRetrieveFinalComponent( &uniFileName,
606 ntStatus = AFSOpenTargetDirectory( Irp,
613 if( pDirectoryCB != NULL)
616 // It is now safe to drop the Reference Count
618 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
620 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
621 AFS_TRACE_LEVEL_VERBOSE,
622 "AFSCommonCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
623 &pDirectoryCB->NameInformation.FileName,
628 ASSERT( lCount >= 0);
631 if( !NT_SUCCESS( ntStatus))
634 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
635 AFS_TRACE_LEVEL_ERROR,
636 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
637 &pParentDirectoryCB->NameInformation.FileName,
641 // Decrement the reference on the parent
644 lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
646 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
647 AFS_TRACE_LEVEL_VERBOSE,
648 "AFSCommonCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
649 &pParentDirectoryCB->NameInformation.FileName,
654 ASSERT( lCount >= 0);
657 try_return( ntStatus);
660 if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
663 if( pDirectoryCB == NULL ||
664 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
666 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
667 AFS_TRACE_LEVEL_VERBOSE,
668 "AFSCommonCreate (%p) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
672 pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
676 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
677 AFS_TRACE_LEVEL_VERBOSE,
678 "AFSCommonCreate (%p) Opening as reparse point %wZ Type %08lX\n",
681 pDirectoryCB->ObjectInformation->FileType);
683 bOpenedReparsePoint = TRUE;
688 // Based on the options passed in, process the file accordingly.
691 if( ulCreateDisposition == FILE_CREATE ||
692 ( ( ulCreateDisposition == FILE_OPEN_IF ||
693 ulCreateDisposition == FILE_OVERWRITE_IF) &&
694 pDirectoryCB == NULL))
697 if( uniComponentName.Length == 0 ||
698 pDirectoryCB != NULL)
702 // We traversed the entire path so we found each entry,
703 // fail with collision
706 if( pDirectoryCB != NULL)
709 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
710 AFS_TRACE_LEVEL_VERBOSE,
711 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
712 &pDirectoryCB->NameInformation.FileName,
715 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
717 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
718 AFS_TRACE_LEVEL_VERBOSE,
719 "AFSCommonCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
720 &pDirectoryCB->NameInformation.FileName,
725 ASSERT( lCount >= 0);
730 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
731 AFS_TRACE_LEVEL_VERBOSE,
732 "AFSCommonCreate Object name collision on create Status %08lX\n",
735 lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
737 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
738 AFS_TRACE_LEVEL_VERBOSE,
739 "AFSCommonCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
740 &pParentDirectoryCB->NameInformation.FileName,
745 ASSERT( lCount >= 0);
748 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
752 // OK, go and create the node
755 ntStatus = AFSProcessCreate( Irp,
765 if( !NT_SUCCESS( ntStatus))
768 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
769 AFS_TRACE_LEVEL_ERROR,
770 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
772 &pParentDirectoryCB->NameInformation.FileName,
777 // Dereference the parent entry
780 lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
782 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
783 AFS_TRACE_LEVEL_VERBOSE,
784 "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
785 &pParentDirectoryCB->NameInformation.FileName,
790 ASSERT( lCount >= 0);
792 try_return( ntStatus);
796 // We should not have an extra component except for PIOCtl opens
799 if( uniComponentName.Length > 0)
803 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
806 if( RtlCompareUnicodeString( &AFSPIOCtlName,
811 ntStatus = AFSOpenIOCtlFcb( Irp,
817 if( !NT_SUCCESS( ntStatus))
820 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
821 AFS_TRACE_LEVEL_ERROR,
822 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
830 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
831 AFS_TRACE_LEVEL_VERBOSE,
832 "AFSCommonCreate (%p) File %wZ name not found\n",
836 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
839 if( !NT_SUCCESS( ntStatus))
843 // Dereference the parent entry
846 if( pDirectoryCB != NULL)
849 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
851 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
852 AFS_TRACE_LEVEL_VERBOSE,
853 "AFSCommonCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
854 &pDirectoryCB->NameInformation.FileName,
859 ASSERT( lCount >= 0);
864 lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
866 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
867 AFS_TRACE_LEVEL_VERBOSE,
868 "AFSCommonCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
869 &pParentDirectoryCB->NameInformation.FileName,
874 ASSERT( lCount >= 0);
878 try_return( ntStatus);
882 // For root opens the parent will be NULL
885 if( pParentDirectoryCB == NULL)
889 // Check for the delete on close flag for the root
892 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
895 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
896 AFS_TRACE_LEVEL_ERROR,
897 "AFSCommonCreate (%p) Attempt to open root as delete on close\n",
900 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
902 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
903 AFS_TRACE_LEVEL_VERBOSE,
904 "AFSCommonCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
905 &pDirectoryCB->NameInformation.FileName,
910 ASSERT( lCount >= 0);
912 try_return( ntStatus = STATUS_CANNOT_DELETE);
916 // If this is the target directory, then bail
919 if( bOpenTargetDirectory)
922 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
923 AFS_TRACE_LEVEL_ERROR,
924 "AFSCommonCreate (%p) Attempt to open root as target directory\n",
927 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
929 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
930 AFS_TRACE_LEVEL_VERBOSE,
931 "AFSCommonCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
932 &pDirectoryCB->NameInformation.FileName,
937 ASSERT( lCount >= 0);
939 try_return( ntStatus = STATUS_INVALID_PARAMETER);
943 // Go and open the root of the volume
946 ntStatus = AFSOpenRoot( Irp,
952 if( !NT_SUCCESS( ntStatus))
955 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
956 AFS_TRACE_LEVEL_ERROR,
957 "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
958 pVolumeCB->ObjectInformation.FileId.Cell,
959 pVolumeCB->ObjectInformation.FileId.Volume,
962 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
964 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
965 AFS_TRACE_LEVEL_VERBOSE,
966 "AFSCommonCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
967 &pDirectoryCB->NameInformation.FileName,
972 ASSERT( lCount >= 0);
975 try_return( ntStatus);
979 // At this point if we have no pDirectoryCB it was not found.
982 if( pDirectoryCB == NULL)
985 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
986 AFS_TRACE_LEVEL_ERROR,
987 "AFSCommonCreate Failing access to %wZ\n",
990 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
993 if( ulCreateDisposition == FILE_OVERWRITE ||
994 ulCreateDisposition == FILE_SUPERSEDE ||
995 ulCreateDisposition == FILE_OVERWRITE_IF)
999 // Go process a file for overwrite or supersede.
1002 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
1011 if( !NT_SUCCESS( ntStatus))
1014 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1015 AFS_TRACE_LEVEL_ERROR,
1016 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
1017 &pDirectoryCB->NameInformation.FileName,
1020 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
1022 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1023 AFS_TRACE_LEVEL_VERBOSE,
1024 "AFSCommonCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
1025 &pDirectoryCB->NameInformation.FileName,
1030 ASSERT( lCount >= 0);
1033 try_return( ntStatus);
1037 // Trying to open the file
1040 ntStatus = AFSProcessOpen( Irp,
1048 if( !NT_SUCCESS( ntStatus))
1051 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1052 AFS_TRACE_LEVEL_ERROR,
1053 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
1054 &pDirectoryCB->NameInformation.FileName,
1057 lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
1059 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1060 AFS_TRACE_LEVEL_VERBOSE,
1061 "AFSCommonCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
1062 &pDirectoryCB->NameInformation.FileName,
1067 ASSERT( lCount >= 0);
1072 if( NT_SUCCESS( ntStatus) &&
1073 ntStatus != STATUS_REPARSE)
1079 AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
1082 RtlCopyMemory( &pCcb->AuthGroup,
1087 // If we have a substitute name, then use it
1090 if( uniSubstitutedPathName.Buffer != NULL)
1093 pCcb->FullFileName = uniSubstitutedPathName;
1095 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1097 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1102 pCcb->FullFileName = uniRootFileName;
1104 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1107 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1109 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1113 if( bOpenedReparsePoint)
1115 SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
1118 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1119 AFS_TRACE_LEVEL_VERBOSE,
1120 "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1121 &pCcb->DirectoryCB->NameInformation.FileName,
1124 lCount = pCcb->DirectoryCB->DirOpenReferenceCount);
1126 ASSERT( lCount >= 0);
1128 pCcb->CurrentDirIndex = 0;
1130 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1133 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1137 // Save off the name array for this instance
1140 pCcb->NameArray = pNameArray;
1144 AFSReleaseResource( &pCcb->NPCcb->CcbLock);
1148 // If we make it here then init the FO for the request.
1151 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1152 AFS_TRACE_LEVEL_VERBOSE_2,
1153 "AFSCommonCreate (%p) FileObject %p FsContext %08lX FsContext2 %08lX\n",
1159 pFileObject->FsContext = (void *)pFcb;
1161 pFileObject->FsContext2 = (void *)pCcb;
1166 ASSERT( pFcb->OpenHandleCount > 0);
1168 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1171 // For files perform additional processing
1174 switch( pFcb->Header.NodeTypeCode)
1181 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1186 // If the user did not request nobuffering then mark the FO as cacheable
1189 if( bNoIntermediateBuffering)
1192 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1197 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1201 // If the file was opened for execution then we need to set the bit in the FO
1204 if( BooleanFlagOn( *pDesiredAccess,
1208 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1212 // Update the last access time
1215 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1226 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1227 AFS_TRACE_LEVEL_ERROR,
1228 "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %08lX FsContext2 %08lX\n",
1237 if( NT_SUCCESS( ntStatus) &&
1238 ntStatus == STATUS_REPARSE)
1241 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1242 AFS_TRACE_LEVEL_ERROR,
1243 "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %08lX FsContext2 %08lX\n",
1251 // Free up the sub name if we have one
1254 if( uniSubstitutedPathName.Buffer != NULL)
1257 AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
1259 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1264 // Free up the name array ...
1267 if( pNameArray != NULL)
1270 AFSFreeNameArray( pNameArray);
1273 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1276 AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
1282 lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
1284 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1285 AFS_TRACE_LEVEL_VERBOSE,
1286 "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
1292 // Setup the Irp for completion, the Information has been set previously
1295 Irp->IoStatus.Status = ntStatus;
1302 AFSOpenAFSRoot( IN PIRP Irp,
1307 NTSTATUS ntStatus = STATUS_SUCCESS;
1314 // Initialize the Ccb for the file.
1317 ntStatus = AFSInitCcb( Ccb,
1318 AFSGlobalRoot->DirectoryCB,
1322 if( !NT_SUCCESS( ntStatus))
1325 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1326 AFS_TRACE_LEVEL_ERROR,
1327 "AFSOpenAFSRoot (%p) Failed to allocate Ccb\n",
1330 try_return( ntStatus);
1334 // Increment the open count on this Fcb
1337 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1339 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1340 AFS_TRACE_LEVEL_VERBOSE,
1341 "AFSOpenAFSRoot Increment count on Fcb %p Cnt %d\n",
1342 AFSGlobalRoot->RootFcb,
1345 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1347 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1348 AFS_TRACE_LEVEL_VERBOSE,
1349 "AFSOpenAFSRoot Increment handle count on Fcb %p Cnt %d\n",
1350 AFSGlobalRoot->RootFcb,
1353 *Fcb = AFSGlobalRoot->RootFcb;
1356 // Return the open result for this file
1359 Irp->IoStatus.Information = FILE_OPENED;
1370 AFSOpenRoot( IN PIRP Irp,
1371 IN AFSVolumeCB *VolumeCB,
1373 OUT AFSFcb **RootFcb,
1377 NTSTATUS ntStatus = STATUS_SUCCESS;
1378 PFILE_OBJECT pFileObject = NULL;
1379 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1380 PACCESS_MASK pDesiredAccess = NULL;
1381 USHORT usShareAccess;
1383 BOOLEAN bAllocatedCcb = FALSE;
1384 BOOLEAN bReleaseFcb = FALSE;
1385 AFSFileOpenCB stOpenCB;
1386 AFSFileOpenResultCB stOpenResultCB;
1387 ULONG ulResultLen = 0;
1393 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1394 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1395 ulOptions = pIrpSp->Parameters.Create.Options;
1397 pFileObject = pIrpSp->FileObject;
1399 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
1402 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
1404 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1405 AFS_TRACE_LEVEL_ERROR,
1406 "AFSOpenRoot (%p) Attempt to open root as file Status %08lX\n",
1410 try_return( ntStatus);
1414 // Check if we should go and retrieve updated information for the node
1417 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1422 if( !NT_SUCCESS( ntStatus))
1425 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1426 AFS_TRACE_LEVEL_ERROR,
1427 "AFSOpenRoot (%p) Failed to validate root entry Status %08lX\n",
1431 try_return( ntStatus);
1435 // Check with the service that we can open the file
1438 RtlZeroMemory( &stOpenCB,
1439 sizeof( AFSFileOpenCB));
1441 stOpenCB.DesiredAccess = *pDesiredAccess;
1443 stOpenCB.ShareAccess = usShareAccess;
1445 stOpenResultCB.GrantedAccess = 0;
1447 ulResultLen = sizeof( AFSFileOpenResultCB);
1449 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1450 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1453 &VolumeCB->ObjectInformation.FileId,
1455 sizeof( AFSFileOpenCB),
1456 (void *)&stOpenResultCB,
1459 if( !NT_SUCCESS( ntStatus))
1462 UNICODE_STRING uniGUID;
1465 uniGUID.MaximumLength = 0;
1466 uniGUID.Buffer = NULL;
1468 if( AuthGroup != NULL)
1470 RtlStringFromGUID( *AuthGroup,
1474 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1475 AFS_TRACE_LEVEL_ERROR,
1476 "AFSOpenRoot (%p) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
1478 VolumeCB->ObjectInformation.FileId.Cell,
1479 VolumeCB->ObjectInformation.FileId.Volume,
1483 if( AuthGroup != NULL)
1485 RtlFreeUnicodeString( &uniGUID);
1488 try_return( ntStatus);
1492 // If the entry is not initialized then do it now
1495 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1498 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1501 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1504 ntStatus = AFSEnumerateDirectory( AuthGroup,
1505 &VolumeCB->ObjectInformation,
1508 if( !NT_SUCCESS( ntStatus))
1511 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1513 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1514 AFS_TRACE_LEVEL_ERROR,
1515 "AFSOpenRoot (%p) Failed to enumerate directory Status %08lX\n",
1519 try_return( ntStatus);
1522 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1525 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1529 // If the root fcb has been initialized then check access otherwise
1530 // init the volume fcb
1533 if( VolumeCB->RootFcb == NULL)
1536 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1539 if( !NT_SUCCESS( ntStatus))
1542 try_return( ntStatus);
1548 AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
1555 // If there are current opens on the Fcb, check the access.
1558 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1561 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1564 &VolumeCB->RootFcb->ShareAccess,
1567 if( !NT_SUCCESS( ntStatus))
1570 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1571 AFS_TRACE_LEVEL_ERROR,
1572 "AFSOpenRoot (%p) Access check failure Status %08lX\n",
1576 try_return( ntStatus);
1581 // Initialize the Ccb for the file.
1584 ntStatus = AFSInitCcb( Ccb,
1585 VolumeCB->DirectoryCB,
1589 if( !NT_SUCCESS( ntStatus))
1592 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1593 AFS_TRACE_LEVEL_ERROR,
1594 "AFSOpenRoot (%p) Failed to allocate Ccb Status %08lX\n",
1598 try_return( ntStatus);
1601 bAllocatedCcb = TRUE;
1604 // OK, update the share access on the fileobject
1607 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1610 IoUpdateShareAccess( pFileObject,
1611 &VolumeCB->RootFcb->ShareAccess);
1620 IoSetShareAccess( *pDesiredAccess,
1623 &VolumeCB->RootFcb->ShareAccess);
1627 // Increment the open count on this Fcb
1630 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1632 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1633 AFS_TRACE_LEVEL_VERBOSE,
1634 "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
1638 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1640 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1641 AFS_TRACE_LEVEL_VERBOSE,
1642 "AFSOpenRoot Increment handle count on Fcb %p Cnt %d\n",
1647 // Indicate the object is held
1650 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1653 // Return the open result for this file
1656 Irp->IoStatus.Information = FILE_OPENED;
1658 *RootFcb = VolumeCB->RootFcb;
1665 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1668 if( !NT_SUCCESS( ntStatus))
1680 Irp->IoStatus.Information = 0;
1688 AFSProcessCreate( IN PIRP Irp,
1690 IN AFSVolumeCB *VolumeCB,
1691 IN AFSDirectoryCB *ParentDirCB,
1692 IN PUNICODE_STRING FileName,
1693 IN PUNICODE_STRING ComponentName,
1694 IN PUNICODE_STRING FullFileName,
1699 NTSTATUS ntStatus = STATUS_SUCCESS;
1700 PFILE_OBJECT pFileObject = NULL;
1701 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1702 ULONG ulOptions = 0;
1703 ULONG ulAttributes = 0;
1704 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1705 PACCESS_MASK pDesiredAccess = NULL;
1706 USHORT usShareAccess;
1707 AFSDirectoryCB *pDirEntry = NULL;
1708 AFSObjectInfoCB *pParentObjectInfo = NULL;
1709 AFSObjectInfoCB *pObjectInfo = NULL;
1715 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1716 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1718 pFileObject = pIrpSp->FileObject;
1721 // Extract out the options
1724 ulOptions = pIrpSp->Parameters.Create.Options;
1727 // We pass all attributes they want to apply to the file to the create
1730 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1733 // If this is a directory create then set the attribute correctly
1736 if( ulOptions & FILE_DIRECTORY_FILE)
1739 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1742 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1743 AFS_TRACE_LEVEL_VERBOSE,
1744 "AFSProcessCreate (%p) Creating file %wZ Attributes %08lX\n",
1749 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1752 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1753 AFS_TRACE_LEVEL_ERROR,
1754 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1757 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
1760 pParentObjectInfo = ParentDirCB->ObjectInformation;
1763 // Allocate and insert the direntry into the parent node
1766 ntStatus = AFSCreateDirEntry( AuthGroup,
1774 if( !NT_SUCCESS( ntStatus))
1777 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1778 AFS_TRACE_LEVEL_ERROR,
1779 "AFSProcessCreate (%p) Failed to create directory entry %wZ Status %08lX\n",
1784 try_return( ntStatus);
1787 bFileCreated = TRUE;
1789 pObjectInfo = pDirEntry->ObjectInformation;
1791 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1792 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1795 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1796 AFS_TRACE_LEVEL_VERBOSE,
1797 "AFSProcessCreate (%p) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1799 &pDirEntry->NameInformation.FileName,
1800 pObjectInfo->FileId.Cell,
1801 pObjectInfo->FileId.Volume,
1802 pObjectInfo->FileId.Vnode,
1803 pObjectInfo->FileId.Unique);
1805 ntStatus = AFSEvaluateNode( AuthGroup,
1808 if( !NT_SUCCESS( ntStatus))
1811 if ( ntStatus == STATUS_NOT_A_DIRECTORY)
1814 if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
1817 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1818 AFS_TRACE_LEVEL_ERROR,
1819 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1821 &pDirEntry->NameInformation.FileName,
1822 pObjectInfo->FileId.Cell,
1823 pObjectInfo->FileId.Volume,
1824 pObjectInfo->FileId.Vnode,
1825 pObjectInfo->FileId.Unique,
1826 pParentObjectInfo->FileId.Cell,
1827 pParentObjectInfo->FileId.Volume,
1828 pParentObjectInfo->FileId.Vnode,
1829 pParentObjectInfo->FileId.Unique,
1832 else if ( pObjectInfo->ParentObjectInformation == NULL)
1835 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1836 AFS_TRACE_LEVEL_ERROR,
1837 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
1839 &pDirEntry->NameInformation.FileName,
1840 pObjectInfo->FileId.Cell,
1841 pObjectInfo->FileId.Volume,
1842 pObjectInfo->FileId.Vnode,
1843 pObjectInfo->FileId.Unique,
1844 pParentObjectInfo->FileId.Cell,
1845 pParentObjectInfo->FileId.Volume,
1846 pParentObjectInfo->FileId.Vnode,
1847 pParentObjectInfo->FileId.Unique,
1853 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1854 AFS_TRACE_LEVEL_ERROR,
1855 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1857 &pDirEntry->NameInformation.FileName,
1858 pObjectInfo->FileId.Cell,
1859 pObjectInfo->FileId.Volume,
1860 pObjectInfo->FileId.Vnode,
1861 pObjectInfo->FileId.Unique,
1862 pParentObjectInfo->FileId.Cell,
1863 pParentObjectInfo->FileId.Volume,
1864 pParentObjectInfo->FileId.Vnode,
1865 pParentObjectInfo->FileId.Unique,
1866 pObjectInfo->ParentObjectInformation->FileId.Cell,
1867 pObjectInfo->ParentObjectInformation->FileId.Volume,
1868 pObjectInfo->ParentObjectInformation->FileId.Vnode,
1869 pObjectInfo->ParentObjectInformation->FileId.Unique,
1876 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1877 AFS_TRACE_LEVEL_ERROR,
1878 "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1880 &pDirEntry->NameInformation.FileName,
1881 pObjectInfo->FileId.Cell,
1882 pObjectInfo->FileId.Volume,
1883 pObjectInfo->FileId.Vnode,
1884 pObjectInfo->FileId.Unique,
1888 try_return( ntStatus);
1891 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1895 // We may have raced and the Fcb is already created
1899 // Allocate and initialize the Fcb for the file.
1902 ntStatus = AFSInitFcb( pDirEntry);
1904 *Fcb = pObjectInfo->Fcb;
1906 if( !NT_SUCCESS( ntStatus))
1909 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1910 AFS_TRACE_LEVEL_ERROR,
1911 "AFSProcessCreate (%p) Failed to initialize fcb %wZ Status %08lX\n",
1916 try_return( ntStatus);
1919 ntStatus = STATUS_SUCCESS;
1922 // Increment the open count on this Fcb
1925 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1927 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1928 AFS_TRACE_LEVEL_VERBOSE,
1929 "AFSProcessCreate Increment count on Fcb %p Cnt %d\n",
1936 // Initialize the Ccb for the file.
1939 ntStatus = AFSInitCcb( Ccb,
1944 if( !NT_SUCCESS( ntStatus))
1947 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1948 AFS_TRACE_LEVEL_ERROR,
1949 "AFSProcessCreate (%p) Failed to initialize ccb %wZ Status %08lX\n",
1954 try_return( ntStatus);
1957 bAllocatedCcb = TRUE;
1960 // If this is a file, update the headers filesizes.
1963 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1967 // Update the sizes with the information passed in
1970 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1971 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1972 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1975 // Notify the system of the addition
1978 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1980 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1981 (ULONG)FILE_ACTION_ADDED);
1983 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1985 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1989 // This is a new directory node so indicate it has been enumerated
1992 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1995 // And the parent directory entry
1998 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
2001 // Notify the system of the addition
2004 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2006 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2007 (ULONG)FILE_ACTION_ADDED);
2009 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2010 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2011 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2012 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
2016 // And the parent directory entry
2019 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
2022 // Notify the system of the addition
2025 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2027 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2028 (ULONG)FILE_ACTION_ADDED);
2032 // Save off the access for the open
2035 IoSetShareAccess( *pDesiredAccess,
2038 &(*Fcb)->ShareAccess);
2040 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
2042 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2043 AFS_TRACE_LEVEL_VERBOSE,
2044 "AFSProcessCreate Increment handle count on Fcb %p Cnt %d\n",
2049 // Increment the open reference and handle on the parent node
2052 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2054 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2055 AFS_TRACE_LEVEL_VERBOSE,
2056 "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
2057 pObjectInfo->ParentObjectInformation,
2060 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2062 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2063 AFS_TRACE_LEVEL_VERBOSE,
2064 "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
2065 pObjectInfo->ParentObjectInformation,
2068 if( ulOptions & FILE_DELETE_ON_CLOSE)
2072 // Mark it for delete on close
2075 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2076 AFS_TRACE_LEVEL_VERBOSE,
2077 "AFSProcessCreate (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2082 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2086 // Indicate the object is locked in the service
2089 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2092 // Return the open result for this file
2095 Irp->IoStatus.Information = FILE_CREATED;
2100 // If we created the Fcb we need to release the resources
2106 if( !NT_SUCCESS( ntStatus))
2109 // Decrement the open count on this Fcb
2112 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
2114 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2115 AFS_TRACE_LEVEL_VERBOSE,
2116 "AFSProcessCreate Decrement count on Fcb %p Cnt %d\n",
2121 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2124 if( !NT_SUCCESS( ntStatus))
2130 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2131 AFS_TRACE_LEVEL_VERBOSE,
2132 "AFSProcessCreate Create failed, removing DE %p from parent object %p Status %08lX\n",
2138 // Remove the dir entry from the parent
2141 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2144 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2146 AFSNotifyDelete( pDirEntry,
2151 // Decrement the reference added during initialization of the DE
2154 lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
2156 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2157 AFS_TRACE_LEVEL_VERBOSE,
2158 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2159 &pDirEntry->NameInformation.FileName,
2163 ASSERT( lCount >= 0);
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);
2192 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2205 AFSOpenTargetDirectory( IN PIRP Irp,
2206 IN AFSVolumeCB *VolumeCB,
2207 IN AFSDirectoryCB *ParentDirectoryCB,
2208 IN AFSDirectoryCB *TargetDirectoryCB,
2209 IN UNICODE_STRING *TargetName,
2213 UNREFERENCED_PARAMETER(VolumeCB);
2214 NTSTATUS ntStatus = STATUS_SUCCESS;
2215 PFILE_OBJECT pFileObject = NULL;
2216 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2217 PACCESS_MASK pDesiredAccess = NULL;
2218 USHORT usShareAccess;
2219 BOOLEAN bAllocatedCcb = FALSE;
2220 BOOLEAN bReleaseFcb = FALSE;
2221 AFSObjectInfoCB *pParentObject = NULL;
2222 UNICODE_STRING uniTargetName;
2228 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2229 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2231 pFileObject = pIrpSp->FileObject;
2233 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2234 AFS_TRACE_LEVEL_VERBOSE,
2235 "AFSOpenTargetDirectory (%p) Processing file %wZ\n",
2239 pParentObject = ParentDirectoryCB->ObjectInformation;
2241 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2244 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2248 // Make sure we have an Fcb for the access
2251 // Allocate and initialize the Fcb for the file.
2254 ntStatus = AFSInitFcb( ParentDirectoryCB);
2256 *Fcb = pParentObject->Fcb;
2258 if( !NT_SUCCESS( ntStatus))
2261 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2262 AFS_TRACE_LEVEL_ERROR,
2263 "AFSOpenTargetDirectory (%p) Failed to initialize fcb %wZ Status %08lX\n",
2265 &ParentDirectoryCB->NameInformation.FileName,
2268 try_return( ntStatus);
2271 ntStatus = STATUS_SUCCESS;
2274 // Increment the open count on this Fcb
2277 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2279 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2280 AFS_TRACE_LEVEL_VERBOSE,
2281 "AFSOpenTargetDirectory Increment count on Fcb %p Cnt %d\n",
2288 // If there are current opens on the Fcb, check the access.
2291 if( pParentObject->Fcb->OpenHandleCount > 0)
2294 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2297 &pParentObject->Fcb->ShareAccess,
2300 if( !NT_SUCCESS( ntStatus))
2303 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2304 AFS_TRACE_LEVEL_ERROR,
2305 "AFSOpenTargetDirectory (%p) Access check failure %wZ Status %08lX\n",
2307 &ParentDirectoryCB->NameInformation.FileName,
2310 try_return( ntStatus);
2315 // Initialize the Ccb for the file.
2318 ntStatus = AFSInitCcb( Ccb,
2323 if( !NT_SUCCESS( ntStatus))
2326 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2327 AFS_TRACE_LEVEL_ERROR,
2328 "AFSOpenTargetDirectory (%p) Failed to initialize ccb %wZ Status %08lX\n",
2330 &ParentDirectoryCB->NameInformation.FileName,
2333 try_return( ntStatus);
2336 bAllocatedCcb = TRUE;
2338 if( TargetDirectoryCB != NULL &&
2339 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2345 Irp->IoStatus.Information = FILE_EXISTS;
2347 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2352 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2354 uniTargetName = *TargetName;
2358 // Update the filename in the fileobject for rename processing
2361 RtlCopyMemory( pFileObject->FileName.Buffer,
2362 uniTargetName.Buffer,
2363 uniTargetName.Length);
2365 pFileObject->FileName.Length = uniTargetName.Length;
2368 // OK, update the share access on the fileobject
2371 if( pParentObject->Fcb->OpenHandleCount > 0)
2374 IoUpdateShareAccess( pFileObject,
2375 &pParentObject->Fcb->ShareAccess);
2384 IoSetShareAccess( *pDesiredAccess,
2387 &pParentObject->Fcb->ShareAccess);
2390 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2392 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2393 AFS_TRACE_LEVEL_VERBOSE,
2394 "AFSOpenTargetDirectory Increment handle count on Fcb %p Cnt %d\n",
2399 // Increment the open reference and handle on the parent node
2402 if( pParentObject->ParentObjectInformation != NULL)
2405 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2407 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2408 AFS_TRACE_LEVEL_VERBOSE,
2409 "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
2410 pParentObject->ParentObjectInformation,
2413 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2415 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2416 AFS_TRACE_LEVEL_VERBOSE,
2417 "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
2418 pParentObject->ParentObjectInformation,
2427 if( !NT_SUCCESS( ntStatus))
2430 // Decrement the open count on this Fcb
2433 lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
2435 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2436 AFS_TRACE_LEVEL_VERBOSE,
2437 "AFSOpenTargetDirectory Decrement count on Fcb %p Cnt %d\n",
2442 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2445 if( !NT_SUCCESS( ntStatus))
2458 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2469 AFSProcessOpen( IN PIRP Irp,
2471 IN AFSVolumeCB *VolumeCB,
2472 IN AFSDirectoryCB *ParentDirCB,
2473 IN AFSDirectoryCB *DirectoryCB,
2477 UNREFERENCED_PARAMETER(VolumeCB);
2478 NTSTATUS ntStatus = STATUS_SUCCESS;
2479 PFILE_OBJECT pFileObject = NULL;
2480 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2481 PACCESS_MASK pDesiredAccess = NULL;
2482 USHORT usShareAccess;
2483 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
2484 ULONG ulOptions = 0;
2485 AFSFileOpenCB stOpenCB;
2486 AFSFileOpenResultCB stOpenResultCB;
2487 ULONG ulResultLen = 0;
2488 AFSObjectInfoCB *pParentObjectInfo = NULL;
2489 AFSObjectInfoCB *pObjectInfo = NULL;
2490 ULONG ulFileAccess = 0;
2491 AFSFileAccessReleaseCB stReleaseFileAccess;
2497 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2498 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2500 pFileObject = pIrpSp->FileObject;
2502 pParentObjectInfo = ParentDirCB->ObjectInformation;
2504 pObjectInfo = DirectoryCB->ObjectInformation;
2507 // Check if the entry is pending a deletion
2510 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2513 ntStatus = STATUS_DELETE_PENDING;
2515 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2516 AFS_TRACE_LEVEL_ERROR,
2517 "AFSProcessOpen (%p) Entry pending delete %wZ Status %08lX\n",
2519 &DirectoryCB->NameInformation.FileName,
2522 try_return( ntStatus);
2526 // Extract out the options
2529 ulOptions = pIrpSp->Parameters.Create.Options;
2532 // Check if we should go and retrieve updated information for the node
2535 ntStatus = AFSValidateEntry( DirectoryCB,
2540 if( !NT_SUCCESS( ntStatus))
2543 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2544 AFS_TRACE_LEVEL_ERROR,
2545 "AFSProcessOpen (%p) Failed to validate entry %wZ Status %08lX\n",
2547 &DirectoryCB->NameInformation.FileName,
2550 try_return( ntStatus);
2554 // If this is marked for delete on close then be sure we can delete the entry
2557 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2560 ntStatus = AFSNotifyDelete( DirectoryCB,
2564 if( !NT_SUCCESS( ntStatus))
2567 ntStatus = STATUS_CANNOT_DELETE;
2569 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2570 AFS_TRACE_LEVEL_ERROR,
2571 "AFSProcessOpen (%p) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2573 &DirectoryCB->NameInformation.FileName,
2576 try_return( ntStatus);
2581 // Be sure we have an Fcb for the current object
2584 ntStatus = AFSInitFcb( DirectoryCB);
2586 if( !NT_SUCCESS( ntStatus))
2589 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2590 AFS_TRACE_LEVEL_ERROR,
2591 "AFSProcessOpen (%p) Failed to init fcb on %wZ Status %08lX\n",
2593 &DirectoryCB->NameInformation.FileName,
2596 try_return( ntStatus);
2599 ntStatus = STATUS_SUCCESS;
2602 // AFSInitFcb returns the Fcb resource held
2608 // Increment the open count on this Fcb
2611 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2613 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2614 AFS_TRACE_LEVEL_VERBOSE,
2615 "AFSProcessOpen Increment2 count on Fcb %p Cnt %d\n",
2620 // Check access on the entry
2623 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2626 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2629 &pObjectInfo->Fcb->ShareAccess,
2632 if( !NT_SUCCESS( ntStatus))
2635 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2636 AFS_TRACE_LEVEL_ERROR,
2637 "AFSProcessOpen (%p) Failed to check share access on %wZ Status %08lX\n",
2639 &DirectoryCB->NameInformation.FileName,
2642 try_return( ntStatus);
2647 // Additional checks
2650 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2654 // If the caller is asking for write access then try to flush the image section
2657 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2658 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2663 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2664 AFS_TRACE_LEVEL_VERBOSE,
2665 "AFSProcessOpen Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
2666 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2667 PsGetCurrentThread());
2669 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2672 bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2675 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2676 AFS_TRACE_LEVEL_VERBOSE,
2677 "AFSProcessOpen Releasing Fcb SectionObject lock %p EXCL %08lX\n",
2678 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
2679 PsGetCurrentThread());
2681 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
2686 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2687 STATUS_SHARING_VIOLATION;
2689 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2690 AFS_TRACE_LEVEL_ERROR,
2691 "AFSProcessOpen (%p) Failed to flush image section %wZ Status %08lX\n",
2693 &DirectoryCB->NameInformation.FileName,
2696 try_return( ntStatus);
2700 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2703 ntStatus = STATUS_NOT_A_DIRECTORY;
2705 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2706 AFS_TRACE_LEVEL_ERROR,
2707 "AFSProcessOpen (%p) Attempt to open file as directory %wZ Status %08lX\n",
2709 &DirectoryCB->NameInformation.FileName,
2712 try_return( ntStatus);
2715 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2717 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2718 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2721 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2724 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2726 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2727 AFS_TRACE_LEVEL_ERROR,
2728 "AFSProcessOpen (%p) Attempt to open directory as file %wZ Status %08lX\n",
2730 &DirectoryCB->NameInformation.FileName,
2733 try_return( ntStatus);
2736 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2737 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2738 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2739 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
2746 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2750 // Check with the service that we can open the file
2753 stOpenCB.ParentId = pParentObjectInfo->FileId;
2755 stOpenCB.DesiredAccess = *pDesiredAccess;
2757 stOpenCB.ShareAccess = usShareAccess;
2759 stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2761 stOpenCB.Identifier = (ULONGLONG)pFileObject;
2763 stOpenResultCB.GrantedAccess = 0;
2765 ulResultLen = sizeof( AFSFileOpenResultCB);
2767 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2768 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2770 &DirectoryCB->NameInformation.FileName,
2771 &pObjectInfo->FileId,
2773 sizeof( AFSFileOpenCB),
2774 (void *)&stOpenResultCB,
2777 if( !NT_SUCCESS( ntStatus))
2780 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2781 AFS_TRACE_LEVEL_ERROR,
2782 "AFSProcessOpen (%p) Failed open in service %wZ Status %08lX\n",
2784 &DirectoryCB->NameInformation.FileName,
2787 try_return( ntStatus);
2791 // Save the granted access in case we need to release it below
2794 ulFileAccess = stOpenResultCB.FileAccess;
2797 // Check if there is a conflict
2800 if( !AFSCheckAccess( *pDesiredAccess,
2801 stOpenResultCB.GrantedAccess,
2802 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2805 ntStatus = STATUS_ACCESS_DENIED;
2807 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2808 AFS_TRACE_LEVEL_ERROR,
2809 "AFSProcessOpen (%p) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2812 stOpenResultCB.GrantedAccess,
2813 &DirectoryCB->NameInformation.FileName,
2816 try_return( ntStatus);
2820 // Initialize the Ccb for the file.
2823 ntStatus = AFSInitCcb( Ccb,
2828 if( !NT_SUCCESS( ntStatus))
2831 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2832 AFS_TRACE_LEVEL_ERROR,
2833 "AFSProcessOpen (%p) Failed to initialize ccb %wZ Status %08lX\n",
2835 &DirectoryCB->NameInformation.FileName,
2838 try_return( ntStatus);
2841 bAllocatedCcb = TRUE;
2844 // Perform the access check on the target if this is a mount point or symlink
2847 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2850 IoUpdateShareAccess( pFileObject,
2851 &pObjectInfo->Fcb->ShareAccess);
2860 IoSetShareAccess( *pDesiredAccess,
2863 &pObjectInfo->Fcb->ShareAccess);
2866 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2868 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2869 AFS_TRACE_LEVEL_VERBOSE,
2870 "AFSProcessOpen Increment handle count on Fcb %p Cnt %d\n",
2875 // Increment the open reference and handle on the parent node
2878 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2880 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2881 AFS_TRACE_LEVEL_VERBOSE,
2882 "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
2883 pObjectInfo->ParentObjectInformation,
2886 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2888 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2889 AFS_TRACE_LEVEL_VERBOSE,
2890 "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
2891 pObjectInfo->ParentObjectInformation,
2894 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2898 // Mark it for delete on close
2901 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2902 AFS_TRACE_LEVEL_VERBOSE,
2903 "AFSProcessOpen (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2906 &DirectoryCB->NameInformation.FileName);
2908 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2912 // Indicate the object is held
2915 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2918 // Return the open result for this file
2921 Irp->IoStatus.Information = FILE_OPENED;
2923 *Fcb = pObjectInfo->Fcb;
2930 if( !NT_SUCCESS( ntStatus))
2933 // Decrement the open count on this Fcb
2936 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2938 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2939 AFS_TRACE_LEVEL_VERBOSE,
2940 "AFSProcessOpen Decrement2 count on Fcb %p Cnt %d\n",
2945 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2948 if( !NT_SUCCESS( ntStatus))
2951 if ( ulFileAccess > 0)
2954 stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2956 stReleaseFileAccess.FileAccess = ulFileAccess;
2958 stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
2960 AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
2961 AFS_REQUEST_FLAG_SYNCHRONOUS,
2963 &DirectoryCB->NameInformation.FileName,
2964 &pObjectInfo->FileId,
2965 (void *)&stReleaseFileAccess,
2966 sizeof( AFSFileAccessReleaseCB),
2981 // Fcb will be freed by AFSPrimaryVolumeWorker thread
2992 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
2994 IN AFSVolumeCB *VolumeCB,
2996 IN AFSDirectoryCB *ParentDirCB,
2997 IN AFSDirectoryCB *DirectoryCB,
3001 UNREFERENCED_PARAMETER(DeviceObject);
3002 NTSTATUS ntStatus = STATUS_SUCCESS;
3003 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3004 PFILE_OBJECT pFileObject = NULL;
3005 LARGE_INTEGER liZero = {0,0};
3006 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
3007 ULONG ulAttributes = 0;
3008 ULONG ulCreateDisposition = 0;
3009 BOOLEAN bAllocatedCcb = FALSE;
3010 BOOLEAN bUserMapped = FALSE;
3011 PACCESS_MASK pDesiredAccess = NULL;
3012 USHORT usShareAccess;
3013 AFSObjectInfoCB *pParentObjectInfo = NULL;
3014 AFSObjectInfoCB *pObjectInfo = NULL;
3016 LARGE_INTEGER liSaveSize;
3017 LARGE_INTEGER liSaveVDL;
3018 LARGE_INTEGER liSaveAlloc;
3023 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
3025 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
3027 pFileObject = pIrpSp->FileObject;
3029 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
3031 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
3033 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
3036 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3037 AFS_TRACE_LEVEL_ERROR,
3038 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
3040 &DirectoryCB->NameInformation.FileName);
3042 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
3045 pParentObjectInfo = ParentDirCB->ObjectInformation;
3047 pObjectInfo = DirectoryCB->ObjectInformation;
3050 // Check if we should go and retrieve updated information for the node
3053 ntStatus = AFSValidateEntry( DirectoryCB,
3058 if( !NT_SUCCESS( ntStatus))
3061 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3062 AFS_TRACE_LEVEL_ERROR,
3063 "AFSProcessOverwriteSupersede (%p) Failed to validate entry %wZ Status %08lX\n",
3065 &DirectoryCB->NameInformation.FileName,
3068 try_return( ntStatus);
3072 // Be sure we have an Fcb for the object block
3075 ntStatus = AFSInitFcb( DirectoryCB);
3077 *Fcb = pObjectInfo->Fcb;
3079 if( !NT_SUCCESS( ntStatus))
3082 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3083 AFS_TRACE_LEVEL_ERROR,
3084 "AFSProcessOverwriteSupersede (%p) Failed to initialize fcb %wZ Status %08lX\n",
3086 &DirectoryCB->NameInformation.FileName,
3089 try_return( ntStatus);
3092 ntStatus = STATUS_SUCCESS;
3095 // Increment the open count on this Fcb.
3098 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3100 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3101 AFS_TRACE_LEVEL_VERBOSE,
3102 "AFSProcessOverwriteSupersede Increment2 count on Fcb %p Cnt %d\n",
3109 // Check access on the entry
3112 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3115 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3118 &pObjectInfo->Fcb->ShareAccess,
3121 if( !NT_SUCCESS( ntStatus))
3124 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3125 AFS_TRACE_LEVEL_ERROR,
3126 "AFSProcessOverwriteSupersede (%p) Access check failure %wZ Status %08lX\n",
3128 &DirectoryCB->NameInformation.FileName,
3131 try_return( ntStatus);
3135 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3136 AFS_TRACE_LEVEL_VERBOSE,
3137 "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
3138 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3139 PsGetCurrentThread());
3141 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3145 // Before we actually truncate, check to see if the purge
3146 // is going to fail.
3149 bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3152 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3153 AFS_TRACE_LEVEL_VERBOSE,
3154 "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %p EXCL %08lX\n",
3155 &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
3156 PsGetCurrentThread());
3158 AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
3163 ntStatus = STATUS_USER_MAPPED_FILE;
3165 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3166 AFS_TRACE_LEVEL_ERROR,
3167 "AFSProcessOverwriteSupersede (%p) File user mapped %wZ Status %08lX\n",
3169 &DirectoryCB->NameInformation.FileName,
3172 try_return( ntStatus);
3176 // Initialize the Ccb for the file.
3179 ntStatus = AFSInitCcb( Ccb,
3184 if( !NT_SUCCESS( ntStatus))
3187 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3188 AFS_TRACE_LEVEL_ERROR,
3189 "AFSProcessOverwriteSupersede (%p) Failed to initialize ccb %wZ Status %08lX\n",
3191 &DirectoryCB->NameInformation.FileName,
3194 try_return( ntStatus);
3197 bAllocatedCcb = TRUE;
3200 // Set the file length to zero
3203 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3206 bReleasePaging = TRUE;
3208 liSaveSize = pObjectInfo->Fcb->Header.FileSize;
3209 liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
3210 liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
3212 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3213 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3214 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3216 pObjectInfo->EndOfFile.QuadPart = 0;
3217 pObjectInfo->AllocationSize.QuadPart = 0;
3220 // Trim down the extents. We do this BEFORE telling the service
3221 // the file is truncated since there is a potential race between
3222 // a worker thread releasing extents and us trimming
3225 AFSTrimExtents( pObjectInfo->Fcb,
3226 &pObjectInfo->Fcb->Header.FileSize);
3228 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3230 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3232 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3235 // Set the update flag accordingly
3238 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3239 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3240 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3241 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3242 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3244 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3248 if( !NT_SUCCESS( ntStatus))
3251 pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
3252 pObjectInfo->Fcb->Header.FileSize = liSaveSize;
3253 pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
3254 pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
3255 pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
3257 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3258 AFS_TRACE_LEVEL_ERROR,
3259 "AFSProcessOverwriteSupersede (%p) Failed to update file information %wZ Status %08lX\n",
3261 &DirectoryCB->NameInformation.FileName,
3264 try_return( ntStatus);
3267 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3269 if( ulCreateDisposition == FILE_SUPERSEDE)
3272 pObjectInfo->FileAttributes = ulAttributes;
3278 pObjectInfo->FileAttributes |= ulAttributes;
3282 // Save off the access for the open
3285 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3288 IoUpdateShareAccess( pFileObject,
3289 &pObjectInfo->Fcb->ShareAccess);
3298 IoSetShareAccess( *pDesiredAccess,
3301 &pObjectInfo->Fcb->ShareAccess);
3305 // Return the correct action
3308 if( ulCreateDisposition == FILE_SUPERSEDE)
3311 Irp->IoStatus.Information = FILE_SUPERSEDED;
3316 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3319 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3321 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3322 AFS_TRACE_LEVEL_VERBOSE,
3323 "AFSProcessOverwriteSupersede Increment handle count on Fcb %p Cnt %d\n",
3328 // Increment the open reference and handle on the parent node
3331 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3333 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3334 AFS_TRACE_LEVEL_VERBOSE,
3335 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
3336 pObjectInfo->ParentObjectInformation,
3339 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3341 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3342 AFS_TRACE_LEVEL_VERBOSE,
3343 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
3344 pObjectInfo->ParentObjectInformation,
3347 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3349 bReleaseFcb = FALSE;
3351 *Fcb = pObjectInfo->Fcb;
3354 // Now that the Fcb->Resource has been dropped
3355 // we can call CcSetFileSizes. We are still holding
3356 // the PagingIoResource
3359 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3361 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3363 pFileObject->FsContext2 = (void *)*Ccb;
3365 CcSetFileSizes( pFileObject,
3366 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3373 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3379 if( !NT_SUCCESS( ntStatus))
3382 // Decrement the open count on this Fcb.
3385 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3387 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3388 AFS_TRACE_LEVEL_VERBOSE,
3389 "AFSProcessOverwriteSupersede Decrement2 count on Fcb %p Cnt %d\n",
3394 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3397 if( !NT_SUCCESS( ntStatus))
3410 // Fcb will be freed by AFSPrimaryVolumeWorker thread
3421 AFSControlDeviceCreate( IN PIRP Irp)
3424 NTSTATUS ntStatus = STATUS_SUCCESS;
3429 if ( KernelMode == Irp->RequestorMode) {
3431 // For now, just let the open happen
3433 Irp->IoStatus.Information = FILE_OPENED;
3438 // Not from usermode, All access must be via
3439 // the FS component (which will do the
3442 ntStatus = STATUS_ACCESS_DENIED;
3450 AFSOpenIOCtlFcb( IN PIRP Irp,
3452 IN AFSDirectoryCB *ParentDirCB,
3457 NTSTATUS ntStatus = STATUS_SUCCESS;
3458 PFILE_OBJECT pFileObject = NULL;
3459 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3460 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
3461 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3463 AFSObjectInfoCB *pParentObjectInfo = NULL;
3469 pFileObject = pIrpSp->FileObject;
3471 pParentObjectInfo = ParentDirCB->ObjectInformation;
3474 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3477 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3480 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3482 if( !NT_SUCCESS( ntStatus))
3485 try_return( ntStatus);
3490 // Allocate and initialize the Fcb for the file.
3493 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
3495 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3497 if( !NT_SUCCESS( ntStatus))
3500 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3501 AFS_TRACE_LEVEL_ERROR,
3502 "AFSOpenIOCtlFcb (%p) Failed to initialize fcb Status %08lX\n",
3506 try_return( ntStatus);
3509 ntStatus = STATUS_SUCCESS;
3512 // Increment the open reference and handle on the node
3515 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3517 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3518 AFS_TRACE_LEVEL_VERBOSE,
3519 "AFSOpenIOCtlFcb Increment count on Fcb %p Cnt %d\n",
3526 // Initialize the Ccb for the file.
3529 ntStatus = AFSInitCcb( Ccb,
3530 pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
3534 if( !NT_SUCCESS( ntStatus))
3537 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3538 AFS_TRACE_LEVEL_ERROR,
3539 "AFSOpenIOCtlFcb (%p) Failed to initialize ccb Status %08lX\n",
3543 try_return( ntStatus);
3546 bAllocatedCcb = TRUE;
3549 // Set the PIOCtl index
3552 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3554 RtlZeroMemory( &stPIOCtlOpen,
3555 sizeof( AFSPIOCtlOpenCloseRequestCB));
3557 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3559 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3561 RtlZeroMemory( &stFileID,
3562 sizeof( AFSFileID));
3565 // The parent directory FID of the node
3568 stFileID = pParentObjectInfo->FileId;
3571 // Issue the open request to the service
3574 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3575 AFS_REQUEST_FLAG_SYNCHRONOUS,
3579 (void *)&stPIOCtlOpen,
3580 sizeof( AFSPIOCtlOpenCloseRequestCB),
3584 if( !NT_SUCCESS( ntStatus))
3587 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3588 AFS_TRACE_LEVEL_ERROR,
3589 "AFSOpenIOCtlFcb (%p) Failed service open Status %08lX\n",
3593 try_return( ntStatus);
3597 // Reference the directory entry
3600 lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->DirOpenReferenceCount));
3602 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3603 AFS_TRACE_LEVEL_VERBOSE,
3604 "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
3605 &(*Ccb)->DirectoryCB->NameInformation.FileName,
3606 (*Ccb)->DirectoryCB,
3611 // Increment the handle on the node
3614 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3616 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3617 AFS_TRACE_LEVEL_VERBOSE,
3618 "AFSOpenIOCtlFcb Increment handle count on Fcb %p Cnt %d\n",
3623 // Increment the open reference and handle on the parent node
3626 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3628 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3629 AFS_TRACE_LEVEL_VERBOSE,
3630 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %p Cnt %d\n",
3634 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3636 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3637 AFS_TRACE_LEVEL_VERBOSE,
3638 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %p Cnt %d\n",