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: AFSFileInfo.cpp
39 #include "AFSCommon.h"
42 // Function: AFSQueryFileInfo
46 // This function is the dispatch handler for the IRP_MJ_QUERY_FILE_INFORMATION request
50 // A status is returned for the function
54 AFSQueryFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
58 UNREFERENCED_PARAMETER(LibDeviceObject);
59 NTSTATUS ntStatus = STATUS_SUCCESS;
60 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
63 BOOLEAN bReleaseMain = FALSE;
65 FILE_INFORMATION_CLASS stFileInformationClass;
73 // Determine the type of request this request is
76 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
78 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
83 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
84 AFS_TRACE_LEVEL_ERROR,
85 "AFSQueryFileInfo Attempted access (%08lX) when pFcb == NULL\n",
88 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
91 lLength = (LONG)pIrpSp->Parameters.QueryFile.Length;
92 stFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
93 pBuffer = Irp->AssociatedIrp.SystemBuffer;
95 if ( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
98 RtlZeroMemory( &stAuthGroup,
101 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
102 (ULONGLONG)PsGetCurrentThreadId(),
105 ntStatus = AFSVerifyEntry( &stAuthGroup,
108 if ( NT_SUCCESS( ntStatus))
111 ClearFlag( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
116 ntStatus = STATUS_SUCCESS;
121 // Grab the main shared right off the bat
124 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
125 AFS_TRACE_LEVEL_VERBOSE,
126 "AFSQueryFileInfo Acquiring Fcb lock %08lX SHARED %08lX\n",
127 &pFcb->NPFcb->Resource,
128 PsGetCurrentThread());
130 AFSAcquireShared( &pFcb->NPFcb->Resource,
136 // Don't allow requests against IOCtl nodes
139 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
142 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
143 AFS_TRACE_LEVEL_VERBOSE,
144 "AFSQueryFileInfo Processing request against SpecialShare Fcb\n");
146 ntStatus = AFSProcessShareQueryInfo( Irp,
150 try_return( ntStatus);
152 else if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
154 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
155 AFS_TRACE_LEVEL_VERBOSE,
156 "AFSQueryFileInfo request against PIOCtl Fcb\n");
158 ntStatus = AFSProcessPIOCtlQueryInfo( Irp,
163 try_return( ntStatus);
166 else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
168 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
169 AFS_TRACE_LEVEL_VERBOSE,
170 "AFSQueryFileInfo request against Invalid Fcb\n");
172 try_return( ntStatus = STATUS_ACCESS_DENIED);
176 // Process the request
179 switch( stFileInformationClass)
182 case FileAllInformation:
185 PFILE_ALL_INFORMATION pAllInfo;
188 // For the all information class we'll typecast a local
189 // pointer to the output buffer and then call the
190 // individual routines to fill in the buffer.
193 pAllInfo = (PFILE_ALL_INFORMATION)pBuffer;
195 ntStatus = AFSQueryBasicInfo( Irp,
197 &pAllInfo->BasicInformation,
200 if( !NT_SUCCESS( ntStatus))
203 try_return( ntStatus);
206 ntStatus = AFSQueryStandardInfo( Irp,
208 &pAllInfo->StandardInformation,
211 if( !NT_SUCCESS( ntStatus))
214 try_return( ntStatus);
217 ntStatus = AFSQueryInternalInfo( Irp,
219 &pAllInfo->InternalInformation,
222 if( !NT_SUCCESS( ntStatus))
225 try_return( ntStatus);
228 ntStatus = AFSQueryEaInfo( Irp,
230 &pAllInfo->EaInformation,
233 if( !NT_SUCCESS( ntStatus))
236 try_return( ntStatus);
239 ntStatus = AFSQueryAccess( Irp,
241 &pAllInfo->AccessInformation,
244 if( !NT_SUCCESS( ntStatus))
247 try_return( ntStatus);
250 ntStatus = AFSQueryPositionInfo( Irp,
252 &pAllInfo->PositionInformation,
255 if( !NT_SUCCESS( ntStatus))
258 try_return( ntStatus);
261 ntStatus = AFSQueryMode( Irp,
263 &pAllInfo->ModeInformation,
266 if( !NT_SUCCESS( ntStatus))
269 try_return( ntStatus);
272 ntStatus = AFSQueryAlignment( Irp,
274 &pAllInfo->AlignmentInformation,
277 if( !NT_SUCCESS( ntStatus))
280 try_return( ntStatus);
283 ntStatus = AFSQueryNameInfo( Irp,
285 &pAllInfo->NameInformation,
288 if( !NT_SUCCESS( ntStatus))
291 try_return( ntStatus);
297 case FileBasicInformation:
300 ntStatus = AFSQueryBasicInfo( Irp,
302 (PFILE_BASIC_INFORMATION)pBuffer,
308 case FileStandardInformation:
311 ntStatus = AFSQueryStandardInfo( Irp,
313 (PFILE_STANDARD_INFORMATION)pBuffer,
319 case FileInternalInformation:
322 ntStatus = AFSQueryInternalInfo( Irp,
324 (PFILE_INTERNAL_INFORMATION)pBuffer,
330 case FileEaInformation:
333 ntStatus = AFSQueryEaInfo( Irp,
335 (PFILE_EA_INFORMATION)pBuffer,
341 case FilePositionInformation:
344 ntStatus = AFSQueryPositionInfo( Irp,
346 (PFILE_POSITION_INFORMATION)pBuffer,
352 case FileNormalizedNameInformation:
353 case FileNameInformation:
356 ntStatus = AFSQueryNameInfo( Irp,
358 (PFILE_NAME_INFORMATION)pBuffer,
364 case FileAlternateNameInformation:
367 ntStatus = AFSQueryShortNameInfo( Irp,
369 (PFILE_NAME_INFORMATION)pBuffer,
375 case FileNetworkOpenInformation:
378 ntStatus = AFSQueryNetworkInfo( Irp,
380 (PFILE_NETWORK_OPEN_INFORMATION)pBuffer,
386 case FileStreamInformation:
389 ntStatus = AFSQueryStreamInfo( Irp,
391 (FILE_STREAM_INFORMATION *)pBuffer,
398 case FileAttributeTagInformation:
401 ntStatus = AFSQueryAttribTagInfo( Irp,
403 (FILE_ATTRIBUTE_TAG_INFORMATION *)pBuffer,
409 case FileRemoteProtocolInformation:
412 ntStatus = AFSQueryRemoteProtocolInfo( Irp,
414 (FILE_REMOTE_PROTOCOL_INFORMATION *)pBuffer,
420 case FileNetworkPhysicalNameInformation:
423 ntStatus = AFSQueryPhysicalNameInfo( Irp,
425 (FILE_NETWORK_PHYSICAL_NAME_INFORMATION *)pBuffer,
433 ntStatus = STATUS_INVALID_PARAMETER;
440 Irp->IoStatus.Information = pIrpSp->Parameters.QueryFile.Length - lLength;
445 AFSReleaseResource( &pFcb->NPFcb->Resource);
448 if( !NT_SUCCESS( ntStatus) &&
449 ntStatus != STATUS_INVALID_PARAMETER &&
450 ntStatus != STATUS_BUFFER_OVERFLOW)
454 pCcb->DirectoryCB != NULL)
457 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
458 AFS_TRACE_LEVEL_ERROR,
459 "AFSQueryFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
460 &pCcb->DirectoryCB->NameInformation.FileName,
461 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
462 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
463 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
464 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
469 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
474 "EXCEPTION - AFSQueryFileInfo\n");
476 AFSDumpTraceFilesFnc();
478 ntStatus = STATUS_UNSUCCESSFUL;
483 AFSReleaseResource( &pFcb->NPFcb->Resource);
487 AFSCompleteRequest( Irp,
494 // Function: AFSSetFileInfo
498 // This function is the dispatch handler for the IRP_MJ_SET_FILE_INFORMATION request
502 // A status is returned for the function
506 AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
510 UNREFERENCED_PARAMETER(LibDeviceObject);
511 NTSTATUS ntStatus = STATUS_SUCCESS;
512 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
515 FILE_INFORMATION_CLASS FileInformationClass;
516 BOOLEAN bCanQueueRequest = FALSE;
517 PFILE_OBJECT pFileObject = NULL;
518 BOOLEAN bReleaseMain = FALSE;
519 BOOLEAN bUpdateFileInfo = FALSE;
520 AFSFileID stParentFileId;
525 pFileObject = pIrpSp->FileObject;
527 pFcb = (AFSFcb *)pFileObject->FsContext;
528 pCcb = (AFSCcb *)pFileObject->FsContext2;
533 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
534 AFS_TRACE_LEVEL_ERROR,
535 "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
538 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
541 bCanQueueRequest = !(IoIsOperationSynchronous( Irp) | (KeGetCurrentIrql() != PASSIVE_LEVEL));
542 FileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
548 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
549 AFS_TRACE_LEVEL_VERBOSE,
550 "AFSSetFileInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
551 &pFcb->NPFcb->Resource,
552 PsGetCurrentThread());
554 AFSAcquireExcl( &pFcb->NPFcb->Resource,
560 // Don't allow requests against IOCtl nodes
563 if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
566 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
567 AFS_TRACE_LEVEL_ERROR,
568 "AFSSetFileInfo Failing request against PIOCtl Fcb\n");
570 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
572 else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
575 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
576 AFS_TRACE_LEVEL_VERBOSE,
577 "AFSSetFileInfo Processing request against SpecialShare Fcb\n");
579 ntStatus = AFSProcessShareSetInfo( Irp,
583 try_return( ntStatus);
586 if( BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
589 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
590 AFS_TRACE_LEVEL_ERROR,
591 "AFSSetFileInfo Request failed due to read only volume\n",
594 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
597 if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
598 FileInformationClass != FileDispositionInformation)
600 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
601 AFS_TRACE_LEVEL_VERBOSE,
602 "AFSSetFileInfo request against Invalid Fcb\n");
604 try_return( ntStatus = STATUS_ACCESS_DENIED);
608 // Ensure rename operations are synchronous
611 if( FileInformationClass == FileRenameInformation)
614 bCanQueueRequest = FALSE;
618 // Store away the parent fid
621 RtlZeroMemory( &stParentFileId,
624 if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
626 stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
630 // Process the request
633 switch( FileInformationClass)
636 case FileBasicInformation:
639 bUpdateFileInfo = TRUE;
641 ntStatus = AFSSetBasicInfo( Irp,
647 case FileDispositionInformation:
650 ntStatus = AFSSetDispositionInfo( Irp,
656 case FileRenameInformation:
659 ntStatus = AFSSetRenameInfo( Irp);
664 case FilePositionInformation:
667 ntStatus = AFSSetPositionInfo( Irp,
673 case FileLinkInformation:
676 ntStatus = AFSSetFileLinkInfo( Irp);
681 case FileAllocationInformation:
684 ntStatus = AFSSetAllocationInfo( Irp,
690 case FileEndOfFileInformation:
693 ntStatus = AFSSetEndOfFileInfo( Irp,
701 ntStatus = STATUS_INVALID_PARAMETER;
711 AFSReleaseResource( &pFcb->NPFcb->Resource);
714 if( NT_SUCCESS( ntStatus) &&
718 ntStatus = AFSUpdateFileInformation( &stParentFileId,
719 pFcb->ObjectInformation,
722 if( !NT_SUCCESS( ntStatus))
725 AFSAcquireExcl( &pFcb->NPFcb->Resource,
729 // Unwind the update and fail the request
732 AFSUnwindFileInfo( pFcb,
735 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
736 AFS_TRACE_LEVEL_ERROR,
737 "AFSSetFileInfo Failed to send file info update to service request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
738 &pCcb->DirectoryCB->NameInformation.FileName,
739 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
740 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
741 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
742 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
745 AFSReleaseResource( &pFcb->NPFcb->Resource);
749 if( !NT_SUCCESS( ntStatus))
753 pCcb->DirectoryCB != NULL)
756 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
757 AFS_TRACE_LEVEL_ERROR,
758 "AFSSetFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
759 &pCcb->DirectoryCB->NameInformation.FileName,
760 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
761 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
762 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
763 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
768 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
773 "EXCEPTION - AFSSetFileInfo\n");
775 AFSDumpTraceFilesFnc();
777 ntStatus = STATUS_UNSUCCESSFUL;
782 AFSReleaseResource( &pFcb->NPFcb->Resource);
786 AFSCompleteRequest( Irp,
793 // Function: AFSQueryBasicInfo
797 // This function is the handler for the query basic information request
801 // A status is returned for the function
805 AFSQueryBasicInfo( IN PIRP Irp,
806 IN AFSDirectoryCB *DirectoryCB,
807 IN OUT PFILE_BASIC_INFORMATION Buffer,
810 NTSTATUS ntStatus = STATUS_SUCCESS;
811 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
812 ULONG ulFileAttribs = 0;
815 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
816 AFSFileInfoCB stFileInfo;
817 AFSDirectoryCB *pParentDirectoryCB = NULL;
818 UNICODE_STRING uniParentPath;
820 if( *Length >= sizeof( FILE_BASIC_INFORMATION))
823 RtlZeroMemory( Buffer,
826 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
828 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
829 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
831 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
834 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
836 AFSRetrieveParentPath( &pCcb->FullFileName,
839 RtlZeroMemory( &stFileInfo,
840 sizeof( AFSFileInfoCB));
843 // Can't hold the Fcb while evaluating the path, leads to lock inversion
846 AFSReleaseResource( &pFcb->NPFcb->Resource);
848 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
856 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
859 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
864 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
867 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
870 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
874 AFSAcquireShared( &pFcb->NPFcb->Resource,
879 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
880 AFS_TRACE_LEVEL_VERBOSE_2,
881 "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
882 &pCcb->DirectoryCB->NameInformation.FileName,
883 pCcb->DirectoryCB->ObjectInformation->FileType,
884 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
887 Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
888 Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
889 Buffer->LastWriteTime = DirectoryCB->ObjectInformation->LastWriteTime;
890 Buffer->ChangeTime = DirectoryCB->ObjectInformation->ChangeTime;
891 Buffer->FileAttributes = ulFileAttribs;
893 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
894 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
897 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
899 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
903 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
907 *Length -= sizeof( FILE_BASIC_INFORMATION);
912 ntStatus = STATUS_BUFFER_TOO_SMALL;
919 AFSQueryStandardInfo( IN PIRP Irp,
920 IN AFSDirectoryCB *DirectoryCB,
921 IN OUT PFILE_STANDARD_INFORMATION Buffer,
925 NTSTATUS ntStatus = STATUS_SUCCESS;
928 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
929 AFSFileInfoCB stFileInfo;
930 AFSDirectoryCB *pParentDirectoryCB = NULL;
931 UNICODE_STRING uniParentPath;
932 ULONG ulFileAttribs = 0;
934 if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
937 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
938 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
940 RtlZeroMemory( Buffer,
943 Buffer->NumberOfLinks = 1;
944 Buffer->DeletePending = BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
946 Buffer->AllocationSize.QuadPart = (ULONGLONG)((DirectoryCB->ObjectInformation->AllocationSize.QuadPart/PAGE_SIZE) + 1) * PAGE_SIZE;
948 Buffer->EndOfFile = DirectoryCB->ObjectInformation->EndOfFile;
950 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
952 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
955 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
957 AFSRetrieveParentPath( &pCcb->FullFileName,
960 RtlZeroMemory( &stFileInfo,
961 sizeof( AFSFileInfoCB));
964 // Can't hold the Fcb while evaluating the path, leads to lock inversion
967 AFSReleaseResource( &pFcb->NPFcb->Resource);
969 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
977 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
980 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
985 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
988 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
991 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
995 AFSAcquireShared( &pFcb->NPFcb->Resource,
999 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1000 AFS_TRACE_LEVEL_VERBOSE_2,
1001 "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1002 &pCcb->DirectoryCB->NameInformation.FileName,
1003 pCcb->DirectoryCB->ObjectInformation->FileType,
1004 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1007 Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
1009 *Length -= sizeof( FILE_STANDARD_INFORMATION);
1014 ntStatus = STATUS_BUFFER_TOO_SMALL;
1021 AFSQueryInternalInfo( IN PIRP Irp,
1023 IN OUT PFILE_INTERNAL_INFORMATION Buffer,
1024 IN OUT PLONG Length)
1027 UNREFERENCED_PARAMETER(Irp);
1028 NTSTATUS ntStatus = STATUS_SUCCESS;
1030 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
1033 Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Volume;
1035 Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Vnode;
1037 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
1042 ntStatus = STATUS_BUFFER_TOO_SMALL;
1049 AFSQueryEaInfo( IN PIRP Irp,
1050 IN AFSDirectoryCB *DirectoryCB,
1051 IN OUT PFILE_EA_INFORMATION Buffer,
1052 IN OUT PLONG Length)
1055 UNREFERENCED_PARAMETER(Irp);
1056 UNREFERENCED_PARAMETER(DirectoryCB);
1057 NTSTATUS ntStatus = STATUS_SUCCESS;
1059 RtlZeroMemory( Buffer,
1062 if( *Length >= sizeof( FILE_EA_INFORMATION))
1067 *Length -= sizeof( FILE_EA_INFORMATION);
1072 ntStatus = STATUS_BUFFER_TOO_SMALL;
1079 AFSQueryPositionInfo( IN PIRP Irp,
1081 IN OUT PFILE_POSITION_INFORMATION Buffer,
1082 IN OUT PLONG Length)
1085 UNREFERENCED_PARAMETER(Fcb);
1086 NTSTATUS ntStatus = STATUS_SUCCESS;
1087 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1089 if( *Length >= sizeof( FILE_POSITION_INFORMATION))
1092 RtlZeroMemory( Buffer,
1095 Buffer->CurrentByteOffset.QuadPart = pIrpSp->FileObject->CurrentByteOffset.QuadPart;
1097 *Length -= sizeof( FILE_POSITION_INFORMATION);
1102 ntStatus = STATUS_BUFFER_TOO_SMALL;
1109 AFSQueryAccess( IN PIRP Irp,
1111 IN OUT PFILE_ACCESS_INFORMATION Buffer,
1112 IN OUT PLONG Length)
1115 UNREFERENCED_PARAMETER(Irp);
1116 UNREFERENCED_PARAMETER(Fcb);
1117 NTSTATUS ntStatus = STATUS_SUCCESS;
1119 if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
1122 RtlZeroMemory( Buffer,
1125 Buffer->AccessFlags = 0;
1127 *Length -= sizeof( FILE_ACCESS_INFORMATION);
1132 ntStatus = STATUS_BUFFER_TOO_SMALL;
1139 AFSQueryMode( IN PIRP Irp,
1141 IN OUT PFILE_MODE_INFORMATION Buffer,
1142 IN OUT PLONG Length)
1145 UNREFERENCED_PARAMETER(Irp);
1146 UNREFERENCED_PARAMETER(Fcb);
1147 NTSTATUS ntStatus = STATUS_SUCCESS;
1149 if( *Length >= sizeof( FILE_MODE_INFORMATION))
1152 RtlZeroMemory( Buffer,
1157 *Length -= sizeof( FILE_MODE_INFORMATION);
1162 ntStatus = STATUS_BUFFER_TOO_SMALL;
1169 AFSQueryAlignment( IN PIRP Irp,
1171 IN OUT PFILE_ALIGNMENT_INFORMATION Buffer,
1172 IN OUT PLONG Length)
1175 UNREFERENCED_PARAMETER(Irp);
1176 UNREFERENCED_PARAMETER(Fcb);
1177 NTSTATUS ntStatus = STATUS_SUCCESS;
1179 if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
1182 RtlZeroMemory( Buffer,
1185 Buffer->AlignmentRequirement = 1;
1187 *Length -= sizeof( FILE_ALIGNMENT_INFORMATION);
1192 ntStatus = STATUS_BUFFER_TOO_SMALL;
1199 AFSQueryNameInfo( IN PIRP Irp,
1200 IN AFSDirectoryCB *DirectoryCB,
1201 IN OUT PFILE_NAME_INFORMATION Buffer,
1202 IN OUT PLONG Length)
1205 UNREFERENCED_PARAMETER(DirectoryCB);
1206 NTSTATUS ntStatus = STATUS_SUCCESS;
1207 ULONG ulCopyLength = 0;
1208 ULONG cchCopied = 0;
1209 AFSFcb *pFcb = NULL;
1210 AFSCcb *pCcb = NULL;
1211 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1212 BOOLEAN bAddLeadingSlash = FALSE;
1213 BOOLEAN bAddTrailingSlash = FALSE;
1214 USHORT usFullNameLength = 0;
1216 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1218 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1220 if( *Length >= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1223 RtlZeroMemory( Buffer,
1226 if( pCcb->FullFileName.Length == 0 ||
1227 pCcb->FullFileName.Buffer[ 0] != L'\\')
1229 bAddLeadingSlash = TRUE;
1232 if( pFcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY &&
1233 pCcb->FullFileName.Length > 0 &&
1234 pCcb->FullFileName.Buffer[ (pCcb->FullFileName.Length/sizeof( WCHAR)) - 1] != L'\\')
1236 bAddTrailingSlash = TRUE;
1239 usFullNameLength = sizeof( WCHAR) +
1240 AFSServerName.Length +
1241 pCcb->FullFileName.Length;
1243 if( bAddLeadingSlash)
1245 usFullNameLength += sizeof( WCHAR);
1248 if( bAddTrailingSlash)
1250 usFullNameLength += sizeof( WCHAR);
1253 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1256 ulCopyLength = (LONG)usFullNameLength;
1261 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1263 ntStatus = STATUS_BUFFER_OVERFLOW;
1266 Buffer->FileNameLength = (ULONG)usFullNameLength;
1268 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1270 if( ulCopyLength > 0)
1273 Buffer->FileName[ 0] = L'\\';
1274 ulCopyLength -= sizeof( WCHAR);
1276 *Length -= sizeof( WCHAR);
1279 if( ulCopyLength >= AFSServerName.Length)
1282 RtlCopyMemory( &Buffer->FileName[ 1],
1283 AFSServerName.Buffer,
1284 AFSServerName.Length);
1286 ulCopyLength -= AFSServerName.Length;
1287 *Length -= AFSServerName.Length;
1288 cchCopied += AFSServerName.Length/sizeof( WCHAR);
1290 if ( ulCopyLength > 0 &&
1294 Buffer->FileName[ cchCopied] = L'\\';
1296 ulCopyLength -= sizeof( WCHAR);
1297 *Length -= sizeof( WCHAR);
1301 if( ulCopyLength >= pCcb->FullFileName.Length)
1304 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1305 pCcb->FullFileName.Buffer,
1306 pCcb->FullFileName.Length);
1308 ulCopyLength -= pCcb->FullFileName.Length;
1309 *Length -= pCcb->FullFileName.Length;
1310 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1312 if( ulCopyLength > 0 &&
1315 Buffer->FileName[ cchCopied] = L'\\';
1317 *Length -= sizeof( WCHAR);
1323 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1324 pCcb->FullFileName.Buffer,
1327 *Length -= ulCopyLength;
1335 ntStatus = STATUS_BUFFER_TOO_SMALL;
1342 AFSQueryShortNameInfo( IN PIRP Irp,
1343 IN AFSDirectoryCB *DirectoryCB,
1344 IN OUT PFILE_NAME_INFORMATION Buffer,
1345 IN OUT PLONG Length)
1348 UNREFERENCED_PARAMETER(Irp);
1349 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1350 ULONG ulCopyLength = 0;
1352 RtlZeroMemory( Buffer,
1355 if( DirectoryCB->NameInformation.ShortNameLength == 0)
1359 // The short name IS the long name
1362 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1365 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1368 ulCopyLength = (LONG)DirectoryCB->NameInformation.FileName.Length;
1370 ntStatus = STATUS_SUCCESS;
1375 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1377 ntStatus = STATUS_BUFFER_OVERFLOW;
1380 Buffer->FileNameLength = DirectoryCB->NameInformation.FileName.Length;
1382 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1384 if( ulCopyLength > 0)
1387 RtlCopyMemory( Buffer->FileName,
1388 DirectoryCB->NameInformation.FileName.Buffer,
1391 *Length -= ulCopyLength;
1398 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1401 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1404 ulCopyLength = (LONG)DirectoryCB->NameInformation.ShortNameLength;
1406 ntStatus = STATUS_SUCCESS;
1411 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1413 ntStatus = STATUS_BUFFER_OVERFLOW;
1416 Buffer->FileNameLength = DirectoryCB->NameInformation.ShortNameLength;
1418 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1420 if( ulCopyLength > 0)
1423 RtlCopyMemory( Buffer->FileName,
1424 DirectoryCB->NameInformation.ShortName,
1425 Buffer->FileNameLength);
1427 *Length -= ulCopyLength;
1436 AFSQueryNetworkInfo( IN PIRP Irp,
1437 IN AFSDirectoryCB *DirectoryCB,
1438 IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
1439 IN OUT PLONG Length)
1442 NTSTATUS ntStatus = STATUS_SUCCESS;
1443 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1444 AFSFcb *pFcb = NULL;
1445 AFSCcb *pCcb = NULL;
1446 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1447 AFSFileInfoCB stFileInfo;
1448 AFSDirectoryCB *pParentDirectoryCB = NULL;
1449 UNICODE_STRING uniParentPath;
1450 ULONG ulFileAttribs = 0;
1452 RtlZeroMemory( Buffer,
1455 if( *Length >= sizeof( FILE_NETWORK_OPEN_INFORMATION))
1458 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1460 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1461 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1463 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1466 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1468 AFSRetrieveParentPath( &pCcb->FullFileName,
1471 RtlZeroMemory( &stFileInfo,
1472 sizeof( AFSFileInfoCB));
1475 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1478 AFSReleaseResource( &pFcb->NPFcb->Resource);
1480 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1488 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
1491 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
1496 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1499 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1502 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
1506 AFSAcquireShared( &pFcb->NPFcb->Resource,
1510 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1511 AFS_TRACE_LEVEL_VERBOSE_2,
1512 "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1513 &pCcb->DirectoryCB->NameInformation.FileName,
1514 pCcb->DirectoryCB->ObjectInformation->FileType,
1515 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1518 Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1519 Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1520 Buffer->LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1521 Buffer->ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1523 Buffer->AllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1524 Buffer->EndOfFile.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1526 Buffer->FileAttributes = ulFileAttribs;
1528 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1529 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1532 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1535 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1540 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1544 *Length -= sizeof( FILE_NETWORK_OPEN_INFORMATION);
1549 ntStatus = STATUS_BUFFER_TOO_SMALL;
1556 AFSQueryStreamInfo( IN PIRP Irp,
1557 IN AFSDirectoryCB *DirectoryCB,
1558 IN OUT FILE_STREAM_INFORMATION *Buffer,
1559 IN OUT PLONG Length)
1562 UNREFERENCED_PARAMETER(Irp);
1563 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1564 ULONG ulCopyLength = 0;
1566 if( *Length >= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName))
1569 RtlZeroMemory( Buffer,
1572 Buffer->NextEntryOffset = 0;
1575 if( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1578 if( *Length >= (LONG)(FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName) + 14)) // ::$DATA
1583 ntStatus = STATUS_SUCCESS;
1588 ulCopyLength = *Length - FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1590 ntStatus = STATUS_BUFFER_OVERFLOW;
1593 Buffer->StreamNameLength = 14; // ::$DATA
1595 Buffer->StreamSize.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1597 Buffer->StreamAllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1599 *Length -= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1601 if( ulCopyLength > 0)
1604 RtlCopyMemory( Buffer->StreamName,
1608 *Length -= ulCopyLength;
1614 Buffer->StreamNameLength = 0; // No stream for a directory
1616 // The response size is zero
1618 ntStatus = STATUS_SUCCESS;
1626 AFSQueryAttribTagInfo( IN PIRP Irp,
1627 IN AFSDirectoryCB *DirectoryCB,
1628 IN OUT FILE_ATTRIBUTE_TAG_INFORMATION *Buffer,
1629 IN OUT PLONG Length)
1632 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1633 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1634 AFSFcb *pFcb = NULL;
1635 AFSCcb *pCcb = NULL;
1636 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1637 AFSFileInfoCB stFileInfo;
1638 AFSDirectoryCB *pParentDirectoryCB = NULL;
1639 UNICODE_STRING uniParentPath;
1640 ULONG ulFileAttribs = 0;
1642 if( *Length >= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION))
1645 RtlZeroMemory( Buffer,
1648 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1650 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1651 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1653 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1656 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1658 AFSRetrieveParentPath( &pCcb->FullFileName,
1661 RtlZeroMemory( &stFileInfo,
1662 sizeof( AFSFileInfoCB));
1665 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1668 AFSReleaseResource( &pFcb->NPFcb->Resource);
1670 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1678 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
1681 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
1686 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1689 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1692 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
1696 AFSAcquireShared( &pFcb->NPFcb->Resource,
1700 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1701 AFS_TRACE_LEVEL_VERBOSE_2,
1702 "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1703 &pCcb->DirectoryCB->NameInformation.FileName,
1704 pCcb->DirectoryCB->ObjectInformation->FileType,
1705 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1708 Buffer->FileAttributes = ulFileAttribs;
1710 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1711 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1714 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1717 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1722 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1726 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
1728 Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
1731 *Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
1733 ntStatus = STATUS_SUCCESS;
1740 AFSQueryRemoteProtocolInfo( IN PIRP Irp,
1741 IN AFSDirectoryCB *DirectoryCB,
1742 IN OUT FILE_REMOTE_PROTOCOL_INFORMATION *Buffer,
1743 IN OUT PLONG Length)
1746 UNREFERENCED_PARAMETER(Irp);
1747 UNREFERENCED_PARAMETER(DirectoryCB);
1748 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1750 if( *Length >= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION))
1753 RtlZeroMemory( Buffer,
1756 Buffer->StructureVersion = 1;
1758 Buffer->StructureSize = sizeof(FILE_REMOTE_PROTOCOL_INFORMATION);
1760 Buffer->Protocol = WNNC_NET_OPENAFS;
1762 Buffer->ProtocolMajorVersion = 3;
1764 Buffer->ProtocolMinorVersion = 0;
1766 Buffer->ProtocolRevision = 0;
1768 *Length -= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION);
1770 ntStatus = STATUS_SUCCESS;
1777 AFSQueryPhysicalNameInfo( IN PIRP Irp,
1778 IN AFSDirectoryCB *DirectoryCB,
1779 IN OUT PFILE_NETWORK_PHYSICAL_NAME_INFORMATION Buffer,
1780 IN OUT PLONG Length)
1783 UNREFERENCED_PARAMETER(DirectoryCB);
1784 NTSTATUS ntStatus = STATUS_SUCCESS;
1785 ULONG ulCopyLength = 0;
1786 ULONG cchCopied = 0;
1787 AFSFcb *pFcb = NULL;
1788 AFSCcb *pCcb = NULL;
1789 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1790 BOOLEAN bAddLeadingSlash = FALSE;
1791 USHORT usFullNameLength = 0;
1793 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1795 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1797 if( *Length >= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName))
1800 RtlZeroMemory( Buffer,
1803 if( pCcb->FullFileName.Length == 0 ||
1804 pCcb->FullFileName.Buffer[ 0] != L'\\')
1806 bAddLeadingSlash = TRUE;
1809 usFullNameLength = pCcb->FullFileName.Length;
1811 if( bAddLeadingSlash)
1813 usFullNameLength += sizeof( WCHAR);
1816 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1818 ulCopyLength = (LONG)usFullNameLength;
1823 ulCopyLength = *Length - FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1825 ntStatus = STATUS_BUFFER_OVERFLOW;
1828 Buffer->FileNameLength = (ULONG)usFullNameLength;
1830 *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1832 if( ulCopyLength > 0)
1835 if( bAddLeadingSlash)
1838 Buffer->FileName[ cchCopied] = L'\\';
1840 ulCopyLength -= sizeof( WCHAR);
1841 *Length -= sizeof( WCHAR);
1845 if( ulCopyLength >= pCcb->FullFileName.Length)
1848 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1849 pCcb->FullFileName.Buffer,
1850 pCcb->FullFileName.Length);
1852 ulCopyLength -= pCcb->FullFileName.Length;
1853 *Length -= pCcb->FullFileName.Length;
1854 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1859 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1860 pCcb->FullFileName.Buffer,
1863 *Length -= ulCopyLength;
1870 ntStatus = STATUS_BUFFER_TOO_SMALL;
1877 AFSSetBasicInfo( IN PIRP Irp,
1878 IN AFSDirectoryCB *DirectoryCB)
1880 NTSTATUS ntStatus = STATUS_SUCCESS;
1881 PFILE_BASIC_INFORMATION pBuffer;
1882 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1883 ULONG ulNotifyFilter = 0;
1884 AFSCcb *pCcb = NULL;
1889 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1891 pBuffer = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
1893 pCcb->FileUnwindInfo.FileAttributes = (ULONG)-1;
1895 if( pBuffer->FileAttributes != (ULONGLONG)0)
1898 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_FILE_FCB &&
1899 BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1902 try_return( ntStatus = STATUS_INVALID_PARAMETER);
1905 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1908 pBuffer->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1911 pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
1913 DirectoryCB->ObjectInformation->FileAttributes = pBuffer->FileAttributes;
1915 ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
1917 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
1920 pCcb->FileUnwindInfo.CreationTime.QuadPart = (ULONGLONG)-1;
1922 if( pBuffer->CreationTime.QuadPart != (ULONGLONG)-1 &&
1923 pBuffer->CreationTime.QuadPart != (ULONGLONG)0)
1926 pCcb->FileUnwindInfo.CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1928 DirectoryCB->ObjectInformation->CreationTime.QuadPart = pBuffer->CreationTime.QuadPart;
1930 ulNotifyFilter |= FILE_NOTIFY_CHANGE_CREATION;
1932 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CREATE_TIME);
1935 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = (ULONGLONG)-1;
1937 if( pBuffer->LastAccessTime.QuadPart != (ULONGLONG)-1 &&
1938 pBuffer->LastAccessTime.QuadPart != (ULONGLONG)0)
1941 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1943 DirectoryCB->ObjectInformation->LastAccessTime.QuadPart = pBuffer->LastAccessTime.QuadPart;
1945 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1947 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_ACCESS_TIME);
1950 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = (ULONGLONG)-1;
1952 if( pBuffer->LastWriteTime.QuadPart != (ULONGLONG)-1 &&
1953 pBuffer->LastWriteTime.QuadPart != (ULONGLONG)0)
1956 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1958 DirectoryCB->ObjectInformation->LastWriteTime.QuadPart = pBuffer->LastWriteTime.QuadPart;
1960 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
1962 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
1965 pCcb->FileUnwindInfo.ChangeTime.QuadPart = (ULONGLONG)-1;
1967 if( pBuffer->ChangeTime.QuadPart != (ULONGLONG)-1 &&
1968 pBuffer->ChangeTime.QuadPart != (ULONGLONG)0)
1971 pCcb->FileUnwindInfo.ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1973 DirectoryCB->ObjectInformation->ChangeTime.QuadPart = pBuffer->ChangeTime.QuadPart;
1975 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1977 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
1980 if( ulNotifyFilter > 0)
1983 if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
1986 AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
1988 (ULONG)ulNotifyFilter,
1989 (ULONG)FILE_ACTION_MODIFIED);
2002 AFSSetDispositionInfo( IN PIRP Irp,
2003 IN AFSDirectoryCB *DirectoryCB)
2005 NTSTATUS ntStatus = STATUS_SUCCESS;
2006 PFILE_DISPOSITION_INFORMATION pBuffer;
2007 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2008 AFSFcb *pFcb = NULL;
2009 AFSCcb *pCcb = NULL;
2014 pBuffer = (PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2016 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
2018 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
2021 // Can't delete the root
2024 if( pFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2027 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2028 AFS_TRACE_LEVEL_ERROR,
2029 "AFSSetDispositionInfo Attempt to delete root entry\n");
2031 try_return( ntStatus = STATUS_CANNOT_DELETE);
2035 // If the file is read only then do not allow the delete
2038 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_READONLY))
2041 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2042 AFS_TRACE_LEVEL_ERROR,
2043 "AFSSetDispositionInfo Attempt to delete read only entry %wZ\n",
2044 &DirectoryCB->NameInformation.FileName);
2046 try_return( ntStatus = STATUS_CANNOT_DELETE);
2049 if( pBuffer->DeleteFile)
2053 // Check if the caller can delete the file
2056 ntStatus = AFSNotifyDelete( DirectoryCB,
2060 if( !NT_SUCCESS( ntStatus))
2063 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2064 AFS_TRACE_LEVEL_ERROR,
2065 "AFSSetDispositionInfo Cannot delete entry %wZ Status %08lX\n",
2066 &DirectoryCB->NameInformation.FileName,
2069 try_return( ntStatus);
2072 if( pFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2076 // Reduce the Link count in the object information block
2077 // to correspond with the deletion of the directory entry.
2080 pFcb->ObjectInformation->Links--;
2083 // Check if this is a directory that there are not currently other opens
2086 if( pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2089 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2090 AFS_TRACE_LEVEL_ERROR,
2091 "AFSSetDispositionInfo Attempt to delete directory %wZ with open %u handles\n",
2092 &DirectoryCB->NameInformation.FileName,
2093 pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount);
2095 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
2098 if( !AFSIsDirectoryEmptyForDelete( pFcb))
2101 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2102 AFS_TRACE_LEVEL_ERROR,
2103 "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
2104 &DirectoryCB->NameInformation.FileName);
2106 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
2109 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2110 AFS_TRACE_LEVEL_VERBOSE,
2111 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2113 &DirectoryCB->NameInformation.FileName);
2115 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2117 else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
2121 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2122 AFS_TRACE_LEVEL_VERBOSE,
2123 "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
2124 &pFcb->NPFcb->SectionObjectResource,
2125 PsGetCurrentThread());
2127 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
2131 // Attempt to flush any outstanding data
2134 bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
2141 // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
2142 // deadlock with Trend Micro's Enterprise anti-virus product
2143 // which attempts to open the file which is being deleted.
2146 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2147 AFS_TRACE_LEVEL_VERBOSE,
2148 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2150 &DirectoryCB->NameInformation.FileName);
2152 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2155 // Purge the cache as well
2158 if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
2161 if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
2167 SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
2172 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2173 AFS_TRACE_LEVEL_VERBOSE,
2174 "AFSSetDispositionInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
2175 &pFcb->NPFcb->SectionObjectResource,
2176 PsGetCurrentThread());
2178 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
2183 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2184 AFS_TRACE_LEVEL_ERROR,
2185 "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
2186 &DirectoryCB->NameInformation.FileName);
2188 try_return( ntStatus = STATUS_CANNOT_DELETE);
2195 ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2199 // OK, should be good to go, set the flag in the file object
2202 pIrpSp->FileObject->DeletePending = pBuffer->DeleteFile;
2213 AFSSetFileLinkInfo( IN PIRP Irp)
2216 NTSTATUS ntStatus = STATUS_SUCCESS;
2217 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
2218 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2219 PFILE_LINK_INFORMATION pFileLinkInfo = NULL;
2220 PFILE_OBJECT pSrcFileObj = NULL;
2221 PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
2222 AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL;
2223 AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
2224 AFSObjectInfoCB *pSrcObject = NULL;
2225 AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
2226 UNICODE_STRING uniSourceName, uniTargetName;
2227 UNICODE_STRING uniFullTargetName, uniTargetParentName;
2228 BOOLEAN bCommonParent = FALSE;
2229 AFSDirectoryCB *pTargetDirEntry = NULL;
2230 AFSDirectoryCB *pNewTargetDirEntry = NULL;
2232 BOOLEAN bTargetEntryExists = FALSE;
2234 BOOLEAN bReleaseTargetDirLock = FALSE;
2235 ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
2240 pSrcFileObj = pIrpSp->FileObject;
2242 pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
2243 pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
2245 pSrcObject = pSrcFcb->ObjectInformation;
2246 pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
2248 pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2251 // Perform some basic checks to ensure FS integrity
2254 if( pSrcFcb->Header.NodeTypeCode != AFS_FILE_FCB)
2257 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2258 AFS_TRACE_LEVEL_ERROR,
2259 "AFSSetFileLinkInfo Attempt to non-file (INVALID_PARAMETER)\n");
2261 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2264 if( pTargetFileObj == NULL)
2267 if ( pFileLinkInfo->RootDirectory)
2271 // The target directory is provided by HANDLE
2272 // RootDirectory is only set when the target directory is not the same
2273 // as the source directory.
2275 // AFS only supports hard links within a single directory.
2277 // The IOManager should translate any Handle to a FileObject for us.
2278 // However, the failure to receive a FileObject is treated as a fatal
2282 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2283 AFS_TRACE_LEVEL_ERROR,
2284 "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory by handle INVALID_PARAMETER\n",
2285 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2287 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2292 uniFullTargetName.Length = (USHORT)pFileLinkInfo->FileNameLength;
2294 uniFullTargetName.Buffer = (PWSTR)&pFileLinkInfo->FileName;
2296 AFSRetrieveFinalComponent( &uniFullTargetName,
2299 AFSRetrieveParentPath( &uniFullTargetName,
2300 &uniTargetParentName);
2302 if ( uniTargetParentName.Length == 0)
2306 // This is a simple rename. Here the target directory is the same as the source parent directory
2307 // and the name is retrieved from the system buffer information
2310 pTargetParentObject = pSrcParentObject;
2315 // uniTargetParentName contains the directory the renamed object
2316 // will be moved to. Must obtain the TargetParentObject.
2319 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2320 AFS_TRACE_LEVEL_ERROR,
2321 "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory %wZ (NOT_SAME_DEVICE)\n",
2322 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2323 &uniFullTargetName);
2325 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2329 pTargetDcb = pTargetParentObject->Fcb;
2335 // So here we have the target directory taken from the targetfile object
2338 pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
2340 pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
2342 pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
2345 // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
2346 // it is only the target component of the rename operation
2349 uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
2353 // The quick check to see if they are self linking.
2354 // Do the names match? Only do this where the parent directories are
2358 if( pTargetParentObject == pSrcParentObject)
2361 if( FsRtlAreNamesEqual( &uniTargetName,
2366 try_return( ntStatus = STATUS_SUCCESS);
2369 bCommonParent = TRUE;
2375 // We do not allow cross-volume hard links
2378 if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
2381 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2382 AFS_TRACE_LEVEL_ERROR,
2383 "AFSSetFileLinkInfo Attempt to link to different volume %wZ\n",
2384 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2386 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2390 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2393 AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2396 bReleaseTargetDirLock = TRUE;
2398 AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
2402 if( pTargetDirEntry == NULL)
2406 // Missed so perform a case insensitive lookup
2409 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2412 AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
2417 if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
2418 pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
2423 // Try the short name
2425 AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
2431 // Increment our ref count on the dir entry
2434 if( pTargetDirEntry != NULL)
2437 ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
2439 lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
2441 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2442 AFS_TRACE_LEVEL_VERBOSE,
2443 "AFSSetFileLinkInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
2444 &pTargetDirEntry->NameInformation.FileName,
2449 ASSERT( lCount >= 0);
2451 if( !pFileLinkInfo->ReplaceIfExists)
2454 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2455 AFS_TRACE_LEVEL_ERROR,
2456 "AFSSetFileLinkInfo Attempt to link with target collision %wZ Target %wZ\n",
2457 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2458 &pTargetDirEntry->NameInformation.FileName);
2460 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
2463 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2464 AFS_TRACE_LEVEL_ERROR,
2465 "AFSSetFileLinkInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
2466 &pTargetDirEntry->NameInformation.FileName,
2468 pTargetDirEntry->DirOpenReferenceCount);
2471 // Pull the directory entry from the parent
2474 AFSRemoveDirNodeFromParent( pTargetParentObject,
2478 bTargetEntryExists = TRUE;
2482 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2483 AFS_TRACE_LEVEL_VERBOSE,
2484 "AFSSetFileLinkInfo Target does NOT exist, normal linking\n");
2488 // OK, this is a simple rename. Issue the rename
2489 // request to the service.
2492 ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
2493 &pSrcCcb->AuthGroup,
2494 pSrcFcb->ObjectInformation->ParentObjectInformation,
2495 pTargetDcb->ObjectInformation,
2496 pSrcCcb->DirectoryCB,
2498 pFileLinkInfo->ReplaceIfExists,
2499 &pNewTargetDirEntry);
2501 if( !NT_SUCCESS( ntStatus))
2504 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2505 AFS_TRACE_LEVEL_ERROR,
2506 "AFSSetFileLinkInfo Failed link of %wZ to target %wZ Status %08lX\n",
2507 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2511 try_return( ntStatus);
2514 AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
2519 // Send notification for the target link file
2522 if( bTargetEntryExists || pNewTargetDirEntry)
2525 ulNotificationAction = FILE_ACTION_MODIFIED;
2530 ulNotificationAction = FILE_ACTION_ADDED;
2533 AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
2535 (ULONG)ulNotifyFilter,
2536 (ULONG)ulNotificationAction);
2540 if( !NT_SUCCESS( ntStatus))
2543 if( bTargetEntryExists)
2546 AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
2552 if( pTargetDirEntry != NULL)
2555 lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
2557 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2558 AFS_TRACE_LEVEL_VERBOSE,
2559 "AFSSetFileLinkInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
2560 &pTargetDirEntry->NameInformation.FileName,
2565 ASSERT( lCount >= 0);
2568 if( bReleaseTargetDirLock)
2571 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
2579 AFSSetRenameInfo( IN PIRP Irp)
2582 NTSTATUS ntStatus = STATUS_SUCCESS;
2583 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
2584 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2585 AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
2586 AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
2587 PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject;
2588 PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
2589 PFILE_OBJECT pTargetParentFileObj = NULL;
2590 PFILE_RENAME_INFORMATION pRenameInfo = NULL;
2591 UNICODE_STRING uniTargetName, uniSourceName, uniTargetParentName;
2592 BOOLEAN bReplaceIfExists = FALSE;
2593 UNICODE_STRING uniShortName;
2594 AFSDirectoryCB *pTargetDirEntry = NULL;
2595 ULONG ulTargetCRC = 0;
2596 BOOLEAN bTargetEntryExists = FALSE;
2597 AFSObjectInfoCB *pSrcObject = NULL;
2598 AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
2600 ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
2601 UNICODE_STRING uniFullTargetName;
2602 BOOLEAN bCommonParent = FALSE;
2603 BOOLEAN bReleaseTargetDirLock = FALSE;
2604 BOOLEAN bReleaseSourceDirLock = FALSE;
2605 BOOLEAN bDereferenceTargetParentObject = FALSE;
2606 PERESOURCE pSourceDirLock = NULL;
2612 bReplaceIfExists = pIrpSp->Parameters.SetFile.ReplaceIfExists;
2614 pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2616 pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
2617 pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
2619 pSrcObject = pSrcFcb->ObjectInformation;
2620 pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
2623 // Perform some basic checks to ensure FS integrity
2626 if( pSrcFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2630 // Can't rename the root directory
2633 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2634 AFS_TRACE_LEVEL_ERROR,
2635 "AFSSetRenameInfo Attempt to rename root entry\n");
2637 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2640 if( pSrcFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2644 // If there are any open children then fail the rename
2647 if( pSrcFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2650 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2651 AFS_TRACE_LEVEL_ERROR,
2652 "AFSSetRenameInfo Attempt to rename directory with open children %wZ\n",
2653 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2655 try_return( ntStatus = STATUS_ACCESS_DENIED);
2661 // Extract off the final component name from the Fcb
2664 uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
2665 uniSourceName.MaximumLength = uniSourceName.Length;
2667 uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
2670 // Resolve the target fileobject
2673 if( pTargetFileObj == NULL)
2676 if ( pRenameInfo->RootDirectory)
2679 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2680 AFS_TRACE_LEVEL_ERROR,
2681 "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n");
2683 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2688 uniFullTargetName.Length = (USHORT)pRenameInfo->FileNameLength;
2690 uniFullTargetName.Buffer = (PWSTR)&pRenameInfo->FileName;
2692 AFSRetrieveFinalComponent( &uniFullTargetName,
2695 AFSRetrieveParentPath( &uniFullTargetName,
2696 &uniTargetParentName);
2698 if ( uniTargetParentName.Length == 0)
2702 // This is a simple rename. Here the target directory is the same as the source parent directory
2703 // and the name is retrieved from the system buffer information
2706 pTargetParentObject = pSrcParentObject;
2711 // uniTargetParentName contains the directory the renamed object
2712 // will be moved to. Must obtain the TargetParentObject.
2715 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2716 AFS_TRACE_LEVEL_ERROR,
2717 "AFSSetRenameInfo Attempt to move %wZ to %wZ -- not yet supported (NOT_SAME_DEVICE)\n",
2718 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2719 &uniFullTargetName);
2721 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2725 pTargetDcb = pTargetParentObject->Fcb;
2731 // So here we have the target directory taken from the targetfile object
2734 pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
2736 pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
2738 pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
2741 // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
2742 // it is only the target component of the rename operation
2745 uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
2749 // The quick check to see if they are not really performing a rename
2750 // Do the names match? Only do this where the parent directories are
2754 if( pTargetParentObject == pSrcParentObject)
2757 if( FsRtlAreNamesEqual( &uniTargetName,
2762 try_return( ntStatus = STATUS_SUCCESS);
2765 bCommonParent = TRUE;
2770 bCommonParent = FALSE;
2774 // We do not allow cross-volume renames to occur
2777 if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
2780 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2781 AFS_TRACE_LEVEL_ERROR,
2782 "AFSSetRenameInfo Attempt to rename directory to different volume %wZ\n",
2783 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2785 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2788 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2791 AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2794 bReleaseTargetDirLock = TRUE;
2796 if( pTargetParentObject != pSrcParentObject)
2798 AFSAcquireExcl( pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2801 bReleaseSourceDirLock = TRUE;
2803 pSourceDirLock = pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock;
2806 AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
2810 if( pTargetDirEntry == NULL)
2814 // Missed so perform a case insensitive lookup
2817 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2820 AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
2825 if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
2826 pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
2831 // Try the short name
2833 AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
2839 // Increment our ref count on the dir entry
2842 if( pTargetDirEntry != NULL)
2845 ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
2847 lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
2850 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2851 AFS_TRACE_LEVEL_VERBOSE,
2852 "AFSSetRenameInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
2853 &pTargetDirEntry->NameInformation.FileName,
2858 ASSERT( lCount >= 0);
2860 if( !bReplaceIfExists)
2863 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2864 AFS_TRACE_LEVEL_ERROR,
2865 "AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
2866 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2867 &pTargetDirEntry->NameInformation.FileName);
2869 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
2872 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2873 AFS_TRACE_LEVEL_ERROR,
2874 "AFSSetRenameInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
2875 &pTargetDirEntry->NameInformation.FileName,
2877 pTargetDirEntry->DirOpenReferenceCount);
2880 // Pull the directory entry from the parent
2883 AFSRemoveDirNodeFromParent( pTargetParentObject,
2887 bTargetEntryExists = TRUE;
2891 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2892 AFS_TRACE_LEVEL_VERBOSE,
2893 "AFSSetRenameInfo Target does NOT exist, normal rename\n");
2897 // We need to remove the DirEntry from the parent node, update the index
2898 // and reinsert it into the parent tree. Note that for entries with the
2899 // same parent we do not pull the node from the enumeration list
2902 AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
2903 pSrcCcb->DirectoryCB,
2907 // OK, this is a simple rename. Issue the rename
2908 // request to the service.
2911 ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
2912 &pSrcCcb->AuthGroup,
2913 pSrcFcb->ObjectInformation->ParentObjectInformation,
2914 pTargetDcb->ObjectInformation,
2915 pSrcCcb->DirectoryCB,
2919 if( !NT_SUCCESS( ntStatus))
2923 // Attempt to re-insert the directory entry
2926 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2927 pSrcCcb->DirectoryCB,
2930 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2931 AFS_TRACE_LEVEL_ERROR,
2932 "AFSSetRenameInfo Failed rename of %wZ to target %wZ Status %08lX\n",
2933 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2937 try_return( ntStatus);
2941 // Set the notification up for the source file
2944 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
2945 !bTargetEntryExists)
2948 ulNotificationAction = FILE_ACTION_RENAMED_OLD_NAME;
2953 ulNotificationAction = FILE_ACTION_REMOVED;
2956 if( pSrcCcb->DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
2959 ulNotifyFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
2964 ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
2967 AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
2969 (ULONG)ulNotifyFilter,
2970 (ULONG)ulNotificationAction);
2973 // Update the name in the dir entry.
2976 ntStatus = AFSUpdateDirEntryName( pSrcCcb->DirectoryCB,
2979 if( !NT_SUCCESS( ntStatus))
2983 // Attempt to re-insert the directory entry
2986 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2987 pSrcCcb->DirectoryCB,
2990 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2991 AFS_TRACE_LEVEL_ERROR,
2992 "AFSSetRenameInfo Failed update of dir entry %wZ to target %wZ Status %08lX\n",
2993 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2997 try_return( ntStatus);
3001 // Update the object information block, if needed
3004 if( !AFSIsEqualFID( &pSrcObject->FileId,
3008 AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
3012 // Remove the old information entry
3015 AFSRemoveHashEntry( &pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
3016 &pSrcObject->TreeEntry);
3018 RtlCopyMemory( &pSrcObject->FileId,
3020 sizeof( AFSFileID));
3023 // Insert the entry into the new object table.
3026 pSrcObject->TreeEntry.HashIndex = AFSCreateLowIndex( &pSrcObject->FileId);
3028 if( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead == NULL)
3031 pSrcObject->VolumeCB->ObjectInfoTree.TreeHead = &pSrcObject->TreeEntry;
3036 if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
3037 &pSrcObject->TreeEntry)))
3041 // Lost a race, an ObjectInfo object already exists for this FID.
3042 // Let this copy be garbage collected.
3045 ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
3049 AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);
3053 // Update the hash values for the name trees.
3056 pSrcCcb->DirectoryCB->CaseSensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
3059 pSrcCcb->DirectoryCB->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
3062 if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
3063 pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0 &&
3064 !RtlIsNameLegalDOS8Dot3( &pSrcCcb->DirectoryCB->NameInformation.FileName,
3069 uniShortName.Length = pSrcCcb->DirectoryCB->NameInformation.ShortNameLength;
3070 uniShortName.MaximumLength = uniShortName.Length;
3071 uniShortName.Buffer = pSrcCcb->DirectoryCB->NameInformation.ShortName;
3073 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
3076 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3077 AFS_TRACE_LEVEL_VERBOSE,
3078 "AFSSetRenameInfo Initialized short name hash for %wZ longname %wZ\n",
3080 &pSrcCcb->DirectoryCB->NameInformation.FileName);
3085 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
3092 // Update the file index for the object in the new parent
3095 pSrcCcb->DirectoryCB->FileIndex = (ULONG)InterlockedIncrement( &pTargetParentObject->Specific.Directory.DirectoryNodeHdr.ContentIndex);
3099 // Re-insert the directory entry
3102 AFSInsertDirectoryNode( pTargetParentObject,
3103 pSrcCcb->DirectoryCB,
3107 // Update the parent pointer in the source object if they are different
3110 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
3113 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3115 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3117 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
3119 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
3121 pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
3123 ulNotificationAction = FILE_ACTION_ADDED;
3128 ulNotificationAction = FILE_ACTION_RENAMED_NEW_NAME;
3132 // Now update the notification for the target file
3135 AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
3137 (ULONG)ulNotifyFilter,
3138 (ULONG)ulNotificationAction);
3141 // If we performed the rename of the target because it existed, we now need to
3142 // delete the tmp target we created above
3145 if( bTargetEntryExists)
3148 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3149 AFS_TRACE_LEVEL_VERBOSE,
3150 "AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
3152 &pTargetDirEntry->NameInformation.FileName);
3154 SetFlag( pTargetDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
3157 // Try and purge the cache map if this is a file
3160 if( pTargetDirEntry->ObjectInformation->FileType == AFS_FILE_TYPE_FILE &&
3161 pTargetDirEntry->ObjectInformation->Fcb != NULL &&
3162 pTargetDirEntry->DirOpenReferenceCount > 1)
3165 pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
3168 ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
3170 lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
3172 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3173 AFS_TRACE_LEVEL_VERBOSE,
3174 "AFSSetRenameInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3175 &pTargetDirEntry->NameInformation.FileName,
3180 ASSERT( lCount >= 0);
3185 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3186 AFS_TRACE_LEVEL_VERBOSE,
3187 "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
3189 &pTargetDirEntry->NameInformation.FileName);
3191 AFSDeleteDirEntry( pTargetParentObject,
3195 pTargetDirEntry = NULL;
3197 if ( pTargetFcb != NULL)
3201 // Do not hold TreeLocks across the MmForceSectionClosed() call as
3202 // it can deadlock with Trend Micro's TmPreFlt!TmpQueryFullName
3205 if( bReleaseTargetDirLock)
3207 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
3209 bReleaseTargetDirLock = FALSE;
3212 if( bReleaseSourceDirLock)
3215 AFSReleaseResource( pSourceDirLock);
3217 bReleaseSourceDirLock = FALSE;
3221 // MmForceSectionClosed() can eventually call back into AFSCleanup
3222 // which will need to acquire Fcb->Resource exclusively. Failure
3223 // to obtain it here before holding the SectionObjectResource will
3224 // permit the locks to be obtained out of order risking a deadlock.
3227 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3228 AFS_TRACE_LEVEL_VERBOSE,
3229 "AFSSetRenameInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
3230 &pTargetFcb->NPFcb->Resource,
3231 PsGetCurrentThread());
3233 AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
3236 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3237 AFS_TRACE_LEVEL_VERBOSE,
3238 "AFSSetRenameInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
3239 &pTargetFcb->NPFcb->SectionObjectResource,
3240 PsGetCurrentThread());
3242 AFSAcquireExcl( &pTargetFcb->NPFcb->SectionObjectResource,
3246 // Close the section in the event it was mapped
3249 if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
3253 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3254 AFS_TRACE_LEVEL_ERROR,
3255 "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
3256 &pTargetDirEntry->NameInformation.FileName);
3259 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3260 AFS_TRACE_LEVEL_VERBOSE,
3261 "AFSSetRenameInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
3262 &pTargetFcb->NPFcb->SectionObjectResource,
3263 PsGetCurrentThread());
3265 AFSReleaseResource( &pTargetFcb->NPFcb->SectionObjectResource);
3267 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3268 AFS_TRACE_LEVEL_VERBOSE,
3269 "AFSSetRenameInfo Releasing Fcb lock %08lX EXCL %08lX\n",
3270 &pTargetFcb->NPFcb->Resource,
3271 PsGetCurrentThread());
3273 AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
3279 if( !NT_SUCCESS( ntStatus))
3282 if( bTargetEntryExists)
3284 AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
3290 if( pTargetDirEntry != NULL)
3293 lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
3295 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3296 AFS_TRACE_LEVEL_VERBOSE,
3297 "AFSSetRenameInfo Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
3298 &pTargetDirEntry->NameInformation.FileName,
3303 ASSERT( lCount >= 0);
3306 if( bReleaseTargetDirLock)
3309 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
3312 if( bReleaseSourceDirLock)
3315 AFSReleaseResource( pSourceDirLock);
3319 if ( bDereferenceTargetParentObject)
3322 ObDereferenceObject( pTargetParentFileObj);
3329 AFSSetPositionInfo( IN PIRP Irp,
3330 IN AFSDirectoryCB *DirectoryCB)
3332 UNREFERENCED_PARAMETER(DirectoryCB);
3333 NTSTATUS ntStatus = STATUS_SUCCESS;
3334 PFILE_POSITION_INFORMATION pBuffer;
3335 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3337 pBuffer = (PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3339 pIrpSp->FileObject->CurrentByteOffset.QuadPart = pBuffer->CurrentByteOffset.QuadPart;
3345 AFSSetAllocationInfo( IN PIRP Irp,
3346 IN AFSDirectoryCB *DirectoryCB)
3348 UNREFERENCED_PARAMETER(DirectoryCB);
3349 NTSTATUS ntStatus = STATUS_SUCCESS;
3350 PFILE_ALLOCATION_INFORMATION pBuffer;
3351 BOOLEAN bReleasePaging = FALSE;
3352 BOOLEAN bTellCc = FALSE;
3353 BOOLEAN bTellService = FALSE;
3354 BOOLEAN bUserMapped = FALSE;
3355 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3356 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
3357 AFSFcb *pFcb = NULL;
3358 AFSCcb *pCcb = NULL;
3359 LARGE_INTEGER liSaveAlloc;
3360 LARGE_INTEGER liSaveFileSize;
3361 LARGE_INTEGER liSaveVDL;
3363 pBuffer = (PFILE_ALLOCATION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3365 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3367 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3370 // save values to put back
3372 liSaveAlloc = pFcb->Header.AllocationSize;
3373 liSaveFileSize = pFcb->Header.FileSize;
3374 liSaveVDL = pFcb->Header.ValidDataLength;
3376 if( pFcb->Header.AllocationSize.QuadPart == pBuffer->AllocationSize.QuadPart ||
3377 pIrpSp->Parameters.SetFile.AdvanceOnly)
3379 return STATUS_SUCCESS ;
3382 if( pFcb->Header.AllocationSize.QuadPart > pBuffer->AllocationSize.QuadPart)
3385 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3386 AFS_TRACE_LEVEL_VERBOSE,
3387 "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
3388 &pFcb->NPFcb->SectionObjectResource,
3389 PsGetCurrentThread());
3391 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
3394 bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
3395 &pBuffer->AllocationSize);
3397 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3398 AFS_TRACE_LEVEL_VERBOSE,
3399 "AFSSetAllocationInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
3400 &pFcb->NPFcb->SectionObjectResource,
3401 PsGetCurrentThread());
3403 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
3406 // Truncating the file
3411 ntStatus = STATUS_USER_MAPPED_FILE ;
3417 // If this is a truncation we need to grab the paging IO resource.
3420 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3421 AFS_TRACE_LEVEL_VERBOSE,
3422 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3423 &pFcb->NPFcb->PagingResource,
3424 PsGetCurrentThread());
3426 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3429 bReleasePaging = TRUE;
3432 // Must drop the Fcb Resource. When changing the file size
3433 // a deadlock can occur with Trend Micro's filter if the file
3434 // size is set to zero.
3437 AFSReleaseResource( &pFcb->NPFcb->Resource);
3439 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
3441 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
3444 // Tell Cc that Allocation is moved.
3448 if( pFcb->Header.FileSize.QuadPart > pBuffer->AllocationSize.QuadPart)
3451 // We are pulling the EOF back as well so we need to tell
3454 bTellService = TRUE;
3456 pFcb->Header.FileSize = pBuffer->AllocationSize;
3458 pFcb->ObjectInformation->EndOfFile = pBuffer->AllocationSize;
3466 // Tell Cc if allocation is increased.
3469 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3470 AFS_TRACE_LEVEL_VERBOSE,
3471 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3472 &pFcb->NPFcb->PagingResource,
3473 PsGetCurrentThread());
3475 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3478 bReleasePaging = TRUE;
3481 // Must drop the Fcb Resource. When changing the file size
3482 // a deadlock can occur with Trend Micro's filter if the file
3483 // size is set to zero.
3486 AFSReleaseResource( &pFcb->NPFcb->Resource);
3488 bTellCc = pBuffer->AllocationSize.QuadPart > pFcb->Header.AllocationSize.QuadPart;
3490 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
3492 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
3496 // Now Tell the server if we have to
3500 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
3501 pFcb->ObjectInformation,
3505 if (NT_SUCCESS(ntStatus))
3508 // Trim extents if we told the service - the update has done an implicit
3509 // trim at the service.
3513 AFSTrimExtents( pFcb,
3514 &pFcb->Header.FileSize);
3517 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
3519 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
3522 CcIsFileCached( pFileObject))
3524 CcSetFileSizes( pFileObject,
3525 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
3531 // Put the saved values back
3533 pFcb->Header.ValidDataLength = liSaveVDL;
3534 pFcb->Header.FileSize = liSaveFileSize;
3535 pFcb->Header.AllocationSize = liSaveAlloc;
3536 pFcb->ObjectInformation->EndOfFile = liSaveFileSize;
3537 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
3543 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
3545 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3553 AFSSetEndOfFileInfo( IN PIRP Irp,
3554 IN AFSDirectoryCB *DirectoryCB)
3556 UNREFERENCED_PARAMETER(DirectoryCB);
3557 NTSTATUS ntStatus = STATUS_SUCCESS;
3558 PFILE_END_OF_FILE_INFORMATION pBuffer;
3559 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3560 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
3561 LARGE_INTEGER liSaveSize;
3562 LARGE_INTEGER liSaveVDL;
3563 LARGE_INTEGER liSaveAlloc;
3564 BOOLEAN bModified = FALSE;
3565 BOOLEAN bReleasePaging = FALSE;
3566 BOOLEAN bTruncated = FALSE;
3567 BOOLEAN bUserMapped = FALSE;
3568 AFSFcb *pFcb = NULL;
3569 AFSCcb *pCcb = NULL;
3571 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3573 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3575 pBuffer = (PFILE_END_OF_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3577 liSaveSize = pFcb->Header.FileSize;
3578 liSaveAlloc = pFcb->Header.AllocationSize;
3579 liSaveVDL = pFcb->Header.ValidDataLength;
3581 if( pFcb->Header.FileSize.QuadPart != pBuffer->EndOfFile.QuadPart &&
3582 !pIrpSp->Parameters.SetFile.AdvanceOnly)
3585 if( pBuffer->EndOfFile.QuadPart < pFcb->Header.FileSize.QuadPart)
3588 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3589 AFS_TRACE_LEVEL_VERBOSE,
3590 "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
3591 &pFcb->NPFcb->SectionObjectResource,
3592 PsGetCurrentThread());
3594 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
3597 bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
3598 &pBuffer->EndOfFile);
3600 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3601 AFS_TRACE_LEVEL_VERBOSE,
3602 "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
3603 &pFcb->NPFcb->SectionObjectResource,
3604 PsGetCurrentThread());
3606 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
3608 // Truncating the file
3612 ntStatus = STATUS_USER_MAPPED_FILE;
3618 // If this is a truncation we need to grab the paging
3621 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3622 AFS_TRACE_LEVEL_VERBOSE,
3623 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3624 &pFcb->NPFcb->PagingResource,
3625 PsGetCurrentThread());
3627 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3630 bReleasePaging = TRUE;
3633 // Must drop the Fcb Resource. When changing the file size
3634 // a deadlock can occur with Trend Micro's filter if the file
3635 // size is set to zero.
3638 AFSReleaseResource( &pFcb->NPFcb->Resource);
3640 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3642 pFcb->Header.FileSize = pBuffer->EndOfFile;
3644 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3646 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3648 if( pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
3651 pFcb->Header.ValidDataLength = pFcb->Header.FileSize;
3663 // extending the file, move EOF
3667 // If this is a truncation we need to grab the paging
3670 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3671 AFS_TRACE_LEVEL_VERBOSE,
3672 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3673 &pFcb->NPFcb->PagingResource,
3674 PsGetCurrentThread());
3676 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3679 bReleasePaging = TRUE;
3682 // Must drop the Fcb Resource. When changing the file size
3683 // a deadlock can occur with Trend Micro's filter if the file
3684 // size is set to zero.
3687 AFSReleaseResource( &pFcb->NPFcb->Resource);
3689 pFcb->Header.FileSize = pBuffer->EndOfFile;
3691 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3693 if (pFcb->Header.FileSize.QuadPart > pFcb->Header.AllocationSize.QuadPart)
3696 // And Allocation as needed.
3698 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3700 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3710 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
3712 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
3718 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
3719 pFcb->ObjectInformation,
3722 if( NT_SUCCESS(ntStatus))
3725 // We are now good to go so tell CC.
3727 CcSetFileSizes( pFileObject,
3728 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
3731 // And give up those extents
3736 AFSTrimExtents( pFcb,
3737 &pFcb->Header.FileSize);
3742 pFcb->Header.ValidDataLength = liSaveVDL;
3743 pFcb->Header.FileSize = liSaveSize;
3744 pFcb->Header.AllocationSize = liSaveAlloc;
3745 pFcb->ObjectInformation->EndOfFile = liSaveSize;
3746 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
3753 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
3755 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3763 AFSProcessShareSetInfo( IN IRP *Irp,
3768 UNREFERENCED_PARAMETER(Fcb);
3769 NTSTATUS ntStatus = STATUS_SUCCESS;
3770 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3771 FILE_INFORMATION_CLASS ulFileInformationClass;
3772 void *pPipeInfo = NULL;
3776 ulFileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
3778 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3779 AFS_TRACE_LEVEL_VERBOSE,
3780 "AFSProcessShareSetInfo On pipe %wZ Class %08lX\n",
3781 &Ccb->DirectoryCB->NameInformation.FileName,
3782 ulFileInformationClass);
3784 pPipeInfo = AFSLockSystemBuffer( Irp,
3785 pIrpSp->Parameters.SetFile.Length);
3787 if( pPipeInfo == NULL)
3790 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3791 AFS_TRACE_LEVEL_ERROR,
3792 "AFSProcessShareSetInfo Failed to lock buffer on pipe %wZ\n",
3793 &Ccb->DirectoryCB->NameInformation.FileName);
3795 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3799 // Send the request to the service
3802 ntStatus = AFSNotifySetPipeInfo( Ccb,
3803 (ULONG)ulFileInformationClass,
3804 pIrpSp->Parameters.SetFile.Length,
3807 if( !NT_SUCCESS( ntStatus))
3810 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3811 AFS_TRACE_LEVEL_ERROR,
3812 "AFSProcessShareSetInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3813 &Ccb->DirectoryCB->NameInformation.FileName,
3816 try_return( ntStatus);
3819 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3820 AFS_TRACE_LEVEL_VERBOSE,
3821 "AFSProcessShareSetInfo Completed request on pipe %wZ Class %08lX\n",
3822 &Ccb->DirectoryCB->NameInformation.FileName,
3823 ulFileInformationClass);
3834 AFSProcessShareQueryInfo( IN IRP *Irp,
3839 UNREFERENCED_PARAMETER(Fcb);
3840 NTSTATUS ntStatus = STATUS_SUCCESS;
3841 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3842 FILE_INFORMATION_CLASS ulFileInformationClass;
3843 void *pPipeInfo = NULL;
3848 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3850 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3851 AFS_TRACE_LEVEL_VERBOSE,
3852 "AFSProcessShareQueryInfo On pipe %wZ Class %08lX\n",
3853 &Ccb->DirectoryCB->NameInformation.FileName,
3854 ulFileInformationClass);
3856 pPipeInfo = AFSLockSystemBuffer( Irp,
3857 pIrpSp->Parameters.QueryFile.Length);
3859 if( pPipeInfo == NULL)
3862 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3863 AFS_TRACE_LEVEL_ERROR,
3864 "AFSProcessShareQueryInfo Failed to lock buffer on pipe %wZ\n",
3865 &Ccb->DirectoryCB->NameInformation.FileName);
3867 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3871 // Send the request to the service
3874 ntStatus = AFSNotifyQueryPipeInfo( Ccb,
3875 (ULONG)ulFileInformationClass,
3876 pIrpSp->Parameters.QueryFile.Length,
3878 (ULONG *)&Irp->IoStatus.Information);
3880 if( !NT_SUCCESS( ntStatus))
3883 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3884 AFS_TRACE_LEVEL_ERROR,
3885 "AFSProcessShareQueryInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3886 &Ccb->DirectoryCB->NameInformation.FileName,
3889 try_return( ntStatus);
3892 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3893 AFS_TRACE_LEVEL_VERBOSE,
3894 "AFSProcessShareQueryInfo Completed request on pipe %wZ Class %08lX\n",
3895 &Ccb->DirectoryCB->NameInformation.FileName,
3896 ulFileInformationClass);
3907 AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
3910 IN OUT LONG *Length)
3913 UNREFERENCED_PARAMETER(Fcb);
3914 UNREFERENCED_PARAMETER(Ccb);
3915 NTSTATUS ntStatus = STATUS_SUCCESS;
3916 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3917 FILE_INFORMATION_CLASS ulFileInformationClass;
3922 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3924 switch( ulFileInformationClass)
3927 case FileBasicInformation:
3930 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3931 AFS_TRACE_LEVEL_VERBOSE,
3932 "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
3934 if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
3936 PFILE_BASIC_INFORMATION pBasic = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3938 pBasic->CreationTime.QuadPart = 0;
3939 pBasic->LastAccessTime.QuadPart = 0;
3940 pBasic->ChangeTime.QuadPart = 0;
3941 pBasic->LastWriteTime.QuadPart = 0;
3942 pBasic->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
3944 *Length -= sizeof( FILE_BASIC_INFORMATION);
3948 ntStatus = STATUS_BUFFER_TOO_SMALL;
3954 case FileStandardInformation:
3957 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3958 AFS_TRACE_LEVEL_VERBOSE,
3959 "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
3961 if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
3963 PFILE_STANDARD_INFORMATION pStandard = (PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3965 pStandard->NumberOfLinks = 1;
3966 pStandard->DeletePending = 0;
3967 pStandard->AllocationSize.QuadPart = 0;
3968 pStandard->EndOfFile.QuadPart = 0;
3969 pStandard->Directory = 0;
3971 *Length -= sizeof( FILE_STANDARD_INFORMATION);
3975 ntStatus = STATUS_BUFFER_TOO_SMALL;
3981 case FileNormalizedNameInformation:
3982 case FileNameInformation:
3985 ULONG ulCopyLength = 0;
3986 AFSFcb *pFcb = NULL;
3987 AFSCcb *pCcb = NULL;
3988 USHORT usFullNameLength = 0;
3989 PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3990 UNICODE_STRING uniName;
3992 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3993 AFS_TRACE_LEVEL_VERBOSE,
3994 "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
3996 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3997 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3999 if( *Length < FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
4001 ntStatus = STATUS_BUFFER_TOO_SMALL;
4005 RtlZeroMemory( pNameInfo,
4008 usFullNameLength = sizeof( WCHAR) +
4009 AFSServerName.Length +
4010 pCcb->FullFileName.Length;
4012 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
4014 ulCopyLength = (LONG)usFullNameLength;
4018 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
4019 ntStatus = STATUS_BUFFER_OVERFLOW;
4022 pNameInfo->FileNameLength = (ULONG)usFullNameLength;
4024 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
4026 if( ulCopyLength > 0)
4029 pNameInfo->FileName[ 0] = L'\\';
4030 ulCopyLength -= sizeof( WCHAR);
4032 *Length -= sizeof( WCHAR);
4034 if( ulCopyLength >= AFSServerName.Length)
4037 RtlCopyMemory( &pNameInfo->FileName[ 1],
4038 AFSServerName.Buffer,
4039 AFSServerName.Length);
4041 ulCopyLength -= AFSServerName.Length;
4042 *Length -= AFSServerName.Length;
4044 if( ulCopyLength >= pCcb->FullFileName.Length)
4047 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
4048 pCcb->FullFileName.Buffer,
4049 pCcb->FullFileName.Length);
4051 ulCopyLength -= pCcb->FullFileName.Length;
4052 *Length -= pCcb->FullFileName.Length;
4054 uniName.Length = (USHORT)pNameInfo->FileNameLength;
4055 uniName.MaximumLength = uniName.Length;
4056 uniName.Buffer = pNameInfo->FileName;
4061 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
4062 pCcb->FullFileName.Buffer,
4065 *Length -= ulCopyLength;
4067 uniName.Length = (USHORT)(sizeof( WCHAR) + AFSServerName.Length + ulCopyLength);
4068 uniName.MaximumLength = uniName.Length;
4069 uniName.Buffer = pNameInfo->FileName;
4072 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4073 AFS_TRACE_LEVEL_VERBOSE,
4074 "AFSProcessPIOCtlQueryInfo (FileNameInformation) Returning %wZ\n",
4082 case FileInternalInformation:
4085 PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
4087 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4088 AFS_TRACE_LEVEL_VERBOSE,
4089 "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
4091 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
4094 pInternalInfo->IndexNumber.HighPart = 0;
4096 pInternalInfo->IndexNumber.LowPart = 0;
4098 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
4103 ntStatus = STATUS_BUFFER_TOO_SMALL;
4109 case FileAllInformation:
4111 ntStatus = STATUS_INVALID_PARAMETER;
4113 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4114 AFS_TRACE_LEVEL_WARNING,
4115 "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
4120 case FileEaInformation:
4122 ntStatus = STATUS_INVALID_PARAMETER;
4124 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4125 AFS_TRACE_LEVEL_WARNING,
4126 "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
4131 case FilePositionInformation:
4133 ntStatus = STATUS_INVALID_PARAMETER;
4135 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4136 AFS_TRACE_LEVEL_WARNING,
4137 "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
4142 case FileAlternateNameInformation:
4144 ntStatus = STATUS_INVALID_PARAMETER;
4146 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4147 AFS_TRACE_LEVEL_WARNING,
4148 "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
4153 case FileNetworkOpenInformation:
4155 ntStatus = STATUS_INVALID_PARAMETER;
4157 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4158 AFS_TRACE_LEVEL_WARNING,
4159 "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
4164 case FileStreamInformation:
4166 ntStatus = STATUS_INVALID_PARAMETER;
4168 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4169 AFS_TRACE_LEVEL_WARNING,
4170 "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
4175 case FileAttributeTagInformation:
4177 ntStatus = STATUS_INVALID_PARAMETER;
4179 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4180 AFS_TRACE_LEVEL_WARNING,
4181 "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
4186 case FileRemoteProtocolInformation:
4188 ntStatus = STATUS_INVALID_PARAMETER;
4190 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4191 AFS_TRACE_LEVEL_WARNING,
4192 "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
4197 case FileNetworkPhysicalNameInformation:
4199 ntStatus = STATUS_INVALID_PARAMETER;
4201 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4202 AFS_TRACE_LEVEL_WARNING,
4203 "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
4210 ntStatus = STATUS_INVALID_PARAMETER;
4212 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4213 AFS_TRACE_LEVEL_WARNING,
4214 "AFSProcessPIOCtlQueryInfo Not handling request %08lX\n",
4215 ulFileInformationClass);
4222 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4223 AFS_TRACE_LEVEL_VERBOSE,
4224 "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",