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( __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, uniPathName, 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;
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 (%08lX) 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 (%08lX) 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->OpenReferenceCount);
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,
381 try_return( ntStatus);
385 // We have a reference on the root volume
388 bReleaseVolume = TRUE;
391 // Attempt to locate the node in the name tree if this is not a target
392 // open and the target is not the root
395 uniComponentName.Length = 0;
396 uniComponentName.Buffer = NULL;
398 if( uniFileName.Length > sizeof( WCHAR) ||
399 uniFileName.Buffer[ 0] != L'\\')
402 if( !AFSValidNameFormat( &uniFileName))
405 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
407 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
408 AFS_TRACE_LEVEL_VERBOSE,
409 "AFSCommonCreate (%08lX) Invalid name %wZ Status %08lX\n",
414 try_return( ntStatus);
418 // Opening a reparse point directly?
421 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
423 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
425 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
426 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
427 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
430 uniSubstitutedPathName = uniRootFileName;
432 ntStatus = AFSLocateNameEntry( &stAuthGroup,
437 ulNameProcessingFlags,
443 if( !NT_SUCCESS( ntStatus) &&
444 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
447 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
449 uniSubstitutedPathName.Buffer = NULL;
453 // The routine above released the root while walking the
457 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
458 AFS_TRACE_LEVEL_VERBOSE,
459 "AFSCommonCreate (%08lX) Failed to locate name entry for %wZ Status %08lX\n",
465 // We released any root volume locks in the above on failure
468 bReleaseVolume = FALSE;
470 try_return( ntStatus);
474 // Check for STATUS_REPARSE
477 if( ntStatus == STATUS_REPARSE)
480 uniSubstitutedPathName.Buffer = NULL;
483 // Update the information and return
486 Irp->IoStatus.Information = IO_REPARSE;
489 // We released the volume lock above
492 bReleaseVolume = FALSE;
494 try_return( ntStatus);
498 // If we re-allocated the name, then update our substitute name
501 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
504 uniSubstitutedPathName = uniRootFileName;
509 uniSubstitutedPathName.Buffer = NULL;
513 // Check for a symlink access
516 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
517 pParentDirectoryCB != NULL)
520 UNICODE_STRING uniFinalComponent;
522 uniFinalComponent.Length = 0;
523 uniFinalComponent.MaximumLength = 0;
524 uniFinalComponent.Buffer = NULL;
526 AFSRetrieveFinalComponent( &uniFileName,
529 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
532 if( !NT_SUCCESS( ntStatus) &&
533 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
536 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
537 AFS_TRACE_LEVEL_VERBOSE,
538 "AFSCommonCreate (%08lX) Failing access to symlink %wZ Status %08lX\n",
543 try_return( ntStatus);
549 // If we have no parent then this is a root open, be sure there is a directory entry
553 else if( pParentDirectoryCB == NULL &&
554 pDirectoryCB == NULL)
557 pDirectoryCB = pVolumeCB->DirectoryCB;
560 if( bOpenTargetDirectory)
564 // If we have a directory cb for the entry then dereference it and reference the parent
567 if( pDirectoryCB != NULL)
571 // Perform in this order to prevent thrashing
574 lCount = InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
576 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
577 AFS_TRACE_LEVEL_VERBOSE,
578 "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
579 &pParentDirectoryCB->NameInformation.FileName,
585 // Do NOT decrement the reference count on the pDirectoryCB yet.
586 // The BackupEntry below might drop the count to zero leaving
587 // the entry subject to being deleted and we need some of the
588 // contents during later processing
591 AFSBackupEntry( pNameArray);
595 // OK, open the target directory
598 if( uniComponentName.Length == 0)
600 AFSRetrieveFinalComponent( &uniFileName,
604 ntStatus = AFSOpenTargetDirectory( Irp,
611 if( pDirectoryCB != NULL)
614 // It is now safe to drop the Reference Count
616 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
618 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
619 AFS_TRACE_LEVEL_VERBOSE,
620 "AFSCommonCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
621 &pDirectoryCB->NameInformation.FileName,
627 if( !NT_SUCCESS( ntStatus))
630 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
631 AFS_TRACE_LEVEL_ERROR,
632 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
633 &pParentDirectoryCB->NameInformation.FileName,
637 // Decrement the reference on the parent
640 lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
642 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
643 AFS_TRACE_LEVEL_VERBOSE,
644 "AFSCommonCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
645 &pParentDirectoryCB->NameInformation.FileName,
651 try_return( ntStatus);
654 if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
657 if( pDirectoryCB == NULL ||
658 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
660 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
661 AFS_TRACE_LEVEL_VERBOSE,
662 "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
666 pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
670 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
671 AFS_TRACE_LEVEL_VERBOSE,
672 "AFSCommonCreate (%08lX) Opening as reparse point %wZ Type %08lX\n",
675 pDirectoryCB->ObjectInformation->FileType);
677 bOpenedReparsePoint = TRUE;
682 // Based on the options passed in, process the file accordingly.
685 if( ulCreateDisposition == FILE_CREATE ||
686 ( ( ulCreateDisposition == FILE_OPEN_IF ||
687 ulCreateDisposition == FILE_OVERWRITE_IF) &&
688 pDirectoryCB == NULL))
691 if( uniComponentName.Length == 0 ||
692 pDirectoryCB != NULL)
696 // We traversed the entire path so we found each entry,
697 // fail with collision
700 if( pDirectoryCB != NULL)
703 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
704 AFS_TRACE_LEVEL_VERBOSE,
705 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
706 &pDirectoryCB->NameInformation.FileName,
709 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
711 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
712 AFS_TRACE_LEVEL_VERBOSE,
713 "AFSCommonCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
714 &pDirectoryCB->NameInformation.FileName,
722 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
723 AFS_TRACE_LEVEL_VERBOSE,
724 "AFSCommonCreate Object name collision on create Status %08lX\n",
727 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
729 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
730 AFS_TRACE_LEVEL_VERBOSE,
731 "AFSCommonCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
732 &pParentDirectoryCB->NameInformation.FileName,
735 pParentDirectoryCB->OpenReferenceCount);
738 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
742 // OK, go and create the node
745 ntStatus = AFSProcessCreate( Irp,
755 if( !NT_SUCCESS( ntStatus))
758 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
759 AFS_TRACE_LEVEL_ERROR,
760 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
762 &pParentDirectoryCB->NameInformation.FileName,
767 // Dereference the parent entry
770 lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
772 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
773 AFS_TRACE_LEVEL_VERBOSE,
774 "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
775 &pParentDirectoryCB->NameInformation.FileName,
780 try_return( ntStatus);
784 // We should not have an extra component except for PIOCtl opens
787 if( uniComponentName.Length > 0)
791 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
794 if( RtlCompareUnicodeString( &AFSPIOCtlName,
799 ntStatus = AFSOpenIOCtlFcb( Irp,
805 if( !NT_SUCCESS( ntStatus))
808 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
809 AFS_TRACE_LEVEL_ERROR,
810 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
818 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
819 AFS_TRACE_LEVEL_VERBOSE,
820 "AFSCommonCreate (%08lX) File %wZ name not found\n",
824 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
827 if( !NT_SUCCESS( ntStatus))
831 // Dereference the parent entry
834 if( pDirectoryCB != NULL)
837 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
839 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
840 AFS_TRACE_LEVEL_VERBOSE,
841 "AFSCommonCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
842 &pDirectoryCB->NameInformation.FileName,
850 lCount = InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
852 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
853 AFS_TRACE_LEVEL_VERBOSE,
854 "AFSCommonCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
855 &pParentDirectoryCB->NameInformation.FileName,
862 try_return( ntStatus);
866 // For root opens the parent will be NULL
869 if( pParentDirectoryCB == NULL)
873 // Check for the delete on close flag for the root
876 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
879 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
880 AFS_TRACE_LEVEL_ERROR,
881 "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
884 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
886 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
887 AFS_TRACE_LEVEL_VERBOSE,
888 "AFSCommonCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
889 &pDirectoryCB->NameInformation.FileName,
894 try_return( ntStatus = STATUS_CANNOT_DELETE);
898 // If this is the target directory, then bail
901 if( bOpenTargetDirectory)
904 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
905 AFS_TRACE_LEVEL_ERROR,
906 "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
909 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
911 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
912 AFS_TRACE_LEVEL_VERBOSE,
913 "AFSCommonCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
914 &pDirectoryCB->NameInformation.FileName,
919 try_return( ntStatus = STATUS_INVALID_PARAMETER);
923 // Go and open the root of the volume
926 ntStatus = AFSOpenRoot( Irp,
932 if( !NT_SUCCESS( ntStatus))
935 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
936 AFS_TRACE_LEVEL_ERROR,
937 "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
938 pVolumeCB->ObjectInformation.FileId.Cell,
939 pVolumeCB->ObjectInformation.FileId.Volume,
942 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
944 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
945 AFS_TRACE_LEVEL_VERBOSE,
946 "AFSCommonCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
947 &pDirectoryCB->NameInformation.FileName,
953 try_return( ntStatus);
957 // At this point if we have no pDirectoryCB it was not found.
960 if( pDirectoryCB == NULL)
963 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
964 AFS_TRACE_LEVEL_ERROR,
965 "AFSCommonCreate Failing access to %wZ\n",
968 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
971 if( ulCreateDisposition == FILE_OVERWRITE ||
972 ulCreateDisposition == FILE_SUPERSEDE ||
973 ulCreateDisposition == FILE_OVERWRITE_IF)
977 // Go process a file for overwrite or supersede.
980 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
989 if( !NT_SUCCESS( ntStatus))
992 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
993 AFS_TRACE_LEVEL_ERROR,
994 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
995 &pDirectoryCB->NameInformation.FileName,
998 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
1000 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1001 AFS_TRACE_LEVEL_VERBOSE,
1002 "AFSCommonCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
1003 &pDirectoryCB->NameInformation.FileName,
1009 try_return( ntStatus);
1013 // Trying to open the file
1016 ntStatus = AFSProcessOpen( Irp,
1024 if( !NT_SUCCESS( ntStatus))
1027 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1028 AFS_TRACE_LEVEL_ERROR,
1029 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
1030 &pDirectoryCB->NameInformation.FileName,
1033 lCount = InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
1035 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1036 AFS_TRACE_LEVEL_VERBOSE,
1037 "AFSCommonCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
1038 &pDirectoryCB->NameInformation.FileName,
1046 if( NT_SUCCESS( ntStatus) &&
1047 ntStatus != STATUS_REPARSE)
1053 AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
1056 RtlCopyMemory( &pCcb->AuthGroup,
1061 // If we have a substitute name, then use it
1064 if( uniSubstitutedPathName.Buffer != NULL)
1067 pCcb->FullFileName = uniSubstitutedPathName;
1069 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1071 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1076 pCcb->FullFileName = uniRootFileName;
1078 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1081 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1083 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1087 if( bOpenedReparsePoint)
1089 SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
1092 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1093 AFS_TRACE_LEVEL_VERBOSE,
1094 "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1095 &pCcb->DirectoryCB->NameInformation.FileName,
1098 pCcb->DirectoryCB->OpenReferenceCount);
1100 ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
1102 pCcb->CurrentDirIndex = 0;
1104 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1107 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1111 // Save off the name array for this instance
1114 pCcb->NameArray = pNameArray;
1118 AFSReleaseResource( &pCcb->NPCcb->CcbLock);
1122 // If we make it here then init the FO for the request.
1125 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1126 AFS_TRACE_LEVEL_VERBOSE_2,
1127 "AFSCommonCreate (%08lX) FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1133 pFileObject->FsContext = (void *)pFcb;
1135 pFileObject->FsContext2 = (void *)pCcb;
1140 ASSERT( pFcb->OpenHandleCount > 0);
1142 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1145 // For files perform additional processing
1148 switch( pFcb->Header.NodeTypeCode)
1155 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1160 // If the user did not request nobuffering then mark the FO as cacheable
1163 if( bNoIntermediateBuffering)
1166 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1171 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1175 // If the file was opened for execution then we need to set the bit in the FO
1178 if( BooleanFlagOn( *pDesiredAccess,
1182 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1186 // Update the last access time
1189 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1200 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1201 AFS_TRACE_LEVEL_ERROR,
1202 "AFSCommonCreate (%08lX) Returning with NULL Fcb FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1211 if( NT_SUCCESS( ntStatus) &&
1212 ntStatus == STATUS_REPARSE)
1215 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1216 AFS_TRACE_LEVEL_ERROR,
1217 "AFSCommonCreate (%08lX) STATUS_REPARSE FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1225 // Free up the sub name if we have one
1228 if( uniSubstitutedPathName.Buffer != NULL)
1231 AFSExFreePool( uniSubstitutedPathName.Buffer);
1233 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1238 // Free up the name array ...
1241 if( pNameArray != NULL)
1244 AFSFreeNameArray( pNameArray);
1247 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1250 AFSExFreePool( uniRootFileName.Buffer);
1256 lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
1258 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1259 AFS_TRACE_LEVEL_VERBOSE,
1260 "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
1266 // Setup the Irp for completion, the Information has been set previously
1269 Irp->IoStatus.Status = ntStatus;
1276 AFSOpenAFSRoot( IN PIRP Irp,
1281 NTSTATUS ntStatus = STATUS_SUCCESS;
1288 // Initialize the Ccb for the file.
1291 ntStatus = AFSInitCcb( Ccb);
1293 if( !NT_SUCCESS( ntStatus))
1296 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1297 AFS_TRACE_LEVEL_ERROR,
1298 "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
1301 try_return( ntStatus);
1308 (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
1311 // Increment the open count on this Fcb
1314 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1316 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1317 AFS_TRACE_LEVEL_VERBOSE,
1318 "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
1319 AFSGlobalRoot->RootFcb,
1322 lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1324 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1325 AFS_TRACE_LEVEL_VERBOSE,
1326 "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
1327 AFSGlobalRoot->RootFcb,
1330 *Fcb = AFSGlobalRoot->RootFcb;
1333 // Return the open result for this file
1336 Irp->IoStatus.Information = FILE_OPENED;
1347 AFSOpenRoot( IN PIRP Irp,
1348 IN AFSVolumeCB *VolumeCB,
1350 OUT AFSFcb **RootFcb,
1354 NTSTATUS ntStatus = STATUS_SUCCESS;
1355 PFILE_OBJECT pFileObject = NULL;
1356 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1357 PACCESS_MASK pDesiredAccess = NULL;
1358 USHORT usShareAccess;
1360 BOOLEAN bAllocatedCcb = FALSE;
1361 BOOLEAN bReleaseFcb = FALSE;
1362 AFSFileOpenCB stOpenCB;
1363 AFSFileOpenResultCB stOpenResultCB;
1364 ULONG ulResultLen = 0;
1370 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1371 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1372 ulOptions = pIrpSp->Parameters.Create.Options;
1374 pFileObject = pIrpSp->FileObject;
1376 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
1379 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
1381 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1382 AFS_TRACE_LEVEL_ERROR,
1383 "AFSOpenRoot (%08lX) Attempt to open root as file Status %08lX\n",
1387 try_return( ntStatus);
1391 // Check if we should go and retrieve updated information for the node
1394 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1398 if( !NT_SUCCESS( ntStatus))
1401 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1402 AFS_TRACE_LEVEL_ERROR,
1403 "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
1407 try_return( ntStatus);
1411 // Check with the service that we can open the file
1414 RtlZeroMemory( &stOpenCB,
1415 sizeof( AFSFileOpenCB));
1417 stOpenCB.DesiredAccess = *pDesiredAccess;
1419 stOpenCB.ShareAccess = usShareAccess;
1421 stOpenResultCB.GrantedAccess = 0;
1423 ulResultLen = sizeof( AFSFileOpenResultCB);
1425 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1426 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1429 &VolumeCB->ObjectInformation.FileId,
1431 sizeof( AFSFileOpenCB),
1432 (void *)&stOpenResultCB,
1435 if( !NT_SUCCESS( ntStatus))
1438 UNICODE_STRING uniGUID;
1441 uniGUID.MaximumLength = 0;
1442 uniGUID.Buffer = NULL;
1444 if( AuthGroup != NULL)
1446 RtlStringFromGUID( *AuthGroup,
1450 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1451 AFS_TRACE_LEVEL_ERROR,
1452 "AFSOpenRoot (%08lX) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
1454 VolumeCB->ObjectInformation.FileId.Cell,
1455 VolumeCB->ObjectInformation.FileId.Volume,
1459 if( AuthGroup != NULL)
1461 RtlFreeUnicodeString( &uniGUID);
1464 try_return( ntStatus);
1468 // If the entry is not initialized then do it now
1471 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1474 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1477 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1480 ntStatus = AFSEnumerateDirectory( AuthGroup,
1481 &VolumeCB->ObjectInformation,
1484 if( !NT_SUCCESS( ntStatus))
1487 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1489 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1490 AFS_TRACE_LEVEL_ERROR,
1491 "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
1495 try_return( ntStatus);
1498 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1501 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1505 // If the root fcb has been initialized then check access otherwise
1506 // init the volume fcb
1509 if( VolumeCB->RootFcb == NULL)
1512 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1515 if( !NT_SUCCESS( ntStatus))
1518 try_return( ntStatus);
1524 AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
1531 // If there are current opens on the Fcb, check the access.
1534 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1537 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1540 &VolumeCB->RootFcb->ShareAccess,
1543 if( !NT_SUCCESS( ntStatus))
1546 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1547 AFS_TRACE_LEVEL_ERROR,
1548 "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
1552 try_return( ntStatus);
1557 // Initialize the Ccb for the file.
1560 ntStatus = AFSInitCcb( Ccb);
1562 if( !NT_SUCCESS( ntStatus))
1565 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1566 AFS_TRACE_LEVEL_ERROR,
1567 "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
1571 try_return( ntStatus);
1574 bAllocatedCcb = TRUE;
1580 (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
1582 (*Ccb)->GrantedAccess = *pDesiredAccess;
1585 // OK, update the share access on the fileobject
1588 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1591 IoUpdateShareAccess( pFileObject,
1592 &VolumeCB->RootFcb->ShareAccess);
1601 IoSetShareAccess( *pDesiredAccess,
1604 &VolumeCB->RootFcb->ShareAccess);
1608 // Increment the open count on this Fcb
1611 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1613 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1614 AFS_TRACE_LEVEL_VERBOSE,
1615 "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
1619 lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1621 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1622 AFS_TRACE_LEVEL_VERBOSE,
1623 "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
1628 // Indicate the object is held
1631 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1634 // Return the open result for this file
1637 Irp->IoStatus.Information = FILE_OPENED;
1639 *RootFcb = VolumeCB->RootFcb;
1646 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1649 if( !NT_SUCCESS( ntStatus))
1661 Irp->IoStatus.Information = 0;
1669 AFSProcessCreate( IN PIRP Irp,
1671 IN AFSVolumeCB *VolumeCB,
1672 IN AFSDirectoryCB *ParentDirCB,
1673 IN PUNICODE_STRING FileName,
1674 IN PUNICODE_STRING ComponentName,
1675 IN PUNICODE_STRING FullFileName,
1680 NTSTATUS ntStatus = STATUS_SUCCESS;
1681 PFILE_OBJECT pFileObject = NULL;
1682 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1683 ULONG ulOptions = 0;
1684 ULONG ulShareMode = 0;
1686 ULONG ulAttributes = 0;
1687 LARGE_INTEGER liAllocationSize = {0,0};
1688 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1689 BOOLEAN bAllocatedFcb = FALSE;
1690 PACCESS_MASK pDesiredAccess = NULL;
1691 USHORT usShareAccess;
1692 AFSDirectoryCB *pDirEntry = NULL;
1693 AFSObjectInfoCB *pParentObjectInfo = NULL;
1694 AFSObjectInfoCB *pObjectInfo = NULL;
1700 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1701 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1703 pFileObject = pIrpSp->FileObject;
1706 // Extract out the options
1709 ulOptions = pIrpSp->Parameters.Create.Options;
1712 // We pass all attributes they want to apply to the file to the create
1715 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1718 // If this is a directory create then set the attribute correctly
1721 if( ulOptions & FILE_DIRECTORY_FILE)
1724 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1727 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1728 AFS_TRACE_LEVEL_VERBOSE,
1729 "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
1734 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1737 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1738 AFS_TRACE_LEVEL_ERROR,
1739 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1742 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
1745 pParentObjectInfo = ParentDirCB->ObjectInformation;
1748 // Allocate and insert the direntry into the parent node
1751 ntStatus = AFSCreateDirEntry( AuthGroup,
1759 if( !NT_SUCCESS( ntStatus))
1762 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1763 AFS_TRACE_LEVEL_ERROR,
1764 "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
1769 try_return( ntStatus);
1772 bFileCreated = TRUE;
1774 pObjectInfo = pDirEntry->ObjectInformation;
1776 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1777 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1780 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1781 AFS_TRACE_LEVEL_VERBOSE,
1782 "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1784 &pDirEntry->NameInformation.FileName,
1785 pObjectInfo->FileId.Cell,
1786 pObjectInfo->FileId.Volume,
1787 pObjectInfo->FileId.Vnode,
1788 pObjectInfo->FileId.Unique);
1790 ntStatus = AFSEvaluateNode( AuthGroup,
1793 if( !NT_SUCCESS( ntStatus))
1796 if ( ntStatus == STATUS_NOT_A_DIRECTORY)
1799 if ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
1802 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1803 AFS_TRACE_LEVEL_ERROR,
1804 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1806 &pDirEntry->NameInformation.FileName,
1807 pObjectInfo->FileId.Cell,
1808 pObjectInfo->FileId.Volume,
1809 pObjectInfo->FileId.Vnode,
1810 pObjectInfo->FileId.Unique,
1811 pParentObjectInfo->FileId.Cell,
1812 pParentObjectInfo->FileId.Volume,
1813 pParentObjectInfo->FileId.Vnode,
1814 pParentObjectInfo->FileId.Unique,
1817 else if ( pObjectInfo->ParentObjectInformation == NULL)
1820 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1821 AFS_TRACE_LEVEL_ERROR,
1822 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
1824 &pDirEntry->NameInformation.FileName,
1825 pObjectInfo->FileId.Cell,
1826 pObjectInfo->FileId.Volume,
1827 pObjectInfo->FileId.Vnode,
1828 pObjectInfo->FileId.Unique,
1829 pParentObjectInfo->FileId.Cell,
1830 pParentObjectInfo->FileId.Volume,
1831 pParentObjectInfo->FileId.Vnode,
1832 pParentObjectInfo->FileId.Unique,
1838 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1839 AFS_TRACE_LEVEL_ERROR,
1840 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1842 &pDirEntry->NameInformation.FileName,
1843 pObjectInfo->FileId.Cell,
1844 pObjectInfo->FileId.Volume,
1845 pObjectInfo->FileId.Vnode,
1846 pObjectInfo->FileId.Unique,
1847 pParentObjectInfo->FileId.Cell,
1848 pParentObjectInfo->FileId.Volume,
1849 pParentObjectInfo->FileId.Vnode,
1850 pParentObjectInfo->FileId.Unique,
1851 pObjectInfo->ParentObjectInformation->FileId.Cell,
1852 pObjectInfo->ParentObjectInformation->FileId.Volume,
1853 pObjectInfo->ParentObjectInformation->FileId.Vnode,
1854 pObjectInfo->ParentObjectInformation->FileId.Unique,
1861 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1862 AFS_TRACE_LEVEL_ERROR,
1863 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
1865 &pDirEntry->NameInformation.FileName,
1866 pObjectInfo->FileId.Cell,
1867 pObjectInfo->FileId.Volume,
1868 pObjectInfo->FileId.Vnode,
1869 pObjectInfo->FileId.Unique,
1873 try_return( ntStatus);
1876 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1880 // We may have raced and the Fcb is already created
1883 if( pObjectInfo->Fcb != NULL)
1886 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1887 AFS_TRACE_LEVEL_VERBOSE,
1888 "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
1892 *Fcb = pObjectInfo->Fcb;
1894 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
1901 // Allocate and initialize the Fcb for the file.
1904 ntStatus = AFSInitFcb( pDirEntry);
1906 *Fcb = pObjectInfo->Fcb;
1908 if( !NT_SUCCESS( ntStatus))
1911 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1912 AFS_TRACE_LEVEL_ERROR,
1913 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
1918 try_return( ntStatus);
1921 if ( ntStatus != STATUS_REPARSE)
1924 bAllocatedFcb = TRUE;
1927 ntStatus = STATUS_SUCCESS;
1931 // Increment the open count on this Fcb
1934 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1936 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1937 AFS_TRACE_LEVEL_VERBOSE,
1938 "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
1945 // Initialize the Ccb for the file.
1948 ntStatus = AFSInitCcb( Ccb);
1950 if( !NT_SUCCESS( ntStatus))
1953 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1954 AFS_TRACE_LEVEL_ERROR,
1955 "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
1960 try_return( ntStatus);
1963 bAllocatedCcb = TRUE;
1966 // Initialize the Ccb
1969 (*Ccb)->DirectoryCB = pDirEntry;
1971 (*Ccb)->GrantedAccess = *pDesiredAccess;
1974 // If this is a file, update the headers filesizes.
1977 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1981 // Update the sizes with the information passed in
1984 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1985 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1986 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1989 // Notify the system of the addition
1992 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1994 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1995 (ULONG)FILE_ACTION_ADDED);
1997 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1999 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2003 // This is a new directory node so indicate it has been enumerated
2006 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
2009 // And the parent directory entry
2012 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
2015 // Notify the system of the addition
2018 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2020 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2021 (ULONG)FILE_ACTION_ADDED);
2023 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2024 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2025 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2026 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
2030 // And the parent directory entry
2033 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
2036 // Notify the system of the addition
2039 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
2041 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
2042 (ULONG)FILE_ACTION_ADDED);
2046 // Save off the access for the open
2049 IoSetShareAccess( *pDesiredAccess,
2052 &(*Fcb)->ShareAccess);
2054 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
2056 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2057 AFS_TRACE_LEVEL_VERBOSE,
2058 "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
2063 // Increment the open reference and handle on the parent node
2066 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2068 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2069 AFS_TRACE_LEVEL_VERBOSE,
2070 "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
2071 pObjectInfo->ParentObjectInformation,
2074 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2076 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2077 AFS_TRACE_LEVEL_VERBOSE,
2078 "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
2079 pObjectInfo->ParentObjectInformation,
2082 if( ulOptions & FILE_DELETE_ON_CLOSE)
2086 // Mark it for delete on close
2089 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2090 AFS_TRACE_LEVEL_VERBOSE,
2091 "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2096 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2100 // Indicate the object is locked in the service
2103 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2106 // Return the open result for this file
2109 Irp->IoStatus.Information = FILE_CREATED;
2114 // If we created the Fcb we need to release the resources
2120 if( !NT_SUCCESS( ntStatus))
2123 // Decrement the open count on this Fcb
2126 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
2128 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2129 AFS_TRACE_LEVEL_VERBOSE,
2130 "AFSProcessCreate Decrement count on Fcb %08lX Cnt %d\n",
2135 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2138 if( !NT_SUCCESS( ntStatus))
2144 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2145 AFS_TRACE_LEVEL_VERBOSE,
2146 "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
2152 // Remove the dir entry from the parent
2155 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2158 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2160 AFSNotifyDelete( pDirEntry,
2165 // Decrement the reference added during initialization of the DE
2168 lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
2170 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2171 AFS_TRACE_LEVEL_VERBOSE,
2172 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2173 &pDirEntry->NameInformation.FileName,
2178 // Pull the directory entry from the parent
2181 AFSRemoveDirNodeFromParent( pParentObjectInfo,
2183 FALSE); // Leave it in the enum list so the worker cleans it up
2186 // Tag the parent as needing verification
2189 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
2191 pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
2193 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2206 AFSRemoveFcb( &pObjectInfo->Fcb);
2219 AFSOpenTargetDirectory( IN PIRP Irp,
2220 IN AFSVolumeCB *VolumeCB,
2221 IN AFSDirectoryCB *ParentDirectoryCB,
2222 IN AFSDirectoryCB *TargetDirectoryCB,
2223 IN UNICODE_STRING *TargetName,
2228 NTSTATUS ntStatus = STATUS_SUCCESS;
2229 PFILE_OBJECT pFileObject = NULL;
2230 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2231 PACCESS_MASK pDesiredAccess = NULL;
2232 USHORT usShareAccess;
2233 BOOLEAN bAllocatedCcb = FALSE;
2234 BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2235 AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
2236 UNICODE_STRING uniTargetName;
2242 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2243 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2245 pFileObject = pIrpSp->FileObject;
2247 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2248 AFS_TRACE_LEVEL_VERBOSE,
2249 "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
2253 pParentObject = ParentDirectoryCB->ObjectInformation;
2255 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2258 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2262 // Make sure we have an Fcb for the access
2265 if( pParentObject->Fcb != NULL)
2268 *Fcb = pParentObject->Fcb;
2270 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
2277 // Allocate and initialize the Fcb for the file.
2280 ntStatus = AFSInitFcb( ParentDirectoryCB);
2282 *Fcb = pParentObject->Fcb;
2284 if( !NT_SUCCESS( ntStatus))
2287 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2288 AFS_TRACE_LEVEL_ERROR,
2289 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2291 &ParentDirectoryCB->NameInformation.FileName,
2294 try_return( ntStatus);
2297 if ( ntStatus == STATUS_REPARSE)
2300 bAllocatedFcb = TRUE;
2303 ntStatus = STATUS_SUCCESS;
2307 // Increment the open count on this Fcb
2310 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2312 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2313 AFS_TRACE_LEVEL_VERBOSE,
2314 "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
2321 // If there are current opens on the Fcb, check the access.
2324 if( pParentObject->Fcb->OpenHandleCount > 0)
2327 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2330 &pParentObject->Fcb->ShareAccess,
2333 if( !NT_SUCCESS( ntStatus))
2336 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2337 AFS_TRACE_LEVEL_ERROR,
2338 "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
2340 &ParentDirectoryCB->NameInformation.FileName,
2343 try_return( ntStatus);
2348 // Initialize the Ccb for the file.
2351 ntStatus = AFSInitCcb( Ccb);
2353 if( !NT_SUCCESS( ntStatus))
2356 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2357 AFS_TRACE_LEVEL_ERROR,
2358 "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2360 &ParentDirectoryCB->NameInformation.FileName,
2363 try_return( ntStatus);
2366 bAllocatedCcb = TRUE;
2369 // Initialize the Ccb
2372 (*Ccb)->DirectoryCB = ParentDirectoryCB;
2374 (*Ccb)->GrantedAccess = *pDesiredAccess;
2376 if( TargetDirectoryCB != NULL &&
2377 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2383 Irp->IoStatus.Information = FILE_EXISTS;
2385 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2390 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2392 uniTargetName = *TargetName;
2396 // Update the filename in the fileobject for rename processing
2399 RtlCopyMemory( pFileObject->FileName.Buffer,
2400 uniTargetName.Buffer,
2401 uniTargetName.Length);
2403 pFileObject->FileName.Length = uniTargetName.Length;
2406 // OK, update the share access on the fileobject
2409 if( pParentObject->Fcb->OpenHandleCount > 0)
2412 IoUpdateShareAccess( pFileObject,
2413 &pParentObject->Fcb->ShareAccess);
2422 IoSetShareAccess( *pDesiredAccess,
2425 &pParentObject->Fcb->ShareAccess);
2428 lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2430 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2431 AFS_TRACE_LEVEL_VERBOSE,
2432 "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
2437 // Increment the open reference and handle on the parent node
2440 if( pParentObject->ParentObjectInformation != NULL)
2443 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2445 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2446 AFS_TRACE_LEVEL_VERBOSE,
2447 "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
2448 pParentObject->ParentObjectInformation,
2451 lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2453 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2454 AFS_TRACE_LEVEL_VERBOSE,
2455 "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
2456 pParentObject->ParentObjectInformation,
2465 if( !NT_SUCCESS( ntStatus))
2468 // Decrement the open count on this Fcb
2471 lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
2473 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2474 AFS_TRACE_LEVEL_VERBOSE,
2475 "AFSOpenTargetDirectory Decrement count on Fcb %08lX Cnt %d\n",
2480 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2483 if( !NT_SUCCESS( ntStatus))
2498 AFSRemoveFcb( &pParentObject->Fcb);
2509 AFSProcessOpen( IN PIRP Irp,
2511 IN AFSVolumeCB *VolumeCB,
2512 IN AFSDirectoryCB *ParentDirCB,
2513 IN AFSDirectoryCB *DirectoryCB,
2518 NTSTATUS ntStatus = STATUS_SUCCESS;
2519 PFILE_OBJECT pFileObject = NULL;
2520 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2521 PACCESS_MASK pDesiredAccess = NULL;
2522 USHORT usShareAccess;
2523 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2524 ULONG ulAdditionalFlags = 0, ulOptions = 0;
2525 AFSFileOpenCB stOpenCB;
2526 AFSFileOpenResultCB stOpenResultCB;
2527 ULONG ulResultLen = 0;
2528 AFSObjectInfoCB *pParentObjectInfo = NULL;
2529 AFSObjectInfoCB *pObjectInfo = NULL;
2530 ULONG ulFileAccess = 0;
2531 AFSFileAccessReleaseCB stReleaseFileAccess;
2537 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2538 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2540 pFileObject = pIrpSp->FileObject;
2542 pParentObjectInfo = ParentDirCB->ObjectInformation;
2544 pObjectInfo = DirectoryCB->ObjectInformation;
2547 // Check if the entry is pending a deletion
2550 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2553 ntStatus = STATUS_DELETE_PENDING;
2555 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2556 AFS_TRACE_LEVEL_ERROR,
2557 "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
2559 &DirectoryCB->NameInformation.FileName,
2562 try_return( ntStatus);
2566 // Extract out the options
2569 ulOptions = pIrpSp->Parameters.Create.Options;
2572 // Check if we should go and retrieve updated information for the node
2575 ntStatus = AFSValidateEntry( DirectoryCB,
2579 if( !NT_SUCCESS( ntStatus))
2582 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2583 AFS_TRACE_LEVEL_ERROR,
2584 "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
2586 &DirectoryCB->NameInformation.FileName,
2589 try_return( ntStatus);
2593 // If this is marked for delete on close then be sure we can delete the entry
2596 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2599 ntStatus = AFSNotifyDelete( DirectoryCB,
2603 if( !NT_SUCCESS( ntStatus))
2606 ntStatus = STATUS_CANNOT_DELETE;
2608 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2609 AFS_TRACE_LEVEL_ERROR,
2610 "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2612 &DirectoryCB->NameInformation.FileName,
2615 try_return( ntStatus);
2620 // Be sure we have an Fcb for the current object
2623 if( pObjectInfo->Fcb == NULL)
2626 ntStatus = AFSInitFcb( DirectoryCB);
2628 if( !NT_SUCCESS( ntStatus))
2631 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2632 AFS_TRACE_LEVEL_ERROR,
2633 "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
2635 &DirectoryCB->NameInformation.FileName,
2638 try_return( ntStatus);
2641 if ( ntStatus != STATUS_REPARSE)
2644 bAllocatedFcb = TRUE;
2647 ntStatus = STATUS_SUCCESS;
2652 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2657 // Increment the open count on this Fcb
2660 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2662 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2663 AFS_TRACE_LEVEL_VERBOSE,
2664 "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
2671 // Check access on the entry
2674 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2677 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2680 &pObjectInfo->Fcb->ShareAccess,
2683 if( !NT_SUCCESS( ntStatus))
2686 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2687 AFS_TRACE_LEVEL_ERROR,
2688 "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
2690 &DirectoryCB->NameInformation.FileName,
2693 try_return( ntStatus);
2698 // Additional checks
2701 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2705 // If the caller is asking for write access then try to flush the image section
2708 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2709 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2712 if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2716 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2717 STATUS_SHARING_VIOLATION;
2719 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2720 AFS_TRACE_LEVEL_ERROR,
2721 "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
2723 &DirectoryCB->NameInformation.FileName,
2726 try_return( ntStatus);
2730 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2733 ntStatus = STATUS_NOT_A_DIRECTORY;
2735 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2736 AFS_TRACE_LEVEL_ERROR,
2737 "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
2739 &DirectoryCB->NameInformation.FileName,
2742 try_return( ntStatus);
2745 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2747 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2748 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2751 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2754 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2756 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2757 AFS_TRACE_LEVEL_ERROR,
2758 "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
2760 &DirectoryCB->NameInformation.FileName,
2763 try_return( ntStatus);
2766 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2767 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2768 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
2769 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
2776 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2780 // Check with the service that we can open the file
2783 stOpenCB.ParentId = pParentObjectInfo->FileId;
2785 stOpenCB.DesiredAccess = *pDesiredAccess;
2787 stOpenCB.ShareAccess = usShareAccess;
2789 stOpenCB.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2791 stOpenCB.Identifier = (ULONGLONG)pFileObject;
2793 stOpenResultCB.GrantedAccess = 0;
2795 ulResultLen = sizeof( AFSFileOpenResultCB);
2797 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2798 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2800 &DirectoryCB->NameInformation.FileName,
2801 &pObjectInfo->FileId,
2803 sizeof( AFSFileOpenCB),
2804 (void *)&stOpenResultCB,
2807 if( !NT_SUCCESS( ntStatus))
2810 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2811 AFS_TRACE_LEVEL_ERROR,
2812 "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
2814 &DirectoryCB->NameInformation.FileName,
2817 try_return( ntStatus);
2821 // Save the granted access in case we need to release it below
2824 ulFileAccess = stOpenResultCB.FileAccess;
2827 // Check if there is a conflict
2830 if( !AFSCheckAccess( *pDesiredAccess,
2831 stOpenResultCB.GrantedAccess,
2832 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2835 ntStatus = STATUS_ACCESS_DENIED;
2837 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2838 AFS_TRACE_LEVEL_ERROR,
2839 "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2842 stOpenResultCB.GrantedAccess,
2843 &DirectoryCB->NameInformation.FileName,
2846 try_return( ntStatus);
2850 // Initialize the Ccb for the file.
2853 ntStatus = AFSInitCcb( Ccb);
2855 if( !NT_SUCCESS( ntStatus))
2858 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2859 AFS_TRACE_LEVEL_ERROR,
2860 "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2862 &DirectoryCB->NameInformation.FileName,
2865 try_return( ntStatus);
2868 bAllocatedCcb = TRUE;
2870 (*Ccb)->DirectoryCB = DirectoryCB;
2872 (*Ccb)->FileAccess = ulFileAccess;
2874 (*Ccb)->GrantedAccess = *pDesiredAccess;
2877 // Perform the access check on the target if this is a mount point or symlink
2880 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2883 IoUpdateShareAccess( pFileObject,
2884 &pObjectInfo->Fcb->ShareAccess);
2893 IoSetShareAccess( *pDesiredAccess,
2896 &pObjectInfo->Fcb->ShareAccess);
2899 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2901 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2902 AFS_TRACE_LEVEL_VERBOSE,
2903 "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
2908 // Increment the open reference and handle on the parent node
2911 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2913 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2914 AFS_TRACE_LEVEL_VERBOSE,
2915 "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
2916 pObjectInfo->ParentObjectInformation,
2919 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2921 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2922 AFS_TRACE_LEVEL_VERBOSE,
2923 "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
2924 pObjectInfo->ParentObjectInformation,
2927 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2931 // Mark it for delete on close
2934 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2935 AFS_TRACE_LEVEL_VERBOSE,
2936 "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2939 &DirectoryCB->NameInformation.FileName);
2941 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2945 // Indicate the object is held
2948 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2951 // Return the open result for this file
2954 Irp->IoStatus.Information = FILE_OPENED;
2956 *Fcb = pObjectInfo->Fcb;
2963 if( !NT_SUCCESS( ntStatus))
2966 // Decrement the open count on this Fcb
2969 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2971 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2972 AFS_TRACE_LEVEL_VERBOSE,
2973 "AFSProcessOpen Decrement2 count on Fcb %08lX Cnt %d\n",
2978 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2981 if( !NT_SUCCESS( ntStatus))
2984 if ( ulFileAccess > 0)
2987 stReleaseFileAccess.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
2989 stReleaseFileAccess.FileAccess = ulFileAccess;
2991 stReleaseFileAccess.Identifier = (ULONGLONG)pFileObject;
2993 AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS,
2994 AFS_REQUEST_FLAG_SYNCHRONOUS,
2996 &DirectoryCB->NameInformation.FileName,
2997 &pObjectInfo->FileId,
2998 (void *)&stReleaseFileAccess,
2999 sizeof( AFSFileAccessReleaseCB),
3016 AFSRemoveFcb( &pObjectInfo->Fcb);
3027 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
3029 IN AFSVolumeCB *VolumeCB,
3031 IN AFSDirectoryCB *ParentDirCB,
3032 IN AFSDirectoryCB *DirectoryCB,
3037 NTSTATUS ntStatus = STATUS_SUCCESS;
3038 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3039 PFILE_OBJECT pFileObject = NULL;
3040 LARGE_INTEGER liZero = {0,0};
3041 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
3042 ULONG ulAttributes = 0;
3043 LARGE_INTEGER liTime;
3044 ULONG ulCreateDisposition = 0;
3045 BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3046 PACCESS_MASK pDesiredAccess = NULL;
3047 USHORT usShareAccess;
3048 AFSObjectInfoCB *pParentObjectInfo = NULL;
3049 AFSObjectInfoCB *pObjectInfo = NULL;
3051 LARGE_INTEGER liSaveSize;
3052 LARGE_INTEGER liSaveVDL;
3053 LARGE_INTEGER liSaveAlloc;
3058 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
3060 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
3062 pFileObject = pIrpSp->FileObject;
3064 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
3066 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
3068 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
3071 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3072 AFS_TRACE_LEVEL_ERROR,
3073 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
3075 &DirectoryCB->NameInformation.FileName);
3077 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
3080 pParentObjectInfo = ParentDirCB->ObjectInformation;
3082 pObjectInfo = DirectoryCB->ObjectInformation;
3085 // Check if we should go and retrieve updated information for the node
3088 ntStatus = AFSValidateEntry( DirectoryCB,
3092 if( !NT_SUCCESS( ntStatus))
3095 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3096 AFS_TRACE_LEVEL_ERROR,
3097 "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
3099 &DirectoryCB->NameInformation.FileName,
3102 try_return( ntStatus);
3106 // Be sure we have an Fcb for the object block
3109 if( pObjectInfo->Fcb == NULL)
3112 ntStatus = AFSInitFcb( DirectoryCB);
3114 *Fcb = pObjectInfo->Fcb;
3116 if( !NT_SUCCESS( ntStatus))
3119 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3120 AFS_TRACE_LEVEL_ERROR,
3121 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
3123 &DirectoryCB->NameInformation.FileName,
3126 try_return( ntStatus);
3129 if ( ntStatus != STATUS_REPARSE)
3132 bAllocatedFcb = TRUE;
3135 ntStatus = STATUS_SUCCESS;
3140 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
3145 // Increment the open count on this Fcb.
3148 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3150 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3151 AFS_TRACE_LEVEL_VERBOSE,
3152 "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
3159 // Check access on the entry
3162 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3165 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3168 &pObjectInfo->Fcb->ShareAccess,
3171 if( !NT_SUCCESS( ntStatus))
3174 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3175 AFS_TRACE_LEVEL_ERROR,
3176 "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
3178 &DirectoryCB->NameInformation.FileName,
3181 try_return( ntStatus);
3186 // Before we actually truncate, check to see if the purge
3187 // is going to fail.
3190 if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3194 ntStatus = STATUS_USER_MAPPED_FILE;
3196 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3197 AFS_TRACE_LEVEL_ERROR,
3198 "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
3200 &DirectoryCB->NameInformation.FileName,
3203 try_return( ntStatus);
3207 // Initialize the Ccb for the file.
3210 ntStatus = AFSInitCcb( Ccb);
3212 if( !NT_SUCCESS( ntStatus))
3215 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3216 AFS_TRACE_LEVEL_ERROR,
3217 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
3219 &DirectoryCB->NameInformation.FileName,
3222 try_return( ntStatus);
3225 bAllocatedCcb = TRUE;
3228 // Initialize the Ccb
3231 (*Ccb)->DirectoryCB = DirectoryCB;
3233 (*Ccb)->GrantedAccess = *pDesiredAccess;
3236 // Set the file length to zero
3239 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3242 bReleasePaging = TRUE;
3244 liSaveSize = pObjectInfo->Fcb->Header.FileSize;
3245 liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
3246 liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
3248 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3249 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3250 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3252 pObjectInfo->EndOfFile.QuadPart = 0;
3253 pObjectInfo->AllocationSize.QuadPart = 0;
3256 // Trim down the extents. We do this BEFORE telling the service
3257 // the file is truncated since there is a potential race between
3258 // a worker thread releasing extents and us trimming
3261 AFSTrimExtents( pObjectInfo->Fcb,
3262 &pObjectInfo->Fcb->Header.FileSize);
3264 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3266 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3268 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3271 // Set the update flag accordingly
3274 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3275 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3276 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3277 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3278 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3280 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3284 if( !NT_SUCCESS( ntStatus))
3287 pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
3288 pObjectInfo->Fcb->Header.FileSize = liSaveSize;
3289 pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
3290 pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
3291 pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
3293 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3294 AFS_TRACE_LEVEL_ERROR,
3295 "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
3297 &DirectoryCB->NameInformation.FileName,
3300 try_return( ntStatus);
3303 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3305 if( ulCreateDisposition == FILE_SUPERSEDE)
3308 pObjectInfo->FileAttributes = ulAttributes;
3314 pObjectInfo->FileAttributes |= ulAttributes;
3318 // Save off the access for the open
3321 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3324 IoUpdateShareAccess( pFileObject,
3325 &pObjectInfo->Fcb->ShareAccess);
3334 IoSetShareAccess( *pDesiredAccess,
3337 &pObjectInfo->Fcb->ShareAccess);
3341 // Return the correct action
3344 if( ulCreateDisposition == FILE_SUPERSEDE)
3347 Irp->IoStatus.Information = FILE_SUPERSEDED;
3352 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3355 lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3357 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3358 AFS_TRACE_LEVEL_VERBOSE,
3359 "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
3364 // Increment the open reference and handle on the parent node
3367 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3369 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3370 AFS_TRACE_LEVEL_VERBOSE,
3371 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
3372 pObjectInfo->ParentObjectInformation,
3375 lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3377 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3378 AFS_TRACE_LEVEL_VERBOSE,
3379 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
3380 pObjectInfo->ParentObjectInformation,
3383 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3385 bReleaseFcb = FALSE;
3387 *Fcb = pObjectInfo->Fcb;
3390 // Now that the Fcb->Resource has been dropped
3391 // we can call CcSetFileSizes. We are still holding
3392 // the PagingIoResource
3395 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3397 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3399 pFileObject->FsContext2 = (void *)*Ccb;
3401 CcSetFileSizes( pFileObject,
3402 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3409 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3415 if( !NT_SUCCESS( ntStatus))
3418 // Decrement the open count on this Fcb.
3421 lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3423 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3424 AFS_TRACE_LEVEL_VERBOSE,
3425 "AFSProcessOverwriteSupersede Decrement2 count on Fcb %08lX Cnt %d\n",
3430 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3433 if( !NT_SUCCESS( ntStatus))
3448 AFSRemoveFcb( &pObjectInfo->Fcb);
3459 AFSControlDeviceCreate( IN PIRP Irp)
3462 NTSTATUS ntStatus = STATUS_SUCCESS;
3468 // For now, jsut let the open happen
3471 Irp->IoStatus.Information = FILE_OPENED;
3478 AFSOpenIOCtlFcb( IN PIRP Irp,
3480 IN AFSDirectoryCB *ParentDirCB,
3485 NTSTATUS ntStatus = STATUS_SUCCESS;
3486 PFILE_OBJECT pFileObject = NULL;
3487 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3488 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3489 UNICODE_STRING uniFullFileName;
3490 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3492 AFSObjectInfoCB *pParentObjectInfo = NULL;
3498 pFileObject = pIrpSp->FileObject;
3500 pParentObjectInfo = ParentDirCB->ObjectInformation;
3503 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3506 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3509 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3511 if( !NT_SUCCESS( ntStatus))
3514 try_return( ntStatus);
3518 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
3522 // Allocate and initialize the Fcb for the file.
3525 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
3527 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3529 if( !NT_SUCCESS( ntStatus))
3532 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3533 AFS_TRACE_LEVEL_ERROR,
3534 "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3538 try_return( ntStatus);
3541 if ( ntStatus != STATUS_REPARSE)
3544 bAllocatedFcb = TRUE;
3547 ntStatus = STATUS_SUCCESS;
3552 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3554 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3559 // Increment the open reference and handle on the node
3562 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3564 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3565 AFS_TRACE_LEVEL_VERBOSE,
3566 "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
3573 // Initialize the Ccb for the file.
3576 ntStatus = AFSInitCcb( Ccb);
3578 if( !NT_SUCCESS( ntStatus))
3581 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3582 AFS_TRACE_LEVEL_ERROR,
3583 "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3587 try_return( ntStatus);
3590 bAllocatedCcb = TRUE;
3596 (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
3599 // Set the PIOCtl index
3602 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3604 RtlZeroMemory( &stPIOCtlOpen,
3605 sizeof( AFSPIOCtlOpenCloseRequestCB));
3607 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3609 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3611 RtlZeroMemory( &stFileID,
3612 sizeof( AFSFileID));
3615 // The parent directory FID of the node
3618 stFileID = pParentObjectInfo->FileId;
3621 // Issue the open request to the service
3624 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3625 AFS_REQUEST_FLAG_SYNCHRONOUS,
3629 (void *)&stPIOCtlOpen,
3630 sizeof( AFSPIOCtlOpenCloseRequestCB),
3634 if( !NT_SUCCESS( ntStatus))
3637 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3638 AFS_TRACE_LEVEL_ERROR,
3639 "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
3643 try_return( ntStatus);
3647 // Reference the directory entry
3650 lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
3652 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3653 AFS_TRACE_LEVEL_VERBOSE,
3654 "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
3655 &(*Ccb)->DirectoryCB->NameInformation.FileName,
3656 (*Ccb)->DirectoryCB,
3661 // Increment the handle on the node
3664 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3666 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3667 AFS_TRACE_LEVEL_VERBOSE,
3668 "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
3673 // Increment the open reference and handle on the parent node
3676 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3678 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3679 AFS_TRACE_LEVEL_VERBOSE,
3680 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3684 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3686 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3687 AFS_TRACE_LEVEL_VERBOSE,
3688 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3693 // Return the open result for this file
3696 Irp->IoStatus.Information = FILE_OPENED;
3701 //Dereference the passed in parent since the returned dir entry
3702 // is already referenced
3705 lCount = InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
3707 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3708 AFS_TRACE_LEVEL_VERBOSE,
3709 "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3710 &ParentDirCB->NameInformation.FileName,
3716 // If we created the Fcb we need to release the resources
3722 if( !NT_SUCCESS( ntStatus))
3725 // Decrement the open reference and handle on the node
3728 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
3730 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3731 AFS_TRACE_LEVEL_VERBOSE,
3732 "AFSOpenIOCtlFcb Decrement count on Fcb %08lX Cnt %d\n",
3737 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3740 if( !NT_SUCCESS( ntStatus))
3756 // Need to tear down this Fcb since it is not in the tree for the worker thread
3759 AFSRemoveFcb( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
3770 AFSOpenSpecialShareFcb( IN PIRP Irp,
3772 IN AFSDirectoryCB *DirectoryCB,
3777 NTSTATUS ntStatus = STATUS_SUCCESS;
3778 PFILE_OBJECT pFileObject = NULL;
3779 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3780 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3781 AFSObjectInfoCB *pParentObjectInfo = NULL;
3782 AFSPipeOpenCloseRequestCB stPipeOpen;
3788 pFileObject = pIrpSp->FileObject;
3790 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3791 AFS_TRACE_LEVEL_VERBOSE_2,
3792 "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
3794 &DirectoryCB->NameInformation.FileName);
3796 pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
3798 if( DirectoryCB->ObjectInformation->Fcb == NULL)
3802 // Allocate and initialize the Fcb for the file.
3805 ntStatus = AFSInitFcb( DirectoryCB);
3807 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3809 if( !NT_SUCCESS( ntStatus))
3812 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3813 AFS_TRACE_LEVEL_ERROR,
3814 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3818 try_return( ntStatus);
3821 if ( ntStatus != STATUS_REPARSE)
3824 bAllocateFcb = TRUE;
3827 ntStatus = STATUS_SUCCESS;
3832 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3834 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3839 // Increment the open count on this Fcb
3842 lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3844 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3845 AFS_TRACE_LEVEL_VERBOSE,
3846 "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
3853 // Initialize the Ccb for the file.
3856 ntStatus = AFSInitCcb( Ccb);
3858 if( !NT_SUCCESS( ntStatus))
3861 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3862 AFS_TRACE_LEVEL_ERROR,
3863 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3867 try_return( ntStatus);
3870 bAllocatedCcb = TRUE;
3876 (*Ccb)->DirectoryCB = DirectoryCB;
3879 // Call the service to open the share
3882 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3884 RtlZeroMemory( &stPipeOpen,
3885 sizeof( AFSPipeOpenCloseRequestCB));
3887 stPipeOpen.RequestId = (*Ccb)->RequestID;
3889 stPipeOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3892 // Issue the open request to the service
3895 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_OPEN,
3896 AFS_REQUEST_FLAG_SYNCHRONOUS,
3898 &DirectoryCB->NameInformation.FileName,
3900 (void *)&stPipeOpen,
3901 sizeof( AFSPipeOpenCloseRequestCB),
3905 if( !NT_SUCCESS( ntStatus))
3908 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3909 AFS_TRACE_LEVEL_ERROR,
3910 "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
3914 try_return( ntStatus);
3917 lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3919 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3920 AFS_TRACE_LEVEL_VERBOSE,
3921 "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
3926 // Increment the open reference and handle on the parent node
3929 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3931 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3932 AFS_TRACE_LEVEL_VERBOSE,
3933 "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3937 lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3939 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3940 AFS_TRACE_LEVEL_VERBOSE,
3941 "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3946 // Return the open result for this file
3949 Irp->IoStatus.Information = FILE_OPENED;
3956 if( !NT_SUCCESS( ntStatus))
3959 // Decrement the open count on this Fcb
3962 lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
3964 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3965 AFS_TRACE_LEVEL_VERBOSE,
3966 "AFSOpenSpecialShareFcb Decrement count on Fcb %08lX Cnt %d\n",
3971 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3974 if( !NT_SUCCESS( ntStatus))
3990 // Need to tear down this Fcb since it is not in the tree for the worker thread
3993 AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);