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;
75 // Determine the type of request this request is
78 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
80 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
85 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
86 AFS_TRACE_LEVEL_ERROR,
87 "AFSQueryFileInfo Attempted access (%08lX) when pFcb == NULL\n",
90 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
93 lLength = (LONG)pIrpSp->Parameters.QueryFile.Length;
94 stFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
95 pBuffer = Irp->AssociatedIrp.SystemBuffer;
97 if ( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
100 RtlZeroMemory( &stAuthGroup,
103 AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
104 (ULONGLONG)PsGetCurrentThreadId(),
107 ntStatus = AFSVerifyEntry( &stAuthGroup,
110 if ( NT_SUCCESS( ntStatus))
113 ClearFlag( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
118 ntStatus = STATUS_SUCCESS;
123 // Grab the main shared right off the bat
126 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
127 AFS_TRACE_LEVEL_VERBOSE,
128 "AFSQueryFileInfo Acquiring Fcb lock %08lX SHARED %08lX\n",
129 &pFcb->NPFcb->Resource,
130 PsGetCurrentThread());
132 AFSAcquireShared( &pFcb->NPFcb->Resource,
138 // Don't allow requests against IOCtl nodes
141 if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
144 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
145 AFS_TRACE_LEVEL_VERBOSE,
146 "AFSQueryFileInfo Processing request against SpecialShare Fcb\n");
148 ntStatus = AFSProcessShareQueryInfo( Irp,
152 try_return( ntStatus);
154 else if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
156 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
157 AFS_TRACE_LEVEL_VERBOSE,
158 "AFSQueryFileInfo request against PIOCtl Fcb\n");
160 ntStatus = AFSProcessPIOCtlQueryInfo( Irp,
165 try_return( ntStatus);
168 else if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB)
170 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
171 AFS_TRACE_LEVEL_VERBOSE,
172 "AFSQueryFileInfo request against Invalid Fcb\n");
174 try_return( ntStatus = STATUS_ACCESS_DENIED);
178 // Process the request
181 switch( stFileInformationClass)
184 case FileAllInformation:
187 PFILE_ALL_INFORMATION pAllInfo;
190 // For the all information class we'll typecast a local
191 // pointer to the output buffer and then call the
192 // individual routines to fill in the buffer.
195 pAllInfo = (PFILE_ALL_INFORMATION)pBuffer;
197 ntStatus = AFSQueryBasicInfo( Irp,
199 &pAllInfo->BasicInformation,
202 if( !NT_SUCCESS( ntStatus))
205 try_return( ntStatus);
208 ntStatus = AFSQueryStandardInfo( Irp,
210 &pAllInfo->StandardInformation,
213 if( !NT_SUCCESS( ntStatus))
216 try_return( ntStatus);
219 ntStatus = AFSQueryInternalInfo( Irp,
221 &pAllInfo->InternalInformation,
224 if( !NT_SUCCESS( ntStatus))
227 try_return( ntStatus);
230 ntStatus = AFSQueryEaInfo( Irp,
232 &pAllInfo->EaInformation,
235 if( !NT_SUCCESS( ntStatus))
238 try_return( ntStatus);
241 ntStatus = AFSQueryAccess( Irp,
243 &pAllInfo->AccessInformation,
246 if( !NT_SUCCESS( ntStatus))
249 try_return( ntStatus);
252 ntStatus = AFSQueryPositionInfo( Irp,
254 &pAllInfo->PositionInformation,
257 if( !NT_SUCCESS( ntStatus))
260 try_return( ntStatus);
263 ntStatus = AFSQueryMode( Irp,
265 &pAllInfo->ModeInformation,
268 if( !NT_SUCCESS( ntStatus))
271 try_return( ntStatus);
274 ntStatus = AFSQueryAlignment( Irp,
276 &pAllInfo->AlignmentInformation,
279 if( !NT_SUCCESS( ntStatus))
282 try_return( ntStatus);
285 ntStatus = AFSQueryNameInfo( Irp,
287 &pAllInfo->NameInformation,
290 if( !NT_SUCCESS( ntStatus))
293 try_return( ntStatus);
299 case FileBasicInformation:
302 ntStatus = AFSQueryBasicInfo( Irp,
304 (PFILE_BASIC_INFORMATION)pBuffer,
310 case FileStandardInformation:
313 ntStatus = AFSQueryStandardInfo( Irp,
315 (PFILE_STANDARD_INFORMATION)pBuffer,
321 case FileInternalInformation:
324 ntStatus = AFSQueryInternalInfo( Irp,
326 (PFILE_INTERNAL_INFORMATION)pBuffer,
332 case FileEaInformation:
335 ntStatus = AFSQueryEaInfo( Irp,
337 (PFILE_EA_INFORMATION)pBuffer,
343 case FilePositionInformation:
346 ntStatus = AFSQueryPositionInfo( Irp,
348 (PFILE_POSITION_INFORMATION)pBuffer,
354 case FileNormalizedNameInformation:
355 case FileNameInformation:
358 ntStatus = AFSQueryNameInfo( Irp,
360 (PFILE_NAME_INFORMATION)pBuffer,
366 case FileAlternateNameInformation:
369 ntStatus = AFSQueryShortNameInfo( Irp,
371 (PFILE_NAME_INFORMATION)pBuffer,
377 case FileNetworkOpenInformation:
380 ntStatus = AFSQueryNetworkInfo( Irp,
382 (PFILE_NETWORK_OPEN_INFORMATION)pBuffer,
388 case FileStreamInformation:
391 ntStatus = AFSQueryStreamInfo( Irp,
393 (FILE_STREAM_INFORMATION *)pBuffer,
400 case FileAttributeTagInformation:
403 ntStatus = AFSQueryAttribTagInfo( Irp,
405 (FILE_ATTRIBUTE_TAG_INFORMATION *)pBuffer,
411 case FileRemoteProtocolInformation:
414 ntStatus = AFSQueryRemoteProtocolInfo( Irp,
416 (FILE_REMOTE_PROTOCOL_INFORMATION *)pBuffer,
422 case FileNetworkPhysicalNameInformation:
425 ntStatus = AFSQueryPhysicalNameInfo( Irp,
427 (FILE_NETWORK_PHYSICAL_NAME_INFORMATION *)pBuffer,
435 ntStatus = STATUS_INVALID_PARAMETER;
442 Irp->IoStatus.Information = pIrpSp->Parameters.QueryFile.Length - lLength;
447 AFSReleaseResource( &pFcb->NPFcb->Resource);
450 if( !NT_SUCCESS( ntStatus) &&
451 ntStatus != STATUS_INVALID_PARAMETER &&
452 ntStatus != STATUS_BUFFER_OVERFLOW)
456 pCcb->DirectoryCB != NULL)
459 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
460 AFS_TRACE_LEVEL_ERROR,
461 "AFSQueryFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
462 &pCcb->DirectoryCB->NameInformation.FileName,
463 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
464 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
465 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
466 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
471 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
476 "EXCEPTION - AFSQueryFileInfo\n");
478 AFSDumpTraceFilesFnc();
480 ntStatus = STATUS_UNSUCCESSFUL;
485 AFSReleaseResource( &pFcb->NPFcb->Resource);
489 AFSCompleteRequest( Irp,
496 // Function: AFSSetFileInfo
500 // This function is the dispatch handler for the IRP_MJ_SET_FILE_INFORMATION request
504 // A status is returned for the function
508 AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
512 NTSTATUS ntStatus = STATUS_SUCCESS;
513 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
514 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
517 BOOLEAN bCompleteRequest = TRUE;
518 FILE_INFORMATION_CLASS FileInformationClass;
519 BOOLEAN bCanQueueRequest = FALSE;
520 PFILE_OBJECT pFileObject = NULL;
521 BOOLEAN bReleaseMain = FALSE;
522 BOOLEAN bUpdateFileInfo = FALSE;
523 AFSFileID stParentFileId;
528 pFileObject = pIrpSp->FileObject;
530 pFcb = (AFSFcb *)pFileObject->FsContext;
531 pCcb = (AFSCcb *)pFileObject->FsContext2;
536 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
537 AFS_TRACE_LEVEL_ERROR,
538 "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
541 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
544 bCanQueueRequest = !(IoIsOperationSynchronous( Irp) | (KeGetCurrentIrql() != PASSIVE_LEVEL));
545 FileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
551 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
552 AFS_TRACE_LEVEL_VERBOSE,
553 "AFSSetFileInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
554 &pFcb->NPFcb->Resource,
555 PsGetCurrentThread());
557 AFSAcquireExcl( &pFcb->NPFcb->Resource,
563 // Don't allow requests against IOCtl nodes
566 if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
569 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
570 AFS_TRACE_LEVEL_ERROR,
571 "AFSSetFileInfo Failing request against PIOCtl Fcb\n");
573 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
575 else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
578 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
579 AFS_TRACE_LEVEL_VERBOSE,
580 "AFSSetFileInfo Processing request against SpecialShare Fcb\n");
582 ntStatus = AFSProcessShareSetInfo( Irp,
586 try_return( ntStatus);
589 if( BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
592 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
593 AFS_TRACE_LEVEL_ERROR,
594 "AFSSetFileInfo Request failed due to read only volume\n",
597 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
600 if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
601 FileInformationClass != FileDispositionInformation)
603 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
604 AFS_TRACE_LEVEL_VERBOSE,
605 "AFSSetFileInfo request against Invalid Fcb\n");
607 try_return( ntStatus = STATUS_ACCESS_DENIED);
611 // Ensure rename operations are synchronous
614 if( FileInformationClass == FileRenameInformation)
617 bCanQueueRequest = FALSE;
621 // Store away the parent fid
624 RtlZeroMemory( &stParentFileId,
627 if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
629 stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
633 // Process the request
636 switch( FileInformationClass)
639 case FileBasicInformation:
642 bUpdateFileInfo = TRUE;
644 ntStatus = AFSSetBasicInfo( Irp,
650 case FileDispositionInformation:
653 ntStatus = AFSSetDispositionInfo( Irp,
659 case FileRenameInformation:
662 ntStatus = AFSSetRenameInfo( Irp);
667 case FilePositionInformation:
670 ntStatus = AFSSetPositionInfo( Irp,
676 case FileLinkInformation:
679 ntStatus = AFSSetFileLinkInfo( Irp);
684 case FileAllocationInformation:
687 ntStatus = AFSSetAllocationInfo( Irp,
693 case FileEndOfFileInformation:
696 ntStatus = AFSSetEndOfFileInfo( Irp,
704 ntStatus = STATUS_INVALID_PARAMETER;
714 AFSReleaseResource( &pFcb->NPFcb->Resource);
717 if( NT_SUCCESS( ntStatus) &&
721 ntStatus = AFSUpdateFileInformation( &stParentFileId,
722 pFcb->ObjectInformation,
725 if( !NT_SUCCESS( ntStatus))
728 AFSAcquireExcl( &pFcb->NPFcb->Resource,
732 // Unwind the update and fail the request
735 AFSUnwindFileInfo( pFcb,
738 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
739 AFS_TRACE_LEVEL_ERROR,
740 "AFSSetFileInfo Failed to send file info update to service request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
741 &pCcb->DirectoryCB->NameInformation.FileName,
742 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
743 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
744 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
745 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
748 AFSReleaseResource( &pFcb->NPFcb->Resource);
752 if( !NT_SUCCESS( ntStatus))
756 pCcb->DirectoryCB != NULL)
759 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
760 AFS_TRACE_LEVEL_ERROR,
761 "AFSSetFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
762 &pCcb->DirectoryCB->NameInformation.FileName,
763 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
764 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
765 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
766 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
771 __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
776 "EXCEPTION - AFSSetFileInfo\n");
778 AFSDumpTraceFilesFnc();
780 ntStatus = STATUS_UNSUCCESSFUL;
785 AFSReleaseResource( &pFcb->NPFcb->Resource);
789 AFSCompleteRequest( Irp,
796 // Function: AFSQueryBasicInfo
800 // This function is the handler for the query basic information request
804 // A status is returned for the function
808 AFSQueryBasicInfo( IN PIRP Irp,
809 IN AFSDirectoryCB *DirectoryCB,
810 IN OUT PFILE_BASIC_INFORMATION Buffer,
813 NTSTATUS ntStatus = STATUS_SUCCESS;
814 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
815 ULONG ulFileAttribs = 0;
818 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
819 AFSFileInfoCB stFileInfo;
820 AFSDirectoryCB *pParentDirectoryCB = NULL;
821 UNICODE_STRING uniParentPath;
823 if( *Length >= sizeof( FILE_BASIC_INFORMATION))
826 RtlZeroMemory( Buffer,
829 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
831 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
832 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
834 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
837 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
839 AFSRetrieveParentPath( &pCcb->FullFileName,
842 RtlZeroMemory( &stFileInfo,
843 sizeof( AFSFileInfoCB));
846 // Can't hold the Fcb while evaluating the path, leads to lock inversion
849 AFSReleaseResource( &pFcb->NPFcb->Resource);
851 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
859 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
862 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
867 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
870 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
873 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
877 AFSAcquireShared( &pFcb->NPFcb->Resource,
882 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
883 AFS_TRACE_LEVEL_VERBOSE_2,
884 "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
885 &pCcb->DirectoryCB->NameInformation.FileName,
886 pCcb->DirectoryCB->ObjectInformation->FileType,
887 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
890 Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
891 Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
892 Buffer->LastWriteTime = DirectoryCB->ObjectInformation->LastWriteTime;
893 Buffer->ChangeTime = DirectoryCB->ObjectInformation->ChangeTime;
894 Buffer->FileAttributes = ulFileAttribs;
896 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
897 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
900 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
902 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
906 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
910 *Length -= sizeof( FILE_BASIC_INFORMATION);
915 ntStatus = STATUS_BUFFER_TOO_SMALL;
922 AFSQueryStandardInfo( IN PIRP Irp,
923 IN AFSDirectoryCB *DirectoryCB,
924 IN OUT PFILE_STANDARD_INFORMATION Buffer,
928 NTSTATUS ntStatus = STATUS_SUCCESS;
931 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
932 AFSFileInfoCB stFileInfo;
933 AFSDirectoryCB *pParentDirectoryCB = NULL;
934 UNICODE_STRING uniParentPath;
935 ULONG ulFileAttribs = 0;
937 if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
940 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
941 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
943 RtlZeroMemory( Buffer,
946 Buffer->NumberOfLinks = 1;
947 Buffer->DeletePending = BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
949 Buffer->AllocationSize.QuadPart = (ULONGLONG)((DirectoryCB->ObjectInformation->AllocationSize.QuadPart/PAGE_SIZE) + 1) * PAGE_SIZE;
951 Buffer->EndOfFile = DirectoryCB->ObjectInformation->EndOfFile;
953 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
955 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
958 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
960 AFSRetrieveParentPath( &pCcb->FullFileName,
963 RtlZeroMemory( &stFileInfo,
964 sizeof( AFSFileInfoCB));
967 // Can't hold the Fcb while evaluating the path, leads to lock inversion
970 AFSReleaseResource( &pFcb->NPFcb->Resource);
972 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
980 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
983 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
988 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
991 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
994 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
998 AFSAcquireShared( &pFcb->NPFcb->Resource,
1002 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1003 AFS_TRACE_LEVEL_VERBOSE_2,
1004 "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1005 &pCcb->DirectoryCB->NameInformation.FileName,
1006 pCcb->DirectoryCB->ObjectInformation->FileType,
1007 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1010 Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
1012 *Length -= sizeof( FILE_STANDARD_INFORMATION);
1017 ntStatus = STATUS_BUFFER_TOO_SMALL;
1024 AFSQueryInternalInfo( IN PIRP Irp,
1026 IN OUT PFILE_INTERNAL_INFORMATION Buffer,
1027 IN OUT PLONG Length)
1030 NTSTATUS ntStatus = STATUS_SUCCESS;
1032 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
1035 Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Volume;
1037 Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Vnode;
1039 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
1044 ntStatus = STATUS_BUFFER_TOO_SMALL;
1051 AFSQueryEaInfo( IN PIRP Irp,
1052 IN AFSDirectoryCB *DirectoryCB,
1053 IN OUT PFILE_EA_INFORMATION Buffer,
1054 IN OUT PLONG Length)
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 NTSTATUS ntStatus = STATUS_SUCCESS;
1086 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1088 if( *Length >= sizeof( FILE_POSITION_INFORMATION))
1091 RtlZeroMemory( Buffer,
1094 Buffer->CurrentByteOffset.QuadPart = pIrpSp->FileObject->CurrentByteOffset.QuadPart;
1096 *Length -= sizeof( FILE_POSITION_INFORMATION);
1101 ntStatus = STATUS_BUFFER_TOO_SMALL;
1108 AFSQueryAccess( IN PIRP Irp,
1110 IN OUT PFILE_ACCESS_INFORMATION Buffer,
1111 IN OUT PLONG Length)
1114 NTSTATUS ntStatus = STATUS_SUCCESS;
1116 if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
1119 RtlZeroMemory( Buffer,
1122 Buffer->AccessFlags = 0;
1124 *Length -= sizeof( FILE_ACCESS_INFORMATION);
1129 ntStatus = STATUS_BUFFER_TOO_SMALL;
1136 AFSQueryMode( IN PIRP Irp,
1138 IN OUT PFILE_MODE_INFORMATION Buffer,
1139 IN OUT PLONG Length)
1142 NTSTATUS ntStatus = STATUS_SUCCESS;
1144 if( *Length >= sizeof( FILE_MODE_INFORMATION))
1147 RtlZeroMemory( Buffer,
1152 *Length -= sizeof( FILE_MODE_INFORMATION);
1157 ntStatus = STATUS_BUFFER_TOO_SMALL;
1164 AFSQueryAlignment( IN PIRP Irp,
1166 IN OUT PFILE_ALIGNMENT_INFORMATION Buffer,
1167 IN OUT PLONG Length)
1170 NTSTATUS ntStatus = STATUS_SUCCESS;
1172 if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
1175 RtlZeroMemory( Buffer,
1178 Buffer->AlignmentRequirement = 1;
1180 *Length -= sizeof( FILE_ALIGNMENT_INFORMATION);
1185 ntStatus = STATUS_BUFFER_TOO_SMALL;
1192 AFSQueryNameInfo( IN PIRP Irp,
1193 IN AFSDirectoryCB *DirectoryCB,
1194 IN OUT PFILE_NAME_INFORMATION Buffer,
1195 IN OUT PLONG Length)
1198 NTSTATUS ntStatus = STATUS_SUCCESS;
1199 ULONG ulCopyLength = 0;
1200 ULONG cchCopied = 0;
1201 AFSFcb *pFcb = NULL;
1202 AFSCcb *pCcb = NULL;
1203 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1204 BOOLEAN bAddLeadingSlash = FALSE;
1205 BOOLEAN bAddTrailingSlash = FALSE;
1206 USHORT usFullNameLength = 0;
1208 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1210 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1212 if( *Length >= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1215 RtlZeroMemory( Buffer,
1218 if( pCcb->FullFileName.Length == 0 ||
1219 pCcb->FullFileName.Buffer[ 0] != L'\\')
1221 bAddLeadingSlash = TRUE;
1224 if( pFcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY &&
1225 pCcb->FullFileName.Length > 0 &&
1226 pCcb->FullFileName.Buffer[ (pCcb->FullFileName.Length/sizeof( WCHAR)) - 1] != L'\\')
1228 bAddTrailingSlash = TRUE;
1231 usFullNameLength = sizeof( WCHAR) +
1232 AFSServerName.Length +
1233 pCcb->FullFileName.Length;
1235 if( bAddLeadingSlash)
1237 usFullNameLength += sizeof( WCHAR);
1240 if( bAddTrailingSlash)
1242 usFullNameLength += sizeof( WCHAR);
1245 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1248 ulCopyLength = (LONG)usFullNameLength;
1253 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1255 ntStatus = STATUS_BUFFER_OVERFLOW;
1258 Buffer->FileNameLength = (ULONG)usFullNameLength;
1260 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1262 if( ulCopyLength > 0)
1265 Buffer->FileName[ 0] = L'\\';
1266 ulCopyLength -= sizeof( WCHAR);
1268 *Length -= sizeof( WCHAR);
1271 if( ulCopyLength >= AFSServerName.Length)
1274 RtlCopyMemory( &Buffer->FileName[ 1],
1275 AFSServerName.Buffer,
1276 AFSServerName.Length);
1278 ulCopyLength -= AFSServerName.Length;
1279 *Length -= AFSServerName.Length;
1280 cchCopied += AFSServerName.Length/sizeof( WCHAR);
1282 if ( ulCopyLength > 0 &&
1286 Buffer->FileName[ cchCopied] = L'\\';
1288 ulCopyLength -= sizeof( WCHAR);
1289 *Length -= sizeof( WCHAR);
1293 if( ulCopyLength >= pCcb->FullFileName.Length)
1296 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1297 pCcb->FullFileName.Buffer,
1298 pCcb->FullFileName.Length);
1300 ulCopyLength -= pCcb->FullFileName.Length;
1301 *Length -= pCcb->FullFileName.Length;
1302 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1304 if( ulCopyLength > 0 &&
1307 Buffer->FileName[ cchCopied] = L'\\';
1309 *Length -= sizeof( WCHAR);
1315 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1316 pCcb->FullFileName.Buffer,
1319 *Length -= ulCopyLength;
1327 ntStatus = STATUS_BUFFER_TOO_SMALL;
1334 AFSQueryShortNameInfo( IN PIRP Irp,
1335 IN AFSDirectoryCB *DirectoryCB,
1336 IN OUT PFILE_NAME_INFORMATION Buffer,
1337 IN OUT PLONG Length)
1340 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1341 ULONG ulCopyLength = 0;
1343 RtlZeroMemory( Buffer,
1346 if( DirectoryCB->NameInformation.ShortNameLength == 0)
1350 // The short name IS the long name
1353 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1356 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1359 ulCopyLength = (LONG)DirectoryCB->NameInformation.FileName.Length;
1361 ntStatus = STATUS_SUCCESS;
1366 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1368 ntStatus = STATUS_BUFFER_OVERFLOW;
1371 Buffer->FileNameLength = DirectoryCB->NameInformation.FileName.Length;
1373 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1375 if( ulCopyLength > 0)
1378 RtlCopyMemory( Buffer->FileName,
1379 DirectoryCB->NameInformation.FileName.Buffer,
1382 *Length -= ulCopyLength;
1389 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1392 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1395 ulCopyLength = (LONG)DirectoryCB->NameInformation.ShortNameLength;
1397 ntStatus = STATUS_SUCCESS;
1402 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1404 ntStatus = STATUS_BUFFER_OVERFLOW;
1407 Buffer->FileNameLength = DirectoryCB->NameInformation.ShortNameLength;
1409 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1411 if( ulCopyLength > 0)
1414 RtlCopyMemory( Buffer->FileName,
1415 DirectoryCB->NameInformation.ShortName,
1416 Buffer->FileNameLength);
1418 *Length -= ulCopyLength;
1427 AFSQueryNetworkInfo( IN PIRP Irp,
1428 IN AFSDirectoryCB *DirectoryCB,
1429 IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
1430 IN OUT PLONG Length)
1433 NTSTATUS ntStatus = STATUS_SUCCESS;
1434 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1435 AFSFcb *pFcb = NULL;
1436 AFSCcb *pCcb = NULL;
1437 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1438 AFSFileInfoCB stFileInfo;
1439 AFSDirectoryCB *pParentDirectoryCB = NULL;
1440 UNICODE_STRING uniParentPath;
1441 ULONG ulFileAttribs = 0;
1443 RtlZeroMemory( Buffer,
1446 if( *Length >= sizeof( FILE_NETWORK_OPEN_INFORMATION))
1449 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1451 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1452 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1454 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1457 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1459 AFSRetrieveParentPath( &pCcb->FullFileName,
1462 RtlZeroMemory( &stFileInfo,
1463 sizeof( AFSFileInfoCB));
1466 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1469 AFSReleaseResource( &pFcb->NPFcb->Resource);
1471 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1479 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
1482 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
1487 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1490 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1493 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
1497 AFSAcquireShared( &pFcb->NPFcb->Resource,
1501 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1502 AFS_TRACE_LEVEL_VERBOSE_2,
1503 "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1504 &pCcb->DirectoryCB->NameInformation.FileName,
1505 pCcb->DirectoryCB->ObjectInformation->FileType,
1506 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1509 Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1510 Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1511 Buffer->LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1512 Buffer->ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1514 Buffer->AllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1515 Buffer->EndOfFile.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1517 Buffer->FileAttributes = ulFileAttribs;
1519 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1520 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1523 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1526 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1531 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1535 *Length -= sizeof( FILE_NETWORK_OPEN_INFORMATION);
1540 ntStatus = STATUS_BUFFER_TOO_SMALL;
1547 AFSQueryStreamInfo( IN PIRP Irp,
1548 IN AFSDirectoryCB *DirectoryCB,
1549 IN OUT FILE_STREAM_INFORMATION *Buffer,
1550 IN OUT PLONG Length)
1553 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1554 ULONG ulCopyLength = 0;
1555 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1557 if( *Length >= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName))
1560 RtlZeroMemory( Buffer,
1563 Buffer->NextEntryOffset = 0;
1566 if( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1569 if( *Length >= (LONG)(FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName) + 14)) // ::$DATA
1574 ntStatus = STATUS_SUCCESS;
1579 ulCopyLength = *Length - FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1581 ntStatus = STATUS_BUFFER_OVERFLOW;
1584 Buffer->StreamNameLength = 14; // ::$DATA
1586 Buffer->StreamSize.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1588 Buffer->StreamAllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1590 *Length -= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1592 if( ulCopyLength > 0)
1595 RtlCopyMemory( Buffer->StreamName,
1599 *Length -= ulCopyLength;
1605 Buffer->StreamNameLength = 0; // No stream for a directory
1607 // The response size is zero
1609 ntStatus = STATUS_SUCCESS;
1617 AFSQueryAttribTagInfo( IN PIRP Irp,
1618 IN AFSDirectoryCB *DirectoryCB,
1619 IN OUT FILE_ATTRIBUTE_TAG_INFORMATION *Buffer,
1620 IN OUT PLONG Length)
1623 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1624 ULONG ulCopyLength = 0;
1625 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1626 AFSFcb *pFcb = NULL;
1627 AFSCcb *pCcb = NULL;
1628 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1629 AFSFileInfoCB stFileInfo;
1630 AFSDirectoryCB *pParentDirectoryCB = NULL;
1631 UNICODE_STRING uniParentPath;
1632 ULONG ulFileAttribs = 0;
1634 if( *Length >= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION))
1637 RtlZeroMemory( Buffer,
1640 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1642 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1643 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1645 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1648 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1650 AFSRetrieveParentPath( &pCcb->FullFileName,
1653 RtlZeroMemory( &stFileInfo,
1654 sizeof( AFSFileInfoCB));
1657 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1660 AFSReleaseResource( &pFcb->NPFcb->Resource);
1662 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1670 if ( ulFileAttribs == FILE_ATTRIBUTE_NORMAL)
1673 ulFileAttribs = FILE_ATTRIBUTE_REPARSE_POINT;
1678 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1681 if ( stFileInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
1684 ulFileAttribs |= FILE_ATTRIBUTE_DIRECTORY;
1688 AFSAcquireShared( &pFcb->NPFcb->Resource,
1692 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1693 AFS_TRACE_LEVEL_VERBOSE_2,
1694 "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1695 &pCcb->DirectoryCB->NameInformation.FileName,
1696 pCcb->DirectoryCB->ObjectInformation->FileType,
1697 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1700 Buffer->FileAttributes = ulFileAttribs;
1702 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1703 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1706 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1709 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1714 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1718 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
1720 Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
1723 *Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
1725 ntStatus = STATUS_SUCCESS;
1732 AFSQueryRemoteProtocolInfo( IN PIRP Irp,
1733 IN AFSDirectoryCB *DirectoryCB,
1734 IN OUT FILE_REMOTE_PROTOCOL_INFORMATION *Buffer,
1735 IN OUT PLONG Length)
1738 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1739 ULONG ulCopyLength = 0;
1740 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1742 if( *Length >= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION))
1745 RtlZeroMemory( Buffer,
1748 Buffer->StructureVersion = 1;
1750 Buffer->StructureSize = sizeof(FILE_REMOTE_PROTOCOL_INFORMATION);
1752 Buffer->Protocol = WNNC_NET_OPENAFS;
1754 Buffer->ProtocolMajorVersion = 3;
1756 Buffer->ProtocolMinorVersion = 0;
1758 Buffer->ProtocolRevision = 0;
1760 *Length -= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION);
1762 ntStatus = STATUS_SUCCESS;
1769 AFSQueryPhysicalNameInfo( IN PIRP Irp,
1770 IN AFSDirectoryCB *DirectoryCB,
1771 IN OUT PFILE_NETWORK_PHYSICAL_NAME_INFORMATION Buffer,
1772 IN OUT PLONG Length)
1775 NTSTATUS ntStatus = STATUS_SUCCESS;
1776 ULONG ulCopyLength = 0;
1777 ULONG cchCopied = 0;
1778 AFSFcb *pFcb = NULL;
1779 AFSCcb *pCcb = NULL;
1780 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1781 BOOLEAN bAddLeadingSlash = FALSE;
1782 USHORT usFullNameLength = 0;
1784 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1786 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1788 if( *Length >= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName))
1791 RtlZeroMemory( Buffer,
1794 if( pCcb->FullFileName.Length == 0 ||
1795 pCcb->FullFileName.Buffer[ 0] != L'\\')
1797 bAddLeadingSlash = TRUE;
1800 usFullNameLength = pCcb->FullFileName.Length;
1802 if( bAddLeadingSlash)
1804 usFullNameLength += sizeof( WCHAR);
1807 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1809 ulCopyLength = (LONG)usFullNameLength;
1814 ulCopyLength = *Length - FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1816 ntStatus = STATUS_BUFFER_OVERFLOW;
1819 Buffer->FileNameLength = (ULONG)usFullNameLength;
1821 *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1823 if( ulCopyLength > 0)
1826 if( bAddLeadingSlash)
1829 Buffer->FileName[ cchCopied] = L'\\';
1831 ulCopyLength -= sizeof( WCHAR);
1832 *Length -= sizeof( WCHAR);
1836 if( ulCopyLength >= pCcb->FullFileName.Length)
1839 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1840 pCcb->FullFileName.Buffer,
1841 pCcb->FullFileName.Length);
1843 ulCopyLength -= pCcb->FullFileName.Length;
1844 *Length -= pCcb->FullFileName.Length;
1845 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1850 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1851 pCcb->FullFileName.Buffer,
1854 *Length -= ulCopyLength;
1861 ntStatus = STATUS_BUFFER_TOO_SMALL;
1868 AFSSetBasicInfo( IN PIRP Irp,
1869 IN AFSDirectoryCB *DirectoryCB)
1871 NTSTATUS ntStatus = STATUS_SUCCESS;
1872 PFILE_BASIC_INFORMATION pBuffer;
1873 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1874 ULONG ulNotifyFilter = 0;
1875 AFSCcb *pCcb = NULL;
1880 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1882 pBuffer = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
1884 pCcb->FileUnwindInfo.FileAttributes = (ULONG)-1;
1886 if( pBuffer->FileAttributes != (ULONGLONG)0)
1889 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_FILE_FCB &&
1890 BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1893 try_return( ntStatus = STATUS_INVALID_PARAMETER);
1896 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1899 pBuffer->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1902 pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
1904 DirectoryCB->ObjectInformation->FileAttributes = pBuffer->FileAttributes;
1906 ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
1908 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
1911 pCcb->FileUnwindInfo.CreationTime.QuadPart = (ULONGLONG)-1;
1913 if( pBuffer->CreationTime.QuadPart != (ULONGLONG)-1 &&
1914 pBuffer->CreationTime.QuadPart != (ULONGLONG)0)
1917 pCcb->FileUnwindInfo.CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1919 DirectoryCB->ObjectInformation->CreationTime.QuadPart = pBuffer->CreationTime.QuadPart;
1921 ulNotifyFilter |= FILE_NOTIFY_CHANGE_CREATION;
1923 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CREATE_TIME);
1926 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = (ULONGLONG)-1;
1928 if( pBuffer->LastAccessTime.QuadPart != (ULONGLONG)-1 &&
1929 pBuffer->LastAccessTime.QuadPart != (ULONGLONG)0)
1932 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1934 DirectoryCB->ObjectInformation->LastAccessTime.QuadPart = pBuffer->LastAccessTime.QuadPart;
1936 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1938 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_ACCESS_TIME);
1941 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = (ULONGLONG)-1;
1943 if( pBuffer->LastWriteTime.QuadPart != (ULONGLONG)-1 &&
1944 pBuffer->LastWriteTime.QuadPart != (ULONGLONG)0)
1947 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1949 DirectoryCB->ObjectInformation->LastWriteTime.QuadPart = pBuffer->LastWriteTime.QuadPart;
1951 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
1953 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
1956 pCcb->FileUnwindInfo.ChangeTime.QuadPart = (ULONGLONG)-1;
1958 if( pBuffer->ChangeTime.QuadPart != (ULONGLONG)-1 &&
1959 pBuffer->ChangeTime.QuadPart != (ULONGLONG)0)
1962 pCcb->FileUnwindInfo.ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1964 DirectoryCB->ObjectInformation->ChangeTime.QuadPart = pBuffer->ChangeTime.QuadPart;
1966 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1968 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
1971 if( ulNotifyFilter > 0)
1974 if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
1977 AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
1979 (ULONG)ulNotifyFilter,
1980 (ULONG)FILE_ACTION_MODIFIED);
1993 AFSSetDispositionInfo( IN PIRP Irp,
1994 IN AFSDirectoryCB *DirectoryCB)
1996 NTSTATUS ntStatus = STATUS_SUCCESS;
1997 PFILE_DISPOSITION_INFORMATION pBuffer;
1998 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1999 AFSFcb *pFcb = NULL;
2000 AFSCcb *pCcb = NULL;
2005 pBuffer = (PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2007 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
2009 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
2012 // Can't delete the root
2015 if( pFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2018 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2019 AFS_TRACE_LEVEL_ERROR,
2020 "AFSSetDispositionInfo Attempt to delete root entry\n");
2022 try_return( ntStatus = STATUS_CANNOT_DELETE);
2026 // If the file is read only then do not allow the delete
2029 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_READONLY))
2032 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2033 AFS_TRACE_LEVEL_ERROR,
2034 "AFSSetDispositionInfo Attempt to delete read only entry %wZ\n",
2035 &DirectoryCB->NameInformation.FileName);
2037 try_return( ntStatus = STATUS_CANNOT_DELETE);
2040 if( pBuffer->DeleteFile)
2044 // Check if the caller can delete the file
2047 ntStatus = AFSNotifyDelete( DirectoryCB,
2051 if( !NT_SUCCESS( ntStatus))
2054 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2055 AFS_TRACE_LEVEL_ERROR,
2056 "AFSSetDispositionInfo Cannot delete entry %wZ Status %08lX\n",
2057 &DirectoryCB->NameInformation.FileName,
2060 try_return( ntStatus);
2063 if( pFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2067 // Reduce the Link count in the object information block
2068 // to correspond with the deletion of the directory entry.
2071 pFcb->ObjectInformation->Links--;
2074 // Check if this is a directory that there are not currently other opens
2077 if( pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2080 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2081 AFS_TRACE_LEVEL_ERROR,
2082 "AFSSetDispositionInfo Attempt to delete directory %wZ with open %u handles\n",
2083 &DirectoryCB->NameInformation.FileName,
2084 pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount);
2086 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
2089 if( !AFSIsDirectoryEmptyForDelete( pFcb))
2092 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2093 AFS_TRACE_LEVEL_ERROR,
2094 "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
2095 &DirectoryCB->NameInformation.FileName);
2097 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
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);
2108 else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
2111 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2112 AFS_TRACE_LEVEL_VERBOSE,
2113 "AFSSetDispositionInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
2114 &pFcb->NPFcb->SectionObjectResource,
2115 PsGetCurrentThread());
2117 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
2121 // Attempt to flush any outstanding data
2124 if( !MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
2128 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2129 AFS_TRACE_LEVEL_ERROR,
2130 "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
2131 &DirectoryCB->NameInformation.FileName);
2133 try_return( ntStatus = STATUS_CANNOT_DELETE);
2137 // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
2138 // deadlock with Trend Micro's Enterprise anti-virus product
2139 // which attempts to open the file which is being deleted.
2142 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2143 AFS_TRACE_LEVEL_VERBOSE,
2144 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2146 &DirectoryCB->NameInformation.FileName);
2148 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2151 // Purge the cache as well
2154 if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
2157 if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
2163 SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
2167 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2168 AFS_TRACE_LEVEL_VERBOSE,
2169 "AFSSetDispositionInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
2170 &pFcb->NPFcb->SectionObjectResource,
2171 PsGetCurrentThread());
2173 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
2179 ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2183 // OK, should be good to go, set the flag in the file object
2186 pIrpSp->FileObject->DeletePending = pBuffer->DeleteFile;
2197 AFSSetFileLinkInfo( IN PIRP Irp)
2200 NTSTATUS ntStatus = STATUS_SUCCESS;
2201 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
2202 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2203 IO_STATUS_BLOCK stIoSb = {0,0};
2204 PFILE_LINK_INFORMATION pFileLinkInfo = NULL;
2205 PFILE_OBJECT pSrcFileObj = NULL;
2206 PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
2207 AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
2208 AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
2209 AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
2210 AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
2211 UNICODE_STRING uniSourceName, uniTargetName;
2212 UNICODE_STRING uniFullTargetName, uniTargetParentName;
2213 UNICODE_STRING uniShortName;
2214 BOOLEAN bCommonParent = FALSE;
2215 AFSDirectoryCB *pTargetDirEntry = NULL;
2216 AFSDirectoryCB *pNewTargetDirEntry = NULL;
2218 BOOLEAN bTargetEntryExists = FALSE;
2220 BOOLEAN bReleaseTargetDirLock = FALSE;
2222 ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
2227 pSrcFileObj = pIrpSp->FileObject;
2229 pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
2230 pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
2232 pSrcObject = pSrcFcb->ObjectInformation;
2233 pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
2235 pFileLinkInfo = (PFILE_LINK_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2238 // Perform some basic checks to ensure FS integrity
2241 if( pSrcFcb->Header.NodeTypeCode != AFS_FILE_FCB)
2244 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2245 AFS_TRACE_LEVEL_ERROR,
2246 "AFSSetFileLinkInfo Attempt to non-file (INVALID_PARAMETER)\n");
2248 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2251 if( pTargetFileObj == NULL)
2254 if ( pFileLinkInfo->RootDirectory)
2258 // The target directory is provided by HANDLE
2259 // RootDirectory is only set when the target directory is not the same
2260 // as the source directory.
2262 // AFS only supports hard links within a single directory.
2264 // The IOManager should translate any Handle to a FileObject for us.
2265 // However, the failure to receive a FileObject is treated as a fatal
2269 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2270 AFS_TRACE_LEVEL_ERROR,
2271 "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory by handle INVALID_PARAMETER\n",
2272 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2274 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2279 uniFullTargetName.Length = (USHORT)pFileLinkInfo->FileNameLength;
2281 uniFullTargetName.Buffer = (PWSTR)&pFileLinkInfo->FileName;
2283 AFSRetrieveFinalComponent( &uniFullTargetName,
2286 AFSRetrieveParentPath( &uniFullTargetName,
2287 &uniTargetParentName);
2289 if ( uniTargetParentName.Length == 0)
2293 // This is a simple rename. Here the target directory is the same as the source parent directory
2294 // and the name is retrieved from the system buffer information
2297 pTargetParentObject = pSrcParentObject;
2302 // uniTargetParentName contains the directory the renamed object
2303 // will be moved to. Must obtain the TargetParentObject.
2306 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2307 AFS_TRACE_LEVEL_ERROR,
2308 "AFSSetFileLinkInfo Attempt to link %wZ to alternate directory %wZ (NOT_SAME_DEVICE)\n",
2309 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2310 &uniFullTargetName);
2312 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2316 pTargetDcb = pTargetParentObject->Fcb;
2322 // So here we have the target directory taken from the targetfile object
2325 pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
2327 pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
2329 pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
2332 // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
2333 // it is only the target component of the rename operation
2336 uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
2340 // The quick check to see if they are self linking.
2341 // Do the names match? Only do this where the parent directories are
2345 if( pTargetParentObject == pSrcParentObject)
2348 if( FsRtlAreNamesEqual( &uniTargetName,
2353 try_return( ntStatus = STATUS_SUCCESS);
2356 bCommonParent = TRUE;
2362 // We do not allow cross-volume hard links
2365 if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
2368 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2369 AFS_TRACE_LEVEL_ERROR,
2370 "AFSSetFileLinkInfo Attempt to link to different volume %wZ\n",
2371 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2373 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2377 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2380 AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2383 bReleaseTargetDirLock = TRUE;
2385 AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
2389 if( pTargetDirEntry == NULL)
2393 // Missed so perform a case insensitive lookup
2396 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2399 AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
2404 if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
2405 pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
2410 // Try the short name
2412 AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
2418 // Increment our ref count on the dir entry
2421 if( pTargetDirEntry != NULL)
2424 ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
2426 lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
2428 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2429 AFS_TRACE_LEVEL_VERBOSE,
2430 "AFSSetFileLinkInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
2431 &pTargetDirEntry->NameInformation.FileName,
2436 ASSERT( lCount >= 0);
2438 if( !pFileLinkInfo->ReplaceIfExists)
2441 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2442 AFS_TRACE_LEVEL_ERROR,
2443 "AFSSetFileLinkInfo Attempt to link with target collision %wZ Target %wZ\n",
2444 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2445 &pTargetDirEntry->NameInformation.FileName);
2447 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
2450 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2451 AFS_TRACE_LEVEL_ERROR,
2452 "AFSSetFileLinkInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
2453 &pTargetDirEntry->NameInformation.FileName,
2455 pTargetDirEntry->DirOpenReferenceCount);
2458 // Pull the directory entry from the parent
2461 AFSRemoveDirNodeFromParent( pTargetParentObject,
2465 bTargetEntryExists = TRUE;
2469 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2470 AFS_TRACE_LEVEL_VERBOSE,
2471 "AFSSetFileLinkInfo Target does NOT exist, normal linking\n");
2475 // OK, this is a simple rename. Issue the rename
2476 // request to the service.
2479 ntStatus = AFSNotifyHardLink( pSrcFcb->ObjectInformation,
2480 &pSrcCcb->AuthGroup,
2481 pSrcFcb->ObjectInformation->ParentObjectInformation,
2482 pTargetDcb->ObjectInformation,
2483 pSrcCcb->DirectoryCB,
2485 pFileLinkInfo->ReplaceIfExists,
2486 &pNewTargetDirEntry);
2488 if( !NT_SUCCESS( ntStatus))
2491 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2492 AFS_TRACE_LEVEL_ERROR,
2493 "AFSSetFileLinkInfo Failed link of %wZ to target %wZ Status %08lX\n",
2494 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2498 try_return( ntStatus);
2501 AFSInsertDirectoryNode( pTargetDcb->ObjectInformation,
2506 // Send notification for the target link file
2509 if( bTargetEntryExists || pNewTargetDirEntry)
2512 ulNotificationAction = FILE_ACTION_MODIFIED;
2517 ulNotificationAction = FILE_ACTION_ADDED;
2520 AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
2522 (ULONG)ulNotifyFilter,
2523 (ULONG)ulNotificationAction);
2527 if( !NT_SUCCESS( ntStatus))
2530 if( bTargetEntryExists)
2533 AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
2539 if( pTargetDirEntry != NULL)
2542 lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
2544 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2545 AFS_TRACE_LEVEL_VERBOSE,
2546 "AFSSetFileLinkInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
2547 &pTargetDirEntry->NameInformation.FileName,
2552 ASSERT( lCount >= 0);
2555 if( bReleaseTargetDirLock)
2558 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
2566 AFSSetRenameInfo( IN PIRP Irp)
2569 NTSTATUS ntStatus = STATUS_SUCCESS;
2570 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
2571 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2572 IO_STATUS_BLOCK stIoSb = {0,0};
2573 AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
2574 AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
2575 PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject;
2576 PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
2577 PFILE_OBJECT pTargetParentFileObj = NULL;
2578 PFILE_RENAME_INFORMATION pRenameInfo = NULL;
2579 UNICODE_STRING uniTargetName, uniSourceName, uniTargetParentName;
2580 BOOLEAN bReplaceIfExists = FALSE;
2581 UNICODE_STRING uniShortName;
2582 AFSDirectoryCB *pTargetDirEntry = NULL;
2583 ULONG ulTargetCRC = 0;
2584 BOOLEAN bTargetEntryExists = FALSE;
2585 AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
2586 AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
2587 AFSFileID stNewFid, stTmpTargetFid;
2588 ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
2589 UNICODE_STRING uniFullTargetName;
2590 BOOLEAN bCommonParent = FALSE;
2591 BOOLEAN bReleaseTargetDirLock = FALSE;
2592 BOOLEAN bReleaseSourceDirLock = FALSE;
2593 BOOLEAN bDereferenceTargetParentObject = FALSE;
2594 PERESOURCE pSourceDirLock = NULL;
2600 bReplaceIfExists = pIrpSp->Parameters.SetFile.ReplaceIfExists;
2602 pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2604 pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
2605 pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
2607 pSrcObject = pSrcFcb->ObjectInformation;
2608 pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
2611 // Perform some basic checks to ensure FS integrity
2614 if( pSrcFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2618 // Can't rename the root directory
2621 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2622 AFS_TRACE_LEVEL_ERROR,
2623 "AFSSetRenameInfo Attempt to rename root entry\n");
2625 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2628 if( pSrcFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2632 // If there are any open children then fail the rename
2635 if( pSrcFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2638 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2639 AFS_TRACE_LEVEL_ERROR,
2640 "AFSSetRenameInfo Attempt to rename directory with open children %wZ\n",
2641 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2643 try_return( ntStatus = STATUS_ACCESS_DENIED);
2649 // Extract off the final component name from the Fcb
2652 uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
2653 uniSourceName.MaximumLength = uniSourceName.Length;
2655 uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
2658 // Resolve the target fileobject
2661 if( pTargetFileObj == NULL)
2664 if ( pRenameInfo->RootDirectory)
2667 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2668 AFS_TRACE_LEVEL_ERROR,
2669 "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n");
2671 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2676 uniFullTargetName.Length = (USHORT)pRenameInfo->FileNameLength;
2678 uniFullTargetName.Buffer = (PWSTR)&pRenameInfo->FileName;
2680 AFSRetrieveFinalComponent( &uniFullTargetName,
2683 AFSRetrieveParentPath( &uniFullTargetName,
2684 &uniTargetParentName);
2686 if ( uniTargetParentName.Length == 0)
2690 // This is a simple rename. Here the target directory is the same as the source parent directory
2691 // and the name is retrieved from the system buffer information
2694 pTargetParentObject = pSrcParentObject;
2699 // uniTargetParentName contains the directory the renamed object
2700 // will be moved to. Must obtain the TargetParentObject.
2703 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2704 AFS_TRACE_LEVEL_ERROR,
2705 "AFSSetRenameInfo Attempt to move %wZ to %wZ -- not yet supported (NOT_SAME_DEVICE)\n",
2706 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2707 &uniFullTargetName);
2709 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2713 pTargetDcb = pTargetParentObject->Fcb;
2719 // So here we have the target directory taken from the targetfile object
2722 pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
2724 pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
2726 pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
2729 // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
2730 // it is only the target component of the rename operation
2733 uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
2737 // The quick check to see if they are not really performing a rename
2738 // Do the names match? Only do this where the parent directories are
2742 if( pTargetParentObject == pSrcParentObject)
2745 if( FsRtlAreNamesEqual( &uniTargetName,
2750 try_return( ntStatus = STATUS_SUCCESS);
2753 bCommonParent = TRUE;
2758 bCommonParent = FALSE;
2762 // We do not allow cross-volume renames to occur
2765 if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
2768 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2769 AFS_TRACE_LEVEL_ERROR,
2770 "AFSSetRenameInfo Attempt to rename directory to different volume %wZ\n",
2771 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2773 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2776 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2779 AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2782 bReleaseTargetDirLock = TRUE;
2784 if( pTargetParentObject != pSrcParentObject)
2786 AFSAcquireExcl( pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2789 bReleaseSourceDirLock = TRUE;
2791 pSourceDirLock = pSrcParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock;
2794 AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
2798 if( pTargetDirEntry == NULL)
2802 // Missed so perform a case insensitive lookup
2805 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2808 AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
2813 if ( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
2814 pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
2819 // Try the short name
2821 AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
2827 // Increment our ref count on the dir entry
2830 if( pTargetDirEntry != NULL)
2833 ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
2835 lCount = InterlockedIncrement( &pTargetDirEntry->DirOpenReferenceCount);
2838 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2839 AFS_TRACE_LEVEL_VERBOSE,
2840 "AFSSetRenameInfo Increment count on %wZ DE %p Ccb %p Cnt %d\n",
2841 &pTargetDirEntry->NameInformation.FileName,
2846 ASSERT( lCount >= 0);
2848 if( !bReplaceIfExists)
2851 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2852 AFS_TRACE_LEVEL_ERROR,
2853 "AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
2854 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2855 &pTargetDirEntry->NameInformation.FileName);
2857 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
2860 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
2861 AFS_TRACE_LEVEL_ERROR,
2862 "AFSSetRenameInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
2863 &pTargetDirEntry->NameInformation.FileName,
2865 pTargetDirEntry->DirOpenReferenceCount);
2868 // Pull the directory entry from the parent
2871 AFSRemoveDirNodeFromParent( pTargetParentObject,
2875 bTargetEntryExists = TRUE;
2879 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2880 AFS_TRACE_LEVEL_VERBOSE,
2881 "AFSSetRenameInfo Target does NOT exist, normal rename\n");
2885 // We need to remove the DirEntry from the parent node, update the index
2886 // and reinsert it into the parent tree. Note that for entries with the
2887 // same parent we do not pull the node from the enumeration list
2890 AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
2891 pSrcCcb->DirectoryCB,
2895 // OK, this is a simple rename. Issue the rename
2896 // request to the service.
2899 ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
2900 &pSrcCcb->AuthGroup,
2901 pSrcFcb->ObjectInformation->ParentObjectInformation,
2902 pTargetDcb->ObjectInformation,
2903 pSrcCcb->DirectoryCB,
2907 if( !NT_SUCCESS( ntStatus))
2911 // Attempt to re-insert the directory entry
2914 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2915 pSrcCcb->DirectoryCB,
2918 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2919 AFS_TRACE_LEVEL_ERROR,
2920 "AFSSetRenameInfo Failed rename of %wZ to target %wZ Status %08lX\n",
2921 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2925 try_return( ntStatus);
2929 // Set the notification up for the source file
2932 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
2933 !bTargetEntryExists)
2936 ulNotificationAction = FILE_ACTION_RENAMED_OLD_NAME;
2941 ulNotificationAction = FILE_ACTION_REMOVED;
2944 if( pSrcCcb->DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
2947 ulNotifyFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
2952 ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
2955 AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
2957 (ULONG)ulNotifyFilter,
2958 (ULONG)ulNotificationAction);
2961 // Update the name in the dir entry.
2964 ntStatus = AFSUpdateDirEntryName( pSrcCcb->DirectoryCB,
2967 if( !NT_SUCCESS( ntStatus))
2971 // Attempt to re-insert the directory entry
2974 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2975 pSrcCcb->DirectoryCB,
2978 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2979 AFS_TRACE_LEVEL_ERROR,
2980 "AFSSetRenameInfo Failed update of dir entry %wZ to target %wZ Status %08lX\n",
2981 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2985 try_return( ntStatus);
2989 // Update the object information block, if needed
2992 if( !AFSIsEqualFID( &pSrcObject->FileId,
2996 AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
3000 // Remove the old information entry
3003 AFSRemoveHashEntry( &pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
3004 &pSrcObject->TreeEntry);
3006 RtlCopyMemory( &pSrcObject->FileId,
3008 sizeof( AFSFileID));
3011 // Insert the entry into the new object table.
3014 pSrcObject->TreeEntry.HashIndex = AFSCreateLowIndex( &pSrcObject->FileId);
3016 if( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead == NULL)
3019 pSrcObject->VolumeCB->ObjectInfoTree.TreeHead = &pSrcObject->TreeEntry;
3024 if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
3025 &pSrcObject->TreeEntry)))
3029 // Lost a race, an ObjectInfo object already exists for this FID.
3030 // Let this copy be garbage collected.
3033 ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
3037 AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);
3041 // Update the hash values for the name trees.
3044 pSrcCcb->DirectoryCB->CaseSensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
3047 pSrcCcb->DirectoryCB->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
3050 if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
3051 pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0 &&
3052 !RtlIsNameLegalDOS8Dot3( &pSrcCcb->DirectoryCB->NameInformation.FileName,
3057 uniShortName.Length = pSrcCcb->DirectoryCB->NameInformation.ShortNameLength;
3058 uniShortName.MaximumLength = uniShortName.Length;
3059 uniShortName.Buffer = pSrcCcb->DirectoryCB->NameInformation.ShortName;
3061 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
3064 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3065 AFS_TRACE_LEVEL_VERBOSE,
3066 "AFSSetRenameInfo Initialized short name hash for %wZ longname %wZ\n",
3068 &pSrcCcb->DirectoryCB->NameInformation.FileName);
3073 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
3080 // Update the file index for the object in the new parent
3083 pSrcCcb->DirectoryCB->FileIndex = (ULONG)InterlockedIncrement( &pTargetParentObject->Specific.Directory.DirectoryNodeHdr.ContentIndex);
3087 // Re-insert the directory entry
3090 AFSInsertDirectoryNode( pTargetParentObject,
3091 pSrcCcb->DirectoryCB,
3095 // Update the parent pointer in the source object if they are different
3098 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
3101 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
3103 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
3105 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
3107 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
3109 pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
3111 ulNotificationAction = FILE_ACTION_ADDED;
3116 ulNotificationAction = FILE_ACTION_RENAMED_NEW_NAME;
3120 // Now update the notification for the target file
3123 AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
3125 (ULONG)ulNotifyFilter,
3126 (ULONG)ulNotificationAction);
3129 // If we performed the rename of the target because it existed, we now need to
3130 // delete the tmp target we created above
3133 if( bTargetEntryExists)
3136 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3137 AFS_TRACE_LEVEL_VERBOSE,
3138 "AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
3140 &pTargetDirEntry->NameInformation.FileName);
3142 SetFlag( pTargetDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
3145 // Try and purge the cache map if this is a file
3148 if( pTargetDirEntry->ObjectInformation->FileType == AFS_FILE_TYPE_FILE &&
3149 pTargetDirEntry->ObjectInformation->Fcb != NULL &&
3150 pTargetDirEntry->DirOpenReferenceCount > 1)
3153 pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
3156 // MmForceSectionClosed() can eventually call back into AFSCleanup
3157 // which will need to acquire Fcb->Resource exclusively. Failure
3158 // to obtain it here before holding the SectionObjectResource will
3159 // permit the locks to be obtained out of order risking a deadlock.
3162 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3163 AFS_TRACE_LEVEL_VERBOSE,
3164 "AFSSetRenameInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
3165 &pTargetFcb->NPFcb->Resource,
3166 PsGetCurrentThread());
3168 AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
3171 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3172 AFS_TRACE_LEVEL_VERBOSE,
3173 "AFSSetRenameInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
3174 &pTargetFcb->NPFcb->SectionObjectResource,
3175 PsGetCurrentThread());
3177 AFSAcquireExcl( &pTargetFcb->NPFcb->SectionObjectResource,
3181 // Close the section in the event it was mapped
3184 if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
3188 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3189 AFS_TRACE_LEVEL_ERROR,
3190 "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
3191 &pTargetDirEntry->NameInformation.FileName);
3194 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3195 AFS_TRACE_LEVEL_VERBOSE,
3196 "AFSSetRenameInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
3197 &pTargetFcb->NPFcb->SectionObjectResource,
3198 PsGetCurrentThread());
3200 AFSReleaseResource( &pTargetFcb->NPFcb->SectionObjectResource);
3202 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3203 AFS_TRACE_LEVEL_VERBOSE,
3204 "AFSSetRenameInfo Releasing Fcb lock %08lX EXCL %08lX\n",
3205 &pTargetFcb->NPFcb->Resource,
3206 PsGetCurrentThread());
3208 AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
3211 ASSERT( pTargetDirEntry->DirOpenReferenceCount > 0);
3213 lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount); // The count we added above
3215 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3216 AFS_TRACE_LEVEL_VERBOSE,
3217 "AFSSetRenameInfo Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
3218 &pTargetDirEntry->NameInformation.FileName,
3223 ASSERT( lCount >= 0);
3228 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
3229 AFS_TRACE_LEVEL_VERBOSE,
3230 "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
3232 &pTargetDirEntry->NameInformation.FileName);
3234 AFSDeleteDirEntry( pTargetParentObject,
3238 pTargetDirEntry = NULL;
3243 if( !NT_SUCCESS( ntStatus))
3246 if( bTargetEntryExists)
3248 AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
3254 if( pTargetDirEntry != NULL)
3257 lCount = InterlockedDecrement( &pTargetDirEntry->DirOpenReferenceCount);
3259 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
3260 AFS_TRACE_LEVEL_VERBOSE,
3261 "AFSSetRenameInfo Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
3262 &pTargetDirEntry->NameInformation.FileName,
3267 ASSERT( lCount >= 0);
3270 if( bReleaseTargetDirLock)
3272 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
3275 if( bReleaseSourceDirLock)
3277 AFSReleaseResource( pSourceDirLock);
3281 if ( bDereferenceTargetParentObject)
3284 ObDereferenceObject( pTargetParentFileObj);
3291 AFSSetPositionInfo( IN PIRP Irp,
3292 IN AFSDirectoryCB *DirectoryCB)
3294 NTSTATUS ntStatus = STATUS_SUCCESS;
3295 PFILE_POSITION_INFORMATION pBuffer;
3296 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3298 pBuffer = (PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3300 pIrpSp->FileObject->CurrentByteOffset.QuadPart = pBuffer->CurrentByteOffset.QuadPart;
3306 AFSSetAllocationInfo( IN PIRP Irp,
3307 IN AFSDirectoryCB *DirectoryCB)
3309 NTSTATUS ntStatus = STATUS_SUCCESS;
3310 PFILE_ALLOCATION_INFORMATION pBuffer;
3311 BOOLEAN bReleasePaging = FALSE;
3312 BOOLEAN bTellCc = FALSE;
3313 BOOLEAN bTellService = FALSE;
3314 BOOLEAN bUserMapped = FALSE;
3315 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3316 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
3317 AFSFcb *pFcb = NULL;
3318 AFSCcb *pCcb = NULL;
3319 LARGE_INTEGER liSaveAlloc;
3320 LARGE_INTEGER liSaveFileSize;
3321 LARGE_INTEGER liSaveVDL;
3323 pBuffer = (PFILE_ALLOCATION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3325 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3327 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3330 // save values to put back
3332 liSaveAlloc = pFcb->Header.AllocationSize;
3333 liSaveFileSize = pFcb->Header.FileSize;
3334 liSaveVDL = pFcb->Header.ValidDataLength;
3336 if( pFcb->Header.AllocationSize.QuadPart == pBuffer->AllocationSize.QuadPart ||
3337 pIrpSp->Parameters.SetFile.AdvanceOnly)
3339 return STATUS_SUCCESS ;
3342 if( pFcb->Header.AllocationSize.QuadPart > pBuffer->AllocationSize.QuadPart)
3345 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3346 AFS_TRACE_LEVEL_VERBOSE,
3347 "AFSSetAllocationInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
3348 &pFcb->NPFcb->SectionObjectResource,
3349 PsGetCurrentThread());
3351 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
3354 bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
3355 &pBuffer->AllocationSize);
3357 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3358 AFS_TRACE_LEVEL_VERBOSE,
3359 "AFSSetAllocationInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
3360 &pFcb->NPFcb->SectionObjectResource,
3361 PsGetCurrentThread());
3363 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
3366 // Truncating the file
3371 ntStatus = STATUS_USER_MAPPED_FILE ;
3377 // If this is a truncation we need to grab the paging IO resource.
3380 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3381 AFS_TRACE_LEVEL_VERBOSE,
3382 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3383 &pFcb->NPFcb->PagingResource,
3384 PsGetCurrentThread());
3386 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3389 bReleasePaging = TRUE;
3392 // Must drop the Fcb Resource. When changing the file size
3393 // a deadlock can occur with Trend Micro's filter if the file
3394 // size is set to zero.
3397 AFSReleaseResource( &pFcb->NPFcb->Resource);
3399 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
3401 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
3404 // Tell Cc that Allocation is moved.
3408 if( pFcb->Header.FileSize.QuadPart > pBuffer->AllocationSize.QuadPart)
3411 // We are pulling the EOF back as well so we need to tell
3414 bTellService = TRUE;
3416 pFcb->Header.FileSize = pBuffer->AllocationSize;
3418 pFcb->ObjectInformation->EndOfFile = pBuffer->AllocationSize;
3426 // Tell Cc if allocation is increased.
3429 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3430 AFS_TRACE_LEVEL_VERBOSE,
3431 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3432 &pFcb->NPFcb->PagingResource,
3433 PsGetCurrentThread());
3435 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3438 bReleasePaging = TRUE;
3441 // Must drop the Fcb Resource. When changing the file size
3442 // a deadlock can occur with Trend Micro's filter if the file
3443 // size is set to zero.
3446 AFSReleaseResource( &pFcb->NPFcb->Resource);
3448 bTellCc = pBuffer->AllocationSize.QuadPart > pFcb->Header.AllocationSize.QuadPart;
3450 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
3452 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
3456 // Now Tell the server if we have to
3460 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
3461 pFcb->ObjectInformation,
3465 if (NT_SUCCESS(ntStatus))
3468 // Trim extents if we told the service - the update has done an implicit
3469 // trim at the service.
3473 AFSTrimExtents( pFcb,
3474 &pFcb->Header.FileSize);
3477 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
3479 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
3482 CcIsFileCached( pFileObject))
3484 CcSetFileSizes( pFileObject,
3485 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
3491 // Put the saved values back
3493 pFcb->Header.ValidDataLength = liSaveVDL;
3494 pFcb->Header.FileSize = liSaveFileSize;
3495 pFcb->Header.AllocationSize = liSaveAlloc;
3496 pFcb->ObjectInformation->EndOfFile = liSaveFileSize;
3497 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
3503 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
3505 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3513 AFSSetEndOfFileInfo( IN PIRP Irp,
3514 IN AFSDirectoryCB *DirectoryCB)
3516 NTSTATUS ntStatus = STATUS_SUCCESS;
3517 PFILE_END_OF_FILE_INFORMATION pBuffer;
3518 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3519 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
3520 LARGE_INTEGER liSaveSize;
3521 LARGE_INTEGER liSaveVDL;
3522 LARGE_INTEGER liSaveAlloc;
3523 BOOLEAN bModified = FALSE;
3524 BOOLEAN bReleasePaging = FALSE;
3525 BOOLEAN bTruncated = FALSE;
3526 BOOLEAN bUserMapped = FALSE;
3527 AFSFcb *pFcb = NULL;
3528 AFSCcb *pCcb = NULL;
3530 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3532 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3534 pBuffer = (PFILE_END_OF_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3536 liSaveSize = pFcb->Header.FileSize;
3537 liSaveAlloc = pFcb->Header.AllocationSize;
3538 liSaveVDL = pFcb->Header.ValidDataLength;
3540 if( pFcb->Header.FileSize.QuadPart != pBuffer->EndOfFile.QuadPart &&
3541 !pIrpSp->Parameters.SetFile.AdvanceOnly)
3544 if( pBuffer->EndOfFile.QuadPart < pFcb->Header.FileSize.QuadPart)
3547 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3548 AFS_TRACE_LEVEL_VERBOSE,
3549 "AFSSetEndOfFileInfo Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
3550 &pFcb->NPFcb->SectionObjectResource,
3551 PsGetCurrentThread());
3553 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
3556 bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
3557 &pBuffer->EndOfFile);
3559 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3560 AFS_TRACE_LEVEL_VERBOSE,
3561 "AFSSetEndOfFileInfo Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
3562 &pFcb->NPFcb->SectionObjectResource,
3563 PsGetCurrentThread());
3565 AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
3567 // Truncating the file
3571 ntStatus = STATUS_USER_MAPPED_FILE;
3577 // If this is a truncation we need to grab the paging
3580 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3581 AFS_TRACE_LEVEL_VERBOSE,
3582 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3583 &pFcb->NPFcb->PagingResource,
3584 PsGetCurrentThread());
3586 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3589 bReleasePaging = TRUE;
3592 // Must drop the Fcb Resource. When changing the file size
3593 // a deadlock can occur with Trend Micro's filter if the file
3594 // size is set to zero.
3597 AFSReleaseResource( &pFcb->NPFcb->Resource);
3599 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3601 pFcb->Header.FileSize = pBuffer->EndOfFile;
3603 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3605 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3607 if( pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
3610 pFcb->Header.ValidDataLength = pFcb->Header.FileSize;
3622 // extending the file, move EOF
3626 // If this is a truncation we need to grab the paging
3629 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
3630 AFS_TRACE_LEVEL_VERBOSE,
3631 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
3632 &pFcb->NPFcb->PagingResource,
3633 PsGetCurrentThread());
3635 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
3638 bReleasePaging = TRUE;
3641 // Must drop the Fcb Resource. When changing the file size
3642 // a deadlock can occur with Trend Micro's filter if the file
3643 // size is set to zero.
3646 AFSReleaseResource( &pFcb->NPFcb->Resource);
3648 pFcb->Header.FileSize = pBuffer->EndOfFile;
3650 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3652 if (pFcb->Header.FileSize.QuadPart > pFcb->Header.AllocationSize.QuadPart)
3655 // And Allocation as needed.
3657 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3659 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3669 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
3671 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
3677 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
3678 pFcb->ObjectInformation,
3681 if( NT_SUCCESS(ntStatus))
3684 // We are now good to go so tell CC.
3686 CcSetFileSizes( pFileObject,
3687 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
3690 // And give up those extents
3695 AFSTrimExtents( pFcb,
3696 &pFcb->Header.FileSize);
3701 pFcb->Header.ValidDataLength = liSaveVDL;
3702 pFcb->Header.FileSize = liSaveSize;
3703 pFcb->Header.AllocationSize = liSaveAlloc;
3704 pFcb->ObjectInformation->EndOfFile = liSaveSize;
3705 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
3712 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
3714 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3722 AFSProcessShareSetInfo( IN IRP *Irp,
3727 NTSTATUS ntStatus = STATUS_SUCCESS;
3728 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3729 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
3730 FILE_INFORMATION_CLASS ulFileInformationClass;
3731 void *pPipeInfo = NULL;
3735 ulFileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
3737 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3738 AFS_TRACE_LEVEL_VERBOSE,
3739 "AFSProcessShareSetInfo On pipe %wZ Class %08lX\n",
3740 &Ccb->DirectoryCB->NameInformation.FileName,
3741 ulFileInformationClass);
3743 pPipeInfo = AFSLockSystemBuffer( Irp,
3744 pIrpSp->Parameters.SetFile.Length);
3746 if( pPipeInfo == NULL)
3749 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3750 AFS_TRACE_LEVEL_ERROR,
3751 "AFSProcessShareSetInfo Failed to lock buffer on pipe %wZ\n",
3752 &Ccb->DirectoryCB->NameInformation.FileName);
3754 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3758 // Send the request to the service
3761 ntStatus = AFSNotifySetPipeInfo( Ccb,
3762 (ULONG)ulFileInformationClass,
3763 pIrpSp->Parameters.SetFile.Length,
3766 if( !NT_SUCCESS( ntStatus))
3769 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3770 AFS_TRACE_LEVEL_ERROR,
3771 "AFSProcessShareSetInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3772 &Ccb->DirectoryCB->NameInformation.FileName,
3775 try_return( ntStatus);
3778 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3779 AFS_TRACE_LEVEL_VERBOSE,
3780 "AFSProcessShareSetInfo Completed request on pipe %wZ Class %08lX\n",
3781 &Ccb->DirectoryCB->NameInformation.FileName,
3782 ulFileInformationClass);
3793 AFSProcessShareQueryInfo( IN IRP *Irp,
3798 NTSTATUS ntStatus = STATUS_SUCCESS;
3799 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3800 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
3801 FILE_INFORMATION_CLASS ulFileInformationClass;
3802 void *pPipeInfo = NULL;
3807 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3809 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3810 AFS_TRACE_LEVEL_VERBOSE,
3811 "AFSProcessShareQueryInfo On pipe %wZ Class %08lX\n",
3812 &Ccb->DirectoryCB->NameInformation.FileName,
3813 ulFileInformationClass);
3815 pPipeInfo = AFSLockSystemBuffer( Irp,
3816 pIrpSp->Parameters.QueryFile.Length);
3818 if( pPipeInfo == NULL)
3821 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3822 AFS_TRACE_LEVEL_ERROR,
3823 "AFSProcessShareQueryInfo Failed to lock buffer on pipe %wZ\n",
3824 &Ccb->DirectoryCB->NameInformation.FileName);
3826 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3830 // Send the request to the service
3833 ntStatus = AFSNotifyQueryPipeInfo( Ccb,
3834 (ULONG)ulFileInformationClass,
3835 pIrpSp->Parameters.QueryFile.Length,
3837 (ULONG *)&Irp->IoStatus.Information);
3839 if( !NT_SUCCESS( ntStatus))
3842 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3843 AFS_TRACE_LEVEL_ERROR,
3844 "AFSProcessShareQueryInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3845 &Ccb->DirectoryCB->NameInformation.FileName,
3848 try_return( ntStatus);
3851 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3852 AFS_TRACE_LEVEL_VERBOSE,
3853 "AFSProcessShareQueryInfo Completed request on pipe %wZ Class %08lX\n",
3854 &Ccb->DirectoryCB->NameInformation.FileName,
3855 ulFileInformationClass);
3866 AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
3869 IN OUT LONG *Length)
3872 NTSTATUS ntStatus = STATUS_SUCCESS;
3873 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3874 FILE_INFORMATION_CLASS ulFileInformationClass;
3879 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3881 switch( ulFileInformationClass)
3884 case FileBasicInformation:
3887 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3888 AFS_TRACE_LEVEL_VERBOSE,
3889 "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
3891 if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
3893 PFILE_BASIC_INFORMATION pBasic = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3895 pBasic->CreationTime.QuadPart = 0;
3896 pBasic->LastAccessTime.QuadPart = 0;
3897 pBasic->ChangeTime.QuadPart = 0;
3898 pBasic->LastWriteTime.QuadPart = 0;
3899 pBasic->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
3901 *Length -= sizeof( FILE_BASIC_INFORMATION);
3905 ntStatus = STATUS_BUFFER_TOO_SMALL;
3911 case FileStandardInformation:
3914 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3915 AFS_TRACE_LEVEL_VERBOSE,
3916 "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
3918 if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
3920 PFILE_STANDARD_INFORMATION pStandard = (PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3922 pStandard->NumberOfLinks = 1;
3923 pStandard->DeletePending = 0;
3924 pStandard->AllocationSize.QuadPart = 0;
3925 pStandard->EndOfFile.QuadPart = 0;
3926 pStandard->Directory = 0;
3928 *Length -= sizeof( FILE_STANDARD_INFORMATION);
3932 ntStatus = STATUS_BUFFER_TOO_SMALL;
3938 case FileNormalizedNameInformation:
3939 case FileNameInformation:
3942 ULONG ulCopyLength = 0;
3943 AFSFcb *pFcb = NULL;
3944 AFSCcb *pCcb = NULL;
3945 USHORT usFullNameLength = 0;
3946 PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3947 UNICODE_STRING uniName;
3949 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3950 AFS_TRACE_LEVEL_VERBOSE,
3951 "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
3953 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3954 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3956 if( *Length < FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
3958 ntStatus = STATUS_BUFFER_TOO_SMALL;
3962 RtlZeroMemory( pNameInfo,
3965 usFullNameLength = sizeof( WCHAR) +
3966 AFSServerName.Length +
3967 pCcb->FullFileName.Length;
3969 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
3971 ulCopyLength = (LONG)usFullNameLength;
3975 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
3976 ntStatus = STATUS_BUFFER_OVERFLOW;
3979 pNameInfo->FileNameLength = (ULONG)usFullNameLength;
3981 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
3983 if( ulCopyLength > 0)
3986 pNameInfo->FileName[ 0] = L'\\';
3987 ulCopyLength -= sizeof( WCHAR);
3989 *Length -= sizeof( WCHAR);
3991 if( ulCopyLength >= AFSServerName.Length)
3994 RtlCopyMemory( &pNameInfo->FileName[ 1],
3995 AFSServerName.Buffer,
3996 AFSServerName.Length);
3998 ulCopyLength -= AFSServerName.Length;
3999 *Length -= AFSServerName.Length;
4001 if( ulCopyLength >= pCcb->FullFileName.Length)
4004 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
4005 pCcb->FullFileName.Buffer,
4006 pCcb->FullFileName.Length);
4008 ulCopyLength -= pCcb->FullFileName.Length;
4009 *Length -= pCcb->FullFileName.Length;
4011 uniName.Length = (USHORT)pNameInfo->FileNameLength;
4012 uniName.MaximumLength = uniName.Length;
4013 uniName.Buffer = pNameInfo->FileName;
4018 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
4019 pCcb->FullFileName.Buffer,
4022 *Length -= ulCopyLength;
4024 uniName.Length = (USHORT)(sizeof( WCHAR) + AFSServerName.Length + ulCopyLength);
4025 uniName.MaximumLength = uniName.Length;
4026 uniName.Buffer = pNameInfo->FileName;
4029 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4030 AFS_TRACE_LEVEL_VERBOSE,
4031 "AFSProcessPIOCtlQueryInfo (FileNameInformation) Returning %wZ\n",
4039 case FileInternalInformation:
4042 PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
4044 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4045 AFS_TRACE_LEVEL_VERBOSE,
4046 "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
4048 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
4051 pInternalInfo->IndexNumber.HighPart = 0;
4053 pInternalInfo->IndexNumber.LowPart = 0;
4055 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
4060 ntStatus = STATUS_BUFFER_TOO_SMALL;
4066 case FileAllInformation:
4068 ntStatus = STATUS_INVALID_PARAMETER;
4070 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4071 AFS_TRACE_LEVEL_WARNING,
4072 "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
4077 case FileEaInformation:
4079 ntStatus = STATUS_INVALID_PARAMETER;
4081 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4082 AFS_TRACE_LEVEL_WARNING,
4083 "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
4088 case FilePositionInformation:
4090 ntStatus = STATUS_INVALID_PARAMETER;
4092 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4093 AFS_TRACE_LEVEL_WARNING,
4094 "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
4099 case FileAlternateNameInformation:
4101 ntStatus = STATUS_INVALID_PARAMETER;
4103 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4104 AFS_TRACE_LEVEL_WARNING,
4105 "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
4110 case FileNetworkOpenInformation:
4112 ntStatus = STATUS_INVALID_PARAMETER;
4114 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4115 AFS_TRACE_LEVEL_WARNING,
4116 "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
4121 case FileStreamInformation:
4123 ntStatus = STATUS_INVALID_PARAMETER;
4125 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4126 AFS_TRACE_LEVEL_WARNING,
4127 "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
4132 case FileAttributeTagInformation:
4134 ntStatus = STATUS_INVALID_PARAMETER;
4136 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4137 AFS_TRACE_LEVEL_WARNING,
4138 "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
4143 case FileRemoteProtocolInformation:
4145 ntStatus = STATUS_INVALID_PARAMETER;
4147 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4148 AFS_TRACE_LEVEL_WARNING,
4149 "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
4154 case FileNetworkPhysicalNameInformation:
4156 ntStatus = STATUS_INVALID_PARAMETER;
4158 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4159 AFS_TRACE_LEVEL_WARNING,
4160 "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
4167 ntStatus = STATUS_INVALID_PARAMETER;
4169 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4170 AFS_TRACE_LEVEL_WARNING,
4171 "AFSProcessPIOCtlQueryInfo Not handling request %08lX\n",
4172 ulFileInformationClass);
4179 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
4180 AFS_TRACE_LEVEL_VERBOSE,
4181 "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",