2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSCreate.cpp
39 #include "AFSCommon.h"
42 // Function: AFSCreate
46 // This function is the dispatch handler for the IRP_MJ_CREATE requests. It makes the determination to
47 // which interface this request is destined.
51 // A status is returned for the function. The Irp completion processing is handled in the specific
56 AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
60 NTSTATUS ntStatus = STATUS_SUCCESS;
61 IO_STACK_LOCATION *pIrpSp;
62 FILE_OBJECT *pFileObject = NULL;
67 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
68 pFileObject = pIrpSp->FileObject;
70 if( pFileObject == NULL ||
71 pFileObject->FileName.Buffer == NULL)
74 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
75 AFS_TRACE_LEVEL_VERBOSE,
76 "AFSCreate (%08lX) Processing control device open request\n",
79 ntStatus = AFSControlDeviceCreate( Irp);
81 try_return( ntStatus);
84 if( AFSRDRDeviceObject == NULL)
87 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
88 AFS_TRACE_LEVEL_VERBOSE,
89 "AFSCreate (%08lX) Invalid request to open before library is initialized\n",
92 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
95 ntStatus = AFSCommonCreate( AFSRDRDeviceObject,
102 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
107 "EXCEPTION - AFSCreate\n");
109 ntStatus = STATUS_ACCESS_DENIED;
113 // Complete the request
116 AFSCompleteRequest( Irp,
123 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
127 NTSTATUS ntStatus = STATUS_SUCCESS;
128 UNICODE_STRING uniFileName;
129 ULONG ulCreateDisposition = 0;
131 BOOLEAN bNoIntermediateBuffering = FALSE;
132 FILE_OBJECT *pFileObject = NULL;
133 IO_STACK_LOCATION *pIrpSp;
136 AFSDeviceExt *pDeviceExt = NULL;
137 BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
138 PACCESS_MASK pDesiredAccess = NULL;
139 UNICODE_STRING uniComponentName, uniPathName, uniRootFileName, uniParsedFileName;
140 UNICODE_STRING uniSubstitutedPathName;
141 UNICODE_STRING uniRelativeName;
142 AFSNameArrayHdr *pNameArray = NULL;
143 AFSVolumeCB *pVolumeCB = NULL;
144 AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
145 ULONG ulParseFlags = 0;
147 ULONG ulNameProcessingFlags = 0;
152 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
153 pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
154 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
155 ulOptions = pIrpSp->Parameters.Create.Options;
156 bNoIntermediateBuffering = BooleanFlagOn( ulOptions, FILE_NO_INTERMEDIATE_BUFFERING);
157 bOpenTargetDirectory = BooleanFlagOn( pIrpSp->Flags, SL_OPEN_TARGET_DIRECTORY);
158 pFileObject = pIrpSp->FileObject;
159 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
161 uniFileName.Length = uniFileName.MaximumLength = 0;
162 uniFileName.Buffer = NULL;
164 uniRootFileName.Length = uniRootFileName.MaximumLength = 0;
165 uniRootFileName.Buffer = NULL;
167 uniParsedFileName.Length = uniParsedFileName.MaximumLength = 0;
168 uniParsedFileName.Buffer = NULL;
170 uniSubstitutedPathName.Buffer = NULL;
171 uniSubstitutedPathName.Length = 0;
173 uniRelativeName.Buffer = NULL;
174 uniRelativeName.Length = 0;
176 if( AFSGlobalRoot == NULL)
178 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
181 RtlZeroMemory( &stAuthGroup,
184 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
185 (ULONGLONG)PsGetCurrentThreadId(),
188 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
191 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
193 if( !NT_SUCCESS( ntStatus))
196 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
197 AFS_TRACE_LEVEL_ERROR,
198 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
201 try_return( ntStatus);
206 // If we are in shutdown mode then fail the request
209 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
212 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
213 AFS_TRACE_LEVEL_WARNING,
214 "AFSCommonCreate (%08lX) Open request after shutdown\n",
217 try_return( ntStatus = STATUS_TOO_LATE);
221 // Go and parse the name for processing.
222 // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
223 // then we are responsible for releasing the uniRootFileName.Buffer.
226 ntStatus = AFSParseName( Irp,
236 if( !NT_SUCCESS( ntStatus))
239 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
240 uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
241 "AFSCommonCreate (%08lX) Failed to parse name \"%wZ\" Status %08lX\n",
246 try_return( ntStatus);
250 // Check for STATUS_REPARSE
253 if( ntStatus == STATUS_REPARSE)
257 // Update the information and return
260 Irp->IoStatus.Information = IO_REPARSE;
262 try_return( ntStatus);
266 // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
270 if( pVolumeCB == NULL)
274 // Remove any leading or trailing slashes
277 if( uniFileName.Length >= sizeof( WCHAR) &&
278 uniFileName.Buffer[ (uniFileName.Length/sizeof( WCHAR)) - 1] == L'\\')
281 uniFileName.Length -= sizeof( WCHAR);
284 if( uniFileName.Length >= sizeof( WCHAR) &&
285 uniFileName.Buffer[ 0] == L'\\')
288 uniFileName.Buffer = &uniFileName.Buffer[ 1];
290 uniFileName.Length -= sizeof( WCHAR);
294 // If there is a remaining portion returned for this request then
295 // check if it is for the PIOCtl interface
298 if( uniFileName.Length > 0)
302 // We don't accept any other opens off of the AFS Root
305 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
308 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
311 if( RtlCompareUnicodeString( &AFSPIOCtlName,
316 ntStatus = AFSOpenIOCtlFcb( Irp,
318 AFSGlobalRoot->DirectoryCB,
322 if( !NT_SUCCESS( ntStatus))
325 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
326 AFS_TRACE_LEVEL_ERROR,
327 "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
331 else if( pParentDirectoryCB != NULL &&
332 pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
335 ntStatus = AFSOpenSpecialShareFcb( Irp,
341 if( !NT_SUCCESS( ntStatus))
344 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
345 AFS_TRACE_LEVEL_ERROR,
346 "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
351 try_return( ntStatus);
354 ntStatus = AFSOpenAFSRoot( Irp,
358 if( !NT_SUCCESS( ntStatus))
361 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
362 AFS_TRACE_LEVEL_ERROR,
363 "AFSCommonCreate Failed to open root Status %08lX\n",
366 InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
368 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
369 AFS_TRACE_LEVEL_VERBOSE,
370 "AFSCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
371 &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
372 AFSGlobalRoot->DirectoryCB,
374 AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
377 try_return( ntStatus);
381 // We have our root node shared
384 bReleaseVolume = TRUE;
387 // Attempt to locate the node in the name tree if this is not a target
388 // open and the target is not the root
391 uniComponentName.Length = 0;
392 uniComponentName.Buffer = NULL;
394 if( uniFileName.Length > sizeof( WCHAR) ||
395 uniFileName.Buffer[ 0] != L'\\')
398 if( !AFSValidNameFormat( &uniFileName))
401 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
403 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
404 AFS_TRACE_LEVEL_VERBOSE,
405 "AFSCommonCreate (%08lX) Invalid name %wZ Status %08lX\n",
410 try_return( ntStatus);
414 // Opening a reparse point directly?
417 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
419 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
421 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
422 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
423 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
426 uniSubstitutedPathName = uniRootFileName;
428 ntStatus = AFSLocateNameEntry( &stAuthGroup,
433 ulNameProcessingFlags,
439 if( !NT_SUCCESS( ntStatus) &&
440 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
443 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
445 uniSubstitutedPathName.Buffer = NULL;
449 // The routine above released the root while walking the
453 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
454 AFS_TRACE_LEVEL_VERBOSE,
455 "AFSCommonCreate (%08lX) Failed to locate name entry for %wZ Status %08lX\n",
461 // We released any root volume locks in the above on failure
464 bReleaseVolume = FALSE;
466 try_return( ntStatus);
470 // Check for STATUS_REPARSE
473 if( ntStatus == STATUS_REPARSE)
476 uniSubstitutedPathName.Buffer = NULL;
479 // Update the information and return
482 Irp->IoStatus.Information = IO_REPARSE;
485 // We released the volume lock above
488 bReleaseVolume = FALSE;
490 try_return( ntStatus);
494 // If we re-allocated the name, then update our substitute name
497 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
500 uniSubstitutedPathName = uniRootFileName;
505 uniSubstitutedPathName.Buffer = NULL;
509 // Check for a symlink access
512 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
513 pParentDirectoryCB != NULL)
516 UNICODE_STRING uniFinalComponent;
518 uniFinalComponent.Length = 0;
519 uniFinalComponent.MaximumLength = 0;
520 uniFinalComponent.Buffer = NULL;
522 AFSRetrieveFinalComponent( &uniFileName,
525 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
528 if( !NT_SUCCESS( ntStatus) &&
529 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
532 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
533 AFS_TRACE_LEVEL_VERBOSE,
534 "AFSCommonCreate (%08lX) Failing access to symlink %wZ Status %08lX\n",
539 try_return( ntStatus);
545 // If we have no parent then this is a root open, be sure there is a directory entry
549 else if( pParentDirectoryCB == NULL &&
550 pDirectoryCB == NULL)
553 pDirectoryCB = pVolumeCB->DirectoryCB;
556 if( bOpenTargetDirectory)
560 // If we have a directory cb for the entry then dereference it and reference the parent
563 if( pDirectoryCB != NULL)
567 // Perform in this order to prevent thrashing
570 InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
572 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
573 AFS_TRACE_LEVEL_VERBOSE,
574 "AFSCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
575 &pParentDirectoryCB->NameInformation.FileName,
578 pParentDirectoryCB->OpenReferenceCount);
580 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
582 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
583 AFS_TRACE_LEVEL_VERBOSE,
584 "AFSCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
585 &pDirectoryCB->NameInformation.FileName,
588 pDirectoryCB->OpenReferenceCount);
591 // The name array also contains a reference to the pDirectoryCB so we need to remove it
592 // Note that this could decrement the count to zero allowing it to be deleted, hence
593 // don't access the pointer contents beyond here.
596 AFSBackupEntry( pNameArray);
600 // OK, open the target directory
603 if( uniComponentName.Length == 0)
605 AFSRetrieveFinalComponent( &uniFileName,
609 ntStatus = AFSOpenTargetDirectory( Irp,
617 if( !NT_SUCCESS( ntStatus))
620 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
621 AFS_TRACE_LEVEL_ERROR,
622 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
623 &pParentDirectoryCB->NameInformation.FileName,
627 // Decrement the reference on the parent
630 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
632 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
633 AFS_TRACE_LEVEL_VERBOSE,
634 "AFSCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
635 &pParentDirectoryCB->NameInformation.FileName,
638 pParentDirectoryCB->OpenReferenceCount);
641 try_return( ntStatus);
645 // Based on the options passed in, process the file accordingly.
648 if( ulCreateDisposition == FILE_CREATE ||
649 ( ( ulCreateDisposition == FILE_OPEN_IF ||
650 ulCreateDisposition == FILE_OVERWRITE_IF) &&
651 pDirectoryCB == NULL))
654 if( uniComponentName.Length == 0 ||
655 pDirectoryCB != NULL)
659 // We traversed the entire path so we found each entry,
660 // fail with collision
663 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
664 AFS_TRACE_LEVEL_VERBOSE,
665 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
666 &pDirectoryCB->NameInformation.FileName,
669 if( pDirectoryCB != NULL)
672 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
674 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
675 AFS_TRACE_LEVEL_VERBOSE,
676 "AFSCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
677 &pDirectoryCB->NameInformation.FileName,
680 pDirectoryCB->OpenReferenceCount);
685 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
687 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
688 AFS_TRACE_LEVEL_VERBOSE,
689 "AFSCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
690 &pParentDirectoryCB->NameInformation.FileName,
693 pParentDirectoryCB->OpenReferenceCount);
696 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
700 // OK, go and create the node
703 ntStatus = AFSProcessCreate( Irp,
713 if( !NT_SUCCESS( ntStatus))
716 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
717 AFS_TRACE_LEVEL_ERROR,
718 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
720 &pParentDirectoryCB->NameInformation.FileName,
727 // Reference the new dir entry
730 InterlockedIncrement( &pCcb->DirectoryCB->OpenReferenceCount);
732 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
733 AFS_TRACE_LEVEL_VERBOSE,
734 "AFSCreate Increment (Create) count on %wZ DE %p Ccb %p Cnt %d\n",
735 &pCcb->DirectoryCB->NameInformation.FileName,
738 pCcb->DirectoryCB->OpenReferenceCount);
742 // Dereference the parent entry
745 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
747 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
748 AFS_TRACE_LEVEL_VERBOSE,
749 "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
750 &pParentDirectoryCB->NameInformation.FileName,
753 pParentDirectoryCB->OpenReferenceCount);
755 try_return( ntStatus);
759 // We should not have an extra component except for PIOCtl opens
762 if( uniComponentName.Length > 0)
766 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
769 if( RtlCompareUnicodeString( &AFSPIOCtlName,
774 ntStatus = AFSOpenIOCtlFcb( Irp,
780 if( !NT_SUCCESS( ntStatus))
783 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
784 AFS_TRACE_LEVEL_ERROR,
785 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
793 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
794 AFS_TRACE_LEVEL_VERBOSE,
795 "AFSCommonCreate (%08lX) File %wZ name not found\n",
799 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
802 if( !NT_SUCCESS( ntStatus))
806 // Dereference the parent entry
809 if( pDirectoryCB != NULL)
812 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
814 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
815 AFS_TRACE_LEVEL_VERBOSE,
816 "AFSCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
817 &pDirectoryCB->NameInformation.FileName,
820 pDirectoryCB->OpenReferenceCount);
825 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
827 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
828 AFS_TRACE_LEVEL_VERBOSE,
829 "AFSCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
830 &pParentDirectoryCB->NameInformation.FileName,
833 pParentDirectoryCB->OpenReferenceCount);
837 try_return( ntStatus);
841 // For root opens the parent will be NULL
844 if( pParentDirectoryCB == NULL)
848 // Check for the delete on close flag for the root
851 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
854 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
855 AFS_TRACE_LEVEL_ERROR,
856 "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
859 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
861 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
862 AFS_TRACE_LEVEL_VERBOSE,
863 "AFSCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
864 &pDirectoryCB->NameInformation.FileName,
867 pDirectoryCB->OpenReferenceCount);
869 try_return( ntStatus = STATUS_CANNOT_DELETE);
873 // If this is the target directory, then bail
876 if( bOpenTargetDirectory)
879 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
880 AFS_TRACE_LEVEL_ERROR,
881 "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
884 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
886 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
887 AFS_TRACE_LEVEL_VERBOSE,
888 "AFSCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
889 &pDirectoryCB->NameInformation.FileName,
892 pDirectoryCB->OpenReferenceCount);
894 try_return( ntStatus = STATUS_INVALID_PARAMETER);
898 // Go and open the root of the volume
901 ntStatus = AFSOpenRoot( Irp,
907 if( !NT_SUCCESS( ntStatus))
910 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
911 AFS_TRACE_LEVEL_ERROR,
912 "AFSCommonCreate Failed to open root (2) Status %08lX\n",
915 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
917 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
918 AFS_TRACE_LEVEL_VERBOSE,
919 "AFSCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
920 &pDirectoryCB->NameInformation.FileName,
923 pDirectoryCB->OpenReferenceCount);
926 try_return( ntStatus);
930 // At this point if we have no pDirectoryCB it was not found.
933 if( pDirectoryCB == NULL)
936 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
937 AFS_TRACE_LEVEL_ERROR,
938 "AFSCommonCreate Failing access to %wZ\n",
941 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
944 if( ulCreateDisposition == FILE_OVERWRITE ||
945 ulCreateDisposition == FILE_SUPERSEDE ||
946 ulCreateDisposition == FILE_OVERWRITE_IF)
950 // Go process a file for overwrite or supersede.
953 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
962 if( !NT_SUCCESS( ntStatus))
965 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
966 AFS_TRACE_LEVEL_ERROR,
967 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
968 &pDirectoryCB->NameInformation.FileName,
971 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
973 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
974 AFS_TRACE_LEVEL_VERBOSE,
975 "AFSCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
976 &pDirectoryCB->NameInformation.FileName,
979 pDirectoryCB->OpenReferenceCount);
982 try_return( ntStatus);
986 // Trying to open the file
989 ntStatus = AFSProcessOpen( Irp,
997 if( !NT_SUCCESS( ntStatus))
1000 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1001 AFS_TRACE_LEVEL_ERROR,
1002 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
1003 &pDirectoryCB->NameInformation.FileName,
1006 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
1008 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1009 AFS_TRACE_LEVEL_VERBOSE,
1010 "AFSCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
1011 &pDirectoryCB->NameInformation.FileName,
1014 pDirectoryCB->OpenReferenceCount);
1019 if( NT_SUCCESS( ntStatus) &&
1020 ntStatus != STATUS_REPARSE)
1027 // If we have a substitute name, then use it
1030 if( uniSubstitutedPathName.Buffer != NULL)
1033 pCcb->FullFileName = uniSubstitutedPathName;
1035 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1037 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1042 pCcb->FullFileName = uniRootFileName;
1044 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1047 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1049 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1053 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1054 AFS_TRACE_LEVEL_VERBOSE,
1055 "AFSCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1056 &pCcb->DirectoryCB->NameInformation.FileName,
1059 pCcb->DirectoryCB->OpenReferenceCount);
1061 ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
1063 pCcb->CurrentDirIndex = 0;
1065 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1068 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1072 // Save off the name array for this instance
1075 pCcb->NameArray = pNameArray;
1081 // If we make it here then init the FO for the request.
1084 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1085 AFS_TRACE_LEVEL_VERBOSE_2,
1086 "AFSCommonCreate (%08lX) FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1092 pFileObject->FsContext = (void *)pFcb;
1094 pFileObject->FsContext2 = (void *)pCcb;
1099 ASSERT( pFcb->OpenHandleCount > 0);
1101 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1103 RtlCopyMemory( &pFcb->AuthGroup,
1108 // For files perform additional processing
1111 if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
1113 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1117 // If the user did not request nobuffering then mark the FO as cacheable
1120 if( bNoIntermediateBuffering)
1123 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1128 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1132 // If the file was opened for execution then we need to set the bit in the FO
1135 if( BooleanFlagOn( *pDesiredAccess,
1139 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1143 // Update the last access time
1146 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1151 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1152 AFS_TRACE_LEVEL_ERROR,
1153 "AFSCommonCreate (%08lX) Returning with NULL Fcb FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1162 if( NT_SUCCESS( ntStatus) &&
1163 ntStatus == STATUS_REPARSE)
1166 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1167 AFS_TRACE_LEVEL_ERROR,
1168 "AFSCommonCreate (%08lX) STATUS_REPARSE FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1176 // Free up the sub name if we have one
1179 if( uniSubstitutedPathName.Buffer != NULL)
1182 AFSExFreePool( uniSubstitutedPathName.Buffer);
1184 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1189 // Free up the name array ...
1192 if( pNameArray != NULL)
1195 AFSFreeNameArray( pNameArray);
1198 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1201 AFSExFreePool( uniRootFileName.Buffer);
1207 InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
1209 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1210 AFS_TRACE_LEVEL_VERBOSE,
1211 "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
1213 pVolumeCB->VolumeReferenceCount);
1215 AFSReleaseResource( pVolumeCB->VolumeLock);
1219 // Setup the Irp for completion, the Information has been set previously
1222 Irp->IoStatus.Status = ntStatus;
1229 AFSOpenRedirector( IN PIRP Irp,
1234 NTSTATUS ntStatus = STATUS_SUCCESS;
1240 // Initialize the Ccb for the file.
1243 ntStatus = AFSInitCcb( Ccb);
1245 if( !NT_SUCCESS( ntStatus))
1248 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1249 AFS_TRACE_LEVEL_ERROR,
1250 "AFSOpenRedirector (%08lX) Failed to allocate Ccb\n",
1253 try_return( ntStatus);
1260 (*Ccb)->DirectoryCB = AFSRedirectorRoot->DirectoryCB;
1263 // Increment the open count on this Fcb
1266 InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenReferenceCount);
1268 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1269 AFS_TRACE_LEVEL_VERBOSE,
1270 "AFSOpenRedirector Increment count on Fcb %08lX Cnt %d\n",
1271 AFSRedirectorRoot->RootFcb,
1272 AFSRedirectorRoot->RootFcb->OpenReferenceCount);
1274 InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenHandleCount);
1276 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1277 AFS_TRACE_LEVEL_VERBOSE,
1278 "AFSOpenRedirector Increment handle count on Fcb %08lX Cnt %d\n",
1279 AFSRedirectorRoot->RootFcb,
1280 AFSRedirectorRoot->RootFcb->OpenHandleCount);
1282 *Fcb = AFSRedirectorRoot->RootFcb;
1284 InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
1287 // Return the open result for this file
1290 Irp->IoStatus.Information = FILE_OPENED;
1301 AFSOpenAFSRoot( IN PIRP Irp,
1306 NTSTATUS ntStatus = STATUS_SUCCESS;
1312 // Initialize the Ccb for the file.
1315 ntStatus = AFSInitCcb( Ccb);
1317 if( !NT_SUCCESS( ntStatus))
1320 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1321 AFS_TRACE_LEVEL_ERROR,
1322 "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
1325 try_return( ntStatus);
1332 (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
1335 // Increment the open count on this Fcb
1338 InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1340 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1341 AFS_TRACE_LEVEL_VERBOSE,
1342 "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
1343 AFSGlobalRoot->RootFcb,
1344 AFSGlobalRoot->RootFcb->OpenReferenceCount);
1346 InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1348 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1349 AFS_TRACE_LEVEL_VERBOSE,
1350 "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
1351 AFSGlobalRoot->RootFcb,
1352 AFSGlobalRoot->RootFcb->OpenHandleCount);
1354 *Fcb = AFSGlobalRoot->RootFcb;
1357 // Return the open result for this file
1360 Irp->IoStatus.Information = FILE_OPENED;
1371 AFSOpenRoot( IN PIRP Irp,
1372 IN AFSVolumeCB *VolumeCB,
1374 OUT AFSFcb **RootFcb,
1378 NTSTATUS ntStatus = STATUS_SUCCESS;
1379 PFILE_OBJECT pFileObject = NULL;
1380 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1381 PACCESS_MASK pDesiredAccess = NULL;
1382 USHORT usShareAccess;
1383 BOOLEAN bAllocatedCcb = FALSE;
1384 BOOLEAN bReleaseFcb = FALSE;
1385 AFSFileOpenCB stOpenCB;
1386 AFSFileOpenResultCB stOpenResultCB;
1387 ULONG ulResultLen = 0;
1392 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1393 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1395 pFileObject = pIrpSp->FileObject;
1398 // Check if we should go and retrieve updated information for the node
1401 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1406 if( !NT_SUCCESS( ntStatus))
1409 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1410 AFS_TRACE_LEVEL_ERROR,
1411 "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
1415 try_return( ntStatus);
1419 // Check with the service that we can open the file
1422 RtlZeroMemory( &stOpenCB,
1423 sizeof( AFSFileOpenCB));
1425 stOpenCB.DesiredAccess = *pDesiredAccess;
1427 stOpenCB.ShareAccess = usShareAccess;
1429 stOpenResultCB.GrantedAccess = 0;
1431 ulResultLen = sizeof( AFSFileOpenResultCB);
1433 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1434 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1437 &VolumeCB->ObjectInformation.FileId,
1439 sizeof( AFSFileOpenCB),
1440 (void *)&stOpenResultCB,
1443 if( !NT_SUCCESS( ntStatus))
1446 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1447 AFS_TRACE_LEVEL_ERROR,
1448 "AFSOpenRoot (%08lX) Failed to open file in service Status %08lX\n",
1452 try_return( ntStatus);
1456 // If the entry is not initialized then do it now
1459 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1462 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1465 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1468 ntStatus = AFSEnumerateDirectory( AuthGroup,
1469 &VolumeCB->ObjectInformation,
1472 if( !NT_SUCCESS( ntStatus))
1475 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1477 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1478 AFS_TRACE_LEVEL_ERROR,
1479 "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
1483 try_return( ntStatus);
1486 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1489 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1493 // If the root fcb has been initialized then check access otherwise
1494 // init the volume fcb
1497 if( VolumeCB->RootFcb == NULL)
1500 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1503 if( !NT_SUCCESS( ntStatus))
1506 try_return( ntStatus);
1512 AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
1519 // If there are current opens on the Fcb, check the access.
1522 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1525 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1528 &VolumeCB->RootFcb->ShareAccess,
1531 if( !NT_SUCCESS( ntStatus))
1534 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1535 AFS_TRACE_LEVEL_ERROR,
1536 "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
1540 try_return( ntStatus);
1545 // Initialize the Ccb for the file.
1548 ntStatus = AFSInitCcb( Ccb);
1550 if( !NT_SUCCESS( ntStatus))
1553 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1554 AFS_TRACE_LEVEL_ERROR,
1555 "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
1559 try_return( ntStatus);
1562 bAllocatedCcb = TRUE;
1568 (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
1571 // OK, update the share access on the fileobject
1574 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1577 IoUpdateShareAccess( pFileObject,
1578 &VolumeCB->RootFcb->ShareAccess);
1587 IoSetShareAccess( *pDesiredAccess,
1590 &VolumeCB->RootFcb->ShareAccess);
1594 // Increment the open count on this Fcb
1597 InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1599 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1600 AFS_TRACE_LEVEL_VERBOSE,
1601 "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
1603 VolumeCB->RootFcb->OpenReferenceCount);
1605 InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1607 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1608 AFS_TRACE_LEVEL_VERBOSE,
1609 "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
1611 VolumeCB->RootFcb->OpenHandleCount);
1614 // Indicate the object is held
1617 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1620 // Return the open result for this file
1623 Irp->IoStatus.Information = FILE_OPENED;
1625 *RootFcb = VolumeCB->RootFcb;
1632 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1635 if( !NT_SUCCESS( ntStatus))
1641 AFSRemoveCcb( *Ccb);
1646 Irp->IoStatus.Information = 0;
1654 AFSProcessCreate( IN PIRP Irp,
1656 IN AFSVolumeCB *VolumeCB,
1657 IN AFSDirectoryCB *ParentDirCB,
1658 IN PUNICODE_STRING FileName,
1659 IN PUNICODE_STRING ComponentName,
1660 IN PUNICODE_STRING FullFileName,
1665 NTSTATUS ntStatus = STATUS_SUCCESS;
1666 PFILE_OBJECT pFileObject = NULL;
1667 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1668 ULONG ulOptions = 0;
1669 ULONG ulShareMode = 0;
1671 ULONG ulAttributes = 0;
1672 LARGE_INTEGER liAllocationSize = {0,0};
1673 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1674 BOOLEAN bAllocatedFcb = FALSE;
1675 PACCESS_MASK pDesiredAccess = NULL;
1676 USHORT usShareAccess;
1677 AFSDirectoryCB *pDirEntry = NULL;
1678 AFSObjectInfoCB *pParentObjectInfo = NULL;
1679 AFSObjectInfoCB *pObjectInfo = NULL;
1684 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1685 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1687 pFileObject = pIrpSp->FileObject;
1690 // Extract out the options
1693 ulOptions = pIrpSp->Parameters.Create.Options;
1696 // We pass all attributes they want to apply to the file to the create
1699 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1702 // If this is a directory create then set the attribute correctly
1705 if( ulOptions & FILE_DIRECTORY_FILE)
1708 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1711 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1712 AFS_TRACE_LEVEL_VERBOSE,
1713 "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
1718 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1721 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1722 AFS_TRACE_LEVEL_ERROR,
1723 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1726 try_return( ntStatus = STATUS_ACCESS_DENIED);
1729 pParentObjectInfo = ParentDirCB->ObjectInformation;
1732 // Allocate and insert the direntry into the parent node
1735 ntStatus = AFSCreateDirEntry( AuthGroup,
1743 if( !NT_SUCCESS( ntStatus))
1746 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1747 AFS_TRACE_LEVEL_ERROR,
1748 "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
1753 try_return( ntStatus);
1756 bFileCreated = TRUE;
1758 pObjectInfo = pDirEntry->ObjectInformation;
1761 // We may have raced and the Fcb is already created
1764 if( pObjectInfo->Fcb != NULL)
1767 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1768 AFS_TRACE_LEVEL_VERBOSE,
1769 "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
1773 *Fcb = pObjectInfo->Fcb;
1775 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
1782 // Allocate and initialize the Fcb for the file.
1785 ntStatus = AFSInitFcb( pDirEntry,
1788 if( !NT_SUCCESS( ntStatus))
1791 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1792 AFS_TRACE_LEVEL_ERROR,
1793 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
1798 try_return( ntStatus);
1801 bAllocatedFcb = TRUE;
1807 // Initialize the Ccb for the file.
1810 ntStatus = AFSInitCcb( Ccb);
1812 if( !NT_SUCCESS( ntStatus))
1815 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1816 AFS_TRACE_LEVEL_ERROR,
1817 "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
1822 try_return( ntStatus);
1825 bAllocatedCcb = TRUE;
1828 // Initialize the Ccb
1831 (*Ccb)->DirectoryCB = pDirEntry;
1834 // If this is a file, update the headers filesizes.
1837 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1841 // Update the sizes with the information passed in
1844 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1845 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1846 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1849 // Notify the system of the addition
1852 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1854 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1855 (ULONG)FILE_ACTION_ADDED);
1857 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1859 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1863 // This is a new directory node so indicate it has been enumerated
1866 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1869 // And the parent directory entry
1872 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1875 // Notify the system of the addition
1878 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1880 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1881 (ULONG)FILE_ACTION_ADDED);
1883 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
1884 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
1885 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
1889 // And the parent directory entry
1892 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1895 // Notify the system of the addition
1898 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1900 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1901 (ULONG)FILE_ACTION_ADDED);
1905 // Save off the access for the open
1908 IoSetShareAccess( *pDesiredAccess,
1911 &(*Fcb)->ShareAccess);
1914 // Increment the open count on this Fcb
1917 InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1919 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1920 AFS_TRACE_LEVEL_VERBOSE,
1921 "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
1923 (*Fcb)->OpenReferenceCount);
1925 InterlockedIncrement( &(*Fcb)->OpenHandleCount);
1927 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1928 AFS_TRACE_LEVEL_VERBOSE,
1929 "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
1931 (*Fcb)->OpenHandleCount);
1934 // Increment the open reference and handle on the parent node
1937 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
1939 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1940 AFS_TRACE_LEVEL_VERBOSE,
1941 "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
1942 pObjectInfo->ParentObjectInformation,
1943 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
1945 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
1947 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1948 AFS_TRACE_LEVEL_VERBOSE,
1949 "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
1950 pObjectInfo->ParentObjectInformation,
1951 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
1953 if( ulOptions & FILE_DELETE_ON_CLOSE)
1957 // Mark it for delete on close
1960 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1961 AFS_TRACE_LEVEL_VERBOSE,
1962 "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
1967 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
1971 // Indicate the object is locked in the service
1974 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
1977 // Return the open result for this file
1980 Irp->IoStatus.Information = FILE_CREATED;
1985 // If we created the Fcb we need to release the resources
1991 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
1994 if( !NT_SUCCESS( ntStatus))
2001 // Remove the dir entry from the parent
2004 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2007 AFSDeleteDirEntry( pParentObjectInfo,
2010 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2016 AFSRemoveCcb( *Ccb);
2022 AFSRemoveFcb( pObjectInfo->Fcb);
2024 pObjectInfo->Fcb = NULL;
2037 AFSOpenTargetDirectory( IN PIRP Irp,
2038 IN AFSVolumeCB *VolumeCB,
2039 IN AFSDirectoryCB *ParentDirectoryCB,
2040 IN AFSDirectoryCB *TargetDirectoryCB,
2041 IN UNICODE_STRING *TargetName,
2046 NTSTATUS ntStatus = STATUS_SUCCESS;
2047 PFILE_OBJECT pFileObject = NULL;
2048 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2049 PACCESS_MASK pDesiredAccess = NULL;
2050 USHORT usShareAccess;
2051 BOOLEAN bRemoveAccess = FALSE;
2052 BOOLEAN bAllocatedCcb = FALSE;
2053 BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2054 AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
2055 UNICODE_STRING uniTargetName;
2060 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2061 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2063 pFileObject = pIrpSp->FileObject;
2065 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2066 AFS_TRACE_LEVEL_VERBOSE,
2067 "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
2071 pParentObject = ParentDirectoryCB->ObjectInformation;
2073 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2076 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2080 // Make sure we have an Fcb for the access
2083 if( pParentObject->Fcb != NULL)
2086 *Fcb = pParentObject->Fcb;
2088 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
2095 // Allocate and initialize the Fcb for the file.
2098 ntStatus = AFSInitFcb( ParentDirectoryCB,
2101 if( !NT_SUCCESS( ntStatus))
2104 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2105 AFS_TRACE_LEVEL_ERROR,
2106 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2108 &ParentDirectoryCB->NameInformation.FileName,
2111 try_return( ntStatus);
2114 bAllocatedFcb = TRUE;
2120 // If there are current opens on the Fcb, check the access.
2123 if( pParentObject->Fcb->OpenHandleCount > 0)
2126 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2129 &pParentObject->Fcb->ShareAccess,
2132 if( !NT_SUCCESS( ntStatus))
2135 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2136 AFS_TRACE_LEVEL_ERROR,
2137 "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
2139 &ParentDirectoryCB->NameInformation.FileName,
2142 try_return( ntStatus);
2147 // Initialize the Ccb for the file.
2150 ntStatus = AFSInitCcb( Ccb);
2152 if( !NT_SUCCESS( ntStatus))
2155 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2156 AFS_TRACE_LEVEL_ERROR,
2157 "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2159 &ParentDirectoryCB->NameInformation.FileName,
2162 try_return( ntStatus);
2165 bAllocatedCcb = TRUE;
2168 // Initialize the Ccb
2171 (*Ccb)->DirectoryCB = ParentDirectoryCB;
2173 if( TargetDirectoryCB != NULL &&
2174 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2180 Irp->IoStatus.Information = FILE_EXISTS;
2182 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2187 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2189 uniTargetName = *TargetName;
2193 // Update the filename in the fileobject for rename processing
2196 RtlCopyMemory( pFileObject->FileName.Buffer,
2197 uniTargetName.Buffer,
2198 uniTargetName.Length);
2200 pFileObject->FileName.Length = uniTargetName.Length;
2203 // OK, update the share access on the fileobject
2206 if( pParentObject->Fcb->OpenHandleCount > 0)
2209 IoUpdateShareAccess( pFileObject,
2210 &pParentObject->Fcb->ShareAccess);
2219 IoSetShareAccess( *pDesiredAccess,
2222 &pParentObject->Fcb->ShareAccess);
2226 // Increment the open count on this Fcb
2229 InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2231 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2232 AFS_TRACE_LEVEL_VERBOSE,
2233 "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
2235 pParentObject->Fcb->OpenReferenceCount);
2237 InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2239 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2240 AFS_TRACE_LEVEL_VERBOSE,
2241 "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
2243 pParentObject->Fcb->OpenHandleCount);
2246 // Increment the open reference and handle on the parent node
2249 if( pParentObject->ParentObjectInformation != NULL)
2252 InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2254 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2255 AFS_TRACE_LEVEL_VERBOSE,
2256 "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
2257 pParentObject->ParentObjectInformation,
2258 pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2260 InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2262 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2263 AFS_TRACE_LEVEL_VERBOSE,
2264 "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
2265 pParentObject->ParentObjectInformation,
2266 pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2274 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2277 if( !NT_SUCCESS( ntStatus))
2283 AFSRemoveCcb( *Ccb);
2291 IoRemoveShareAccess( pFileObject,
2292 &pParentObject->Fcb->ShareAccess);
2298 AFSRemoveFcb( pParentObject->Fcb);
2300 pParentObject->Fcb = NULL;
2311 AFSProcessOpen( IN PIRP Irp,
2313 IN AFSVolumeCB *VolumeCB,
2314 IN AFSDirectoryCB *ParentDirCB,
2315 IN AFSDirectoryCB *DirectoryCB,
2320 NTSTATUS ntStatus = STATUS_SUCCESS;
2321 PFILE_OBJECT pFileObject = NULL;
2322 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2323 PACCESS_MASK pDesiredAccess = NULL;
2324 USHORT usShareAccess;
2325 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2326 ULONG ulAdditionalFlags = 0, ulOptions = 0;
2327 AFSFileOpenCB stOpenCB;
2328 AFSFileOpenResultCB stOpenResultCB;
2329 ULONG ulResultLen = 0;
2330 AFSObjectInfoCB *pParentObjectInfo = NULL;
2331 AFSObjectInfoCB *pObjectInfo = NULL;
2336 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2337 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2339 pFileObject = pIrpSp->FileObject;
2341 pParentObjectInfo = ParentDirCB->ObjectInformation;
2343 pObjectInfo = DirectoryCB->ObjectInformation;
2346 // Check if the entry is pending a deletion
2349 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2352 ntStatus = STATUS_DELETE_PENDING;
2354 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2355 AFS_TRACE_LEVEL_ERROR,
2356 "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
2358 &DirectoryCB->NameInformation.FileName,
2361 try_return( ntStatus);
2365 // Extract out the options
2368 ulOptions = pIrpSp->Parameters.Create.Options;
2371 // Check if we should go and retrieve updated information for the node
2374 ntStatus = AFSValidateEntry( DirectoryCB,
2379 if( !NT_SUCCESS( ntStatus))
2382 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2383 AFS_TRACE_LEVEL_ERROR,
2384 "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
2386 &DirectoryCB->NameInformation.FileName,
2389 try_return( ntStatus);
2393 // If this is marked for delete on close then be sure we can delete the entry
2396 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2399 ntStatus = AFSNotifyDelete( DirectoryCB,
2402 if( !NT_SUCCESS( ntStatus))
2405 ntStatus = STATUS_CANNOT_DELETE;
2407 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2408 AFS_TRACE_LEVEL_ERROR,
2409 "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2411 &DirectoryCB->NameInformation.FileName,
2414 try_return( ntStatus);
2419 // Be sure we have an Fcb for the current object
2422 if( pObjectInfo->Fcb == NULL)
2425 ntStatus = AFSInitFcb( DirectoryCB,
2428 if( !NT_SUCCESS( ntStatus))
2431 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2432 AFS_TRACE_LEVEL_ERROR,
2433 "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
2435 &DirectoryCB->NameInformation.FileName,
2438 try_return( ntStatus);
2441 bAllocatedFcb = TRUE;
2446 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2453 // Reference the Fcb so it won't go away while we call into the service for processing
2456 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2458 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2459 AFS_TRACE_LEVEL_VERBOSE,
2460 "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
2462 pObjectInfo->Fcb->OpenReferenceCount);
2465 // Check access on the entry
2468 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2471 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2474 &pObjectInfo->Fcb->ShareAccess,
2477 if( !NT_SUCCESS( ntStatus))
2480 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2481 AFS_TRACE_LEVEL_ERROR,
2482 "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
2484 &DirectoryCB->NameInformation.FileName,
2487 try_return( ntStatus);
2492 // Additional checks
2495 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2499 // If the caller is asking for write access then try to flush the image section
2502 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2503 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2506 if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2510 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2511 STATUS_SHARING_VIOLATION;
2513 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2514 AFS_TRACE_LEVEL_ERROR,
2515 "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
2517 &DirectoryCB->NameInformation.FileName,
2520 try_return( ntStatus);
2524 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2527 ntStatus = STATUS_NOT_A_DIRECTORY;
2529 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2530 AFS_TRACE_LEVEL_ERROR,
2531 "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
2533 &DirectoryCB->NameInformation.FileName,
2536 try_return( ntStatus);
2539 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2541 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2542 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2545 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2548 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2550 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2551 AFS_TRACE_LEVEL_ERROR,
2552 "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
2554 &DirectoryCB->NameInformation.FileName,
2557 try_return( ntStatus);
2560 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2561 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2562 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
2569 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2573 // Check with the service that we can open the file
2576 stOpenCB.ParentId = pParentObjectInfo->FileId;
2578 stOpenCB.DesiredAccess = *pDesiredAccess;
2580 stOpenCB.ShareAccess = usShareAccess;
2582 stOpenResultCB.GrantedAccess = 0;
2584 ulResultLen = sizeof( AFSFileOpenResultCB);
2586 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2587 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2589 &DirectoryCB->NameInformation.FileName,
2590 &pObjectInfo->FileId,
2592 sizeof( AFSFileOpenCB),
2593 (void *)&stOpenResultCB,
2596 if( !NT_SUCCESS( ntStatus))
2599 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2600 AFS_TRACE_LEVEL_ERROR,
2601 "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
2603 &DirectoryCB->NameInformation.FileName,
2606 try_return( ntStatus);
2610 // Check if there is a conflict
2613 if( !AFSCheckAccess( *pDesiredAccess,
2614 stOpenResultCB.GrantedAccess,
2615 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2618 ntStatus = STATUS_ACCESS_DENIED;
2620 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2621 AFS_TRACE_LEVEL_ERROR,
2622 "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2625 stOpenResultCB.GrantedAccess,
2626 &DirectoryCB->NameInformation.FileName,
2629 try_return( ntStatus);
2633 // Initialize the Ccb for the file.
2636 ntStatus = AFSInitCcb( Ccb);
2638 if( !NT_SUCCESS( ntStatus))
2641 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2642 AFS_TRACE_LEVEL_ERROR,
2643 "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2645 &DirectoryCB->NameInformation.FileName,
2648 try_return( ntStatus);
2651 bAllocatedCcb = TRUE;
2653 (*Ccb)->DirectoryCB = DirectoryCB;
2656 // Perform the access check on the target if this is a mount point or symlink
2659 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2662 IoUpdateShareAccess( pFileObject,
2663 &pObjectInfo->Fcb->ShareAccess);
2672 IoSetShareAccess( *pDesiredAccess,
2675 &pObjectInfo->Fcb->ShareAccess);
2679 // Increment the open count on this Fcb
2682 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2684 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2685 AFS_TRACE_LEVEL_VERBOSE,
2686 "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
2688 pObjectInfo->Fcb->OpenReferenceCount);
2690 InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2692 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2693 AFS_TRACE_LEVEL_VERBOSE,
2694 "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
2696 pObjectInfo->Fcb->OpenHandleCount);
2699 // Increment the open reference and handle on the parent node
2702 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2704 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2705 AFS_TRACE_LEVEL_VERBOSE,
2706 "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
2707 pObjectInfo->ParentObjectInformation,
2708 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2710 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2712 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2713 AFS_TRACE_LEVEL_VERBOSE,
2714 "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
2715 pObjectInfo->ParentObjectInformation,
2716 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2718 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2722 // Mark it for delete on close
2725 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2726 AFS_TRACE_LEVEL_VERBOSE,
2727 "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2730 &DirectoryCB->NameInformation.FileName);
2732 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2736 // Indicate the object is held
2739 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2742 // Return the open result for this file
2745 Irp->IoStatus.Information = FILE_OPENED;
2747 *Fcb = pObjectInfo->Fcb;
2755 // Remove the reference we added initially
2758 InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2760 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2761 AFS_TRACE_LEVEL_VERBOSE,
2762 "AFSProcessOpen Decrement count on Fcb %08lX Cnt %d\n",
2764 pObjectInfo->Fcb->OpenReferenceCount);
2766 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2769 if( !NT_SUCCESS( ntStatus))
2775 AFSRemoveCcb( *Ccb);
2783 AFSRemoveFcb( pObjectInfo->Fcb);
2785 pObjectInfo->Fcb = NULL;
2796 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
2798 IN AFSVolumeCB *VolumeCB,
2800 IN AFSDirectoryCB *ParentDirCB,
2801 IN AFSDirectoryCB *DirectoryCB,
2806 NTSTATUS ntStatus = STATUS_SUCCESS;
2807 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2808 PFILE_OBJECT pFileObject = NULL;
2809 LARGE_INTEGER liZero = {0,0};
2810 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
2811 ULONG ulAttributes = 0;
2812 LARGE_INTEGER liTime;
2813 ULONG ulCreateDisposition = 0;
2814 BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
2815 PACCESS_MASK pDesiredAccess = NULL;
2816 USHORT usShareAccess;
2817 AFSObjectInfoCB *pParentObjectInfo = NULL;
2818 AFSObjectInfoCB *pObjectInfo = NULL;
2823 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2824 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2826 pFileObject = pIrpSp->FileObject;
2828 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
2830 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
2832 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
2835 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2836 AFS_TRACE_LEVEL_ERROR,
2837 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
2839 &DirectoryCB->NameInformation.FileName);
2841 try_return( ntStatus = STATUS_ACCESS_DENIED);
2844 pParentObjectInfo = ParentDirCB->ObjectInformation;
2846 pObjectInfo = DirectoryCB->ObjectInformation;
2849 // Check if we should go and retrieve updated information for the node
2852 ntStatus = AFSValidateEntry( DirectoryCB,
2857 if( !NT_SUCCESS( ntStatus))
2860 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2861 AFS_TRACE_LEVEL_ERROR,
2862 "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
2864 &DirectoryCB->NameInformation.FileName,
2867 try_return( ntStatus);
2871 // Be sure we have an Fcb for the object block
2874 if( pObjectInfo->Fcb == NULL)
2877 ntStatus = AFSInitFcb( DirectoryCB,
2880 if( !NT_SUCCESS( ntStatus))
2883 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2884 AFS_TRACE_LEVEL_ERROR,
2885 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2887 &DirectoryCB->NameInformation.FileName,
2890 try_return( ntStatus);
2893 bAllocatedFcb = TRUE;
2898 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2905 // Reference the Fcb so it won't go away while processing the request
2908 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2910 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2911 AFS_TRACE_LEVEL_VERBOSE,
2912 "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
2914 pObjectInfo->Fcb->OpenReferenceCount);
2917 // Check access on the entry
2920 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2923 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2926 &pObjectInfo->Fcb->ShareAccess,
2929 if( !NT_SUCCESS( ntStatus))
2932 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2933 AFS_TRACE_LEVEL_ERROR,
2934 "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
2936 &DirectoryCB->NameInformation.FileName,
2939 try_return( ntStatus);
2944 // Before we actually truncate, check to see if the purge
2945 // is going to fail.
2948 if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2952 ntStatus = STATUS_USER_MAPPED_FILE;
2954 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2955 AFS_TRACE_LEVEL_ERROR,
2956 "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
2958 &DirectoryCB->NameInformation.FileName,
2961 try_return( ntStatus);
2965 // Initialize the Ccb for the file.
2968 ntStatus = AFSInitCcb( Ccb);
2970 if( !NT_SUCCESS( ntStatus))
2973 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2974 AFS_TRACE_LEVEL_ERROR,
2975 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2977 &DirectoryCB->NameInformation.FileName,
2980 try_return( ntStatus);
2983 bAllocatedCcb = TRUE;
2986 // Initialize the Ccb
2989 (*Ccb)->DirectoryCB = DirectoryCB;
2992 // Need to purge any data currently in the cache
2995 CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3000 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3001 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3002 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3004 pObjectInfo->EndOfFile.QuadPart = 0;
3005 pObjectInfo->AllocationSize.QuadPart = 0;
3008 // Trim down the extents. We do this BEFORE telling the service
3009 // the file is truncated since there is a potential race between
3010 // a worker thread releasing extents and us trimming
3013 AFSTrimExtents( pObjectInfo->Fcb,
3014 &pObjectInfo->Fcb->Header.FileSize);
3016 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3018 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3020 //KeQuerySystemTime( &pObjectInfo->CreationTime);
3022 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3024 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3028 if( !NT_SUCCESS( ntStatus))
3031 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3032 AFS_TRACE_LEVEL_ERROR,
3033 "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
3035 &DirectoryCB->NameInformation.FileName,
3038 try_return( ntStatus);
3041 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3044 bReleasePaging = TRUE;
3046 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3048 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3050 pFileObject->FsContext2 = (void *)*Ccb;
3053 // Set the update flag accordingly
3056 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3057 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3058 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3059 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3060 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3062 CcSetFileSizes( pFileObject,
3063 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3065 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3067 bReleasePaging = FALSE;
3069 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3071 if( ulCreateDisposition == FILE_SUPERSEDE)
3074 pObjectInfo->FileAttributes = ulAttributes;
3080 pObjectInfo->FileAttributes |= ulAttributes;
3084 // Save off the access for the open
3087 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3090 IoUpdateShareAccess( pFileObject,
3091 &pObjectInfo->Fcb->ShareAccess);
3100 IoSetShareAccess( *pDesiredAccess,
3103 &pObjectInfo->Fcb->ShareAccess);
3107 // Return the correct action
3110 if( ulCreateDisposition == FILE_SUPERSEDE)
3113 Irp->IoStatus.Information = FILE_SUPERSEDED;
3118 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3122 // Increment the open count on this Fcb.
3125 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3127 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3128 AFS_TRACE_LEVEL_VERBOSE,
3129 "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
3131 pObjectInfo->Fcb->OpenReferenceCount);
3133 InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3135 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3136 AFS_TRACE_LEVEL_VERBOSE,
3137 "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
3139 pObjectInfo->Fcb->OpenHandleCount);
3142 // Increment the open reference and handle on the parent node
3145 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3147 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3148 AFS_TRACE_LEVEL_VERBOSE,
3149 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
3150 pObjectInfo->ParentObjectInformation,
3151 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3153 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3155 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3156 AFS_TRACE_LEVEL_VERBOSE,
3157 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
3158 pObjectInfo->ParentObjectInformation,
3159 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3161 *Fcb = pObjectInfo->Fcb;
3168 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3175 // Remove the reference we added above to prevent tear down
3178 InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3180 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3181 AFS_TRACE_LEVEL_VERBOSE,
3182 "AFSProcessOverwriteSupersede Decrement count on Fcb %08lX Cnt %d\n",
3184 pObjectInfo->Fcb->OpenReferenceCount);
3186 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3189 if( !NT_SUCCESS( ntStatus))
3195 AFSRemoveCcb( *Ccb);
3203 AFSRemoveFcb( pObjectInfo->Fcb);
3205 pObjectInfo->Fcb = NULL;
3216 AFSControlDeviceCreate( IN PIRP Irp)
3219 NTSTATUS ntStatus = STATUS_SUCCESS;
3225 // For now, jsut let the open happen
3228 Irp->IoStatus.Information = FILE_OPENED;
3235 AFSOpenIOCtlFcb( IN PIRP Irp,
3237 IN AFSDirectoryCB *ParentDirCB,
3242 NTSTATUS ntStatus = STATUS_SUCCESS;
3243 PFILE_OBJECT pFileObject = NULL;
3244 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3245 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3246 UNICODE_STRING uniFullFileName;
3247 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3249 AFSObjectInfoCB *pParentObjectInfo = NULL;
3254 pFileObject = pIrpSp->FileObject;
3256 pParentObjectInfo = ParentDirCB->ObjectInformation;
3259 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3262 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3265 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3267 if( !NT_SUCCESS( ntStatus))
3270 try_return( ntStatus);
3274 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
3278 // Allocate and initialize the Fcb for the file.
3281 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
3284 if( !NT_SUCCESS( ntStatus))
3287 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3288 AFS_TRACE_LEVEL_ERROR,
3289 "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3293 try_return( ntStatus);
3296 bAllocatedFcb = TRUE;
3301 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3303 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3310 // Initialize the Ccb for the file.
3313 ntStatus = AFSInitCcb( Ccb);
3315 if( !NT_SUCCESS( ntStatus))
3318 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3319 AFS_TRACE_LEVEL_ERROR,
3320 "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3324 try_return( ntStatus);
3327 bAllocatedCcb = TRUE;
3333 (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
3336 // Set the PIOCtl index
3339 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3341 RtlZeroMemory( &stPIOCtlOpen,
3342 sizeof( AFSPIOCtlOpenCloseRequestCB));
3344 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3346 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3348 RtlZeroMemory( &stFileID,
3349 sizeof( AFSFileID));
3352 // The parent directory FID of the node
3355 stFileID = pParentObjectInfo->FileId;
3358 // Issue the open request to the service
3361 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3362 AFS_REQUEST_FLAG_SYNCHRONOUS,
3366 (void *)&stPIOCtlOpen,
3367 sizeof( AFSPIOCtlOpenCloseRequestCB),
3371 if( !NT_SUCCESS( ntStatus))
3374 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3375 AFS_TRACE_LEVEL_ERROR,
3376 "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
3380 try_return( ntStatus);
3384 // Reference the directory entry
3387 InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
3389 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3390 AFS_TRACE_LEVEL_VERBOSE,
3391 "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
3392 &(*Ccb)->DirectoryCB->NameInformation.FileName,
3393 (*Ccb)->DirectoryCB,
3395 (*Ccb)->DirectoryCB->OpenReferenceCount);
3398 // Increment the open reference and handle on the node
3401 InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3403 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3404 AFS_TRACE_LEVEL_VERBOSE,
3405 "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
3407 (*Fcb)->OpenReferenceCount);
3409 InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3411 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3412 AFS_TRACE_LEVEL_VERBOSE,
3413 "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
3415 (*Fcb)->OpenHandleCount);
3418 // Increment the open reference and handle on the parent node
3421 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3423 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3424 AFS_TRACE_LEVEL_VERBOSE,
3425 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3427 pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3429 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3431 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3432 AFS_TRACE_LEVEL_VERBOSE,
3433 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3435 pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3438 // Return the open result for this file
3441 Irp->IoStatus.Information = FILE_OPENED;
3446 //Dereference the passed in parent since the returned dir entry
3447 // is already referenced
3450 InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
3452 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3453 AFS_TRACE_LEVEL_VERBOSE,
3454 "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3455 &ParentDirCB->NameInformation.FileName,
3458 ParentDirCB->OpenReferenceCount);
3461 // If we created the Fcb we need to release the resources
3467 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3470 if( !NT_SUCCESS( ntStatus))
3476 AFSRemoveCcb( *Ccb);
3485 // Need to tear down this Fcb since it is not in the tree for the worker thread
3488 AFSRemoveFcb( *Fcb);
3490 pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
3503 AFSOpenSpecialShareFcb( IN PIRP Irp,
3505 IN AFSDirectoryCB *DirectoryCB,
3510 NTSTATUS ntStatus = STATUS_SUCCESS;
3511 PFILE_OBJECT pFileObject = NULL;
3512 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3513 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3514 AFSObjectInfoCB *pParentObjectInfo = NULL;
3515 AFSPipeOpenCloseRequestCB stPipeOpen;
3520 pFileObject = pIrpSp->FileObject;
3522 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3523 AFS_TRACE_LEVEL_VERBOSE_2,
3524 "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
3526 &DirectoryCB->NameInformation.FileName);
3528 pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
3530 if( DirectoryCB->ObjectInformation->Fcb == NULL)
3534 // Allocate and initialize the Fcb for the file.
3537 ntStatus = AFSInitFcb( DirectoryCB,
3540 if( !NT_SUCCESS( ntStatus))
3543 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3544 AFS_TRACE_LEVEL_ERROR,
3545 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3549 try_return( ntStatus);
3552 bAllocateFcb = TRUE;
3557 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3559 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3566 // Initialize the Ccb for the file.
3569 ntStatus = AFSInitCcb( Ccb);
3571 if( !NT_SUCCESS( ntStatus))
3574 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3575 AFS_TRACE_LEVEL_ERROR,
3576 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3580 try_return( ntStatus);
3583 bAllocatedCcb = TRUE;
3589 (*Ccb)->DirectoryCB = DirectoryCB;
3592 // Call the service to open the share
3595 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3597 RtlZeroMemory( &stPipeOpen,
3598 sizeof( AFSPipeOpenCloseRequestCB));
3600 stPipeOpen.RequestId = (*Ccb)->RequestID;
3602 stPipeOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3605 // Issue the open request to the service
3608 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_OPEN,
3609 AFS_REQUEST_FLAG_SYNCHRONOUS,
3611 &DirectoryCB->NameInformation.FileName,
3613 (void *)&stPipeOpen,
3614 sizeof( AFSPipeOpenCloseRequestCB),
3618 if( !NT_SUCCESS( ntStatus))
3621 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3622 AFS_TRACE_LEVEL_ERROR,
3623 "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
3627 try_return( ntStatus);
3631 // Increment the open count on this Fcb
3634 InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3636 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3637 AFS_TRACE_LEVEL_VERBOSE,
3638 "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
3640 (*Fcb)->OpenReferenceCount);
3642 InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3644 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3645 AFS_TRACE_LEVEL_VERBOSE,
3646 "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
3648 (*Fcb)->OpenHandleCount);
3651 // Increment the open reference and handle on the parent node
3654 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3656 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3657 AFS_TRACE_LEVEL_VERBOSE,
3658 "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3660 pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3662 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3664 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3665 AFS_TRACE_LEVEL_VERBOSE,
3666 "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3668 pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3671 // Return the open result for this file
3674 Irp->IoStatus.Information = FILE_OPENED;
3681 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3684 if( !NT_SUCCESS( ntStatus))
3690 AFSRemoveCcb( *Ccb);
3699 // Need to tear down this Fcb since it is not in the tree for the worker thread
3702 AFSRemoveFcb( *Fcb);
3704 DirectoryCB->ObjectInformation->Fcb = NULL;