2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSCreate.cpp
39 #include "AFSCommon.h"
42 // Function: AFSCreate
46 // This function is the dispatch handler for the IRP_MJ_CREATE requests. It makes the determination to
47 // which interface this request is destined.
51 // A status is returned for the function. The Irp completion processing is handled in the specific
56 AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
60 NTSTATUS ntStatus = STATUS_SUCCESS;
61 IO_STACK_LOCATION *pIrpSp;
62 FILE_OBJECT *pFileObject = NULL;
67 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
68 pFileObject = pIrpSp->FileObject;
70 if( pFileObject == NULL ||
71 pFileObject->FileName.Buffer == NULL)
74 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
75 AFS_TRACE_LEVEL_VERBOSE,
76 "AFSCreate (%08lX) Processing control device open request\n",
79 ntStatus = AFSControlDeviceCreate( Irp);
81 try_return( ntStatus);
84 if( AFSRDRDeviceObject == NULL)
87 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
88 AFS_TRACE_LEVEL_VERBOSE,
89 "AFSCreate (%08lX) Invalid request to open before library is initialized\n",
92 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
95 ntStatus = AFSCommonCreate( AFSRDRDeviceObject,
102 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
107 "EXCEPTION - AFSCreate\n");
109 ntStatus = STATUS_ACCESS_DENIED;
113 // Complete the request
116 AFSCompleteRequest( Irp,
123 AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
127 NTSTATUS ntStatus = STATUS_SUCCESS;
128 UNICODE_STRING uniFileName;
129 ULONG ulCreateDisposition = 0;
131 BOOLEAN bNoIntermediateBuffering = FALSE;
132 FILE_OBJECT *pFileObject = NULL;
133 IO_STACK_LOCATION *pIrpSp;
136 AFSDeviceExt *pDeviceExt = NULL;
137 BOOLEAN bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
138 PACCESS_MASK pDesiredAccess = NULL;
139 UNICODE_STRING uniComponentName, uniPathName, uniRootFileName, uniParsedFileName;
140 UNICODE_STRING uniSubstitutedPathName;
141 UNICODE_STRING uniRelativeName;
142 AFSNameArrayHdr *pNameArray = NULL;
143 AFSVolumeCB *pVolumeCB = NULL;
144 AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
145 ULONG ulParseFlags = 0;
147 ULONG ulNameProcessingFlags = 0;
148 BOOLEAN bOpenedReparsePoint = FALSE;
153 pIrpSp = IoGetCurrentIrpStackLocation( Irp);
154 pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
155 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
156 ulOptions = pIrpSp->Parameters.Create.Options;
157 bNoIntermediateBuffering = BooleanFlagOn( ulOptions, FILE_NO_INTERMEDIATE_BUFFERING);
158 bOpenTargetDirectory = BooleanFlagOn( pIrpSp->Flags, SL_OPEN_TARGET_DIRECTORY);
159 pFileObject = pIrpSp->FileObject;
160 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
162 uniFileName.Length = uniFileName.MaximumLength = 0;
163 uniFileName.Buffer = NULL;
165 uniRootFileName.Length = uniRootFileName.MaximumLength = 0;
166 uniRootFileName.Buffer = NULL;
168 uniParsedFileName.Length = uniParsedFileName.MaximumLength = 0;
169 uniParsedFileName.Buffer = NULL;
171 uniSubstitutedPathName.Buffer = NULL;
172 uniSubstitutedPathName.Length = 0;
174 uniRelativeName.Buffer = NULL;
175 uniRelativeName.Length = 0;
177 if( AFSGlobalRoot == NULL)
179 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
182 RtlZeroMemory( &stAuthGroup,
185 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
186 (ULONGLONG)PsGetCurrentThreadId(),
189 if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
192 ntStatus = AFSEnumerateGlobalRoot( &stAuthGroup);
194 if( !NT_SUCCESS( ntStatus))
197 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
198 AFS_TRACE_LEVEL_ERROR,
199 "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
202 try_return( ntStatus);
207 // If we are in shutdown mode then fail the request
210 if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
213 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
214 AFS_TRACE_LEVEL_WARNING,
215 "AFSCommonCreate (%08lX) Open request after shutdown\n",
218 try_return( ntStatus = STATUS_TOO_LATE);
222 // Go and parse the name for processing.
223 // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
224 // then we are responsible for releasing the uniRootFileName.Buffer.
227 ntStatus = AFSParseName( Irp,
237 if( !NT_SUCCESS( ntStatus))
240 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
241 uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
242 "AFSCommonCreate (%08lX) Failed to parse name \"%wZ\" Status %08lX\n",
247 try_return( ntStatus);
251 // Check for STATUS_REPARSE
254 if( ntStatus == STATUS_REPARSE)
258 // Update the information and return
261 Irp->IoStatus.Information = IO_REPARSE;
263 try_return( ntStatus);
267 // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
271 if( pVolumeCB == NULL)
275 // Remove any leading or trailing slashes
278 if( uniFileName.Length >= sizeof( WCHAR) &&
279 uniFileName.Buffer[ (uniFileName.Length/sizeof( WCHAR)) - 1] == L'\\')
282 uniFileName.Length -= sizeof( WCHAR);
285 if( uniFileName.Length >= sizeof( WCHAR) &&
286 uniFileName.Buffer[ 0] == L'\\')
289 uniFileName.Buffer = &uniFileName.Buffer[ 1];
291 uniFileName.Length -= sizeof( WCHAR);
295 // If there is a remaining portion returned for this request then
296 // check if it is for the PIOCtl interface
299 if( uniFileName.Length > 0)
303 // We don't accept any other opens off of the AFS Root
306 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
309 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
312 if( RtlCompareUnicodeString( &AFSPIOCtlName,
317 ntStatus = AFSOpenIOCtlFcb( Irp,
319 AFSGlobalRoot->DirectoryCB,
323 if( !NT_SUCCESS( ntStatus))
326 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
327 AFS_TRACE_LEVEL_ERROR,
328 "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
332 else if( pParentDirectoryCB != NULL &&
333 pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
336 ntStatus = AFSOpenSpecialShareFcb( Irp,
342 if( !NT_SUCCESS( ntStatus))
345 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
346 AFS_TRACE_LEVEL_ERROR,
347 "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
352 try_return( ntStatus);
355 ntStatus = AFSOpenAFSRoot( Irp,
359 if( !NT_SUCCESS( ntStatus))
362 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
363 AFS_TRACE_LEVEL_ERROR,
364 "AFSCommonCreate Failed to open root Status %08lX\n",
367 InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
369 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
370 AFS_TRACE_LEVEL_VERBOSE,
371 "AFSCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
372 &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
373 AFSGlobalRoot->DirectoryCB,
375 AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
378 try_return( ntStatus);
382 // We have our root node shared
385 bReleaseVolume = TRUE;
388 // Attempt to locate the node in the name tree if this is not a target
389 // open and the target is not the root
392 uniComponentName.Length = 0;
393 uniComponentName.Buffer = NULL;
395 if( uniFileName.Length > sizeof( WCHAR) ||
396 uniFileName.Buffer[ 0] != L'\\')
399 if( !AFSValidNameFormat( &uniFileName))
402 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
404 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
405 AFS_TRACE_LEVEL_VERBOSE,
406 "AFSCommonCreate (%08lX) Invalid name %wZ Status %08lX\n",
411 try_return( ntStatus);
415 // Opening a reparse point directly?
418 ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
420 if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
422 ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
423 AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
424 AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
427 uniSubstitutedPathName = uniRootFileName;
429 ntStatus = AFSLocateNameEntry( &stAuthGroup,
434 ulNameProcessingFlags,
440 if( !NT_SUCCESS( ntStatus) &&
441 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
444 if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
446 uniSubstitutedPathName.Buffer = NULL;
450 // The routine above released the root while walking the
454 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
455 AFS_TRACE_LEVEL_VERBOSE,
456 "AFSCommonCreate (%08lX) Failed to locate name entry for %wZ Status %08lX\n",
462 // We released any root volume locks in the above on failure
465 bReleaseVolume = FALSE;
467 try_return( ntStatus);
471 // Check for STATUS_REPARSE
474 if( ntStatus == STATUS_REPARSE)
477 uniSubstitutedPathName.Buffer = NULL;
480 // Update the information and return
483 Irp->IoStatus.Information = IO_REPARSE;
486 // We released the volume lock above
489 bReleaseVolume = FALSE;
491 try_return( ntStatus);
495 // If we re-allocated the name, then update our substitute name
498 if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
501 uniSubstitutedPathName = uniRootFileName;
506 uniSubstitutedPathName.Buffer = NULL;
510 // Check for a symlink access
513 if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
514 pParentDirectoryCB != NULL)
517 UNICODE_STRING uniFinalComponent;
519 uniFinalComponent.Length = 0;
520 uniFinalComponent.MaximumLength = 0;
521 uniFinalComponent.Buffer = NULL;
523 AFSRetrieveFinalComponent( &uniFileName,
526 ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
529 if( !NT_SUCCESS( ntStatus) &&
530 ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
533 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
534 AFS_TRACE_LEVEL_VERBOSE,
535 "AFSCommonCreate (%08lX) Failing access to symlink %wZ Status %08lX\n",
540 try_return( ntStatus);
546 // If we have no parent then this is a root open, be sure there is a directory entry
550 else if( pParentDirectoryCB == NULL &&
551 pDirectoryCB == NULL)
554 pDirectoryCB = pVolumeCB->DirectoryCB;
557 if( bOpenTargetDirectory)
561 // If we have a directory cb for the entry then dereference it and reference the parent
564 if( pDirectoryCB != NULL)
568 // Perform in this order to prevent thrashing
571 InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
573 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
574 AFS_TRACE_LEVEL_VERBOSE,
575 "AFSCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
576 &pParentDirectoryCB->NameInformation.FileName,
579 pParentDirectoryCB->OpenReferenceCount);
582 // Do NOT decrement the reference count on the pDirectoryCB yet.
583 // The BackupEntry below might drop the count to zero leaving
584 // the entry subject to being deleted and we need some of the
585 // contents during later processing
588 AFSBackupEntry( pNameArray);
592 // OK, open the target directory
595 if( uniComponentName.Length == 0)
597 AFSRetrieveFinalComponent( &uniFileName,
601 ntStatus = AFSOpenTargetDirectory( Irp,
608 if( pDirectoryCB != NULL)
611 // It is now safe to drop the Reference Count
613 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
615 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
616 AFS_TRACE_LEVEL_VERBOSE,
617 "AFSCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
618 &pDirectoryCB->NameInformation.FileName,
621 pDirectoryCB->OpenReferenceCount);
624 if( !NT_SUCCESS( ntStatus))
627 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
628 AFS_TRACE_LEVEL_ERROR,
629 "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
630 &pParentDirectoryCB->NameInformation.FileName,
634 // Decrement the reference on the parent
637 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
639 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
640 AFS_TRACE_LEVEL_VERBOSE,
641 "AFSCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
642 &pParentDirectoryCB->NameInformation.FileName,
645 pParentDirectoryCB->OpenReferenceCount);
648 try_return( ntStatus);
651 if ( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
654 if( pDirectoryCB == NULL ||
655 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
657 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
658 AFS_TRACE_LEVEL_VERBOSE,
659 "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
663 pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
667 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
668 AFS_TRACE_LEVEL_VERBOSE,
669 "AFSCommonCreate (%08lX) Opening as reparse point %wZ Type %08lX\n",
672 pDirectoryCB->ObjectInformation->FileType);
674 bOpenedReparsePoint = TRUE;
679 // Based on the options passed in, process the file accordingly.
682 if( ulCreateDisposition == FILE_CREATE ||
683 ( ( ulCreateDisposition == FILE_OPEN_IF ||
684 ulCreateDisposition == FILE_OVERWRITE_IF) &&
685 pDirectoryCB == NULL))
688 if( uniComponentName.Length == 0 ||
689 pDirectoryCB != NULL)
693 // We traversed the entire path so we found each entry,
694 // fail with collision
697 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
698 AFS_TRACE_LEVEL_VERBOSE,
699 "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
700 &pDirectoryCB->NameInformation.FileName,
703 if( pDirectoryCB != NULL)
706 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
708 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
709 AFS_TRACE_LEVEL_VERBOSE,
710 "AFSCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
711 &pDirectoryCB->NameInformation.FileName,
714 pDirectoryCB->OpenReferenceCount);
719 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
721 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
722 AFS_TRACE_LEVEL_VERBOSE,
723 "AFSCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
724 &pParentDirectoryCB->NameInformation.FileName,
727 pParentDirectoryCB->OpenReferenceCount);
730 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
734 // OK, go and create the node
737 ntStatus = AFSProcessCreate( Irp,
747 if( !NT_SUCCESS( ntStatus))
750 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
751 AFS_TRACE_LEVEL_ERROR,
752 "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
754 &pParentDirectoryCB->NameInformation.FileName,
759 // Dereference the parent entry
762 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
764 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
765 AFS_TRACE_LEVEL_VERBOSE,
766 "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
767 &pParentDirectoryCB->NameInformation.FileName,
770 pParentDirectoryCB->OpenReferenceCount);
772 try_return( ntStatus);
776 // We should not have an extra component except for PIOCtl opens
779 if( uniComponentName.Length > 0)
783 // If this is an open on "_._AFS_IOCTL_._" then perform handling on it accordingly
786 if( RtlCompareUnicodeString( &AFSPIOCtlName,
791 ntStatus = AFSOpenIOCtlFcb( Irp,
797 if( !NT_SUCCESS( ntStatus))
800 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
801 AFS_TRACE_LEVEL_ERROR,
802 "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
810 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
811 AFS_TRACE_LEVEL_VERBOSE,
812 "AFSCommonCreate (%08lX) File %wZ name not found\n",
816 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
819 if( !NT_SUCCESS( ntStatus))
823 // Dereference the parent entry
826 if( pDirectoryCB != NULL)
829 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
831 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
832 AFS_TRACE_LEVEL_VERBOSE,
833 "AFSCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
834 &pDirectoryCB->NameInformation.FileName,
837 pDirectoryCB->OpenReferenceCount);
842 InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
844 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
845 AFS_TRACE_LEVEL_VERBOSE,
846 "AFSCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
847 &pParentDirectoryCB->NameInformation.FileName,
850 pParentDirectoryCB->OpenReferenceCount);
854 try_return( ntStatus);
858 // For root opens the parent will be NULL
861 if( pParentDirectoryCB == NULL)
865 // Check for the delete on close flag for the root
868 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
871 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
872 AFS_TRACE_LEVEL_ERROR,
873 "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
876 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
878 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
879 AFS_TRACE_LEVEL_VERBOSE,
880 "AFSCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
881 &pDirectoryCB->NameInformation.FileName,
884 pDirectoryCB->OpenReferenceCount);
886 try_return( ntStatus = STATUS_CANNOT_DELETE);
890 // If this is the target directory, then bail
893 if( bOpenTargetDirectory)
896 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
897 AFS_TRACE_LEVEL_ERROR,
898 "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
901 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
903 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
904 AFS_TRACE_LEVEL_VERBOSE,
905 "AFSCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
906 &pDirectoryCB->NameInformation.FileName,
909 pDirectoryCB->OpenReferenceCount);
911 try_return( ntStatus = STATUS_INVALID_PARAMETER);
915 // Go and open the root of the volume
918 ntStatus = AFSOpenRoot( Irp,
924 if( !NT_SUCCESS( ntStatus))
927 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
928 AFS_TRACE_LEVEL_ERROR,
929 "AFSCommonCreate Failed to open root (2) Status %08lX\n",
932 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
934 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
935 AFS_TRACE_LEVEL_VERBOSE,
936 "AFSCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
937 &pDirectoryCB->NameInformation.FileName,
940 pDirectoryCB->OpenReferenceCount);
943 try_return( ntStatus);
947 // At this point if we have no pDirectoryCB it was not found.
950 if( pDirectoryCB == NULL)
953 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
954 AFS_TRACE_LEVEL_ERROR,
955 "AFSCommonCreate Failing access to %wZ\n",
958 try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
961 if( ulCreateDisposition == FILE_OVERWRITE ||
962 ulCreateDisposition == FILE_SUPERSEDE ||
963 ulCreateDisposition == FILE_OVERWRITE_IF)
967 // Go process a file for overwrite or supersede.
970 ntStatus = AFSProcessOverwriteSupersede( DeviceObject,
979 if( !NT_SUCCESS( ntStatus))
982 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
983 AFS_TRACE_LEVEL_ERROR,
984 "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
985 &pDirectoryCB->NameInformation.FileName,
988 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
990 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
991 AFS_TRACE_LEVEL_VERBOSE,
992 "AFSCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
993 &pDirectoryCB->NameInformation.FileName,
996 pDirectoryCB->OpenReferenceCount);
999 try_return( ntStatus);
1003 // Trying to open the file
1006 ntStatus = AFSProcessOpen( Irp,
1014 if( !NT_SUCCESS( ntStatus))
1017 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1018 AFS_TRACE_LEVEL_ERROR,
1019 "AFSCommonCreate Failed open on %wZ Status %08lX\n",
1020 &pDirectoryCB->NameInformation.FileName,
1023 InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
1025 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1026 AFS_TRACE_LEVEL_VERBOSE,
1027 "AFSCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
1028 &pDirectoryCB->NameInformation.FileName,
1031 pDirectoryCB->OpenReferenceCount);
1036 if( NT_SUCCESS( ntStatus) &&
1037 ntStatus != STATUS_REPARSE)
1044 // If we have a substitute name, then use it
1047 if( uniSubstitutedPathName.Buffer != NULL)
1050 pCcb->FullFileName = uniSubstitutedPathName;
1052 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1054 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1059 pCcb->FullFileName = uniRootFileName;
1061 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1064 SetFlag( pCcb->Flags, CCB_FLAG_FREE_FULL_PATHNAME);
1066 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1070 if( bOpenedReparsePoint)
1072 SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
1075 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
1076 AFS_TRACE_LEVEL_VERBOSE,
1077 "AFSCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
1078 &pCcb->DirectoryCB->NameInformation.FileName,
1081 pCcb->DirectoryCB->OpenReferenceCount);
1083 ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
1085 pCcb->CurrentDirIndex = 0;
1087 if( !BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_ROOT_ACCESS))
1090 SetFlag( pCcb->Flags, CCB_FLAG_RETURN_RELATIVE_ENTRIES);
1094 // Save off the name array for this instance
1097 pCcb->NameArray = pNameArray;
1103 // If we make it here then init the FO for the request.
1106 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1107 AFS_TRACE_LEVEL_VERBOSE_2,
1108 "AFSCommonCreate (%08lX) FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1114 pFileObject->FsContext = (void *)pFcb;
1116 pFileObject->FsContext2 = (void *)pCcb;
1121 ASSERT( pFcb->OpenHandleCount > 0);
1123 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
1125 RtlCopyMemory( &pFcb->AuthGroup,
1130 // For files perform additional processing
1133 if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
1135 pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
1139 // If the user did not request nobuffering then mark the FO as cacheable
1142 if( bNoIntermediateBuffering)
1145 pFileObject->Flags |= FO_NO_INTERMEDIATE_BUFFERING;
1150 pFileObject->Flags |= FO_CACHE_SUPPORTED;
1154 // If the file was opened for execution then we need to set the bit in the FO
1157 if( BooleanFlagOn( *pDesiredAccess,
1161 SetFlag( pFileObject->Flags, FO_FILE_FAST_IO_READ);
1165 // Update the last access time
1168 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
1173 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1174 AFS_TRACE_LEVEL_ERROR,
1175 "AFSCommonCreate (%08lX) Returning with NULL Fcb FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1184 if( NT_SUCCESS( ntStatus) &&
1185 ntStatus == STATUS_REPARSE)
1188 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1189 AFS_TRACE_LEVEL_ERROR,
1190 "AFSCommonCreate (%08lX) STATUS_REPARSE FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
1198 // Free up the sub name if we have one
1201 if( uniSubstitutedPathName.Buffer != NULL)
1204 AFSExFreePool( uniSubstitutedPathName.Buffer);
1206 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
1211 // Free up the name array ...
1214 if( pNameArray != NULL)
1217 AFSFreeNameArray( pNameArray);
1220 if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
1223 AFSExFreePool( uniRootFileName.Buffer);
1229 InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
1231 AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
1232 AFS_TRACE_LEVEL_VERBOSE,
1233 "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
1235 pVolumeCB->VolumeReferenceCount);
1237 AFSReleaseResource( pVolumeCB->VolumeLock);
1241 // Setup the Irp for completion, the Information has been set previously
1244 Irp->IoStatus.Status = ntStatus;
1251 AFSOpenRedirector( IN PIRP Irp,
1256 NTSTATUS ntStatus = STATUS_SUCCESS;
1262 // Initialize the Ccb for the file.
1265 ntStatus = AFSInitCcb( Ccb);
1267 if( !NT_SUCCESS( ntStatus))
1270 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1271 AFS_TRACE_LEVEL_ERROR,
1272 "AFSOpenRedirector (%08lX) Failed to allocate Ccb\n",
1275 try_return( ntStatus);
1282 (*Ccb)->DirectoryCB = AFSRedirectorRoot->DirectoryCB;
1285 // Increment the open count on this Fcb
1288 InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenReferenceCount);
1290 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1291 AFS_TRACE_LEVEL_VERBOSE,
1292 "AFSOpenRedirector Increment count on Fcb %08lX Cnt %d\n",
1293 AFSRedirectorRoot->RootFcb,
1294 AFSRedirectorRoot->RootFcb->OpenReferenceCount);
1296 InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenHandleCount);
1298 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1299 AFS_TRACE_LEVEL_VERBOSE,
1300 "AFSOpenRedirector Increment handle count on Fcb %08lX Cnt %d\n",
1301 AFSRedirectorRoot->RootFcb,
1302 AFSRedirectorRoot->RootFcb->OpenHandleCount);
1304 *Fcb = AFSRedirectorRoot->RootFcb;
1306 InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
1309 // Return the open result for this file
1312 Irp->IoStatus.Information = FILE_OPENED;
1323 AFSOpenAFSRoot( IN PIRP Irp,
1328 NTSTATUS ntStatus = STATUS_SUCCESS;
1334 // Initialize the Ccb for the file.
1337 ntStatus = AFSInitCcb( Ccb);
1339 if( !NT_SUCCESS( ntStatus))
1342 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1343 AFS_TRACE_LEVEL_ERROR,
1344 "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
1347 try_return( ntStatus);
1354 (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
1357 // Increment the open count on this Fcb
1360 InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
1362 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1363 AFS_TRACE_LEVEL_VERBOSE,
1364 "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
1365 AFSGlobalRoot->RootFcb,
1366 AFSGlobalRoot->RootFcb->OpenReferenceCount);
1368 InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
1370 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1371 AFS_TRACE_LEVEL_VERBOSE,
1372 "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
1373 AFSGlobalRoot->RootFcb,
1374 AFSGlobalRoot->RootFcb->OpenHandleCount);
1376 *Fcb = AFSGlobalRoot->RootFcb;
1379 // Return the open result for this file
1382 Irp->IoStatus.Information = FILE_OPENED;
1393 AFSOpenRoot( IN PIRP Irp,
1394 IN AFSVolumeCB *VolumeCB,
1396 OUT AFSFcb **RootFcb,
1400 NTSTATUS ntStatus = STATUS_SUCCESS;
1401 PFILE_OBJECT pFileObject = NULL;
1402 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1403 PACCESS_MASK pDesiredAccess = NULL;
1404 USHORT usShareAccess;
1405 BOOLEAN bAllocatedCcb = FALSE;
1406 BOOLEAN bReleaseFcb = FALSE;
1407 AFSFileOpenCB stOpenCB;
1408 AFSFileOpenResultCB stOpenResultCB;
1409 ULONG ulResultLen = 0;
1414 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1415 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1417 pFileObject = pIrpSp->FileObject;
1420 // Check if we should go and retrieve updated information for the node
1423 ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
1428 if( !NT_SUCCESS( ntStatus))
1431 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1432 AFS_TRACE_LEVEL_ERROR,
1433 "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
1437 try_return( ntStatus);
1441 // Check with the service that we can open the file
1444 RtlZeroMemory( &stOpenCB,
1445 sizeof( AFSFileOpenCB));
1447 stOpenCB.DesiredAccess = *pDesiredAccess;
1449 stOpenCB.ShareAccess = usShareAccess;
1451 stOpenResultCB.GrantedAccess = 0;
1453 ulResultLen = sizeof( AFSFileOpenResultCB);
1455 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
1456 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
1459 &VolumeCB->ObjectInformation.FileId,
1461 sizeof( AFSFileOpenCB),
1462 (void *)&stOpenResultCB,
1465 if( !NT_SUCCESS( ntStatus))
1468 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1469 AFS_TRACE_LEVEL_ERROR,
1470 "AFSOpenRoot (%08lX) Failed open in service AFSRoot Status %08lX\n",
1474 try_return( ntStatus);
1478 // If the entry is not initialized then do it now
1481 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1484 AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
1487 if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
1490 ntStatus = AFSEnumerateDirectory( AuthGroup,
1491 &VolumeCB->ObjectInformation,
1494 if( !NT_SUCCESS( ntStatus))
1497 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1499 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1500 AFS_TRACE_LEVEL_ERROR,
1501 "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
1505 try_return( ntStatus);
1508 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1511 AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
1515 // If the root fcb has been initialized then check access otherwise
1516 // init the volume fcb
1519 if( VolumeCB->RootFcb == NULL)
1522 ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
1525 if( !NT_SUCCESS( ntStatus))
1528 try_return( ntStatus);
1534 AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
1541 // If there are current opens on the Fcb, check the access.
1544 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1547 ntStatus = IoCheckShareAccess( *pDesiredAccess,
1550 &VolumeCB->RootFcb->ShareAccess,
1553 if( !NT_SUCCESS( ntStatus))
1556 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1557 AFS_TRACE_LEVEL_ERROR,
1558 "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
1562 try_return( ntStatus);
1567 // Initialize the Ccb for the file.
1570 ntStatus = AFSInitCcb( Ccb);
1572 if( !NT_SUCCESS( ntStatus))
1575 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1576 AFS_TRACE_LEVEL_ERROR,
1577 "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
1581 try_return( ntStatus);
1584 bAllocatedCcb = TRUE;
1590 (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
1593 // OK, update the share access on the fileobject
1596 if( VolumeCB->RootFcb->OpenHandleCount > 0)
1599 IoUpdateShareAccess( pFileObject,
1600 &VolumeCB->RootFcb->ShareAccess);
1609 IoSetShareAccess( *pDesiredAccess,
1612 &VolumeCB->RootFcb->ShareAccess);
1616 // Increment the open count on this Fcb
1619 InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
1621 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1622 AFS_TRACE_LEVEL_VERBOSE,
1623 "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
1625 VolumeCB->RootFcb->OpenReferenceCount);
1627 InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
1629 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1630 AFS_TRACE_LEVEL_VERBOSE,
1631 "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
1633 VolumeCB->RootFcb->OpenHandleCount);
1636 // Indicate the object is held
1639 SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_HELD_IN_SERVICE);
1642 // Return the open result for this file
1645 Irp->IoStatus.Information = FILE_OPENED;
1647 *RootFcb = VolumeCB->RootFcb;
1654 AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
1657 if( !NT_SUCCESS( ntStatus))
1663 AFSRemoveCcb( *Ccb);
1668 Irp->IoStatus.Information = 0;
1676 AFSProcessCreate( IN PIRP Irp,
1678 IN AFSVolumeCB *VolumeCB,
1679 IN AFSDirectoryCB *ParentDirCB,
1680 IN PUNICODE_STRING FileName,
1681 IN PUNICODE_STRING ComponentName,
1682 IN PUNICODE_STRING FullFileName,
1687 NTSTATUS ntStatus = STATUS_SUCCESS;
1688 PFILE_OBJECT pFileObject = NULL;
1689 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1690 ULONG ulOptions = 0;
1691 ULONG ulShareMode = 0;
1693 ULONG ulAttributes = 0;
1694 LARGE_INTEGER liAllocationSize = {0,0};
1695 BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
1696 BOOLEAN bAllocatedFcb = FALSE;
1697 PACCESS_MASK pDesiredAccess = NULL;
1698 USHORT usShareAccess;
1699 AFSDirectoryCB *pDirEntry = NULL;
1700 AFSObjectInfoCB *pParentObjectInfo = NULL;
1701 AFSObjectInfoCB *pObjectInfo = NULL;
1706 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
1707 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
1709 pFileObject = pIrpSp->FileObject;
1712 // Extract out the options
1715 ulOptions = pIrpSp->Parameters.Create.Options;
1718 // We pass all attributes they want to apply to the file to the create
1721 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
1724 // If this is a directory create then set the attribute correctly
1727 if( ulOptions & FILE_DIRECTORY_FILE)
1730 ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1733 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1734 AFS_TRACE_LEVEL_VERBOSE,
1735 "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
1740 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
1743 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1744 AFS_TRACE_LEVEL_ERROR,
1745 "AFSProcessCreate Request failed due to read only volume %wZ\n",
1748 try_return( ntStatus = STATUS_ACCESS_DENIED);
1751 pParentObjectInfo = ParentDirCB->ObjectInformation;
1754 // Allocate and insert the direntry into the parent node
1757 ntStatus = AFSCreateDirEntry( AuthGroup,
1765 if( !NT_SUCCESS( ntStatus))
1768 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1769 AFS_TRACE_LEVEL_ERROR,
1770 "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
1775 try_return( ntStatus);
1778 bFileCreated = TRUE;
1780 pObjectInfo = pDirEntry->ObjectInformation;
1782 if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED) ||
1783 pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
1786 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1787 AFS_TRACE_LEVEL_VERBOSE,
1788 "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
1790 &pDirEntry->NameInformation.FileName,
1791 pObjectInfo->FileId.Cell,
1792 pObjectInfo->FileId.Volume,
1793 pObjectInfo->FileId.Vnode,
1794 pObjectInfo->FileId.Unique);
1796 ntStatus = AFSEvaluateNode( AuthGroup,
1799 if( !NT_SUCCESS( ntStatus))
1802 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1803 AFS_TRACE_LEVEL_ERROR,
1804 "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %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,
1813 try_return( ntStatus);
1816 ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
1820 // We may have raced and the Fcb is already created
1823 if( pObjectInfo->Fcb != NULL)
1826 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1827 AFS_TRACE_LEVEL_VERBOSE,
1828 "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
1832 *Fcb = pObjectInfo->Fcb;
1834 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
1841 // Allocate and initialize the Fcb for the file.
1844 ntStatus = AFSInitFcb( pDirEntry,
1847 if( !NT_SUCCESS( ntStatus))
1850 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1851 AFS_TRACE_LEVEL_ERROR,
1852 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
1857 try_return( ntStatus);
1860 bAllocatedFcb = TRUE;
1866 // Initialize the Ccb for the file.
1869 ntStatus = AFSInitCcb( Ccb);
1871 if( !NT_SUCCESS( ntStatus))
1874 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1875 AFS_TRACE_LEVEL_ERROR,
1876 "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
1881 try_return( ntStatus);
1884 bAllocatedCcb = TRUE;
1887 // Initialize the Ccb
1890 (*Ccb)->DirectoryCB = pDirEntry;
1893 // If this is a file, update the headers filesizes.
1896 if( (*Fcb)->Header.NodeTypeCode == AFS_FILE_FCB)
1900 // Update the sizes with the information passed in
1903 (*Fcb)->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
1904 (*Fcb)->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1905 (*Fcb)->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
1908 // Notify the system of the addition
1911 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1913 (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
1914 (ULONG)FILE_ACTION_ADDED);
1916 (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
1918 else if( (*Fcb)->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1922 // This is a new directory node so indicate it has been enumerated
1925 SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
1928 // And the parent directory entry
1931 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1934 // Notify the system of the addition
1937 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1939 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1940 (ULONG)FILE_ACTION_ADDED);
1942 else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
1943 (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
1944 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
1948 // And the parent directory entry
1951 KeQuerySystemTime( &pParentObjectInfo->ChangeTime);
1954 // Notify the system of the addition
1957 AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
1959 (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
1960 (ULONG)FILE_ACTION_ADDED);
1964 // Save off the access for the open
1967 IoSetShareAccess( *pDesiredAccess,
1970 &(*Fcb)->ShareAccess);
1973 // Increment the open count on this Fcb
1976 InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
1978 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1979 AFS_TRACE_LEVEL_VERBOSE,
1980 "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
1982 (*Fcb)->OpenReferenceCount);
1984 InterlockedIncrement( &(*Fcb)->OpenHandleCount);
1986 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1987 AFS_TRACE_LEVEL_VERBOSE,
1988 "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
1990 (*Fcb)->OpenHandleCount);
1993 // Increment the open reference and handle on the parent node
1996 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
1998 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
1999 AFS_TRACE_LEVEL_VERBOSE,
2000 "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
2001 pObjectInfo->ParentObjectInformation,
2002 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2004 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2006 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2007 AFS_TRACE_LEVEL_VERBOSE,
2008 "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
2009 pObjectInfo->ParentObjectInformation,
2010 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2012 if( ulOptions & FILE_DELETE_ON_CLOSE)
2016 // Mark it for delete on close
2019 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2020 AFS_TRACE_LEVEL_VERBOSE,
2021 "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2026 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2030 // Indicate the object is locked in the service
2033 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2036 // Return the open result for this file
2039 Irp->IoStatus.Information = FILE_CREATED;
2044 // If we created the Fcb we need to release the resources
2050 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
2053 if( !NT_SUCCESS( ntStatus))
2059 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2060 AFS_TRACE_LEVEL_VERBOSE,
2061 "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
2067 // Remove the dir entry from the parent
2070 AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
2073 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2076 // Decrement the reference added during initialization of the DE
2079 InterlockedDecrement( &pDirEntry->OpenReferenceCount);
2081 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2082 AFS_TRACE_LEVEL_VERBOSE,
2083 "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
2084 &pDirEntry->NameInformation.FileName,
2086 pDirEntry->OpenReferenceCount);
2089 // Pull the directory entry from the parent
2092 AFSRemoveDirNodeFromParent( pParentObjectInfo,
2094 FALSE); // Leave it in the enum list so the worker cleans it up
2096 AFSNotifyDelete( pDirEntry,
2100 // Tag the parent as needing verification
2103 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
2105 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
2111 AFSRemoveCcb( *Ccb);
2117 AFSRemoveFcb( pObjectInfo->Fcb);
2119 pObjectInfo->Fcb = NULL;
2132 AFSOpenTargetDirectory( IN PIRP Irp,
2133 IN AFSVolumeCB *VolumeCB,
2134 IN AFSDirectoryCB *ParentDirectoryCB,
2135 IN AFSDirectoryCB *TargetDirectoryCB,
2136 IN UNICODE_STRING *TargetName,
2141 NTSTATUS ntStatus = STATUS_SUCCESS;
2142 PFILE_OBJECT pFileObject = NULL;
2143 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2144 PACCESS_MASK pDesiredAccess = NULL;
2145 USHORT usShareAccess;
2146 BOOLEAN bAllocatedCcb = FALSE;
2147 BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2148 AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
2149 UNICODE_STRING uniTargetName;
2154 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2155 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2157 pFileObject = pIrpSp->FileObject;
2159 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2160 AFS_TRACE_LEVEL_VERBOSE,
2161 "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
2165 pParentObject = ParentDirectoryCB->ObjectInformation;
2167 if( pParentObject->FileType != AFS_FILE_TYPE_DIRECTORY)
2170 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2174 // Make sure we have an Fcb for the access
2177 if( pParentObject->Fcb != NULL)
2180 *Fcb = pParentObject->Fcb;
2182 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
2189 // Allocate and initialize the Fcb for the file.
2192 ntStatus = AFSInitFcb( ParentDirectoryCB,
2195 if( !NT_SUCCESS( ntStatus))
2198 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2199 AFS_TRACE_LEVEL_ERROR,
2200 "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2202 &ParentDirectoryCB->NameInformation.FileName,
2205 try_return( ntStatus);
2208 bAllocatedFcb = TRUE;
2214 // If there are current opens on the Fcb, check the access.
2217 if( pParentObject->Fcb->OpenHandleCount > 0)
2220 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2223 &pParentObject->Fcb->ShareAccess,
2226 if( !NT_SUCCESS( ntStatus))
2229 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2230 AFS_TRACE_LEVEL_ERROR,
2231 "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
2233 &ParentDirectoryCB->NameInformation.FileName,
2236 try_return( ntStatus);
2241 // Initialize the Ccb for the file.
2244 ntStatus = AFSInitCcb( Ccb);
2246 if( !NT_SUCCESS( ntStatus))
2249 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2250 AFS_TRACE_LEVEL_ERROR,
2251 "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2253 &ParentDirectoryCB->NameInformation.FileName,
2256 try_return( ntStatus);
2259 bAllocatedCcb = TRUE;
2262 // Initialize the Ccb
2265 (*Ccb)->DirectoryCB = ParentDirectoryCB;
2267 if( TargetDirectoryCB != NULL &&
2268 FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
2274 Irp->IoStatus.Information = FILE_EXISTS;
2276 uniTargetName = TargetDirectoryCB->NameInformation.FileName;
2281 Irp->IoStatus.Information = FILE_DOES_NOT_EXIST;
2283 uniTargetName = *TargetName;
2287 // Update the filename in the fileobject for rename processing
2290 RtlCopyMemory( pFileObject->FileName.Buffer,
2291 uniTargetName.Buffer,
2292 uniTargetName.Length);
2294 pFileObject->FileName.Length = uniTargetName.Length;
2297 // OK, update the share access on the fileobject
2300 if( pParentObject->Fcb->OpenHandleCount > 0)
2303 IoUpdateShareAccess( pFileObject,
2304 &pParentObject->Fcb->ShareAccess);
2313 IoSetShareAccess( *pDesiredAccess,
2316 &pParentObject->Fcb->ShareAccess);
2320 // Increment the open count on this Fcb
2323 InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
2325 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2326 AFS_TRACE_LEVEL_VERBOSE,
2327 "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
2329 pParentObject->Fcb->OpenReferenceCount);
2331 InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
2333 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2334 AFS_TRACE_LEVEL_VERBOSE,
2335 "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
2337 pParentObject->Fcb->OpenHandleCount);
2340 // Increment the open reference and handle on the parent node
2343 if( pParentObject->ParentObjectInformation != NULL)
2346 InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2348 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2349 AFS_TRACE_LEVEL_VERBOSE,
2350 "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
2351 pParentObject->ParentObjectInformation,
2352 pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2354 InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2356 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2357 AFS_TRACE_LEVEL_VERBOSE,
2358 "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
2359 pParentObject->ParentObjectInformation,
2360 pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2368 AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
2371 if( !NT_SUCCESS( ntStatus))
2377 AFSRemoveCcb( *Ccb);
2385 AFSRemoveFcb( pParentObject->Fcb);
2387 pParentObject->Fcb = NULL;
2398 AFSProcessOpen( IN PIRP Irp,
2400 IN AFSVolumeCB *VolumeCB,
2401 IN AFSDirectoryCB *ParentDirCB,
2402 IN AFSDirectoryCB *DirectoryCB,
2407 NTSTATUS ntStatus = STATUS_SUCCESS;
2408 PFILE_OBJECT pFileObject = NULL;
2409 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2410 PACCESS_MASK pDesiredAccess = NULL;
2411 USHORT usShareAccess;
2412 BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
2413 ULONG ulAdditionalFlags = 0, ulOptions = 0;
2414 AFSFileOpenCB stOpenCB;
2415 AFSFileOpenResultCB stOpenResultCB;
2416 ULONG ulResultLen = 0;
2417 AFSObjectInfoCB *pParentObjectInfo = NULL;
2418 AFSObjectInfoCB *pObjectInfo = NULL;
2423 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2424 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2426 pFileObject = pIrpSp->FileObject;
2428 pParentObjectInfo = ParentDirCB->ObjectInformation;
2430 pObjectInfo = DirectoryCB->ObjectInformation;
2433 // Check if the entry is pending a deletion
2436 if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE))
2439 ntStatus = STATUS_DELETE_PENDING;
2441 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2442 AFS_TRACE_LEVEL_ERROR,
2443 "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
2445 &DirectoryCB->NameInformation.FileName,
2448 try_return( ntStatus);
2452 // Extract out the options
2455 ulOptions = pIrpSp->Parameters.Create.Options;
2458 // Check if we should go and retrieve updated information for the node
2461 ntStatus = AFSValidateEntry( DirectoryCB,
2466 if( !NT_SUCCESS( ntStatus))
2469 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2470 AFS_TRACE_LEVEL_ERROR,
2471 "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
2473 &DirectoryCB->NameInformation.FileName,
2476 try_return( ntStatus);
2480 // If this is marked for delete on close then be sure we can delete the entry
2483 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2486 ntStatus = AFSNotifyDelete( DirectoryCB,
2489 if( !NT_SUCCESS( ntStatus))
2492 ntStatus = STATUS_CANNOT_DELETE;
2494 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2495 AFS_TRACE_LEVEL_ERROR,
2496 "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
2498 &DirectoryCB->NameInformation.FileName,
2501 try_return( ntStatus);
2506 // Be sure we have an Fcb for the current object
2509 if( pObjectInfo->Fcb == NULL)
2512 ntStatus = AFSInitFcb( DirectoryCB,
2515 if( !NT_SUCCESS( ntStatus))
2518 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2519 AFS_TRACE_LEVEL_ERROR,
2520 "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
2522 &DirectoryCB->NameInformation.FileName,
2525 try_return( ntStatus);
2528 bAllocatedFcb = TRUE;
2533 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2540 // Reference the Fcb so it won't go away while we call into the service for processing
2543 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2545 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2546 AFS_TRACE_LEVEL_VERBOSE,
2547 "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
2549 pObjectInfo->Fcb->OpenReferenceCount);
2552 // Check access on the entry
2555 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2558 ntStatus = IoCheckShareAccess( *pDesiredAccess,
2561 &pObjectInfo->Fcb->ShareAccess,
2564 if( !NT_SUCCESS( ntStatus))
2567 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2568 AFS_TRACE_LEVEL_ERROR,
2569 "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
2571 &DirectoryCB->NameInformation.FileName,
2574 try_return( ntStatus);
2579 // Additional checks
2582 if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_FILE_FCB)
2586 // If the caller is asking for write access then try to flush the image section
2589 if( FlagOn( *pDesiredAccess, FILE_WRITE_DATA) ||
2590 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
2593 if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
2597 ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
2598 STATUS_SHARING_VIOLATION;
2600 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2601 AFS_TRACE_LEVEL_ERROR,
2602 "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
2604 &DirectoryCB->NameInformation.FileName,
2607 try_return( ntStatus);
2611 if( BooleanFlagOn( ulOptions, FILE_DIRECTORY_FILE))
2614 ntStatus = STATUS_NOT_A_DIRECTORY;
2616 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2617 AFS_TRACE_LEVEL_ERROR,
2618 "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
2620 &DirectoryCB->NameInformation.FileName,
2623 try_return( ntStatus);
2626 pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
2628 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB ||
2629 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2632 if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
2635 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
2637 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2638 AFS_TRACE_LEVEL_ERROR,
2639 "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
2641 &DirectoryCB->NameInformation.FileName,
2644 try_return( ntStatus);
2647 else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
2648 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
2649 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
2656 try_return( ntStatus = STATUS_UNSUCCESSFUL);
2660 // Check with the service that we can open the file
2663 stOpenCB.ParentId = pParentObjectInfo->FileId;
2665 stOpenCB.DesiredAccess = *pDesiredAccess;
2667 stOpenCB.ShareAccess = usShareAccess;
2669 stOpenResultCB.GrantedAccess = 0;
2671 ulResultLen = sizeof( AFSFileOpenResultCB);
2673 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_OPEN_FILE,
2674 AFS_REQUEST_FLAG_SYNCHRONOUS | AFS_REQUEST_FLAG_HOLD_FID,
2676 &DirectoryCB->NameInformation.FileName,
2677 &pObjectInfo->FileId,
2679 sizeof( AFSFileOpenCB),
2680 (void *)&stOpenResultCB,
2683 if( !NT_SUCCESS( ntStatus))
2686 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2687 AFS_TRACE_LEVEL_ERROR,
2688 "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
2690 &DirectoryCB->NameInformation.FileName,
2693 try_return( ntStatus);
2697 // Check if there is a conflict
2700 if( !AFSCheckAccess( *pDesiredAccess,
2701 stOpenResultCB.GrantedAccess,
2702 BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY)))
2705 ntStatus = STATUS_ACCESS_DENIED;
2707 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2708 AFS_TRACE_LEVEL_ERROR,
2709 "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
2712 stOpenResultCB.GrantedAccess,
2713 &DirectoryCB->NameInformation.FileName,
2716 try_return( ntStatus);
2720 // Initialize the Ccb for the file.
2723 ntStatus = AFSInitCcb( Ccb);
2725 if( !NT_SUCCESS( ntStatus))
2728 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2729 AFS_TRACE_LEVEL_ERROR,
2730 "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
2732 &DirectoryCB->NameInformation.FileName,
2735 try_return( ntStatus);
2738 bAllocatedCcb = TRUE;
2740 (*Ccb)->DirectoryCB = DirectoryCB;
2743 // Perform the access check on the target if this is a mount point or symlink
2746 if( pObjectInfo->Fcb->OpenHandleCount > 0)
2749 IoUpdateShareAccess( pFileObject,
2750 &pObjectInfo->Fcb->ShareAccess);
2759 IoSetShareAccess( *pDesiredAccess,
2762 &pObjectInfo->Fcb->ShareAccess);
2766 // Increment the open count on this Fcb
2769 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2771 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2772 AFS_TRACE_LEVEL_VERBOSE,
2773 "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
2775 pObjectInfo->Fcb->OpenReferenceCount);
2777 InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
2779 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2780 AFS_TRACE_LEVEL_VERBOSE,
2781 "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
2783 pObjectInfo->Fcb->OpenHandleCount);
2786 // Increment the open reference and handle on the parent node
2789 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2791 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2792 AFS_TRACE_LEVEL_VERBOSE,
2793 "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
2794 pObjectInfo->ParentObjectInformation,
2795 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2797 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2799 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2800 AFS_TRACE_LEVEL_VERBOSE,
2801 "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
2802 pObjectInfo->ParentObjectInformation,
2803 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2805 if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
2809 // Mark it for delete on close
2812 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2813 AFS_TRACE_LEVEL_VERBOSE,
2814 "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
2817 &DirectoryCB->NameInformation.FileName);
2819 SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2823 // Indicate the object is held
2826 SetFlag( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
2829 // Return the open result for this file
2832 Irp->IoStatus.Information = FILE_OPENED;
2834 *Fcb = pObjectInfo->Fcb;
2842 // Remove the reference we added initially
2845 InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
2847 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2848 AFS_TRACE_LEVEL_VERBOSE,
2849 "AFSProcessOpen Decrement count on Fcb %08lX Cnt %d\n",
2851 pObjectInfo->Fcb->OpenReferenceCount);
2853 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
2856 if( !NT_SUCCESS( ntStatus))
2862 AFSRemoveCcb( *Ccb);
2870 AFSRemoveFcb( pObjectInfo->Fcb);
2872 pObjectInfo->Fcb = NULL;
2883 AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
2885 IN AFSVolumeCB *VolumeCB,
2887 IN AFSDirectoryCB *ParentDirCB,
2888 IN AFSDirectoryCB *DirectoryCB,
2893 NTSTATUS ntStatus = STATUS_SUCCESS;
2894 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2895 PFILE_OBJECT pFileObject = NULL;
2896 LARGE_INTEGER liZero = {0,0};
2897 BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
2898 ULONG ulAttributes = 0;
2899 LARGE_INTEGER liTime;
2900 ULONG ulCreateDisposition = 0;
2901 BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
2902 PACCESS_MASK pDesiredAccess = NULL;
2903 USHORT usShareAccess;
2904 AFSObjectInfoCB *pParentObjectInfo = NULL;
2905 AFSObjectInfoCB *pObjectInfo = NULL;
2910 pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
2911 usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
2913 pFileObject = pIrpSp->FileObject;
2915 ulAttributes = pIrpSp->Parameters.Create.FileAttributes;
2917 ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
2919 if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
2922 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2923 AFS_TRACE_LEVEL_ERROR,
2924 "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
2926 &DirectoryCB->NameInformation.FileName);
2928 try_return( ntStatus = STATUS_ACCESS_DENIED);
2931 pParentObjectInfo = ParentDirCB->ObjectInformation;
2933 pObjectInfo = DirectoryCB->ObjectInformation;
2936 // Check if we should go and retrieve updated information for the node
2939 ntStatus = AFSValidateEntry( DirectoryCB,
2944 if( !NT_SUCCESS( ntStatus))
2947 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2948 AFS_TRACE_LEVEL_ERROR,
2949 "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
2951 &DirectoryCB->NameInformation.FileName,
2954 try_return( ntStatus);
2958 // Be sure we have an Fcb for the object block
2961 if( pObjectInfo->Fcb == NULL)
2964 ntStatus = AFSInitFcb( DirectoryCB,
2967 if( !NT_SUCCESS( ntStatus))
2970 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2971 AFS_TRACE_LEVEL_ERROR,
2972 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
2974 &DirectoryCB->NameInformation.FileName,
2977 try_return( ntStatus);
2980 bAllocatedFcb = TRUE;
2985 AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
2992 // Reference the Fcb so it won't go away while processing the request
2995 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
2997 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
2998 AFS_TRACE_LEVEL_VERBOSE,
2999 "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
3001 pObjectInfo->Fcb->OpenReferenceCount);
3004 // Check access on the entry
3007 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3010 ntStatus = IoCheckShareAccess( *pDesiredAccess,
3013 &pObjectInfo->Fcb->ShareAccess,
3016 if( !NT_SUCCESS( ntStatus))
3019 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3020 AFS_TRACE_LEVEL_ERROR,
3021 "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
3023 &DirectoryCB->NameInformation.FileName,
3026 try_return( ntStatus);
3031 // Before we actually truncate, check to see if the purge
3032 // is going to fail.
3035 if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3039 ntStatus = STATUS_USER_MAPPED_FILE;
3041 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3042 AFS_TRACE_LEVEL_ERROR,
3043 "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
3045 &DirectoryCB->NameInformation.FileName,
3048 try_return( ntStatus);
3052 // Initialize the Ccb for the file.
3055 ntStatus = AFSInitCcb( Ccb);
3057 if( !NT_SUCCESS( ntStatus))
3060 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3061 AFS_TRACE_LEVEL_ERROR,
3062 "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
3064 &DirectoryCB->NameInformation.FileName,
3067 try_return( ntStatus);
3070 bAllocatedCcb = TRUE;
3073 // Initialize the Ccb
3076 (*Ccb)->DirectoryCB = DirectoryCB;
3079 // Need to purge any data currently in the cache
3082 CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
3087 pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
3088 pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
3089 pObjectInfo->Fcb->Header.AllocationSize.QuadPart = 0;
3091 pObjectInfo->EndOfFile.QuadPart = 0;
3092 pObjectInfo->AllocationSize.QuadPart = 0;
3095 // Trim down the extents. We do this BEFORE telling the service
3096 // the file is truncated since there is a potential race between
3097 // a worker thread releasing extents and us trimming
3100 AFSTrimExtents( pObjectInfo->Fcb,
3101 &pObjectInfo->Fcb->Header.FileSize);
3103 KeQuerySystemTime( &pObjectInfo->ChangeTime);
3105 KeQuerySystemTime( &pObjectInfo->LastAccessTime);
3107 //KeQuerySystemTime( &pObjectInfo->CreationTime);
3109 KeQuerySystemTime( &pObjectInfo->LastWriteTime);
3111 ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
3115 if( !NT_SUCCESS( ntStatus))
3118 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3119 AFS_TRACE_LEVEL_ERROR,
3120 "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
3122 &DirectoryCB->NameInformation.FileName,
3125 try_return( ntStatus);
3128 AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
3131 bReleasePaging = TRUE;
3133 pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
3135 pFileObject->FsContext = (void *)pObjectInfo->Fcb;
3137 pFileObject->FsContext2 = (void *)*Ccb;
3140 // Set the update flag accordingly
3143 SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
3144 AFS_FCB_FLAG_UPDATE_CREATE_TIME |
3145 AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
3146 AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
3147 AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
3149 CcSetFileSizes( pFileObject,
3150 (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
3152 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3154 bReleasePaging = FALSE;
3156 ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
3158 if( ulCreateDisposition == FILE_SUPERSEDE)
3161 pObjectInfo->FileAttributes = ulAttributes;
3167 pObjectInfo->FileAttributes |= ulAttributes;
3171 // Save off the access for the open
3174 if( pObjectInfo->Fcb->OpenHandleCount > 0)
3177 IoUpdateShareAccess( pFileObject,
3178 &pObjectInfo->Fcb->ShareAccess);
3187 IoSetShareAccess( *pDesiredAccess,
3190 &pObjectInfo->Fcb->ShareAccess);
3194 // Return the correct action
3197 if( ulCreateDisposition == FILE_SUPERSEDE)
3200 Irp->IoStatus.Information = FILE_SUPERSEDED;
3205 Irp->IoStatus.Information = FILE_OVERWRITTEN;
3209 // Increment the open count on this Fcb.
3212 InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
3214 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3215 AFS_TRACE_LEVEL_VERBOSE,
3216 "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
3218 pObjectInfo->Fcb->OpenReferenceCount);
3220 InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
3222 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3223 AFS_TRACE_LEVEL_VERBOSE,
3224 "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
3226 pObjectInfo->Fcb->OpenHandleCount);
3229 // Increment the open reference and handle on the parent node
3232 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3234 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3235 AFS_TRACE_LEVEL_VERBOSE,
3236 "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
3237 pObjectInfo->ParentObjectInformation,
3238 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3240 InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3242 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3243 AFS_TRACE_LEVEL_VERBOSE,
3244 "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
3245 pObjectInfo->ParentObjectInformation,
3246 pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3248 *Fcb = pObjectInfo->Fcb;
3255 AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
3262 // Remove the reference we added above to prevent tear down
3265 InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
3267 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3268 AFS_TRACE_LEVEL_VERBOSE,
3269 "AFSProcessOverwriteSupersede Decrement count on Fcb %08lX Cnt %d\n",
3271 pObjectInfo->Fcb->OpenReferenceCount);
3273 AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
3276 if( !NT_SUCCESS( ntStatus))
3282 AFSRemoveCcb( *Ccb);
3290 AFSRemoveFcb( pObjectInfo->Fcb);
3292 pObjectInfo->Fcb = NULL;
3303 AFSControlDeviceCreate( IN PIRP Irp)
3306 NTSTATUS ntStatus = STATUS_SUCCESS;
3312 // For now, jsut let the open happen
3315 Irp->IoStatus.Information = FILE_OPENED;
3322 AFSOpenIOCtlFcb( IN PIRP Irp,
3324 IN AFSDirectoryCB *ParentDirCB,
3329 NTSTATUS ntStatus = STATUS_SUCCESS;
3330 PFILE_OBJECT pFileObject = NULL;
3331 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3332 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
3333 UNICODE_STRING uniFullFileName;
3334 AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
3336 AFSObjectInfoCB *pParentObjectInfo = NULL;
3341 pFileObject = pIrpSp->FileObject;
3343 pParentObjectInfo = ParentDirCB->ObjectInformation;
3346 // If we haven't initialized the PIOCtl DirectoryCB for this directory then do it now
3349 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB == NULL)
3352 ntStatus = AFSInitPIOCtlDirectoryCB( pParentObjectInfo);
3354 if( !NT_SUCCESS( ntStatus))
3357 try_return( ntStatus);
3361 if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
3365 // Allocate and initialize the Fcb for the file.
3368 ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
3371 if( !NT_SUCCESS( ntStatus))
3374 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3375 AFS_TRACE_LEVEL_ERROR,
3376 "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3380 try_return( ntStatus);
3383 bAllocatedFcb = TRUE;
3388 *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
3390 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3397 // Initialize the Ccb for the file.
3400 ntStatus = AFSInitCcb( Ccb);
3402 if( !NT_SUCCESS( ntStatus))
3405 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3406 AFS_TRACE_LEVEL_ERROR,
3407 "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3411 try_return( ntStatus);
3414 bAllocatedCcb = TRUE;
3420 (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
3423 // Set the PIOCtl index
3426 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3428 RtlZeroMemory( &stPIOCtlOpen,
3429 sizeof( AFSPIOCtlOpenCloseRequestCB));
3431 stPIOCtlOpen.RequestId = (*Ccb)->RequestID;
3433 stPIOCtlOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3435 RtlZeroMemory( &stFileID,
3436 sizeof( AFSFileID));
3439 // The parent directory FID of the node
3442 stFileID = pParentObjectInfo->FileId;
3445 // Issue the open request to the service
3448 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_OPEN,
3449 AFS_REQUEST_FLAG_SYNCHRONOUS,
3453 (void *)&stPIOCtlOpen,
3454 sizeof( AFSPIOCtlOpenCloseRequestCB),
3458 if( !NT_SUCCESS( ntStatus))
3461 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3462 AFS_TRACE_LEVEL_ERROR,
3463 "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
3467 try_return( ntStatus);
3471 // Reference the directory entry
3474 InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
3476 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3477 AFS_TRACE_LEVEL_VERBOSE,
3478 "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
3479 &(*Ccb)->DirectoryCB->NameInformation.FileName,
3480 (*Ccb)->DirectoryCB,
3482 (*Ccb)->DirectoryCB->OpenReferenceCount);
3485 // Increment the open reference and handle on the node
3488 InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3490 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3491 AFS_TRACE_LEVEL_VERBOSE,
3492 "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
3494 (*Fcb)->OpenReferenceCount);
3496 InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3498 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3499 AFS_TRACE_LEVEL_VERBOSE,
3500 "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
3502 (*Fcb)->OpenHandleCount);
3505 // Increment the open reference and handle on the parent node
3508 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3510 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3511 AFS_TRACE_LEVEL_VERBOSE,
3512 "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3514 pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3516 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3518 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3519 AFS_TRACE_LEVEL_VERBOSE,
3520 "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3522 pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3525 // Return the open result for this file
3528 Irp->IoStatus.Information = FILE_OPENED;
3533 //Dereference the passed in parent since the returned dir entry
3534 // is already referenced
3537 InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
3539 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3540 AFS_TRACE_LEVEL_VERBOSE,
3541 "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3542 &ParentDirCB->NameInformation.FileName,
3545 ParentDirCB->OpenReferenceCount);
3548 // If we created the Fcb we need to release the resources
3554 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3557 if( !NT_SUCCESS( ntStatus))
3563 AFSRemoveCcb( *Ccb);
3572 // Need to tear down this Fcb since it is not in the tree for the worker thread
3575 AFSRemoveFcb( *Fcb);
3577 pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
3590 AFSOpenSpecialShareFcb( IN PIRP Irp,
3592 IN AFSDirectoryCB *DirectoryCB,
3597 NTSTATUS ntStatus = STATUS_SUCCESS;
3598 PFILE_OBJECT pFileObject = NULL;
3599 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3600 BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
3601 AFSObjectInfoCB *pParentObjectInfo = NULL;
3602 AFSPipeOpenCloseRequestCB stPipeOpen;
3607 pFileObject = pIrpSp->FileObject;
3609 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3610 AFS_TRACE_LEVEL_VERBOSE_2,
3611 "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
3613 &DirectoryCB->NameInformation.FileName);
3615 pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
3617 if( DirectoryCB->ObjectInformation->Fcb == NULL)
3621 // Allocate and initialize the Fcb for the file.
3624 ntStatus = AFSInitFcb( DirectoryCB,
3627 if( !NT_SUCCESS( ntStatus))
3630 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3631 AFS_TRACE_LEVEL_ERROR,
3632 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
3636 try_return( ntStatus);
3639 bAllocateFcb = TRUE;
3644 *Fcb = DirectoryCB->ObjectInformation->Fcb;
3646 AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
3653 // Initialize the Ccb for the file.
3656 ntStatus = AFSInitCcb( Ccb);
3658 if( !NT_SUCCESS( ntStatus))
3661 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3662 AFS_TRACE_LEVEL_ERROR,
3663 "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
3667 try_return( ntStatus);
3670 bAllocatedCcb = TRUE;
3676 (*Ccb)->DirectoryCB = DirectoryCB;
3679 // Call the service to open the share
3682 (*Ccb)->RequestID = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.OpenRequestIndex);
3684 RtlZeroMemory( &stPipeOpen,
3685 sizeof( AFSPipeOpenCloseRequestCB));
3687 stPipeOpen.RequestId = (*Ccb)->RequestID;
3689 stPipeOpen.RootId = pParentObjectInfo->VolumeCB->ObjectInformation.FileId;
3692 // Issue the open request to the service
3695 ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_OPEN,
3696 AFS_REQUEST_FLAG_SYNCHRONOUS,
3698 &DirectoryCB->NameInformation.FileName,
3700 (void *)&stPipeOpen,
3701 sizeof( AFSPipeOpenCloseRequestCB),
3705 if( !NT_SUCCESS( ntStatus))
3708 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3709 AFS_TRACE_LEVEL_ERROR,
3710 "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
3714 try_return( ntStatus);
3718 // Increment the open count on this Fcb
3721 InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
3723 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3724 AFS_TRACE_LEVEL_VERBOSE,
3725 "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
3727 (*Fcb)->OpenReferenceCount);
3729 InterlockedIncrement( &(*Fcb)->OpenHandleCount);
3731 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3732 AFS_TRACE_LEVEL_VERBOSE,
3733 "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
3735 (*Fcb)->OpenHandleCount);
3738 // Increment the open reference and handle on the parent node
3741 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3743 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3744 AFS_TRACE_LEVEL_VERBOSE,
3745 "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
3747 pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
3749 InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3751 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
3752 AFS_TRACE_LEVEL_VERBOSE,
3753 "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
3755 pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
3758 // Return the open result for this file
3761 Irp->IoStatus.Information = FILE_OPENED;
3768 AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
3771 if( !NT_SUCCESS( ntStatus))
3777 AFSRemoveCcb( *Ccb);
3786 // Need to tear down this Fcb since it is not in the tree for the worker thread
3789 AFSRemoveFcb( *Fcb);
3791 DirectoryCB->ObjectInformation->Fcb = NULL;