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 NTSTATUS ntStatus = STATUS_SUCCESS;
59 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
60 ULONG ulRequestType = 0;
61 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
64 PFILE_OBJECT pFileObject;
65 BOOLEAN bReleaseMain = FALSE;
67 FILE_INFORMATION_CLASS stFileInformationClass;
74 // Determine the type of request this request is
77 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
79 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
84 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
85 AFS_TRACE_LEVEL_ERROR,
86 "AFSQueryFileInfo Attempted access (%08lX) when pFcb == NULL\n",
89 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
92 lLength = (LONG)pIrpSp->Parameters.QueryFile.Length;
93 stFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
94 pBuffer = Irp->AssociatedIrp.SystemBuffer;
97 // Grab the main shared right off the bat
100 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
101 AFS_TRACE_LEVEL_VERBOSE,
102 "AFSQueryFileInfo Acquiring Fcb lock %08lX SHARED %08lX\n",
103 &pFcb->NPFcb->Resource,
104 PsGetCurrentThread());
106 AFSAcquireShared( &pFcb->NPFcb->Resource,
112 // Don't allow requests against IOCtl nodes
115 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
118 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
119 AFS_TRACE_LEVEL_VERBOSE,
120 "AFSQueryFileInfo Processing request against SpecialShare Fcb\n");
122 ntStatus = AFSProcessShareQueryInfo( Irp,
126 try_return( ntStatus);
128 else if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
130 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
131 AFS_TRACE_LEVEL_VERBOSE,
132 "AFSQueryFileInfo request against PIOCtl Fcb\n");
134 ntStatus = AFSProcessPIOCtlQueryInfo( Irp,
139 try_return( ntStatus);
142 else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
144 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
145 AFS_TRACE_LEVEL_VERBOSE,
146 "AFSQueryFileInfo request against Invalid Fcb\n");
148 try_return( ntStatus = STATUS_ACCESS_DENIED);
152 // Process the request
155 switch( stFileInformationClass)
158 case FileAllInformation:
161 PFILE_ALL_INFORMATION pAllInfo;
164 // For the all information class we'll typecast a local
165 // pointer to the output buffer and then call the
166 // individual routines to fill in the buffer.
169 pAllInfo = (PFILE_ALL_INFORMATION)pBuffer;
171 ntStatus = AFSQueryBasicInfo( Irp,
173 &pAllInfo->BasicInformation,
176 if( !NT_SUCCESS( ntStatus))
179 try_return( ntStatus);
182 ntStatus = AFSQueryStandardInfo( Irp,
184 &pAllInfo->StandardInformation,
187 if( !NT_SUCCESS( ntStatus))
190 try_return( ntStatus);
193 ntStatus = AFSQueryInternalInfo( Irp,
195 &pAllInfo->InternalInformation,
198 if( !NT_SUCCESS( ntStatus))
201 try_return( ntStatus);
204 ntStatus = AFSQueryEaInfo( Irp,
206 &pAllInfo->EaInformation,
209 if( !NT_SUCCESS( ntStatus))
212 try_return( ntStatus);
215 ntStatus = AFSQueryAccess( Irp,
217 &pAllInfo->AccessInformation,
220 if( !NT_SUCCESS( ntStatus))
223 try_return( ntStatus);
226 ntStatus = AFSQueryPositionInfo( Irp,
228 &pAllInfo->PositionInformation,
231 if( !NT_SUCCESS( ntStatus))
234 try_return( ntStatus);
237 ntStatus = AFSQueryMode( Irp,
239 &pAllInfo->ModeInformation,
242 if( !NT_SUCCESS( ntStatus))
245 try_return( ntStatus);
248 ntStatus = AFSQueryAlignment( Irp,
250 &pAllInfo->AlignmentInformation,
253 if( !NT_SUCCESS( ntStatus))
256 try_return( ntStatus);
259 ntStatus = AFSQueryNameInfo( Irp,
261 &pAllInfo->NameInformation,
264 if( !NT_SUCCESS( ntStatus))
267 try_return( ntStatus);
273 case FileBasicInformation:
276 ntStatus = AFSQueryBasicInfo( Irp,
278 (PFILE_BASIC_INFORMATION)pBuffer,
284 case FileStandardInformation:
287 ntStatus = AFSQueryStandardInfo( Irp,
289 (PFILE_STANDARD_INFORMATION)pBuffer,
295 case FileInternalInformation:
298 ntStatus = AFSQueryInternalInfo( Irp,
300 (PFILE_INTERNAL_INFORMATION)pBuffer,
306 case FileEaInformation:
309 ntStatus = AFSQueryEaInfo( Irp,
311 (PFILE_EA_INFORMATION)pBuffer,
317 case FilePositionInformation:
320 ntStatus = AFSQueryPositionInfo( Irp,
322 (PFILE_POSITION_INFORMATION)pBuffer,
328 case FileNormalizedNameInformation:
329 case FileNameInformation:
332 ntStatus = AFSQueryNameInfo( Irp,
334 (PFILE_NAME_INFORMATION)pBuffer,
340 case FileAlternateNameInformation:
343 ntStatus = AFSQueryShortNameInfo( Irp,
345 (PFILE_NAME_INFORMATION)pBuffer,
351 case FileNetworkOpenInformation:
354 ntStatus = AFSQueryNetworkInfo( Irp,
356 (PFILE_NETWORK_OPEN_INFORMATION)pBuffer,
362 case FileStreamInformation:
365 ntStatus = AFSQueryStreamInfo( Irp,
367 (FILE_STREAM_INFORMATION *)pBuffer,
374 case FileAttributeTagInformation:
377 ntStatus = AFSQueryAttribTagInfo( Irp,
379 (FILE_ATTRIBUTE_TAG_INFORMATION *)pBuffer,
385 case FileRemoteProtocolInformation:
388 ntStatus = AFSQueryRemoteProtocolInfo( Irp,
390 (FILE_REMOTE_PROTOCOL_INFORMATION *)pBuffer,
396 case FileNetworkPhysicalNameInformation:
399 ntStatus = AFSQueryPhysicalNameInfo( Irp,
401 (FILE_NETWORK_PHYSICAL_NAME_INFORMATION *)pBuffer,
409 ntStatus = STATUS_INVALID_PARAMETER;
416 Irp->IoStatus.Information = pIrpSp->Parameters.QueryFile.Length - lLength;
421 AFSReleaseResource( &pFcb->NPFcb->Resource);
424 if( !NT_SUCCESS( ntStatus) &&
425 ntStatus != STATUS_INVALID_PARAMETER &&
426 ntStatus != STATUS_BUFFER_OVERFLOW)
430 pCcb->DirectoryCB != NULL)
433 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
434 AFS_TRACE_LEVEL_ERROR,
435 "AFSQueryFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
436 &pCcb->DirectoryCB->NameInformation.FileName,
437 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
438 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
439 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
440 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
445 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
450 "EXCEPTION - AFSQueryFileInfo\n");
452 AFSDumpTraceFilesFnc();
454 ntStatus = STATUS_UNSUCCESSFUL;
459 AFSReleaseResource( &pFcb->NPFcb->Resource);
463 AFSCompleteRequest( Irp,
470 // Function: AFSSetFileInfo
474 // This function is the dispatch handler for the IRP_MJ_SET_FILE_INFORMATION request
478 // A status is returned for the function
482 AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
486 NTSTATUS ntStatus = STATUS_SUCCESS;
487 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
488 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
491 BOOLEAN bCompleteRequest = TRUE;
492 FILE_INFORMATION_CLASS FileInformationClass;
493 BOOLEAN bCanQueueRequest = FALSE;
494 PFILE_OBJECT pFileObject = NULL;
495 BOOLEAN bReleaseMain = FALSE;
496 BOOLEAN bUpdateFileInfo = FALSE;
497 AFSFileID stParentFileId;
502 pFileObject = pIrpSp->FileObject;
504 pFcb = (AFSFcb *)pFileObject->FsContext;
505 pCcb = (AFSCcb *)pFileObject->FsContext2;
510 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
511 AFS_TRACE_LEVEL_ERROR,
512 "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
515 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
518 bCanQueueRequest = !(IoIsOperationSynchronous( Irp) | (KeGetCurrentIrql() != PASSIVE_LEVEL));
519 FileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
525 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
526 AFS_TRACE_LEVEL_VERBOSE,
527 "AFSSetFileInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
528 &pFcb->NPFcb->Resource,
529 PsGetCurrentThread());
531 AFSAcquireExcl( &pFcb->NPFcb->Resource,
537 // Don't allow requests against IOCtl nodes
540 if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
543 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
544 AFS_TRACE_LEVEL_ERROR,
545 "AFSSetFileInfo Failing request against PIOCtl Fcb\n");
547 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
549 else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
552 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
553 AFS_TRACE_LEVEL_VERBOSE,
554 "AFSSetFileInfo Processing request against SpecialShare Fcb\n");
556 ntStatus = AFSProcessShareSetInfo( Irp,
560 try_return( ntStatus);
563 if( BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
566 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
567 AFS_TRACE_LEVEL_ERROR,
568 "AFSSetFileInfo Request failed due to read only volume\n",
571 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
574 if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
575 FileInformationClass != FileDispositionInformation)
577 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
578 AFS_TRACE_LEVEL_VERBOSE,
579 "AFSSetFileInfo request against Invalid Fcb\n");
581 try_return( ntStatus = STATUS_ACCESS_DENIED);
585 // Ensure rename operations are synchronous
588 if( FileInformationClass == FileRenameInformation)
591 bCanQueueRequest = FALSE;
595 // Store away the parent fid
598 RtlZeroMemory( &stParentFileId,
601 if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
603 stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
607 // Process the request
610 switch( FileInformationClass)
613 case FileBasicInformation:
616 bUpdateFileInfo = TRUE;
618 ntStatus = AFSSetBasicInfo( Irp,
624 case FileDispositionInformation:
627 ntStatus = AFSSetDispositionInfo( Irp,
633 case FileRenameInformation:
636 ntStatus = AFSSetRenameInfo( Irp);
641 case FilePositionInformation:
644 ntStatus = AFSSetPositionInfo( Irp,
650 case FileLinkInformation:
653 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
658 case FileAllocationInformation:
661 ntStatus = AFSSetAllocationInfo( Irp,
667 case FileEndOfFileInformation:
670 ntStatus = AFSSetEndOfFileInfo( Irp,
678 ntStatus = STATUS_INVALID_PARAMETER;
688 AFSReleaseResource( &pFcb->NPFcb->Resource);
691 if( NT_SUCCESS( ntStatus) &&
695 ntStatus = AFSUpdateFileInformation( &stParentFileId,
696 pFcb->ObjectInformation,
699 if( !NT_SUCCESS( ntStatus))
702 AFSAcquireExcl( &pFcb->NPFcb->Resource,
706 // Unwind the update and fail the request
709 AFSUnwindFileInfo( pFcb,
712 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
713 AFS_TRACE_LEVEL_ERROR,
714 "AFSSetFileInfo Failed to send file info update to service request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
715 &pCcb->DirectoryCB->NameInformation.FileName,
716 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
717 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
718 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
719 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
722 AFSReleaseResource( &pFcb->NPFcb->Resource);
726 if( !NT_SUCCESS( ntStatus))
730 pCcb->DirectoryCB != NULL)
733 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
734 AFS_TRACE_LEVEL_ERROR,
735 "AFSSetFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
736 &pCcb->DirectoryCB->NameInformation.FileName,
737 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
738 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
739 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
740 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
745 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
750 "EXCEPTION - AFSSetFileInfo\n");
752 AFSDumpTraceFilesFnc();
754 ntStatus = STATUS_UNSUCCESSFUL;
759 AFSReleaseResource( &pFcb->NPFcb->Resource);
763 AFSCompleteRequest( Irp,
770 // Function: AFSQueryBasicInfo
774 // This function is the handler for the query basic information request
778 // A status is returned for the function
782 AFSQueryBasicInfo( IN PIRP Irp,
783 IN AFSDirectoryCB *DirectoryCB,
784 IN OUT PFILE_BASIC_INFORMATION Buffer,
787 NTSTATUS ntStatus = STATUS_SUCCESS;
788 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
789 ULONG ulFileAttribs = 0;
792 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
793 AFSFileInfoCB stFileInfo;
794 AFSDirectoryCB *pParentDirectoryCB = NULL;
795 UNICODE_STRING uniParentPath;
797 if( *Length >= sizeof( FILE_BASIC_INFORMATION))
800 RtlZeroMemory( Buffer,
803 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
805 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
806 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
808 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
811 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
813 AFSRetrieveParentPath( &pCcb->FullFileName,
816 RtlZeroMemory( &stFileInfo,
817 sizeof( AFSFileInfoCB));
820 // Can't hold the Fcb while evaluating the path, leads to lock inversion
823 AFSReleaseResource( &pFcb->NPFcb->Resource);
825 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
833 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
836 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
841 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
844 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
847 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
851 AFSAcquireShared( &pFcb->NPFcb->Resource,
856 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
857 AFS_TRACE_LEVEL_VERBOSE_2,
858 "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
859 &pCcb->DirectoryCB->NameInformation.FileName,
860 pCcb->DirectoryCB->ObjectInformation->FileType,
861 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
864 Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
865 Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
866 Buffer->LastWriteTime = DirectoryCB->ObjectInformation->LastWriteTime;
867 Buffer->ChangeTime = DirectoryCB->ObjectInformation->ChangeTime;
868 Buffer->FileAttributes = ulFileAttribs;
870 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
871 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
874 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
876 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
880 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
884 *Length -= sizeof( FILE_BASIC_INFORMATION);
889 ntStatus = STATUS_BUFFER_TOO_SMALL;
896 AFSQueryStandardInfo( IN PIRP Irp,
897 IN AFSDirectoryCB *DirectoryCB,
898 IN OUT PFILE_STANDARD_INFORMATION Buffer,
902 NTSTATUS ntStatus = STATUS_SUCCESS;
905 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
906 AFSFileInfoCB stFileInfo;
907 AFSDirectoryCB *pParentDirectoryCB = NULL;
908 UNICODE_STRING uniParentPath;
909 ULONG ulFileAttribs = 0;
911 if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
914 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
915 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
917 RtlZeroMemory( Buffer,
920 Buffer->NumberOfLinks = 1;
921 Buffer->DeletePending = BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
923 Buffer->AllocationSize.QuadPart = (ULONGLONG)((DirectoryCB->ObjectInformation->AllocationSize.QuadPart/PAGE_SIZE) + 1) * PAGE_SIZE;
925 Buffer->EndOfFile = DirectoryCB->ObjectInformation->EndOfFile;
927 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
929 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
932 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
934 AFSRetrieveParentPath( &pCcb->FullFileName,
937 RtlZeroMemory( &stFileInfo,
938 sizeof( AFSFileInfoCB));
941 // Can't hold the Fcb while evaluating the path, leads to lock inversion
944 AFSReleaseResource( &pFcb->NPFcb->Resource);
946 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
954 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
957 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
962 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
965 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
968 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
972 AFSAcquireShared( &pFcb->NPFcb->Resource,
976 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
977 AFS_TRACE_LEVEL_VERBOSE_2,
978 "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
979 &pCcb->DirectoryCB->NameInformation.FileName,
980 pCcb->DirectoryCB->ObjectInformation->FileType,
981 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
984 Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
986 *Length -= sizeof( FILE_STANDARD_INFORMATION);
991 ntStatus = STATUS_BUFFER_TOO_SMALL;
998 AFSQueryInternalInfo( IN PIRP Irp,
1000 IN OUT PFILE_INTERNAL_INFORMATION Buffer,
1001 IN OUT PLONG Length)
1004 NTSTATUS ntStatus = STATUS_SUCCESS;
1006 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
1009 Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Volume;
1011 Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Vnode;
1013 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
1018 ntStatus = STATUS_BUFFER_TOO_SMALL;
1025 AFSQueryEaInfo( IN PIRP Irp,
1026 IN AFSDirectoryCB *DirectoryCB,
1027 IN OUT PFILE_EA_INFORMATION Buffer,
1028 IN OUT PLONG Length)
1031 NTSTATUS ntStatus = STATUS_SUCCESS;
1033 RtlZeroMemory( Buffer,
1036 if( *Length >= sizeof( FILE_EA_INFORMATION))
1041 *Length -= sizeof( FILE_EA_INFORMATION);
1046 ntStatus = STATUS_BUFFER_TOO_SMALL;
1053 AFSQueryPositionInfo( IN PIRP Irp,
1055 IN OUT PFILE_POSITION_INFORMATION Buffer,
1056 IN OUT PLONG Length)
1059 NTSTATUS ntStatus = STATUS_SUCCESS;
1060 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1062 if( *Length >= sizeof( FILE_POSITION_INFORMATION))
1065 RtlZeroMemory( Buffer,
1068 Buffer->CurrentByteOffset.QuadPart = pIrpSp->FileObject->CurrentByteOffset.QuadPart;
1070 *Length -= sizeof( FILE_POSITION_INFORMATION);
1075 ntStatus = STATUS_BUFFER_TOO_SMALL;
1082 AFSQueryAccess( IN PIRP Irp,
1084 IN OUT PFILE_ACCESS_INFORMATION Buffer,
1085 IN OUT PLONG Length)
1088 NTSTATUS ntStatus = STATUS_SUCCESS;
1090 if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
1093 RtlZeroMemory( Buffer,
1096 Buffer->AccessFlags = 0;
1098 *Length -= sizeof( FILE_ACCESS_INFORMATION);
1103 ntStatus = STATUS_BUFFER_TOO_SMALL;
1110 AFSQueryMode( IN PIRP Irp,
1112 IN OUT PFILE_MODE_INFORMATION Buffer,
1113 IN OUT PLONG Length)
1116 NTSTATUS ntStatus = STATUS_SUCCESS;
1118 if( *Length >= sizeof( FILE_MODE_INFORMATION))
1121 RtlZeroMemory( Buffer,
1126 *Length -= sizeof( FILE_MODE_INFORMATION);
1131 ntStatus = STATUS_BUFFER_TOO_SMALL;
1138 AFSQueryAlignment( IN PIRP Irp,
1140 IN OUT PFILE_ALIGNMENT_INFORMATION Buffer,
1141 IN OUT PLONG Length)
1144 NTSTATUS ntStatus = STATUS_SUCCESS;
1146 if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
1149 RtlZeroMemory( Buffer,
1152 Buffer->AlignmentRequirement = 1;
1154 *Length -= sizeof( FILE_ALIGNMENT_INFORMATION);
1159 ntStatus = STATUS_BUFFER_TOO_SMALL;
1166 AFSQueryNameInfo( IN PIRP Irp,
1167 IN AFSDirectoryCB *DirectoryCB,
1168 IN OUT PFILE_NAME_INFORMATION Buffer,
1169 IN OUT PLONG Length)
1172 NTSTATUS ntStatus = STATUS_SUCCESS;
1173 ULONG ulCopyLength = 0;
1174 ULONG cchCopied = 0;
1175 AFSFcb *pFcb = NULL;
1176 AFSCcb *pCcb = NULL;
1177 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1178 BOOLEAN bAddLeadingSlash = FALSE;
1179 BOOLEAN bAddTrailingSlash = FALSE;
1180 USHORT usFullNameLength = 0;
1182 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1184 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1186 if( *Length >= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1189 RtlZeroMemory( Buffer,
1192 if( pCcb->FullFileName.Length == 0 ||
1193 pCcb->FullFileName.Buffer[ 0] != L'\\')
1195 bAddLeadingSlash = TRUE;
1198 if( pFcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY &&
1199 pCcb->FullFileName.Length > 0 &&
1200 pCcb->FullFileName.Buffer[ (pCcb->FullFileName.Length/sizeof( WCHAR)) - 1] != L'\\')
1202 bAddTrailingSlash = TRUE;
1205 usFullNameLength = sizeof( WCHAR) +
1206 AFSServerName.Length +
1207 pCcb->FullFileName.Length;
1209 if( bAddLeadingSlash)
1211 usFullNameLength += sizeof( WCHAR);
1214 if( bAddTrailingSlash)
1216 usFullNameLength += sizeof( WCHAR);
1219 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1222 ulCopyLength = (LONG)usFullNameLength;
1227 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1229 ntStatus = STATUS_BUFFER_OVERFLOW;
1232 Buffer->FileNameLength = (ULONG)usFullNameLength;
1234 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1236 if( ulCopyLength > 0)
1239 Buffer->FileName[ 0] = L'\\';
1240 ulCopyLength -= sizeof( WCHAR);
1242 *Length -= sizeof( WCHAR);
1245 if( ulCopyLength >= AFSServerName.Length)
1248 RtlCopyMemory( &Buffer->FileName[ 1],
1249 AFSServerName.Buffer,
1250 AFSServerName.Length);
1252 ulCopyLength -= AFSServerName.Length;
1253 *Length -= AFSServerName.Length;
1254 cchCopied += AFSServerName.Length/sizeof( WCHAR);
1256 if ( ulCopyLength > 0 &&
1260 Buffer->FileName[ cchCopied] = L'\\';
1262 ulCopyLength -= sizeof( WCHAR);
1263 *Length -= sizeof( WCHAR);
1267 if( ulCopyLength >= pCcb->FullFileName.Length)
1270 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1271 pCcb->FullFileName.Buffer,
1272 pCcb->FullFileName.Length);
1274 ulCopyLength -= pCcb->FullFileName.Length;
1275 *Length -= pCcb->FullFileName.Length;
1276 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1278 if( ulCopyLength > 0 &&
1281 Buffer->FileName[ cchCopied] = L'\\';
1283 *Length -= sizeof( WCHAR);
1289 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1290 pCcb->FullFileName.Buffer,
1293 *Length -= ulCopyLength;
1301 ntStatus = STATUS_BUFFER_TOO_SMALL;
1308 AFSQueryShortNameInfo( IN PIRP Irp,
1309 IN AFSDirectoryCB *DirectoryCB,
1310 IN OUT PFILE_NAME_INFORMATION Buffer,
1311 IN OUT PLONG Length)
1314 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1315 ULONG ulCopyLength = 0;
1317 RtlZeroMemory( Buffer,
1320 if( DirectoryCB->NameInformation.ShortNameLength == 0)
1324 // The short name IS the long name
1327 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1330 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1333 ulCopyLength = (LONG)DirectoryCB->NameInformation.FileName.Length;
1335 ntStatus = STATUS_SUCCESS;
1340 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1342 ntStatus = STATUS_BUFFER_OVERFLOW;
1345 Buffer->FileNameLength = DirectoryCB->NameInformation.FileName.Length;
1347 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1349 if( ulCopyLength > 0)
1352 RtlCopyMemory( Buffer->FileName,
1353 DirectoryCB->NameInformation.FileName.Buffer,
1356 *Length -= ulCopyLength;
1363 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1366 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1369 ulCopyLength = (LONG)DirectoryCB->NameInformation.ShortNameLength;
1371 ntStatus = STATUS_SUCCESS;
1376 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1378 ntStatus = STATUS_BUFFER_OVERFLOW;
1381 Buffer->FileNameLength = DirectoryCB->NameInformation.ShortNameLength;
1383 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1385 if( ulCopyLength > 0)
1388 RtlCopyMemory( Buffer->FileName,
1389 DirectoryCB->NameInformation.ShortName,
1390 Buffer->FileNameLength);
1392 *Length -= ulCopyLength;
1401 AFSQueryNetworkInfo( IN PIRP Irp,
1402 IN AFSDirectoryCB *DirectoryCB,
1403 IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
1404 IN OUT PLONG Length)
1407 NTSTATUS ntStatus = STATUS_SUCCESS;
1408 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1409 AFSFcb *pFcb = NULL;
1410 AFSCcb *pCcb = NULL;
1411 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1412 AFSFileInfoCB stFileInfo;
1413 AFSDirectoryCB *pParentDirectoryCB = NULL;
1414 UNICODE_STRING uniParentPath;
1415 ULONG ulFileAttribs = 0;
1417 RtlZeroMemory( Buffer,
1420 if( *Length >= sizeof( FILE_NETWORK_OPEN_INFORMATION))
1423 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1425 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1426 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1428 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1431 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1433 AFSRetrieveParentPath( &pCcb->FullFileName,
1436 RtlZeroMemory( &stFileInfo,
1437 sizeof( AFSFileInfoCB));
1440 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1443 AFSReleaseResource( &pFcb->NPFcb->Resource);
1445 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1453 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
1456 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
1461 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1464 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1467 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
1471 AFSAcquireShared( &pFcb->NPFcb->Resource,
1475 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1476 AFS_TRACE_LEVEL_VERBOSE_2,
1477 "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1478 &pCcb->DirectoryCB->NameInformation.FileName,
1479 pCcb->DirectoryCB->ObjectInformation->FileType,
1480 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1483 Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1484 Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1485 Buffer->LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1486 Buffer->ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1488 Buffer->AllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1489 Buffer->EndOfFile.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1491 Buffer->FileAttributes = ulFileAttribs;
1493 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1494 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1497 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1500 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1505 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1509 *Length -= sizeof( FILE_NETWORK_OPEN_INFORMATION);
1514 ntStatus = STATUS_BUFFER_TOO_SMALL;
1521 AFSQueryStreamInfo( IN PIRP Irp,
1522 IN AFSDirectoryCB *DirectoryCB,
1523 IN OUT FILE_STREAM_INFORMATION *Buffer,
1524 IN OUT PLONG Length)
1527 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1528 ULONG ulCopyLength = 0;
1529 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1531 if( *Length >= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName))
1534 RtlZeroMemory( Buffer,
1537 Buffer->NextEntryOffset = 0;
1540 if( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1543 if( *Length >= (LONG)(FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName) + 14)) // ::$DATA
1548 ntStatus = STATUS_SUCCESS;
1553 ulCopyLength = *Length - FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1555 ntStatus = STATUS_BUFFER_OVERFLOW;
1558 Buffer->StreamNameLength = 14; // ::$DATA
1560 Buffer->StreamSize.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1562 Buffer->StreamAllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1564 *Length -= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1566 if( ulCopyLength > 0)
1569 RtlCopyMemory( Buffer->StreamName,
1573 *Length -= ulCopyLength;
1579 Buffer->StreamNameLength = 0; // No stream for a directory
1581 // The response size is zero
1583 ntStatus = STATUS_SUCCESS;
1591 AFSQueryAttribTagInfo( IN PIRP Irp,
1592 IN AFSDirectoryCB *DirectoryCB,
1593 IN OUT FILE_ATTRIBUTE_TAG_INFORMATION *Buffer,
1594 IN OUT PLONG Length)
1597 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1598 ULONG ulCopyLength = 0;
1599 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1600 AFSFcb *pFcb = NULL;
1601 AFSCcb *pCcb = NULL;
1602 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1603 AFSFileInfoCB stFileInfo;
1604 AFSDirectoryCB *pParentDirectoryCB = NULL;
1605 UNICODE_STRING uniParentPath;
1606 ULONG ulFileAttribs = 0;
1608 if( *Length >= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION))
1611 RtlZeroMemory( Buffer,
1614 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1616 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1617 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1619 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1622 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1624 AFSRetrieveParentPath( &pCcb->FullFileName,
1627 RtlZeroMemory( &stFileInfo,
1628 sizeof( AFSFileInfoCB));
1631 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1634 AFSReleaseResource( &pFcb->NPFcb->Resource);
1636 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1644 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
1647 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
1652 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1655 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1658 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
1662 AFSAcquireShared( &pFcb->NPFcb->Resource,
1666 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1667 AFS_TRACE_LEVEL_VERBOSE_2,
1668 "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1669 &pCcb->DirectoryCB->NameInformation.FileName,
1670 pCcb->DirectoryCB->ObjectInformation->FileType,
1671 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1674 Buffer->FileAttributes = ulFileAttribs;
1676 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1677 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1680 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1683 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1688 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1692 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
1694 Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
1697 *Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
1699 ntStatus = STATUS_SUCCESS;
1706 AFSQueryRemoteProtocolInfo( IN PIRP Irp,
1707 IN AFSDirectoryCB *DirectoryCB,
1708 IN OUT FILE_REMOTE_PROTOCOL_INFORMATION *Buffer,
1709 IN OUT PLONG Length)
1712 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1713 ULONG ulCopyLength = 0;
1714 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1716 if( *Length >= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION))
1719 RtlZeroMemory( Buffer,
1722 Buffer->StructureVersion = 1;
1724 Buffer->StructureSize = sizeof(FILE_REMOTE_PROTOCOL_INFORMATION);
1726 Buffer->Protocol = WNNC_NET_OPENAFS;
1728 Buffer->ProtocolMajorVersion = 3;
1730 Buffer->ProtocolMinorVersion = 0;
1732 Buffer->ProtocolRevision = 0;
1734 *Length -= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION);
1736 ntStatus = STATUS_SUCCESS;
1743 AFSQueryPhysicalNameInfo( IN PIRP Irp,
1744 IN AFSDirectoryCB *DirectoryCB,
1745 IN OUT PFILE_NETWORK_PHYSICAL_NAME_INFORMATION Buffer,
1746 IN OUT PLONG Length)
1749 NTSTATUS ntStatus = STATUS_SUCCESS;
1750 ULONG ulCopyLength = 0;
1751 ULONG cchCopied = 0;
1752 AFSFcb *pFcb = NULL;
1753 AFSCcb *pCcb = NULL;
1754 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1755 BOOLEAN bAddLeadingSlash = FALSE;
1756 USHORT usFullNameLength = 0;
1758 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1760 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1762 if( *Length >= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName))
1765 RtlZeroMemory( Buffer,
1768 if( pCcb->FullFileName.Length == 0 ||
1769 pCcb->FullFileName.Buffer[ 0] != L'\\')
1771 bAddLeadingSlash = TRUE;
1774 usFullNameLength = pCcb->FullFileName.Length;
1776 if( bAddLeadingSlash)
1778 usFullNameLength += sizeof( WCHAR);
1781 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1783 ulCopyLength = (LONG)usFullNameLength;
1788 ulCopyLength = *Length - FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1790 ntStatus = STATUS_BUFFER_OVERFLOW;
1793 Buffer->FileNameLength = (ULONG)usFullNameLength;
1795 *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1797 if( ulCopyLength > 0)
1800 if( bAddLeadingSlash)
1803 Buffer->FileName[ cchCopied] = L'\\';
1805 ulCopyLength -= sizeof( WCHAR);
1806 *Length -= sizeof( WCHAR);
1810 if( ulCopyLength >= pCcb->FullFileName.Length)
1813 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1814 pCcb->FullFileName.Buffer,
1815 pCcb->FullFileName.Length);
1817 ulCopyLength -= pCcb->FullFileName.Length;
1818 *Length -= pCcb->FullFileName.Length;
1819 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1824 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1825 pCcb->FullFileName.Buffer,
1828 *Length -= ulCopyLength;
1835 ntStatus = STATUS_BUFFER_TOO_SMALL;
1842 AFSSetBasicInfo( IN PIRP Irp,
1843 IN AFSDirectoryCB *DirectoryCB)
1845 NTSTATUS ntStatus = STATUS_SUCCESS;
1846 PFILE_BASIC_INFORMATION pBuffer;
1847 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1848 ULONG ulNotifyFilter = 0;
1849 AFSCcb *pCcb = NULL;
1854 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1856 pBuffer = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
1858 pCcb->FileUnwindInfo.FileAttributes = (ULONG)-1;
1860 if( pBuffer->FileAttributes != (ULONGLONG)0)
1863 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_FILE_FCB &&
1864 BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1867 try_return( ntStatus = STATUS_INVALID_PARAMETER);
1870 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1873 pBuffer->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1876 pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
1878 DirectoryCB->ObjectInformation->FileAttributes = pBuffer->FileAttributes;
1880 ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
1882 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
1885 pCcb->FileUnwindInfo.CreationTime.QuadPart = (ULONGLONG)-1;
1887 if( pBuffer->CreationTime.QuadPart != (ULONGLONG)-1 &&
1888 pBuffer->CreationTime.QuadPart != (ULONGLONG)0)
1891 pCcb->FileUnwindInfo.CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1893 DirectoryCB->ObjectInformation->CreationTime.QuadPart = pBuffer->CreationTime.QuadPart;
1895 ulNotifyFilter |= FILE_NOTIFY_CHANGE_CREATION;
1897 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CREATE_TIME);
1900 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = (ULONGLONG)-1;
1902 if( pBuffer->LastAccessTime.QuadPart != (ULONGLONG)-1 &&
1903 pBuffer->LastAccessTime.QuadPart != (ULONGLONG)0)
1906 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1908 DirectoryCB->ObjectInformation->LastAccessTime.QuadPart = pBuffer->LastAccessTime.QuadPart;
1910 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1912 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_ACCESS_TIME);
1915 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = (ULONGLONG)-1;
1917 if( pBuffer->LastWriteTime.QuadPart != (ULONGLONG)-1 &&
1918 pBuffer->LastWriteTime.QuadPart != (ULONGLONG)0)
1921 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1923 DirectoryCB->ObjectInformation->LastWriteTime.QuadPart = pBuffer->LastWriteTime.QuadPart;
1925 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
1927 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
1930 pCcb->FileUnwindInfo.ChangeTime.QuadPart = (ULONGLONG)-1;
1932 if( pBuffer->ChangeTime.QuadPart != (ULONGLONG)-1 &&
1933 pBuffer->ChangeTime.QuadPart != (ULONGLONG)0)
1936 pCcb->FileUnwindInfo.ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1938 DirectoryCB->ObjectInformation->ChangeTime.QuadPart = pBuffer->ChangeTime.QuadPart;
1940 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1942 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
1945 if( ulNotifyFilter > 0)
1948 if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
1951 AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
1953 (ULONG)ulNotifyFilter,
1954 (ULONG)FILE_ACTION_MODIFIED);
1967 AFSSetDispositionInfo( IN PIRP Irp,
1968 IN AFSDirectoryCB *DirectoryCB)
1970 NTSTATUS ntStatus = STATUS_SUCCESS;
1971 PFILE_DISPOSITION_INFORMATION pBuffer;
1972 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1973 AFSFcb *pFcb = NULL;
1974 AFSCcb *pCcb = NULL;
1979 pBuffer = (PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
1981 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1983 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1986 // Can't delete the root
1989 if( pFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
1992 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1993 AFS_TRACE_LEVEL_ERROR,
1994 "AFSSetDispositionInfo Attempt to delete root entry\n");
1996 try_return( ntStatus = STATUS_CANNOT_DELETE);
2000 // If the file is read only then do not allow the delete
2003 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_READONLY))
2006 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2007 AFS_TRACE_LEVEL_ERROR,
2008 "AFSSetDispositionInfo Attempt to delete read only entry %wZ\n",
2009 &DirectoryCB->NameInformation.FileName);
2011 try_return( ntStatus = STATUS_CANNOT_DELETE);
2014 if( pBuffer->DeleteFile)
2018 // Check if the caller can delete the file
2021 ntStatus = AFSNotifyDelete( DirectoryCB,
2025 if( !NT_SUCCESS( ntStatus))
2028 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2029 AFS_TRACE_LEVEL_ERROR,
2030 "AFSSetDispositionInfo Cannot delete entry %wZ Status %08lX\n",
2031 &DirectoryCB->NameInformation.FileName,
2034 try_return( ntStatus);
2037 if( pFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2041 // Check if this is a directory that there are not currently other opens
2044 if( pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2047 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2048 AFS_TRACE_LEVEL_ERROR,
2049 "AFSSetDispositionInfo Attempt to delete directory %wZ with open %u handles\n",
2050 &DirectoryCB->NameInformation.FileName,
2051 pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount);
2053 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
2056 if( !AFSIsDirectoryEmptyForDelete( pFcb))
2059 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2060 AFS_TRACE_LEVEL_ERROR,
2061 "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
2062 &DirectoryCB->NameInformation.FileName);
2064 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
2067 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2068 AFS_TRACE_LEVEL_VERBOSE,
2069 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2071 &DirectoryCB->NameInformation.FileName);
2073 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2075 else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
2079 // Attempt to flush any outstanding data
2082 if( !MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
2086 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2087 AFS_TRACE_LEVEL_ERROR,
2088 "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
2089 &DirectoryCB->NameInformation.FileName);
2091 try_return( ntStatus = STATUS_CANNOT_DELETE);
2095 // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
2096 // deadlock with Trend Micro's Enterprise anti-virus product
2097 // which attempts to open the file which is being deleted.
2100 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2101 AFS_TRACE_LEVEL_VERBOSE,
2102 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2104 &DirectoryCB->NameInformation.FileName);
2106 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2109 // Purge the cache as well
2112 if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
2115 if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
2121 SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
2129 ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2133 // OK, should be good to go, set the flag in the file object
2136 pIrpSp->FileObject->DeletePending = pBuffer->DeleteFile;
2147 AFSSetRenameInfo( IN PIRP Irp)
2150 NTSTATUS ntStatus = STATUS_SUCCESS;
2151 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
2152 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2153 IO_STATUS_BLOCK stIoSb = {0,0};
2154 AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
2155 AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
2156 PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject;
2157 PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
2158 PFILE_OBJECT pTargetParentFileObj = NULL;
2159 PFILE_RENAME_INFORMATION pRenameInfo = NULL;
2160 UNICODE_STRING uniTargetName, uniSourceName, uniTargetParentName;
2161 BOOLEAN bReplaceIfExists = FALSE;
2162 UNICODE_STRING uniShortName;
2163 AFSDirectoryCB *pTargetDirEntry = NULL;
2164 ULONG ulTargetCRC = 0;
2165 BOOLEAN bTargetEntryExists = FALSE;
2166 AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
2167 AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
2168 AFSFileID stNewFid, stTmpTargetFid;
2169 ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
2170 UNICODE_STRING uniFullTargetName;
2171 BOOLEAN bCommonParent = FALSE;
2172 BOOLEAN bReleaseTargetDirLock = FALSE;
2173 BOOLEAN bReleaseSourceDirLock = FALSE;
2174 BOOLEAN bDereferenceTargetParentObject = FALSE;
2175 PERESOURCE pSourceDirLock = NULL;
2181 bReplaceIfExists = pIrpSp->Parameters.SetFile.ReplaceIfExists;
2183 pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2185 pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
2186 pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
2188 pSrcObject = pSrcFcb->ObjectInformation;
2189 pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
2192 // Perform some basic checks to ensure FS integrity
2195 if( pSrcFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2199 // Can't rename the root directory
2202 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2203 AFS_TRACE_LEVEL_ERROR,
2204 "AFSSetRenameInfo Attempt to rename root entry\n");
2206 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2209 if( pSrcFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2213 // If there are any open children then fail the rename
2216 if( pSrcFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2219 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2220 AFS_TRACE_LEVEL_ERROR,
2221 "AFSSetRenameInfo Attempt to rename directory with open children %wZ\n",
2222 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2224 try_return( ntStatus = STATUS_ACCESS_DENIED);
2229 // Extract off the final component name from the Fcb
2232 uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
2233 uniSourceName.MaximumLength = uniSourceName.Length;
2235 uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
2238 // Resolve the target fileobject
2241 if( pTargetFileObj == NULL)
2244 if ( pRenameInfo->RootDirectory)
2247 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2248 AFS_TRACE_LEVEL_ERROR,
2249 "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n");
2251 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2256 uniFullTargetName.Length = (USHORT)pRenameInfo->FileNameLength;
2258 uniFullTargetName.Buffer = (PWSTR)&pRenameInfo->FileName;
2260 AFSRetrieveFinalComponent( &uniFullTargetName,
2263 AFSRetrieveParentPath( &uniFullTargetName,
2264 &uniTargetParentName);
2266 if ( uniTargetParentName.Length == 0)
2270 // This is a simple rename. Here the target directory is the same as the source parent directory
2271 // and the name is retrieved from the system buffer information
2274 pTargetParentObject = pSrcParentObject;
2279 // uniTargetParentName contains the directory the renamed object
2280 // will be moved to. Must obtain the TargetParentObject.
2283 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2284 AFS_TRACE_LEVEL_ERROR,
2285 "AFSSetRenameInfo Attempt to move %wZ to %wZ -- not yet supported (NOT_SAME_DEVICE)\n",
2286 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2287 &uniFullTargetName);
2289 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2293 pTargetDcb = pTargetParentObject->Fcb;
2299 // So here we have the target directory taken from the targetfile object
2302 pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
2304 pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
2306 pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
2309 // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
2310 // it is only the target component of the rename operation
2313 uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
2317 // The quick check to see if they are not really performing a rename
2318 // Do the names match? Only do this where the parent directories are
2322 if( pTargetParentObject == pSrcParentObject)
2325 if( FsRtlAreNamesEqual( &uniTargetName,
2330 try_return( ntStatus = STATUS_SUCCESS);
2333 bCommonParent = TRUE;
2338 bCommonParent = FALSE;
2342 // We do not allow cross-volume renames to occur
2345 if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
2348 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2349 AFS_TRACE_LEVEL_ERROR,
2350 "AFSSetRenameInfo Attempt to rename directory to different volume %wZ\n",
2351 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2353 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2356 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2359 AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2362 bReleaseTargetDirLock = TRUE;
2364 if( pTargetParentObject != pSrcParentObject)
2366 AFSAcquireExcl( pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2369 bReleaseSourceDirLock = TRUE;
2371 pSourceDirLock = pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock;
2374 AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
2378 if( pTargetDirEntry == NULL)
2382 // Missed so perform a case insensitive lookup
2385 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2388 AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
2393 if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
2394 pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
2399 // Try the short name
2401 AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
2407 // Increment our ref count on the dir entry
2410 if( pTargetDirEntry != NULL)
2413 ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
2415 lCount = InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
2417 if( !bReplaceIfExists)
2420 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2421 AFS_TRACE_LEVEL_ERROR,
2422 "AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
2423 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2424 &pTargetDirEntry->NameInformation.FileName);
2426 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
2429 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2430 AFS_TRACE_LEVEL_ERROR,
2431 "AFSSetRenameInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
2432 &pTargetDirEntry->NameInformation.FileName,
2434 pTargetDirEntry->OpenReferenceCount);
2437 // Pull the directory entry from the parent
2440 AFSRemoveDirNodeFromParent( pTargetParentObject,
2444 bTargetEntryExists = TRUE;
2448 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2449 AFS_TRACE_LEVEL_VERBOSE,
2450 "AFSSetRenameInfo Target does NOT exist, normal rename\n");
2454 // We need to remove the DirEntry from the parent node, update the index
2455 // and reinsert it into the parent tree. Note that for entries with the
2456 // same parent we do not pull the node from the enumeration list
2459 AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
2460 pSrcCcb->DirectoryCB,
2464 // OK, this is a simple rename. Issue the rename
2465 // request to the service.
2468 ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
2469 &pSrcCcb->AuthGroup,
2470 pSrcFcb->ObjectInformation->ParentObjectInformation,
2471 pTargetDcb->ObjectInformation,
2472 pSrcCcb->DirectoryCB,
2476 if( !NT_SUCCESS( ntStatus))
2480 // Attempt to re-insert the directory entry
2483 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2484 pSrcCcb->DirectoryCB,
2487 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2488 AFS_TRACE_LEVEL_ERROR,
2489 "AFSSetRenameInfo Failed rename of %wZ to target %wZ Status %08lX\n",
2490 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2494 try_return( ntStatus);
2498 // Set the notification up for the source file
2501 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
2502 !bTargetEntryExists)
2505 ulNotificationAction = FILE_ACTION_RENAMED_OLD_NAME;
2510 ulNotificationAction = FILE_ACTION_REMOVED;
2513 if( pSrcCcb->DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
2516 ulNotifyFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
2521 ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
2524 AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
2526 (ULONG)ulNotifyFilter,
2527 (ULONG)ulNotificationAction);
2530 // Update the name in the dir entry.
2533 ntStatus = AFSUpdateDirEntryName( pSrcCcb->DirectoryCB,
2536 if( !NT_SUCCESS( ntStatus))
2540 // Attempt to re-insert the directory entry
2543 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2544 pSrcCcb->DirectoryCB,
2547 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2548 AFS_TRACE_LEVEL_ERROR,
2549 "AFSSetRenameInfo Failed update of dir entry %wZ to target %wZ Status %08lX\n",
2550 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2554 try_return( ntStatus);
2558 // Update the object information block, if needed
2561 if( !AFSIsEqualFID( &pSrcObject->FileId,
2565 AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
2569 // Remove the old information entry
2572 AFSRemoveHashEntry( &pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
2573 &pSrcObject->TreeEntry);
2575 RtlCopyMemory( &pSrcObject->FileId,
2577 sizeof( AFSFileID));
2580 // Insert the entry into the new object table.
2583 pSrcObject->TreeEntry.HashIndex = AFSCreateLowIndex( &pSrcObject->FileId);
2585 if( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead == NULL)
2588 pSrcObject->VolumeCB->ObjectInfoTree.TreeHead = &pSrcObject->TreeEntry;
2593 if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
2594 &pSrcObject->TreeEntry)))
2598 // Lost a race, an ObjectInfo object already exists for this FID.
2599 // Let this copy be garbage collected.
2602 ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
2606 AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);
2610 // Update the hash values for the name trees.
2613 pSrcCcb->DirectoryCB->CaseSensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
2616 pSrcCcb->DirectoryCB->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
2619 if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
2620 pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0 &&
2621 !RtlIsNameLegalDOS8Dot3( &pSrcCcb->DirectoryCB->NameInformation.FileName,
2626 uniShortName.Length = pSrcCcb->DirectoryCB->NameInformation.ShortNameLength;
2627 uniShortName.MaximumLength = uniShortName.Length;
2628 uniShortName.Buffer = pSrcCcb->DirectoryCB->NameInformation.ShortName;
2630 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
2633 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2634 AFS_TRACE_LEVEL_VERBOSE,
2635 "AFSSetRenameInfo Initialized short name hash for %wZ longname %wZ\n",
2637 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2642 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
2649 // Update the file index for the object in the new parent
2652 pSrcCcb->DirectoryCB->FileIndex = (ULONG)InterlockedIncrement( &pTargetParentObject->Specific.Directory.DirectoryNodeHdr.ContentIndex);
2656 // Re-insert the directory entry
2659 AFSInsertDirectoryNode( pTargetParentObject,
2660 pSrcCcb->DirectoryCB,
2664 // Update the parent pointer in the source object if they are different
2667 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
2670 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2672 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2674 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
2676 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
2678 pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
2680 ulNotificationAction = FILE_ACTION_ADDED;
2685 ulNotificationAction = FILE_ACTION_RENAMED_NEW_NAME;
2689 // Now update the notification for the target file
2692 AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
2694 (ULONG)ulNotifyFilter,
2695 (ULONG)ulNotificationAction);
2698 // If we performed the rename of the target because it existed, we now need to
2699 // delete the tmp target we created above
2702 if( bTargetEntryExists)
2705 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2706 AFS_TRACE_LEVEL_VERBOSE,
2707 "AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
2709 &pTargetDirEntry->NameInformation.FileName);
2711 SetFlag( pTargetDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2714 // Try and purge the cache map if this is a file
2717 if( pTargetDirEntry->ObjectInformation->FileType == AFS_FILE_TYPE_FILE &&
2718 pTargetDirEntry->ObjectInformation->Fcb != NULL &&
2719 pTargetDirEntry->OpenReferenceCount > 1)
2722 pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
2724 AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
2728 // Close the section in the event it was mapped
2731 if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
2735 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2736 AFS_TRACE_LEVEL_ERROR,
2737 "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
2738 &pTargetDirEntry->NameInformation.FileName);
2741 AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
2744 ASSERT( pTargetDirEntry->OpenReferenceCount > 0);
2746 lCount = InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount); // The count we added above
2751 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2752 AFS_TRACE_LEVEL_VERBOSE,
2753 "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
2755 &pTargetDirEntry->NameInformation.FileName);
2757 AFSDeleteDirEntry( pTargetParentObject,
2761 pTargetDirEntry = NULL;
2767 if( !NT_SUCCESS( ntStatus))
2770 if( bTargetEntryExists)
2772 AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
2778 if( pTargetDirEntry != NULL)
2781 lCount = InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
2784 if( bReleaseTargetDirLock)
2786 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
2789 if( bReleaseSourceDirLock)
2791 AFSReleaseResource( pSourceDirLock);
2795 if ( bDereferenceTargetParentObject)
2798 ObDereferenceObject( pTargetParentFileObj);
2805 AFSSetPositionInfo( IN PIRP Irp,
2806 IN AFSDirectoryCB *DirectoryCB)
2808 NTSTATUS ntStatus = STATUS_SUCCESS;
2809 PFILE_POSITION_INFORMATION pBuffer;
2810 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2812 pBuffer = (PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2814 pIrpSp->FileObject->CurrentByteOffset.QuadPart = pBuffer->CurrentByteOffset.QuadPart;
2820 AFSSetAllocationInfo( IN PIRP Irp,
2821 IN AFSDirectoryCB *DirectoryCB)
2823 NTSTATUS ntStatus = STATUS_SUCCESS;
2824 PFILE_ALLOCATION_INFORMATION pBuffer;
2825 BOOLEAN bReleasePaging = FALSE;
2826 BOOLEAN bTellCc = FALSE;
2827 BOOLEAN bTellService = FALSE;
2828 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2829 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
2830 AFSFcb *pFcb = NULL;
2831 AFSCcb *pCcb = NULL;
2832 LARGE_INTEGER liSaveAlloc;
2833 LARGE_INTEGER liSaveFileSize;
2834 LARGE_INTEGER liSaveVDL;
2836 pBuffer = (PFILE_ALLOCATION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2838 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
2840 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
2843 // save values to put back
2845 liSaveAlloc = pFcb->Header.AllocationSize;
2846 liSaveFileSize = pFcb->Header.FileSize;
2847 liSaveVDL = pFcb->Header.ValidDataLength;
2849 if( pFcb->Header.AllocationSize.QuadPart == pBuffer->AllocationSize.QuadPart ||
2850 pIrpSp->Parameters.SetFile.AdvanceOnly)
2852 return STATUS_SUCCESS ;
2855 if( pFcb->Header.AllocationSize.QuadPart > pBuffer->AllocationSize.QuadPart)
2858 // Truncating the file
2860 if( !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
2861 &pBuffer->AllocationSize))
2864 ntStatus = STATUS_USER_MAPPED_FILE ;
2869 // If this is a truncation we need to grab the paging IO resource.
2872 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2873 AFS_TRACE_LEVEL_VERBOSE,
2874 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
2875 &pFcb->NPFcb->PagingResource,
2876 PsGetCurrentThread());
2878 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
2881 bReleasePaging = TRUE;
2884 // Must drop the Fcb Resource. When changing the file size
2885 // a deadlock can occur with Trend Micro's filter if the file
2886 // size is set to zero.
2889 AFSReleaseResource( &pFcb->NPFcb->Resource);
2891 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
2893 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
2896 // Tell Cc that Allocation is moved.
2900 if( pFcb->Header.FileSize.QuadPart > pBuffer->AllocationSize.QuadPart)
2903 // We are pulling the EOF back as well so we need to tell
2906 bTellService = TRUE;
2908 pFcb->Header.FileSize = pBuffer->AllocationSize;
2910 pFcb->ObjectInformation->EndOfFile = pBuffer->AllocationSize;
2918 // Tell Cc if allocation is increased.
2921 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2922 AFS_TRACE_LEVEL_VERBOSE,
2923 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
2924 &pFcb->NPFcb->PagingResource,
2925 PsGetCurrentThread());
2927 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
2930 bReleasePaging = TRUE;
2933 // Must drop the Fcb Resource. When changing the file size
2934 // a deadlock can occur with Trend Micro's filter if the file
2935 // size is set to zero.
2938 AFSReleaseResource( &pFcb->NPFcb->Resource);
2940 bTellCc = pBuffer->AllocationSize.QuadPart > pFcb->Header.AllocationSize.QuadPart;
2942 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
2944 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
2948 // Now Tell the server if we have to
2952 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
2953 pFcb->ObjectInformation,
2957 if (NT_SUCCESS(ntStatus))
2960 // Trim extents if we told the service - the update has done an implicit
2961 // trim at the service.
2965 AFSTrimExtents( pFcb,
2966 &pFcb->Header.FileSize);
2969 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
2971 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
2974 CcIsFileCached( pFileObject))
2976 CcSetFileSizes( pFileObject,
2977 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
2983 // Put the saved values back
2985 pFcb->Header.ValidDataLength = liSaveVDL;
2986 pFcb->Header.FileSize = liSaveFileSize;
2987 pFcb->Header.AllocationSize = liSaveAlloc;
2988 pFcb->ObjectInformation->EndOfFile = liSaveFileSize;
2989 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
2995 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
2997 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3005 AFSSetEndOfFileInfo( IN PIRP Irp,
3006 IN AFSDirectoryCB *DirectoryCB)
3008 NTSTATUS ntStatus = STATUS_SUCCESS;
3009 PFILE_END_OF_FILE_INFORMATION pBuffer;
3010 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3011 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
3012 LARGE_INTEGER liSaveSize;
3013 LARGE_INTEGER liSaveVDL;
3014 LARGE_INTEGER liSaveAlloc;
3015 BOOLEAN bModified = FALSE;
3016 BOOLEAN bReleasePaging = FALSE;
3017 BOOLEAN bTruncated = FALSE;
3018 AFSFcb *pFcb = NULL;
3019 AFSCcb *pCcb = NULL;
3021 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3023 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3025 pBuffer = (PFILE_END_OF_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3027 liSaveSize = pFcb->Header.FileSize;
3028 liSaveAlloc = pFcb->Header.AllocationSize;
3029 liSaveVDL = pFcb->Header.ValidDataLength;
3031 if( pFcb->Header.FileSize.QuadPart != pBuffer->EndOfFile.QuadPart &&
3032 !pIrpSp->Parameters.SetFile.AdvanceOnly)
3035 if( pBuffer->EndOfFile.QuadPart < pFcb->Header.FileSize.QuadPart)
3038 // Truncating the file
3039 if( !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
3040 &pBuffer->EndOfFile))
3043 ntStatus = STATUS_USER_MAPPED_FILE;
3049 // If this is a truncation we need to grab the paging
3052 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3053 AFS_TRACE_LEVEL_VERBOSE,
3054 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3055 &pFcb->NPFcb->PagingResource,
3056 PsGetCurrentThread());
3058 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3061 bReleasePaging = TRUE;
3064 // Must drop the Fcb Resource. When changing the file size
3065 // a deadlock can occur with Trend Micro's filter if the file
3066 // size is set to zero.
3069 AFSReleaseResource( &pFcb->NPFcb->Resource);
3071 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3073 pFcb->Header.FileSize = pBuffer->EndOfFile;
3075 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3077 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3079 if( pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
3082 pFcb->Header.ValidDataLength = pFcb->Header.FileSize;
3094 // extending the file, move EOF
3098 // If this is a truncation we need to grab the paging
3101 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3102 AFS_TRACE_LEVEL_VERBOSE,
3103 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3104 &pFcb->NPFcb->PagingResource,
3105 PsGetCurrentThread());
3107 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3110 bReleasePaging = TRUE;
3113 // Must drop the Fcb Resource. When changing the file size
3114 // a deadlock can occur with Trend Micro's filter if the file
3115 // size is set to zero.
3118 AFSReleaseResource( &pFcb->NPFcb->Resource);
3120 pFcb->Header.FileSize = pBuffer->EndOfFile;
3122 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3124 if (pFcb->Header.FileSize.QuadPart > pFcb->Header.AllocationSize.QuadPart)
3127 // And Allocation as needed.
3129 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3131 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3141 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
3143 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
3149 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
3150 pFcb->ObjectInformation,
3153 if( NT_SUCCESS(ntStatus))
3156 // We are now good to go so tell CC.
3158 CcSetFileSizes( pFileObject,
3159 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
3162 // And give up those extents
3167 AFSTrimExtents( pFcb,
3168 &pFcb->Header.FileSize);
3173 pFcb->Header.ValidDataLength = liSaveVDL;
3174 pFcb->Header.FileSize = liSaveSize;
3175 pFcb->Header.AllocationSize = liSaveAlloc;
3176 pFcb->ObjectInformation->EndOfFile = liSaveSize;
3177 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
3184 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
3186 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3194 AFSProcessShareSetInfo( IN IRP *Irp,
3199 NTSTATUS ntStatus = STATUS_SUCCESS;
3200 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3201 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
3202 FILE_INFORMATION_CLASS ulFileInformationClass;
3203 void *pPipeInfo = NULL;
3207 ulFileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
3209 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3210 AFS_TRACE_LEVEL_VERBOSE,
3211 "AFSProcessShareSetInfo On pipe %wZ Class %08lX\n",
3212 &Ccb->DirectoryCB->NameInformation.FileName,
3213 ulFileInformationClass);
3215 pPipeInfo = AFSLockSystemBuffer( Irp,
3216 pIrpSp->Parameters.SetFile.Length);
3218 if( pPipeInfo == NULL)
3221 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3222 AFS_TRACE_LEVEL_ERROR,
3223 "AFSProcessShareSetInfo Failed to lock buffer on pipe %wZ\n",
3224 &Ccb->DirectoryCB->NameInformation.FileName);
3226 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3230 // Send the request to the service
3233 ntStatus = AFSNotifySetPipeInfo( Ccb,
3234 (ULONG)ulFileInformationClass,
3235 pIrpSp->Parameters.SetFile.Length,
3238 if( !NT_SUCCESS( ntStatus))
3241 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3242 AFS_TRACE_LEVEL_ERROR,
3243 "AFSProcessShareSetInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3244 &Ccb->DirectoryCB->NameInformation.FileName,
3247 try_return( ntStatus);
3250 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3251 AFS_TRACE_LEVEL_VERBOSE,
3252 "AFSProcessShareSetInfo Completed request on pipe %wZ Class %08lX\n",
3253 &Ccb->DirectoryCB->NameInformation.FileName,
3254 ulFileInformationClass);
3265 AFSProcessShareQueryInfo( IN IRP *Irp,
3270 NTSTATUS ntStatus = STATUS_SUCCESS;
3271 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3272 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
3273 FILE_INFORMATION_CLASS ulFileInformationClass;
3274 void *pPipeInfo = NULL;
3279 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3281 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3282 AFS_TRACE_LEVEL_VERBOSE,
3283 "AFSProcessShareQueryInfo On pipe %wZ Class %08lX\n",
3284 &Ccb->DirectoryCB->NameInformation.FileName,
3285 ulFileInformationClass);
3287 pPipeInfo = AFSLockSystemBuffer( Irp,
3288 pIrpSp->Parameters.QueryFile.Length);
3290 if( pPipeInfo == NULL)
3293 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3294 AFS_TRACE_LEVEL_ERROR,
3295 "AFSProcessShareQueryInfo Failed to lock buffer on pipe %wZ\n",
3296 &Ccb->DirectoryCB->NameInformation.FileName);
3298 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3302 // Send the request to the service
3305 ntStatus = AFSNotifyQueryPipeInfo( Ccb,
3306 (ULONG)ulFileInformationClass,
3307 pIrpSp->Parameters.QueryFile.Length,
3309 (ULONG *)&Irp->IoStatus.Information);
3311 if( !NT_SUCCESS( ntStatus))
3314 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3315 AFS_TRACE_LEVEL_ERROR,
3316 "AFSProcessShareQueryInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3317 &Ccb->DirectoryCB->NameInformation.FileName,
3320 try_return( ntStatus);
3323 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3324 AFS_TRACE_LEVEL_VERBOSE,
3325 "AFSProcessShareQueryInfo Completed request on pipe %wZ Class %08lX\n",
3326 &Ccb->DirectoryCB->NameInformation.FileName,
3327 ulFileInformationClass);
3338 AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
3341 IN OUT LONG *Length)
3344 NTSTATUS ntStatus = STATUS_SUCCESS;
3345 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3346 FILE_INFORMATION_CLASS ulFileInformationClass;
3351 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3353 switch( ulFileInformationClass)
3356 case FileBasicInformation:
3359 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3360 AFS_TRACE_LEVEL_VERBOSE,
3361 "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
3363 if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
3365 PFILE_BASIC_INFORMATION pBasic = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3367 pBasic->CreationTime.QuadPart = 0;
3368 pBasic->LastAccessTime.QuadPart = 0;
3369 pBasic->ChangeTime.QuadPart = 0;
3370 pBasic->LastWriteTime.QuadPart = 0;
3371 pBasic->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
3373 *Length -= sizeof( FILE_BASIC_INFORMATION);
3377 ntStatus = STATUS_BUFFER_TOO_SMALL;
3383 case FileStandardInformation:
3386 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3387 AFS_TRACE_LEVEL_VERBOSE,
3388 "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
3390 if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
3392 PFILE_STANDARD_INFORMATION pStandard = (PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3394 pStandard->NumberOfLinks = 1;
3395 pStandard->DeletePending = 0;
3396 pStandard->AllocationSize.QuadPart = 0;
3397 pStandard->EndOfFile.QuadPart = 0;
3398 pStandard->Directory = 0;
3400 *Length -= sizeof( FILE_STANDARD_INFORMATION);
3404 ntStatus = STATUS_BUFFER_TOO_SMALL;
3410 case FileNormalizedNameInformation:
3411 case FileNameInformation:
3414 ULONG ulCopyLength = 0;
3415 AFSFcb *pFcb = NULL;
3416 AFSCcb *pCcb = NULL;
3417 USHORT usFullNameLength = 0;
3418 PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3419 UNICODE_STRING uniName;
3421 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3422 AFS_TRACE_LEVEL_VERBOSE,
3423 "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
3425 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3426 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3428 if( *Length < FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
3430 ntStatus = STATUS_BUFFER_TOO_SMALL;
3434 RtlZeroMemory( pNameInfo,
3437 usFullNameLength = sizeof( WCHAR) +
3438 AFSServerName.Length +
3439 pCcb->FullFileName.Length;
3441 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
3443 ulCopyLength = (LONG)usFullNameLength;
3447 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
3448 ntStatus = STATUS_BUFFER_OVERFLOW;
3451 pNameInfo->FileNameLength = (ULONG)usFullNameLength;
3453 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
3455 if( ulCopyLength > 0)
3458 pNameInfo->FileName[ 0] = L'\\';
3459 ulCopyLength -= sizeof( WCHAR);
3461 *Length -= sizeof( WCHAR);
3463 if( ulCopyLength >= AFSServerName.Length)
3466 RtlCopyMemory( &pNameInfo->FileName[ 1],
3467 AFSServerName.Buffer,
3468 AFSServerName.Length);
3470 ulCopyLength -= AFSServerName.Length;
3471 *Length -= AFSServerName.Length;
3473 if( ulCopyLength >= pCcb->FullFileName.Length)
3476 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
3477 pCcb->FullFileName.Buffer,
3478 pCcb->FullFileName.Length);
3480 ulCopyLength -= pCcb->FullFileName.Length;
3481 *Length -= pCcb->FullFileName.Length;
3483 uniName.Length = (USHORT)pNameInfo->FileNameLength;
3484 uniName.MaximumLength = uniName.Length;
3485 uniName.Buffer = pNameInfo->FileName;
3490 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
3491 pCcb->FullFileName.Buffer,
3494 *Length -= ulCopyLength;
3496 uniName.Length = (USHORT)(sizeof( WCHAR) + AFSServerName.Length + ulCopyLength);
3497 uniName.MaximumLength = uniName.Length;
3498 uniName.Buffer = pNameInfo->FileName;
3501 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3502 AFS_TRACE_LEVEL_VERBOSE,
3503 "AFSProcessPIOCtlQueryInfo (FileNameInformation) Returning %wZ\n",
3511 case FileInternalInformation:
3514 PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3516 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3517 AFS_TRACE_LEVEL_VERBOSE,
3518 "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
3520 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
3523 pInternalInfo->IndexNumber.HighPart = 0;
3525 pInternalInfo->IndexNumber.LowPart = 0;
3527 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
3532 ntStatus = STATUS_BUFFER_TOO_SMALL;
3538 case FileAllInformation:
3540 ntStatus = STATUS_INVALID_PARAMETER;
3542 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3543 AFS_TRACE_LEVEL_WARNING,
3544 "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
3549 case FileEaInformation:
3551 ntStatus = STATUS_INVALID_PARAMETER;
3553 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3554 AFS_TRACE_LEVEL_WARNING,
3555 "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
3560 case FilePositionInformation:
3562 ntStatus = STATUS_INVALID_PARAMETER;
3564 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3565 AFS_TRACE_LEVEL_WARNING,
3566 "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
3571 case FileAlternateNameInformation:
3573 ntStatus = STATUS_INVALID_PARAMETER;
3575 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3576 AFS_TRACE_LEVEL_WARNING,
3577 "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
3582 case FileNetworkOpenInformation:
3584 ntStatus = STATUS_INVALID_PARAMETER;
3586 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3587 AFS_TRACE_LEVEL_WARNING,
3588 "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
3593 case FileStreamInformation:
3595 ntStatus = STATUS_INVALID_PARAMETER;
3597 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3598 AFS_TRACE_LEVEL_WARNING,
3599 "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
3604 case FileAttributeTagInformation:
3606 ntStatus = STATUS_INVALID_PARAMETER;
3608 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3609 AFS_TRACE_LEVEL_WARNING,
3610 "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
3615 case FileRemoteProtocolInformation:
3617 ntStatus = STATUS_INVALID_PARAMETER;
3619 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3620 AFS_TRACE_LEVEL_WARNING,
3621 "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
3626 case FileNetworkPhysicalNameInformation:
3628 ntStatus = STATUS_INVALID_PARAMETER;
3630 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3631 AFS_TRACE_LEVEL_WARNING,
3632 "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
3639 ntStatus = STATUS_INVALID_PARAMETER;
3641 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3642 AFS_TRACE_LEVEL_WARNING,
3643 "AFSProcessPIOCtlQueryInfo Not handling request %08lX\n",
3644 ulFileInformationClass);
3651 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3652 AFS_TRACE_LEVEL_VERBOSE,
3653 "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",