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 FileNameInformation:
331 ntStatus = AFSQueryNameInfo( Irp,
333 (PFILE_NAME_INFORMATION)pBuffer,
339 case FileAlternateNameInformation:
342 ntStatus = AFSQueryShortNameInfo( Irp,
344 (PFILE_NAME_INFORMATION)pBuffer,
350 case FileNetworkOpenInformation:
353 ntStatus = AFSQueryNetworkInfo( Irp,
355 (PFILE_NETWORK_OPEN_INFORMATION)pBuffer,
361 case FileStreamInformation:
364 ntStatus = AFSQueryStreamInfo( Irp,
366 (FILE_STREAM_INFORMATION *)pBuffer,
373 case FileAttributeTagInformation:
376 ntStatus = AFSQueryAttribTagInfo( Irp,
378 (FILE_ATTRIBUTE_TAG_INFORMATION *)pBuffer,
384 case FileRemoteProtocolInformation:
387 ntStatus = AFSQueryRemoteProtocolInfo( Irp,
389 (FILE_REMOTE_PROTOCOL_INFORMATION *)pBuffer,
395 case FileNetworkPhysicalNameInformation:
398 ntStatus = AFSQueryPhysicalNameInfo( Irp,
400 (FILE_NETWORK_PHYSICAL_NAME_INFORMATION *)pBuffer,
408 ntStatus = STATUS_INVALID_PARAMETER;
415 Irp->IoStatus.Information = pIrpSp->Parameters.QueryFile.Length - lLength;
420 AFSReleaseResource( &pFcb->NPFcb->Resource);
423 if( !NT_SUCCESS( ntStatus) &&
424 ntStatus != STATUS_INVALID_PARAMETER &&
425 ntStatus != STATUS_BUFFER_OVERFLOW)
429 pCcb->DirectoryCB != NULL)
432 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
433 AFS_TRACE_LEVEL_ERROR,
434 "AFSQueryFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
435 &pCcb->DirectoryCB->NameInformation.FileName,
436 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
437 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
438 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
439 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
444 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
449 "EXCEPTION - AFSQueryFileInfo\n");
451 ntStatus = STATUS_UNSUCCESSFUL;
456 AFSReleaseResource( &pFcb->NPFcb->Resource);
460 AFSCompleteRequest( Irp,
467 // Function: AFSSetFileInfo
471 // This function is the dispatch handler for the IRP_MJ_SET_FILE_INFORMATION request
475 // A status is returned for the function
479 AFSSetFileInfo( IN PDEVICE_OBJECT LibDeviceObject,
483 NTSTATUS ntStatus = STATUS_SUCCESS;
484 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
485 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
488 BOOLEAN bCompleteRequest = TRUE;
489 FILE_INFORMATION_CLASS FileInformationClass;
490 BOOLEAN bCanQueueRequest = FALSE;
491 PFILE_OBJECT pFileObject = NULL;
492 BOOLEAN bReleaseMain = FALSE;
493 BOOLEAN bUpdateFileInfo = FALSE;
494 AFSFileID stParentFileId;
499 pFileObject = pIrpSp->FileObject;
501 pFcb = (AFSFcb *)pFileObject->FsContext;
502 pCcb = (AFSCcb *)pFileObject->FsContext2;
507 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
508 AFS_TRACE_LEVEL_ERROR,
509 "AFSSetFileInfo Attempted access (%08lX) when pFcb == NULL\n",
512 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
515 bCanQueueRequest = !(IoIsOperationSynchronous( Irp) | (KeGetCurrentIrql() != PASSIVE_LEVEL));
516 FileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
522 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
523 AFS_TRACE_LEVEL_VERBOSE,
524 "AFSSetFileInfo Acquiring Fcb lock %08lX EXCL %08lX\n",
525 &pFcb->NPFcb->Resource,
526 PsGetCurrentThread());
528 AFSAcquireExcl( &pFcb->NPFcb->Resource,
534 // Don't allow requests against IOCtl nodes
537 if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
540 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
541 AFS_TRACE_LEVEL_ERROR,
542 "AFSSetFileInfo Failing request against PIOCtl Fcb\n");
544 try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
546 else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
549 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
550 AFS_TRACE_LEVEL_VERBOSE,
551 "AFSSetFileInfo Processing request against SpecialShare Fcb\n");
553 ntStatus = AFSProcessShareSetInfo( Irp,
557 try_return( ntStatus);
560 if( BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
563 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
564 AFS_TRACE_LEVEL_ERROR,
565 "AFSSetFileInfo Request failed due to read only volume\n",
568 try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
571 if( pFcb->Header.NodeTypeCode == AFS_INVALID_FCB &&
572 FileInformationClass != FileDispositionInformation)
574 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
575 AFS_TRACE_LEVEL_VERBOSE,
576 "AFSSetFileInfo request against Invalid Fcb\n");
578 try_return( ntStatus = STATUS_ACCESS_DENIED);
582 // Ensure rename operations are synchronous
585 if( FileInformationClass == FileRenameInformation)
588 bCanQueueRequest = FALSE;
592 // Store away the parent fid
595 RtlZeroMemory( &stParentFileId,
598 if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
600 stParentFileId = pFcb->ObjectInformation->ParentObjectInformation->FileId;
604 // Process the request
607 switch( FileInformationClass)
610 case FileBasicInformation:
613 bUpdateFileInfo = TRUE;
615 ntStatus = AFSSetBasicInfo( Irp,
621 case FileDispositionInformation:
624 ntStatus = AFSSetDispositionInfo( Irp,
630 case FileRenameInformation:
633 ntStatus = AFSSetRenameInfo( Irp);
638 case FilePositionInformation:
641 ntStatus = AFSSetPositionInfo( Irp,
647 case FileLinkInformation:
650 ntStatus = STATUS_INVALID_DEVICE_REQUEST;
655 case FileAllocationInformation:
658 ntStatus = AFSSetAllocationInfo( Irp,
664 case FileEndOfFileInformation:
667 ntStatus = AFSSetEndOfFileInfo( Irp,
675 ntStatus = STATUS_INVALID_PARAMETER;
685 AFSReleaseResource( &pFcb->NPFcb->Resource);
688 if( NT_SUCCESS( ntStatus) &&
692 ntStatus = AFSUpdateFileInformation( &stParentFileId,
693 pFcb->ObjectInformation,
696 if( !NT_SUCCESS( ntStatus))
699 AFSAcquireExcl( &pFcb->NPFcb->Resource,
703 // Unwind the update and fail the request
706 AFSUnwindFileInfo( pFcb,
709 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
710 AFS_TRACE_LEVEL_ERROR,
711 "AFSSetFileInfo Failed to send file info update to service request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
712 &pCcb->DirectoryCB->NameInformation.FileName,
713 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
714 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
715 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
716 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
719 AFSReleaseResource( &pFcb->NPFcb->Resource);
723 if( !NT_SUCCESS( ntStatus))
727 pCcb->DirectoryCB != NULL)
730 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
731 AFS_TRACE_LEVEL_ERROR,
732 "AFSSetFileInfo Failed to process request for %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
733 &pCcb->DirectoryCB->NameInformation.FileName,
734 pCcb->DirectoryCB->ObjectInformation->FileId.Cell,
735 pCcb->DirectoryCB->ObjectInformation->FileId.Volume,
736 pCcb->DirectoryCB->ObjectInformation->FileId.Vnode,
737 pCcb->DirectoryCB->ObjectInformation->FileId.Unique,
742 __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
747 "EXCEPTION - AFSSetFileInfo\n");
749 ntStatus = STATUS_UNSUCCESSFUL;
754 AFSReleaseResource( &pFcb->NPFcb->Resource);
758 AFSCompleteRequest( Irp,
765 // Function: AFSQueryBasicInfo
769 // This function is the handler for the query basic information request
773 // A status is returned for the function
777 AFSQueryBasicInfo( IN PIRP Irp,
778 IN AFSDirectoryCB *DirectoryCB,
779 IN OUT PFILE_BASIC_INFORMATION Buffer,
782 NTSTATUS ntStatus = STATUS_SUCCESS;
783 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
784 ULONG ulFileAttribs = 0;
787 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
788 AFSFileInfoCB stFileInfo;
789 AFSDirectoryCB *pParentDirectoryCB = NULL;
790 UNICODE_STRING uniParentPath;
792 if( *Length >= sizeof( FILE_BASIC_INFORMATION))
795 RtlZeroMemory( Buffer,
798 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
800 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
801 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
803 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
806 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
808 AFSRetrieveParentPath( &pCcb->FullFileName,
811 RtlZeroMemory( &stFileInfo,
812 sizeof( AFSFileInfoCB));
815 // Can't hold the Fcb while evaluating the path, leads to lock inversion
818 AFSReleaseResource( &pFcb->NPFcb->Resource);
820 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
827 ulFileAttribs = stFileInfo.FileAttributes;
829 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
832 AFSAcquireShared( &pFcb->NPFcb->Resource,
837 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
838 AFS_TRACE_LEVEL_VERBOSE_2,
839 "AFSQueryBasicInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
840 &pCcb->DirectoryCB->NameInformation.FileName,
841 pCcb->DirectoryCB->ObjectInformation->FileType,
842 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
845 Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
846 Buffer->LastAccessTime = DirectoryCB->ObjectInformation->LastAccessTime;
847 Buffer->LastWriteTime = DirectoryCB->ObjectInformation->LastWriteTime;
848 Buffer->ChangeTime = DirectoryCB->ObjectInformation->ChangeTime;
849 Buffer->FileAttributes = ulFileAttribs;
851 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
852 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
855 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
857 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
861 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
865 *Length -= sizeof( FILE_BASIC_INFORMATION);
870 ntStatus = STATUS_BUFFER_TOO_SMALL;
877 AFSQueryStandardInfo( IN PIRP Irp,
878 IN AFSDirectoryCB *DirectoryCB,
879 IN OUT PFILE_STANDARD_INFORMATION Buffer,
883 NTSTATUS ntStatus = STATUS_SUCCESS;
886 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
887 AFSFileInfoCB stFileInfo;
888 AFSDirectoryCB *pParentDirectoryCB = NULL;
889 UNICODE_STRING uniParentPath;
890 ULONG ulFileAttribs = 0;
892 if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
895 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
896 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
898 RtlZeroMemory( Buffer,
901 Buffer->NumberOfLinks = 1;
902 Buffer->DeletePending = BooleanFlagOn( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
904 Buffer->AllocationSize.QuadPart = (ULONGLONG)((DirectoryCB->ObjectInformation->AllocationSize.QuadPart/PAGE_SIZE) + 1) * PAGE_SIZE;
906 Buffer->EndOfFile = DirectoryCB->ObjectInformation->EndOfFile;
908 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
910 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
913 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
915 AFSRetrieveParentPath( &pCcb->FullFileName,
918 RtlZeroMemory( &stFileInfo,
919 sizeof( AFSFileInfoCB));
922 // Can't hold the Fcb while evaluating the path, leads to lock inversion
925 AFSReleaseResource( &pFcb->NPFcb->Resource);
927 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
934 ulFileAttribs = stFileInfo.FileAttributes;
937 AFSAcquireShared( &pFcb->NPFcb->Resource,
941 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
942 AFS_TRACE_LEVEL_VERBOSE_2,
943 "AFSQueryStandardInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
944 &pCcb->DirectoryCB->NameInformation.FileName,
945 pCcb->DirectoryCB->ObjectInformation->FileType,
946 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
949 Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
951 *Length -= sizeof( FILE_STANDARD_INFORMATION);
956 ntStatus = STATUS_BUFFER_TOO_SMALL;
963 AFSQueryInternalInfo( IN PIRP Irp,
965 IN OUT PFILE_INTERNAL_INFORMATION Buffer,
969 NTSTATUS ntStatus = STATUS_SUCCESS;
971 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
974 Buffer->IndexNumber.HighPart = Fcb->ObjectInformation->FileId.Volume;
976 Buffer->IndexNumber.LowPart = Fcb->ObjectInformation->FileId.Vnode;
978 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
983 ntStatus = STATUS_BUFFER_TOO_SMALL;
990 AFSQueryEaInfo( IN PIRP Irp,
991 IN AFSDirectoryCB *DirectoryCB,
992 IN OUT PFILE_EA_INFORMATION Buffer,
996 NTSTATUS ntStatus = STATUS_SUCCESS;
998 RtlZeroMemory( Buffer,
1001 if( *Length >= sizeof( FILE_EA_INFORMATION))
1006 *Length -= sizeof( FILE_EA_INFORMATION);
1011 ntStatus = STATUS_BUFFER_TOO_SMALL;
1018 AFSQueryPositionInfo( IN PIRP Irp,
1020 IN OUT PFILE_POSITION_INFORMATION Buffer,
1021 IN OUT PLONG Length)
1024 NTSTATUS ntStatus = STATUS_SUCCESS;
1025 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1027 if( *Length >= sizeof( FILE_POSITION_INFORMATION))
1030 RtlZeroMemory( Buffer,
1033 Buffer->CurrentByteOffset.QuadPart = pIrpSp->FileObject->CurrentByteOffset.QuadPart;
1035 *Length -= sizeof( FILE_POSITION_INFORMATION);
1040 ntStatus = STATUS_BUFFER_TOO_SMALL;
1047 AFSQueryAccess( IN PIRP Irp,
1049 IN OUT PFILE_ACCESS_INFORMATION Buffer,
1050 IN OUT PLONG Length)
1053 NTSTATUS ntStatus = STATUS_SUCCESS;
1055 if( *Length >= sizeof( FILE_ACCESS_INFORMATION))
1058 RtlZeroMemory( Buffer,
1061 Buffer->AccessFlags = 0;
1063 *Length -= sizeof( FILE_ACCESS_INFORMATION);
1068 ntStatus = STATUS_BUFFER_TOO_SMALL;
1075 AFSQueryMode( IN PIRP Irp,
1077 IN OUT PFILE_MODE_INFORMATION Buffer,
1078 IN OUT PLONG Length)
1081 NTSTATUS ntStatus = STATUS_SUCCESS;
1083 if( *Length >= sizeof( FILE_MODE_INFORMATION))
1086 RtlZeroMemory( Buffer,
1091 *Length -= sizeof( FILE_MODE_INFORMATION);
1096 ntStatus = STATUS_BUFFER_TOO_SMALL;
1103 AFSQueryAlignment( IN PIRP Irp,
1105 IN OUT PFILE_ALIGNMENT_INFORMATION Buffer,
1106 IN OUT PLONG Length)
1109 NTSTATUS ntStatus = STATUS_SUCCESS;
1111 if( *Length >= sizeof( FILE_ALIGNMENT_INFORMATION))
1114 RtlZeroMemory( Buffer,
1117 Buffer->AlignmentRequirement = 1;
1119 *Length -= sizeof( FILE_ALIGNMENT_INFORMATION);
1124 ntStatus = STATUS_BUFFER_TOO_SMALL;
1131 AFSQueryNameInfo( IN PIRP Irp,
1132 IN AFSDirectoryCB *DirectoryCB,
1133 IN OUT PFILE_NAME_INFORMATION Buffer,
1134 IN OUT PLONG Length)
1137 NTSTATUS ntStatus = STATUS_SUCCESS;
1138 ULONG ulCopyLength = 0;
1139 ULONG cchCopied = 0;
1140 AFSFcb *pFcb = NULL;
1141 AFSCcb *pCcb = NULL;
1142 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1143 BOOLEAN bAddLeadingSlash = FALSE;
1144 BOOLEAN bAddTrailingSlash = FALSE;
1145 USHORT usFullNameLength = 0;
1147 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1149 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1151 if( *Length >= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1154 RtlZeroMemory( Buffer,
1157 if( pCcb->FullFileName.Length == 0 ||
1158 pCcb->FullFileName.Buffer[ 0] != L'\\')
1160 bAddLeadingSlash = TRUE;
1163 if( pFcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY &&
1164 pCcb->FullFileName.Length > 0 &&
1165 pCcb->FullFileName.Buffer[ (pCcb->FullFileName.Length/sizeof( WCHAR)) - 1] != L'\\')
1167 bAddTrailingSlash = TRUE;
1170 usFullNameLength = sizeof( WCHAR) +
1171 AFSServerName.Length +
1172 pCcb->FullFileName.Length;
1174 if( bAddLeadingSlash)
1176 usFullNameLength += sizeof( WCHAR);
1179 if( bAddTrailingSlash)
1181 usFullNameLength += sizeof( WCHAR);
1184 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1187 ulCopyLength = (LONG)usFullNameLength;
1192 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1194 ntStatus = STATUS_BUFFER_OVERFLOW;
1197 Buffer->FileNameLength = (ULONG)usFullNameLength;
1199 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1201 if( ulCopyLength > 0)
1204 Buffer->FileName[ 0] = L'\\';
1205 ulCopyLength -= sizeof( WCHAR);
1207 *Length -= sizeof( WCHAR);
1210 if( ulCopyLength >= AFSServerName.Length)
1213 RtlCopyMemory( &Buffer->FileName[ 1],
1214 AFSServerName.Buffer,
1215 AFSServerName.Length);
1217 ulCopyLength -= AFSServerName.Length;
1218 *Length -= AFSServerName.Length;
1219 cchCopied += AFSServerName.Length/sizeof( WCHAR);
1221 if ( ulCopyLength > 0 &&
1225 Buffer->FileName[ cchCopied] = L'\\';
1227 ulCopyLength -= sizeof( WCHAR);
1228 *Length -= sizeof( WCHAR);
1232 if( ulCopyLength >= pCcb->FullFileName.Length)
1235 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1236 pCcb->FullFileName.Buffer,
1237 pCcb->FullFileName.Length);
1239 ulCopyLength -= pCcb->FullFileName.Length;
1240 *Length -= pCcb->FullFileName.Length;
1241 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1243 if( ulCopyLength > 0 &&
1246 Buffer->FileName[ cchCopied] = L'\\';
1248 *Length -= sizeof( WCHAR);
1254 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1255 pCcb->FullFileName.Buffer,
1258 *Length -= ulCopyLength;
1266 ntStatus = STATUS_BUFFER_TOO_SMALL;
1273 AFSQueryShortNameInfo( IN PIRP Irp,
1274 IN AFSDirectoryCB *DirectoryCB,
1275 IN OUT PFILE_NAME_INFORMATION Buffer,
1276 IN OUT PLONG Length)
1279 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1280 ULONG ulCopyLength = 0;
1282 RtlZeroMemory( Buffer,
1285 if( DirectoryCB->NameInformation.ShortNameLength == 0)
1289 // The short name IS the long name
1292 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1295 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1298 ulCopyLength = (LONG)DirectoryCB->NameInformation.FileName.Length;
1300 ntStatus = STATUS_SUCCESS;
1305 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1307 ntStatus = STATUS_BUFFER_OVERFLOW;
1310 Buffer->FileNameLength = DirectoryCB->NameInformation.FileName.Length;
1312 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1314 if( ulCopyLength > 0)
1317 RtlCopyMemory( Buffer->FileName,
1318 DirectoryCB->NameInformation.FileName.Buffer,
1321 *Length -= ulCopyLength;
1328 if( *Length >= (LONG)FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
1331 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)DirectoryCB->NameInformation.FileName.Length))
1334 ulCopyLength = (LONG)DirectoryCB->NameInformation.ShortNameLength;
1336 ntStatus = STATUS_SUCCESS;
1341 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1343 ntStatus = STATUS_BUFFER_OVERFLOW;
1346 Buffer->FileNameLength = DirectoryCB->NameInformation.ShortNameLength;
1348 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
1350 if( ulCopyLength > 0)
1353 RtlCopyMemory( Buffer->FileName,
1354 DirectoryCB->NameInformation.ShortName,
1355 Buffer->FileNameLength);
1357 *Length -= ulCopyLength;
1366 AFSQueryNetworkInfo( IN PIRP Irp,
1367 IN AFSDirectoryCB *DirectoryCB,
1368 IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
1369 IN OUT PLONG Length)
1372 NTSTATUS ntStatus = STATUS_SUCCESS;
1373 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1374 AFSFcb *pFcb = NULL;
1375 AFSCcb *pCcb = NULL;
1376 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1377 AFSFileInfoCB stFileInfo;
1378 AFSDirectoryCB *pParentDirectoryCB = NULL;
1379 UNICODE_STRING uniParentPath;
1380 ULONG ulFileAttribs = 0;
1382 RtlZeroMemory( Buffer,
1385 if( *Length >= sizeof( FILE_NETWORK_OPEN_INFORMATION))
1388 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1390 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1391 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1393 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1396 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1398 AFSRetrieveParentPath( &pCcb->FullFileName,
1401 RtlZeroMemory( &stFileInfo,
1402 sizeof( AFSFileInfoCB));
1405 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1408 AFSReleaseResource( &pFcb->NPFcb->Resource);
1410 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1417 ulFileAttribs = stFileInfo.FileAttributes;
1419 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1422 AFSAcquireShared( &pFcb->NPFcb->Resource,
1426 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1427 AFS_TRACE_LEVEL_VERBOSE_2,
1428 "AFSQueryNetworkInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1429 &pCcb->DirectoryCB->NameInformation.FileName,
1430 pCcb->DirectoryCB->ObjectInformation->FileType,
1431 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1434 Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1435 Buffer->LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1436 Buffer->LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1437 Buffer->ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1439 Buffer->AllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1440 Buffer->EndOfFile.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1442 Buffer->FileAttributes = ulFileAttribs;
1444 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1445 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1448 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1451 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1456 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1460 *Length -= sizeof( FILE_NETWORK_OPEN_INFORMATION);
1465 ntStatus = STATUS_BUFFER_TOO_SMALL;
1472 AFSQueryStreamInfo( IN PIRP Irp,
1473 IN AFSDirectoryCB *DirectoryCB,
1474 IN OUT FILE_STREAM_INFORMATION *Buffer,
1475 IN OUT PLONG Length)
1478 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1479 ULONG ulCopyLength = 0;
1480 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1482 if( *Length >= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName))
1485 RtlZeroMemory( Buffer,
1488 Buffer->NextEntryOffset = 0;
1491 if( !BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1494 if( *Length >= (LONG)(FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName) + 14)) // ::$DATA
1499 ntStatus = STATUS_SUCCESS;
1504 ulCopyLength = *Length - FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1506 ntStatus = STATUS_BUFFER_OVERFLOW;
1509 Buffer->StreamNameLength = 14; // ::$DATA
1511 Buffer->StreamSize.QuadPart = DirectoryCB->ObjectInformation->EndOfFile.QuadPart;
1513 Buffer->StreamAllocationSize.QuadPart = DirectoryCB->ObjectInformation->AllocationSize.QuadPart;
1515 *Length -= FIELD_OFFSET( FILE_STREAM_INFORMATION, StreamName);
1517 if( ulCopyLength > 0)
1520 RtlCopyMemory( Buffer->StreamName,
1524 *Length -= ulCopyLength;
1530 Buffer->StreamNameLength = 0; // No stream for a directory
1532 // The response size is zero
1534 ntStatus = STATUS_SUCCESS;
1542 AFSQueryAttribTagInfo( IN PIRP Irp,
1543 IN AFSDirectoryCB *DirectoryCB,
1544 IN OUT FILE_ATTRIBUTE_TAG_INFORMATION *Buffer,
1545 IN OUT PLONG Length)
1548 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1549 ULONG ulCopyLength = 0;
1550 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1551 AFSFcb *pFcb = NULL;
1552 AFSCcb *pCcb = NULL;
1553 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1554 AFSFileInfoCB stFileInfo;
1555 AFSDirectoryCB *pParentDirectoryCB = NULL;
1556 UNICODE_STRING uniParentPath;
1557 ULONG ulFileAttribs = 0;
1559 if( *Length >= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION))
1562 RtlZeroMemory( Buffer,
1565 ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
1567 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1568 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1570 if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
1573 pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
1575 AFSRetrieveParentPath( &pCcb->FullFileName,
1578 RtlZeroMemory( &stFileInfo,
1579 sizeof( AFSFileInfoCB));
1582 // Can't hold the Fcb while evaluating the path, leads to lock inversion
1585 AFSReleaseResource( &pFcb->NPFcb->Resource);
1587 if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
1594 ulFileAttribs = stFileInfo.FileAttributes;
1596 ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
1599 AFSAcquireShared( &pFcb->NPFcb->Resource,
1603 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1604 AFS_TRACE_LEVEL_VERBOSE_2,
1605 "AFSAttribTagInfo %wZ Type 0x%x Attrib 0x%x -> 0x%x\n",
1606 &pCcb->DirectoryCB->NameInformation.FileName,
1607 pCcb->DirectoryCB->ObjectInformation->FileType,
1608 pCcb->DirectoryCB->ObjectInformation->FileAttributes,
1611 Buffer->FileAttributes = ulFileAttribs;
1613 if( DirectoryCB->NameInformation.FileName.Buffer[ 0] == L'.' &&
1614 BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_HIDE_DOT_NAMES))
1617 if ( Buffer->FileAttributes != FILE_ATTRIBUTE_NORMAL)
1620 Buffer->FileAttributes |= FILE_ATTRIBUTE_HIDDEN;
1625 Buffer->FileAttributes = FILE_ATTRIBUTE_HIDDEN;
1629 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
1631 Buffer->ReparseTag = IO_REPARSE_TAG_SURROGATE|IO_REPARSE_TAG_OPENAFS_DFS;
1634 *Length -= sizeof( FILE_ATTRIBUTE_TAG_INFORMATION);
1636 ntStatus = STATUS_SUCCESS;
1643 AFSQueryRemoteProtocolInfo( IN PIRP Irp,
1644 IN AFSDirectoryCB *DirectoryCB,
1645 IN OUT FILE_REMOTE_PROTOCOL_INFORMATION *Buffer,
1646 IN OUT PLONG Length)
1649 NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
1650 ULONG ulCopyLength = 0;
1651 AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
1653 if( *Length >= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION))
1656 RtlZeroMemory( Buffer,
1659 Buffer->StructureVersion = 1;
1661 Buffer->StructureSize = sizeof(FILE_REMOTE_PROTOCOL_INFORMATION);
1663 Buffer->Protocol = WNNC_NET_OPENAFS;
1665 Buffer->ProtocolMajorVersion = 3;
1667 Buffer->ProtocolMinorVersion = 0;
1669 Buffer->ProtocolRevision = 0;
1671 *Length -= sizeof( FILE_REMOTE_PROTOCOL_INFORMATION);
1673 ntStatus = STATUS_SUCCESS;
1680 AFSQueryPhysicalNameInfo( IN PIRP Irp,
1681 IN AFSDirectoryCB *DirectoryCB,
1682 IN OUT PFILE_NETWORK_PHYSICAL_NAME_INFORMATION Buffer,
1683 IN OUT PLONG Length)
1686 NTSTATUS ntStatus = STATUS_SUCCESS;
1687 ULONG ulCopyLength = 0;
1688 ULONG cchCopied = 0;
1689 AFSFcb *pFcb = NULL;
1690 AFSCcb *pCcb = NULL;
1691 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1692 BOOLEAN bAddLeadingSlash = FALSE;
1693 USHORT usFullNameLength = 0;
1695 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1697 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1699 if( *Length >= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName))
1702 RtlZeroMemory( Buffer,
1705 if( pCcb->FullFileName.Length == 0 ||
1706 pCcb->FullFileName.Buffer[ 0] != L'\\')
1708 bAddLeadingSlash = TRUE;
1711 usFullNameLength = pCcb->FullFileName.Length;
1713 if( bAddLeadingSlash)
1715 usFullNameLength += sizeof( WCHAR);
1718 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
1720 ulCopyLength = (LONG)usFullNameLength;
1725 ulCopyLength = *Length - FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1727 ntStatus = STATUS_BUFFER_OVERFLOW;
1730 Buffer->FileNameLength = (ULONG)usFullNameLength;
1732 *Length -= FIELD_OFFSET( FILE_NETWORK_PHYSICAL_NAME_INFORMATION, FileName);
1734 if( ulCopyLength > 0)
1737 if( bAddLeadingSlash)
1740 Buffer->FileName[ cchCopied] = L'\\';
1742 ulCopyLength -= sizeof( WCHAR);
1743 *Length -= sizeof( WCHAR);
1747 if( ulCopyLength >= pCcb->FullFileName.Length)
1750 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1751 pCcb->FullFileName.Buffer,
1752 pCcb->FullFileName.Length);
1754 ulCopyLength -= pCcb->FullFileName.Length;
1755 *Length -= pCcb->FullFileName.Length;
1756 cchCopied += pCcb->FullFileName.Length/sizeof( WCHAR);
1761 RtlCopyMemory( &Buffer->FileName[ cchCopied],
1762 pCcb->FullFileName.Buffer,
1765 *Length -= ulCopyLength;
1772 ntStatus = STATUS_BUFFER_TOO_SMALL;
1779 AFSSetBasicInfo( IN PIRP Irp,
1780 IN AFSDirectoryCB *DirectoryCB)
1782 NTSTATUS ntStatus = STATUS_SUCCESS;
1783 PFILE_BASIC_INFORMATION pBuffer;
1784 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1785 ULONG ulNotifyFilter = 0;
1786 AFSCcb *pCcb = NULL;
1791 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1793 pBuffer = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
1795 pCcb->FileUnwindInfo.FileAttributes = (ULONG)-1;
1797 if( pBuffer->FileAttributes != (ULONGLONG)0)
1800 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_FILE_FCB &&
1801 BooleanFlagOn( pBuffer->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
1804 try_return( ntStatus = STATUS_INVALID_PARAMETER);
1807 if( DirectoryCB->ObjectInformation->Fcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1810 pBuffer->FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
1813 pCcb->FileUnwindInfo.FileAttributes = DirectoryCB->ObjectInformation->FileAttributes;
1815 DirectoryCB->ObjectInformation->FileAttributes = pBuffer->FileAttributes;
1817 ulNotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
1819 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED);
1822 pCcb->FileUnwindInfo.CreationTime.QuadPart = (ULONGLONG)-1;
1824 if( pBuffer->CreationTime.QuadPart != (ULONGLONG)-1 &&
1825 pBuffer->CreationTime.QuadPart != (ULONGLONG)0)
1828 pCcb->FileUnwindInfo.CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
1830 DirectoryCB->ObjectInformation->CreationTime.QuadPart = pBuffer->CreationTime.QuadPart;
1832 ulNotifyFilter |= FILE_NOTIFY_CHANGE_CREATION;
1834 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CREATE_TIME);
1837 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = (ULONGLONG)-1;
1839 if( pBuffer->LastAccessTime.QuadPart != (ULONGLONG)-1 &&
1840 pBuffer->LastAccessTime.QuadPart != (ULONGLONG)0)
1843 pCcb->FileUnwindInfo.LastAccessTime.QuadPart = DirectoryCB->ObjectInformation->LastAccessTime.QuadPart;
1845 DirectoryCB->ObjectInformation->LastAccessTime.QuadPart = pBuffer->LastAccessTime.QuadPart;
1847 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1849 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_ACCESS_TIME);
1852 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = (ULONGLONG)-1;
1854 if( pBuffer->LastWriteTime.QuadPart != (ULONGLONG)-1 &&
1855 pBuffer->LastWriteTime.QuadPart != (ULONGLONG)0)
1858 pCcb->FileUnwindInfo.LastWriteTime.QuadPart = DirectoryCB->ObjectInformation->LastWriteTime.QuadPart;
1860 DirectoryCB->ObjectInformation->LastWriteTime.QuadPart = pBuffer->LastWriteTime.QuadPart;
1862 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
1864 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
1867 pCcb->FileUnwindInfo.ChangeTime.QuadPart = (ULONGLONG)-1;
1869 if( pBuffer->ChangeTime.QuadPart != (ULONGLONG)-1 &&
1870 pBuffer->ChangeTime.QuadPart != (ULONGLONG)0)
1873 pCcb->FileUnwindInfo.ChangeTime.QuadPart = DirectoryCB->ObjectInformation->ChangeTime.QuadPart;
1875 DirectoryCB->ObjectInformation->ChangeTime.QuadPart = pBuffer->ChangeTime.QuadPart;
1877 ulNotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
1879 SetFlag( DirectoryCB->ObjectInformation->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
1882 if( ulNotifyFilter > 0)
1885 if( DirectoryCB->ObjectInformation->ParentObjectInformation != NULL)
1888 AFSFsRtlNotifyFullReportChange( DirectoryCB->ObjectInformation->ParentObjectInformation,
1890 (ULONG)ulNotifyFilter,
1891 (ULONG)FILE_ACTION_MODIFIED);
1904 AFSSetDispositionInfo( IN PIRP Irp,
1905 IN AFSDirectoryCB *DirectoryCB)
1907 NTSTATUS ntStatus = STATUS_SUCCESS;
1908 PFILE_DISPOSITION_INFORMATION pBuffer;
1909 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
1910 AFSFcb *pFcb = NULL;
1911 AFSCcb *pCcb = NULL;
1916 pBuffer = (PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
1918 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
1920 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
1923 // Can't delete the root
1926 if( pFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
1929 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1930 AFS_TRACE_LEVEL_ERROR,
1931 "AFSSetDispositionInfo Attempt to delete root entry\n");
1933 try_return( ntStatus = STATUS_CANNOT_DELETE);
1937 // If the file is read only then do not allow the delete
1940 if( BooleanFlagOn( DirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_READONLY))
1943 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1944 AFS_TRACE_LEVEL_ERROR,
1945 "AFSSetDispositionInfo Attempt to delete read only entry %wZ\n",
1946 &DirectoryCB->NameInformation.FileName);
1948 try_return( ntStatus = STATUS_CANNOT_DELETE);
1951 if( pBuffer->DeleteFile)
1955 // Check if the caller can delete the file
1958 ntStatus = AFSNotifyDelete( DirectoryCB,
1962 if( !NT_SUCCESS( ntStatus))
1965 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1966 AFS_TRACE_LEVEL_ERROR,
1967 "AFSSetDispositionInfo Cannot delete entry %wZ Status %08lX\n",
1968 &DirectoryCB->NameInformation.FileName,
1971 try_return( ntStatus);
1974 if( pFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
1978 // Check if this is a directory that there are not currently other opens
1981 if( pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
1984 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1985 AFS_TRACE_LEVEL_ERROR,
1986 "AFSSetDispositionInfo Attempt to delete directory %wZ with open %u handles\n",
1987 &DirectoryCB->NameInformation.FileName,
1988 pFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount);
1990 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
1993 if( !AFSIsDirectoryEmptyForDelete( pFcb))
1996 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
1997 AFS_TRACE_LEVEL_ERROR,
1998 "AFSSetDispositionInfo Attempt to delete non-empty directory %wZ\n",
1999 &DirectoryCB->NameInformation.FileName);
2001 try_return( ntStatus = STATUS_DIRECTORY_NOT_EMPTY);
2004 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2005 AFS_TRACE_LEVEL_VERBOSE,
2006 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2008 &DirectoryCB->NameInformation.FileName);
2010 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2012 else if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
2016 // Attempt to flush any outstanding data
2019 if( !MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
2023 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2024 AFS_TRACE_LEVEL_ERROR,
2025 "AFSSetDispositionInfo Failed to flush image section for delete Entry %wZ\n",
2026 &DirectoryCB->NameInformation.FileName);
2028 try_return( ntStatus = STATUS_CANNOT_DELETE);
2032 // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
2033 // deadlock with Trend Micro's Enterprise anti-virus product
2034 // which attempts to open the file which is being deleted.
2037 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2038 AFS_TRACE_LEVEL_VERBOSE,
2039 "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
2041 &DirectoryCB->NameInformation.FileName);
2043 SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2046 // Purge the cache as well
2049 if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
2052 if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
2058 SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
2066 ClearFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
2070 // OK, should be good to go, set the flag in the file object
2073 pIrpSp->FileObject->DeletePending = pBuffer->DeleteFile;
2084 AFSSetRenameInfo( IN PIRP Irp)
2087 NTSTATUS ntStatus = STATUS_SUCCESS;
2088 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2089 IO_STATUS_BLOCK stIoSb = {0,0};
2090 AFSFcb *pSrcFcb = NULL, *pTargetDcb = NULL, *pTargetFcb = NULL;
2091 AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL;
2092 PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject;
2093 PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject;
2094 PFILE_RENAME_INFORMATION pRenameInfo = NULL;
2095 UNICODE_STRING uniTargetName, uniSourceName;
2096 BOOLEAN bReplaceIfExists = FALSE;
2097 UNICODE_STRING uniShortName;
2098 AFSDirectoryCB *pTargetDirEntry = NULL;
2099 ULONG ulTargetCRC = 0;
2100 BOOLEAN bTargetEntryExists = FALSE;
2101 AFSObjectInfoCB *pSrcObject = NULL, *pTargetObject = NULL;
2102 AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL;
2103 AFSFileID stNewFid, stTmpTargetFid;
2104 ULONG ulNotificationAction = 0, ulNotifyFilter = 0;
2105 UNICODE_STRING uniFullTargetPath;
2106 BOOLEAN bCommonParent = FALSE;
2107 BOOLEAN bReleaseTargetDirLock = FALSE;
2108 BOOLEAN bReleaseSourceDirLock = FALSE;
2109 PERESOURCE pSourceDirLock = NULL;
2115 bReplaceIfExists = pIrpSp->Parameters.SetFile.ReplaceIfExists;
2117 pSrcFcb = (AFSFcb *)pSrcFileObj->FsContext;
2118 pSrcCcb = (AFSCcb *)pSrcFileObj->FsContext2;
2120 pSrcObject = pSrcFcb->ObjectInformation;
2121 pSrcParentObject = pSrcFcb->ObjectInformation->ParentObjectInformation;
2124 // Perform some basic checks to ensure FS integrity
2127 if( pSrcFcb->Header.NodeTypeCode == AFS_ROOT_FCB)
2131 // Can't rename the root directory
2134 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2135 AFS_TRACE_LEVEL_ERROR,
2136 "AFSSetRenameInfo Attempt to rename root entry\n");
2138 try_return( ntStatus = STATUS_INVALID_PARAMETER);
2141 if( pSrcFcb->Header.NodeTypeCode == AFS_DIRECTORY_FCB)
2145 // If there are any open children then fail the rename
2148 if( pSrcFcb->ObjectInformation->Specific.Directory.ChildOpenHandleCount > 0)
2151 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2152 AFS_TRACE_LEVEL_ERROR,
2153 "AFSSetRenameInfo Attempt to rename directory with open children %wZ\n",
2154 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2156 try_return( ntStatus = STATUS_ACCESS_DENIED);
2161 // Extract off the final component name from the Fcb
2164 uniSourceName.Length = (USHORT)pSrcCcb->DirectoryCB->NameInformation.FileName.Length;
2165 uniSourceName.MaximumLength = uniSourceName.Length;
2167 uniSourceName.Buffer = pSrcCcb->DirectoryCB->NameInformation.FileName.Buffer;
2170 // Resolve the target fileobject
2173 if( pTargetFileObj == NULL)
2177 // This is a simple rename. Here the target directory is the same as the source parent directory
2178 // and the name is retrieved from the system buffer information
2181 pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2183 pTargetParentObject = pSrcParentObject;
2185 pTargetDcb = pTargetParentObject->Fcb;
2187 uniTargetName.Length = (USHORT)pRenameInfo->FileNameLength;
2188 uniTargetName.Buffer = (PWSTR)&pRenameInfo->FileName;
2194 // So here we have the target directory taken from the targetfile object
2197 pTargetDcb = (AFSFcb *)pTargetFileObj->FsContext;
2199 pTargetDirCcb = (AFSCcb *)pTargetFileObj->FsContext2;
2201 pTargetParentObject = (AFSObjectInfoCB *)pTargetDcb->ObjectInformation;
2204 // Grab the target name which we setup in the IRP_MJ_CREATE handler. By how we set this up
2205 // it is only the target component of the rename operation
2208 uniTargetName = *((PUNICODE_STRING)&pTargetFileObj->FileName);
2212 // The quick check to see if they are not really performing a rename
2213 // Do the names match? Only do this where the parent directories are
2217 if( pTargetParentObject == pSrcParentObject)
2220 if( FsRtlAreNamesEqual( &uniTargetName,
2225 try_return( ntStatus = STATUS_SUCCESS);
2228 bCommonParent = TRUE;
2233 bCommonParent = FALSE;
2237 // We do not allow cross-volume renames to occur
2240 if( pTargetParentObject->VolumeCB != pSrcObject->VolumeCB)
2243 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2244 AFS_TRACE_LEVEL_ERROR,
2245 "AFSSetRenameInfo Attempt to rename directory to different volume %wZ\n",
2246 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2248 try_return( ntStatus = STATUS_NOT_SAME_DEVICE);
2251 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2254 AFSAcquireExcl( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock,
2257 bReleaseTargetDirLock = TRUE;
2259 if( pTargetParentObject != pSrcParentObject)
2261 AFSAcquireExcl( pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
2264 bReleaseSourceDirLock = TRUE;
2266 pSourceDirLock = pSrcFcb->ObjectInformation->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock;
2269 AFSLocateCaseSensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
2273 if( pTargetDirEntry == NULL)
2277 // Missed so perform a case insensitive lookup
2280 ulTargetCRC = AFSGenerateCRC( &uniTargetName,
2283 AFSLocateCaseInsensitiveDirEntry( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
2288 if( pTargetDirEntry == NULL && RtlIsNameLegalDOS8Dot3( &uniTargetName,
2293 // Try the short name
2295 AFSLocateShortNameDirEntry( pTargetParentObject->Specific.Directory.ShortNameTree,
2301 // Increment our ref count on the dir entry
2304 if( pTargetDirEntry != NULL)
2307 ASSERT( pTargetParentObject == pTargetDirEntry->ObjectInformation->ParentObjectInformation);
2309 lCount = InterlockedIncrement( &pTargetDirEntry->OpenReferenceCount);
2311 if( !bReplaceIfExists)
2314 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2315 AFS_TRACE_LEVEL_ERROR,
2316 "AFSSetRenameInfo Attempt to rename directory with target collision %wZ Target %wZ\n",
2317 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2318 &pTargetDirEntry->NameInformation.FileName);
2320 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
2323 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2324 AFS_TRACE_LEVEL_ERROR,
2325 "AFSSetRenameInfo Target %wZ exists DE %p Count %08lX, performing delete of target\n",
2326 &pTargetDirEntry->NameInformation.FileName,
2328 pTargetDirEntry->OpenReferenceCount);
2331 // Pull the directory entry from the parent
2334 AFSRemoveDirNodeFromParent( pTargetParentObject,
2338 bTargetEntryExists = TRUE;
2342 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2343 AFS_TRACE_LEVEL_VERBOSE,
2344 "AFSSetRenameInfo Target does NOT exist, normal rename\n");
2348 // We need to remove the DirEntry from the parent node, update the index
2349 // and reinsert it into the parent tree. Note that for entries with the
2350 // same parent we do not pull the node from the enumeration list
2353 AFSRemoveDirNodeFromParent( pSrcFcb->ObjectInformation->ParentObjectInformation,
2354 pSrcCcb->DirectoryCB,
2358 // OK, this is a simple rename. Issue the rename
2359 // request to the service.
2362 ntStatus = AFSNotifyRename( pSrcFcb->ObjectInformation,
2363 &pSrcCcb->AuthGroup,
2364 pSrcFcb->ObjectInformation->ParentObjectInformation,
2365 pTargetDcb->ObjectInformation,
2366 pSrcCcb->DirectoryCB,
2370 if( !NT_SUCCESS( ntStatus))
2374 // Attempt to re-insert the directory entry
2377 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2378 pSrcCcb->DirectoryCB,
2381 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2382 AFS_TRACE_LEVEL_ERROR,
2383 "AFSSetRenameInfo Failed rename of %wZ to target %wZ Status %08lX\n",
2384 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2388 try_return( ntStatus);
2392 // Set the notification up for the source file
2395 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation == pTargetParentObject &&
2396 !bTargetEntryExists)
2399 ulNotificationAction = FILE_ACTION_RENAMED_OLD_NAME;
2404 ulNotificationAction = FILE_ACTION_REMOVED;
2407 if( pSrcCcb->DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
2410 ulNotifyFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
2415 ulNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
2418 AFSFsRtlNotifyFullReportChange( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation,
2420 (ULONG)ulNotifyFilter,
2421 (ULONG)ulNotificationAction);
2424 // Update the name in the dir entry.
2427 ntStatus = AFSUpdateDirEntryName( pSrcCcb->DirectoryCB,
2430 if( !NT_SUCCESS( ntStatus))
2434 // Attempt to re-insert the directory entry
2437 AFSInsertDirectoryNode( pSrcFcb->ObjectInformation->ParentObjectInformation,
2438 pSrcCcb->DirectoryCB,
2441 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2442 AFS_TRACE_LEVEL_ERROR,
2443 "AFSSetRenameInfo Failed update of dir entry %wZ to target %wZ Status %08lX\n",
2444 &pSrcCcb->DirectoryCB->NameInformation.FileName,
2448 try_return( ntStatus);
2452 // Update the object information block, if needed
2455 if( !AFSIsEqualFID( &pSrcObject->FileId,
2459 AFSAcquireExcl( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock,
2463 // Remove the old information entry
2466 AFSRemoveHashEntry( &pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
2467 &pSrcObject->TreeEntry);
2469 RtlCopyMemory( &pSrcObject->FileId,
2471 sizeof( AFSFileID));
2474 // Insert the entry into the new object table.
2477 pSrcObject->TreeEntry.HashIndex = AFSCreateLowIndex( &pSrcObject->FileId);
2479 if( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead == NULL)
2482 pSrcObject->VolumeCB->ObjectInfoTree.TreeHead = &pSrcObject->TreeEntry;
2487 if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
2488 &pSrcObject->TreeEntry)))
2492 // Lost a race, an ObjectInfo object already exists for this FID.
2493 // Let this copy be garbage collected.
2496 ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
2500 AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);
2504 // Update the hash values for the name trees.
2507 pSrcCcb->DirectoryCB->CaseSensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
2510 pSrcCcb->DirectoryCB->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pSrcCcb->DirectoryCB->NameInformation.FileName,
2513 if( pSrcCcb->DirectoryCB->NameInformation.ShortNameLength > 0 &&
2514 !RtlIsNameLegalDOS8Dot3( &pSrcCcb->DirectoryCB->NameInformation.FileName,
2519 uniShortName.Length = pSrcCcb->DirectoryCB->NameInformation.ShortNameLength;
2520 uniShortName.MaximumLength = uniShortName.Length;
2521 uniShortName.Buffer = pSrcCcb->DirectoryCB->NameInformation.ShortName;
2523 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
2526 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2527 AFS_TRACE_LEVEL_VERBOSE,
2528 "AFSSetRenameInfo Initialized short name hash for %wZ longname %wZ\n",
2530 &pSrcCcb->DirectoryCB->NameInformation.FileName);
2535 pSrcCcb->DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
2542 // Update the file index for the object in the new parent
2545 pSrcCcb->DirectoryCB->FileIndex = (ULONG)InterlockedIncrement( &pTargetParentObject->Specific.Directory.DirectoryNodeHdr.ContentIndex);
2549 // Re-insert the directory entry
2552 AFSInsertDirectoryNode( pTargetParentObject,
2553 pSrcCcb->DirectoryCB,
2557 // Update the parent pointer in the source object if they are different
2560 if( pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation != pTargetParentObject)
2563 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
2565 lCount = InterlockedDecrement( &pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
2567 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenHandleCount);
2569 lCount = InterlockedIncrement( &pTargetParentObject->Specific.Directory.ChildOpenReferenceCount);
2571 pSrcCcb->DirectoryCB->ObjectInformation->ParentObjectInformation = pTargetParentObject;
2573 ulNotificationAction = FILE_ACTION_ADDED;
2578 ulNotificationAction = FILE_ACTION_RENAMED_NEW_NAME;
2582 // Now update the notification for the target file
2585 AFSFsRtlNotifyFullReportChange( pTargetParentObject->ParentObjectInformation,
2587 (ULONG)ulNotifyFilter,
2588 (ULONG)ulNotificationAction);
2591 // If we performed the rename of the target because it existed, we now need to
2592 // delete the tmp target we created above
2595 if( bTargetEntryExists)
2598 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2599 AFS_TRACE_LEVEL_VERBOSE,
2600 "AFSSetRenameInfo Setting DELETE flag in dir entry %p name %wZ\n",
2602 &pTargetDirEntry->NameInformation.FileName);
2604 SetFlag( pTargetDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
2607 // Try and purge the cache map if this is a file
2610 if( pTargetDirEntry->ObjectInformation->FileType == AFS_FILE_TYPE_FILE &&
2611 pTargetDirEntry->ObjectInformation->Fcb != NULL &&
2612 pTargetDirEntry->OpenReferenceCount > 1)
2615 pTargetFcb = pTargetDirEntry->ObjectInformation->Fcb;
2617 AFSAcquireExcl( &pTargetFcb->NPFcb->Resource,
2621 // Close the section in the event it was mapped
2624 if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
2628 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2629 AFS_TRACE_LEVEL_ERROR,
2630 "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
2631 &pTargetDirEntry->NameInformation.FileName);
2634 AFSReleaseResource( &pTargetFcb->NPFcb->Resource);
2637 ASSERT( pTargetDirEntry->OpenReferenceCount > 0);
2639 lCount = InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount); // The count we added above
2644 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
2645 AFS_TRACE_LEVEL_VERBOSE,
2646 "AFSSetRenameInfo Deleting dir entry %p name %wZ\n",
2648 &pTargetDirEntry->NameInformation.FileName);
2650 AFSDeleteDirEntry( pTargetParentObject,
2654 pTargetDirEntry = NULL;
2660 if( !NT_SUCCESS( ntStatus))
2663 if( bTargetEntryExists)
2665 AFSInsertDirectoryNode( pTargetDirEntry->ObjectInformation->ParentObjectInformation,
2671 if( pTargetDirEntry != NULL)
2674 lCount = InterlockedDecrement( &pTargetDirEntry->OpenReferenceCount);
2677 if( bReleaseTargetDirLock)
2679 AFSReleaseResource( pTargetParentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
2682 if( bReleaseSourceDirLock)
2684 AFSReleaseResource( pSourceDirLock);
2692 AFSSetPositionInfo( IN PIRP Irp,
2693 IN AFSDirectoryCB *DirectoryCB)
2695 NTSTATUS ntStatus = STATUS_SUCCESS;
2696 PFILE_POSITION_INFORMATION pBuffer;
2697 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2699 pBuffer = (PFILE_POSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2701 pIrpSp->FileObject->CurrentByteOffset.QuadPart = pBuffer->CurrentByteOffset.QuadPart;
2707 AFSSetAllocationInfo( IN PIRP Irp,
2708 IN AFSDirectoryCB *DirectoryCB)
2710 NTSTATUS ntStatus = STATUS_SUCCESS;
2711 PFILE_ALLOCATION_INFORMATION pBuffer;
2712 BOOLEAN bReleasePaging = FALSE;
2713 BOOLEAN bTellCc = FALSE;
2714 BOOLEAN bTellService = FALSE;
2715 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2716 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
2717 AFSFcb *pFcb = NULL;
2718 AFSCcb *pCcb = NULL;
2719 LARGE_INTEGER liSaveAlloc;
2720 LARGE_INTEGER liSaveFileSize;
2721 LARGE_INTEGER liSaveVDL;
2723 pBuffer = (PFILE_ALLOCATION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2725 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
2727 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
2730 // save values to put back
2732 liSaveAlloc = pFcb->Header.AllocationSize;
2733 liSaveFileSize = pFcb->Header.FileSize;
2734 liSaveVDL = pFcb->Header.ValidDataLength;
2736 if( pFcb->Header.AllocationSize.QuadPart == pBuffer->AllocationSize.QuadPart ||
2737 pIrpSp->Parameters.SetFile.AdvanceOnly)
2739 return STATUS_SUCCESS ;
2742 if( pFcb->Header.AllocationSize.QuadPart > pBuffer->AllocationSize.QuadPart)
2745 // Truncating the file
2747 if( !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
2748 &pBuffer->AllocationSize))
2751 ntStatus = STATUS_USER_MAPPED_FILE ;
2756 // If this is a truncation we need to grab the paging IO resource.
2759 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2760 AFS_TRACE_LEVEL_VERBOSE,
2761 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
2762 &pFcb->NPFcb->PagingResource,
2763 PsGetCurrentThread());
2765 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
2768 bReleasePaging = TRUE;
2771 // Must drop the Fcb Resource. When changing the file size
2772 // a deadlock can occur with Trend Micro's filter if the file
2773 // size is set to zero.
2776 AFSReleaseResource( &pFcb->NPFcb->Resource);
2778 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
2780 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
2783 // Tell Cc that Allocation is moved.
2787 if( pFcb->Header.FileSize.QuadPart > pBuffer->AllocationSize.QuadPart)
2790 // We are pulling the EOF back as well so we need to tell
2793 bTellService = TRUE;
2795 pFcb->Header.FileSize = pBuffer->AllocationSize;
2797 pFcb->ObjectInformation->EndOfFile = pBuffer->AllocationSize;
2805 // Tell Cc if allocation is increased.
2808 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2809 AFS_TRACE_LEVEL_VERBOSE,
2810 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
2811 &pFcb->NPFcb->PagingResource,
2812 PsGetCurrentThread());
2814 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
2817 bReleasePaging = TRUE;
2820 // Must drop the Fcb Resource. When changing the file size
2821 // a deadlock can occur with Trend Micro's filter if the file
2822 // size is set to zero.
2825 AFSReleaseResource( &pFcb->NPFcb->Resource);
2827 bTellCc = pBuffer->AllocationSize.QuadPart > pFcb->Header.AllocationSize.QuadPart;
2829 pFcb->Header.AllocationSize = pBuffer->AllocationSize;
2831 pFcb->ObjectInformation->AllocationSize = pBuffer->AllocationSize;
2835 // Now Tell the server if we have to
2839 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
2840 pFcb->ObjectInformation,
2844 if (NT_SUCCESS(ntStatus))
2847 // Trim extents if we told the service - the update has done an implicit
2848 // trim at the service.
2852 AFSTrimExtents( pFcb,
2853 &pFcb->Header.FileSize);
2856 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
2858 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
2861 CcIsFileCached( pFileObject))
2863 CcSetFileSizes( pFileObject,
2864 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
2870 // Put the saved values back
2872 pFcb->Header.ValidDataLength = liSaveVDL;
2873 pFcb->Header.FileSize = liSaveFileSize;
2874 pFcb->Header.AllocationSize = liSaveAlloc;
2875 pFcb->ObjectInformation->EndOfFile = liSaveFileSize;
2876 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
2882 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
2884 AFSAcquireExcl( &pFcb->NPFcb->Resource,
2892 AFSSetEndOfFileInfo( IN PIRP Irp,
2893 IN AFSDirectoryCB *DirectoryCB)
2895 NTSTATUS ntStatus = STATUS_SUCCESS;
2896 PFILE_END_OF_FILE_INFORMATION pBuffer;
2897 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
2898 PFILE_OBJECT pFileObject = pIrpSp->FileObject;
2899 LARGE_INTEGER liSaveSize;
2900 LARGE_INTEGER liSaveVDL;
2901 LARGE_INTEGER liSaveAlloc;
2902 BOOLEAN bModified = FALSE;
2903 BOOLEAN bReleasePaging = FALSE;
2904 BOOLEAN bTruncated = FALSE;
2905 AFSFcb *pFcb = NULL;
2906 AFSCcb *pCcb = NULL;
2908 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
2910 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
2912 pBuffer = (PFILE_END_OF_FILE_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
2914 liSaveSize = pFcb->Header.FileSize;
2915 liSaveAlloc = pFcb->Header.AllocationSize;
2916 liSaveVDL = pFcb->Header.ValidDataLength;
2918 if( pFcb->Header.FileSize.QuadPart != pBuffer->EndOfFile.QuadPart &&
2919 !pIrpSp->Parameters.SetFile.AdvanceOnly)
2922 if( pBuffer->EndOfFile.QuadPart < pFcb->Header.FileSize.QuadPart)
2925 // Truncating the file
2926 if( !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
2927 &pBuffer->EndOfFile))
2930 ntStatus = STATUS_USER_MAPPED_FILE;
2936 // If this is a truncation we need to grab the paging
2939 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2940 AFS_TRACE_LEVEL_VERBOSE,
2941 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
2942 &pFcb->NPFcb->PagingResource,
2943 PsGetCurrentThread());
2945 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
2948 bReleasePaging = TRUE;
2951 // Must drop the Fcb Resource. When changing the file size
2952 // a deadlock can occur with Trend Micro's filter if the file
2953 // size is set to zero.
2956 AFSReleaseResource( &pFcb->NPFcb->Resource);
2958 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
2960 pFcb->Header.FileSize = pBuffer->EndOfFile;
2962 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
2964 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
2966 if( pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
2969 pFcb->Header.ValidDataLength = pFcb->Header.FileSize;
2981 // extending the file, move EOF
2985 // If this is a truncation we need to grab the paging
2988 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
2989 AFS_TRACE_LEVEL_VERBOSE,
2990 "AFSSetAllocationInfo Acquiring Fcb PagingIo lock %08lX EXCL %08lX\n",
2991 &pFcb->NPFcb->PagingResource,
2992 PsGetCurrentThread());
2994 AFSAcquireExcl( &pFcb->NPFcb->PagingResource,
2997 bReleasePaging = TRUE;
3000 // Must drop the Fcb Resource. When changing the file size
3001 // a deadlock can occur with Trend Micro's filter if the file
3002 // size is set to zero.
3005 AFSReleaseResource( &pFcb->NPFcb->Resource);
3007 pFcb->Header.FileSize = pBuffer->EndOfFile;
3009 pFcb->ObjectInformation->EndOfFile = pBuffer->EndOfFile;
3011 if (pFcb->Header.FileSize.QuadPart > pFcb->Header.AllocationSize.QuadPart)
3014 // And Allocation as needed.
3016 pFcb->Header.AllocationSize = pBuffer->EndOfFile;
3018 pFcb->ObjectInformation->AllocationSize = pBuffer->EndOfFile;
3028 KeQuerySystemTime( &pFcb->ObjectInformation->ChangeTime);
3030 SetFlag( pFcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED | AFS_FCB_FLAG_UPDATE_CHANGE_TIME);
3036 ntStatus = AFSUpdateFileInformation( &pFcb->ObjectInformation->ParentObjectInformation->FileId,
3037 pFcb->ObjectInformation,
3040 if( NT_SUCCESS(ntStatus))
3043 // We are now good to go so tell CC.
3045 CcSetFileSizes( pFileObject,
3046 (PCC_FILE_SIZES)&pFcb->Header.AllocationSize);
3049 // And give up those extents
3054 AFSTrimExtents( pFcb,
3055 &pFcb->Header.FileSize);
3060 pFcb->Header.ValidDataLength = liSaveVDL;
3061 pFcb->Header.FileSize = liSaveSize;
3062 pFcb->Header.AllocationSize = liSaveAlloc;
3063 pFcb->ObjectInformation->EndOfFile = liSaveSize;
3064 pFcb->ObjectInformation->AllocationSize = liSaveAlloc;
3071 AFSReleaseResource( &pFcb->NPFcb->PagingResource);
3073 AFSAcquireExcl( &pFcb->NPFcb->Resource,
3081 AFSProcessShareSetInfo( IN IRP *Irp,
3086 NTSTATUS ntStatus = STATUS_SUCCESS;
3087 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3088 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
3089 FILE_INFORMATION_CLASS ulFileInformationClass;
3090 void *pPipeInfo = NULL;
3094 ulFileInformationClass = pIrpSp->Parameters.SetFile.FileInformationClass;
3096 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3097 AFS_TRACE_LEVEL_VERBOSE,
3098 "AFSProcessShareSetInfo On pipe %wZ Class %08lX\n",
3099 &Ccb->DirectoryCB->NameInformation.FileName,
3100 ulFileInformationClass);
3102 pPipeInfo = AFSLockSystemBuffer( Irp,
3103 pIrpSp->Parameters.SetFile.Length);
3105 if( pPipeInfo == NULL)
3108 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3109 AFS_TRACE_LEVEL_ERROR,
3110 "AFSProcessShareSetInfo Failed to lock buffer on pipe %wZ\n",
3111 &Ccb->DirectoryCB->NameInformation.FileName);
3113 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3117 // Send the request to the service
3120 ntStatus = AFSNotifySetPipeInfo( Ccb,
3121 (ULONG)ulFileInformationClass,
3122 pIrpSp->Parameters.SetFile.Length,
3125 if( !NT_SUCCESS( ntStatus))
3128 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3129 AFS_TRACE_LEVEL_ERROR,
3130 "AFSProcessShareSetInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3131 &Ccb->DirectoryCB->NameInformation.FileName,
3134 try_return( ntStatus);
3137 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3138 AFS_TRACE_LEVEL_VERBOSE,
3139 "AFSProcessShareSetInfo Completed request on pipe %wZ Class %08lX\n",
3140 &Ccb->DirectoryCB->NameInformation.FileName,
3141 ulFileInformationClass);
3152 AFSProcessShareQueryInfo( IN IRP *Irp,
3157 NTSTATUS ntStatus = STATUS_SUCCESS;
3158 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3159 ULONG ulOutputBufferLen = 0, ulInputBufferLen;
3160 FILE_INFORMATION_CLASS ulFileInformationClass;
3161 void *pPipeInfo = NULL;
3166 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3168 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3169 AFS_TRACE_LEVEL_VERBOSE,
3170 "AFSProcessShareQueryInfo On pipe %wZ Class %08lX\n",
3171 &Ccb->DirectoryCB->NameInformation.FileName,
3172 ulFileInformationClass);
3174 pPipeInfo = AFSLockSystemBuffer( Irp,
3175 pIrpSp->Parameters.QueryFile.Length);
3177 if( pPipeInfo == NULL)
3180 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3181 AFS_TRACE_LEVEL_ERROR,
3182 "AFSProcessShareQueryInfo Failed to lock buffer on pipe %wZ\n",
3183 &Ccb->DirectoryCB->NameInformation.FileName);
3185 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
3189 // Send the request to the service
3192 ntStatus = AFSNotifyQueryPipeInfo( Ccb,
3193 (ULONG)ulFileInformationClass,
3194 pIrpSp->Parameters.QueryFile.Length,
3196 (ULONG *)&Irp->IoStatus.Information);
3198 if( !NT_SUCCESS( ntStatus))
3201 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3202 AFS_TRACE_LEVEL_ERROR,
3203 "AFSProcessShareQueryInfo Failed to send request to service on pipe %wZ Status %08lX\n",
3204 &Ccb->DirectoryCB->NameInformation.FileName,
3207 try_return( ntStatus);
3210 AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
3211 AFS_TRACE_LEVEL_VERBOSE,
3212 "AFSProcessShareQueryInfo Completed request on pipe %wZ Class %08lX\n",
3213 &Ccb->DirectoryCB->NameInformation.FileName,
3214 ulFileInformationClass);
3225 AFSProcessPIOCtlQueryInfo( IN IRP *Irp,
3228 IN OUT LONG *Length)
3231 NTSTATUS ntStatus = STATUS_SUCCESS;
3232 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
3233 FILE_INFORMATION_CLASS ulFileInformationClass;
3238 ulFileInformationClass = pIrpSp->Parameters.QueryFile.FileInformationClass;
3240 switch( ulFileInformationClass)
3243 case FileBasicInformation:
3246 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3247 AFS_TRACE_LEVEL_VERBOSE,
3248 "AFSProcessPIOCtlQueryInfo (FileBasicInformation)\n");
3250 if ( *Length >= sizeof( FILE_BASIC_INFORMATION))
3252 PFILE_BASIC_INFORMATION pBasic = (PFILE_BASIC_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3254 pBasic->CreationTime.QuadPart = 0;
3255 pBasic->LastAccessTime.QuadPart = 0;
3256 pBasic->ChangeTime.QuadPart = 0;
3257 pBasic->LastWriteTime.QuadPart = 0;
3258 pBasic->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
3260 *Length -= sizeof( FILE_BASIC_INFORMATION);
3264 ntStatus = STATUS_BUFFER_TOO_SMALL;
3270 case FileStandardInformation:
3273 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3274 AFS_TRACE_LEVEL_VERBOSE,
3275 "AFSProcessPIOCtlQueryInfo (FileStandardInformation)\n");
3277 if ( *Length >= sizeof( FILE_STANDARD_INFORMATION))
3279 PFILE_STANDARD_INFORMATION pStandard = (PFILE_STANDARD_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3281 pStandard->NumberOfLinks = 1;
3282 pStandard->DeletePending = 0;
3283 pStandard->AllocationSize.QuadPart = 0;
3284 pStandard->EndOfFile.QuadPart = 0;
3285 pStandard->Directory = 0;
3287 *Length -= sizeof( FILE_STANDARD_INFORMATION);
3291 ntStatus = STATUS_BUFFER_TOO_SMALL;
3297 case FileNameInformation:
3300 ULONG ulCopyLength = 0;
3301 AFSFcb *pFcb = NULL;
3302 AFSCcb *pCcb = NULL;
3303 USHORT usFullNameLength = 0;
3304 PFILE_NAME_INFORMATION pNameInfo = (PFILE_NAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3305 UNICODE_STRING uniName;
3307 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3308 AFS_TRACE_LEVEL_VERBOSE,
3309 "AFSProcessPIOCtlQueryInfo (FileNameInformation)\n");
3311 pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
3312 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
3314 if( *Length < FIELD_OFFSET( FILE_NAME_INFORMATION, FileName))
3316 ntStatus = STATUS_BUFFER_TOO_SMALL;
3320 RtlZeroMemory( pNameInfo,
3323 usFullNameLength = sizeof( WCHAR) +
3324 AFSServerName.Length +
3325 pCcb->FullFileName.Length;
3327 if( *Length >= (LONG)(FIELD_OFFSET( FILE_NAME_INFORMATION, FileName) + (LONG)usFullNameLength))
3329 ulCopyLength = (LONG)usFullNameLength;
3333 ulCopyLength = *Length - FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
3334 ntStatus = STATUS_BUFFER_OVERFLOW;
3337 pNameInfo->FileNameLength = (ULONG)usFullNameLength;
3339 *Length -= FIELD_OFFSET( FILE_NAME_INFORMATION, FileName);
3341 if( ulCopyLength > 0)
3344 pNameInfo->FileName[ 0] = L'\\';
3345 ulCopyLength -= sizeof( WCHAR);
3347 *Length -= sizeof( WCHAR);
3349 if( ulCopyLength >= AFSServerName.Length)
3352 RtlCopyMemory( &pNameInfo->FileName[ 1],
3353 AFSServerName.Buffer,
3354 AFSServerName.Length);
3356 ulCopyLength -= AFSServerName.Length;
3357 *Length -= AFSServerName.Length;
3359 if( ulCopyLength >= pCcb->FullFileName.Length)
3362 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
3363 pCcb->FullFileName.Buffer,
3364 pCcb->FullFileName.Length);
3366 ulCopyLength -= pCcb->FullFileName.Length;
3367 *Length -= pCcb->FullFileName.Length;
3369 uniName.Length = (USHORT)pNameInfo->FileNameLength;
3370 uniName.MaximumLength = uniName.Length;
3371 uniName.Buffer = pNameInfo->FileName;
3376 RtlCopyMemory( &pNameInfo->FileName[ 1 + (AFSServerName.Length/sizeof( WCHAR))],
3377 pCcb->FullFileName.Buffer,
3380 *Length -= ulCopyLength;
3382 uniName.Length = (USHORT)(sizeof( WCHAR) + AFSServerName.Length + ulCopyLength);
3383 uniName.MaximumLength = uniName.Length;
3384 uniName.Buffer = pNameInfo->FileName;
3387 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3388 AFS_TRACE_LEVEL_VERBOSE,
3389 "AFSProcessPIOCtlQueryInfo (FileNameInformation) Returning %wZ\n",
3397 case FileInternalInformation:
3400 PFILE_INTERNAL_INFORMATION pInternalInfo = (PFILE_INTERNAL_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
3402 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3403 AFS_TRACE_LEVEL_VERBOSE,
3404 "AFSProcessPIOCtlQueryInfo (FileInternalInformation)\n");
3406 if( *Length >= sizeof( FILE_INTERNAL_INFORMATION))
3409 pInternalInfo->IndexNumber.HighPart = 0;
3411 pInternalInfo->IndexNumber.LowPart = 0;
3413 *Length -= sizeof( FILE_INTERNAL_INFORMATION);
3418 ntStatus = STATUS_BUFFER_TOO_SMALL;
3424 case FileAllInformation:
3426 ntStatus = STATUS_INVALID_PARAMETER;
3428 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3429 AFS_TRACE_LEVEL_WARNING,
3430 "AFSProcessPIOCtlQueryInfo (FileAllInformation) Not Implemented\n");
3435 case FileEaInformation:
3437 ntStatus = STATUS_INVALID_PARAMETER;
3439 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3440 AFS_TRACE_LEVEL_WARNING,
3441 "AFSProcessPIOCtlQueryInfo (FileEaInformation) Not Implemented\n");
3446 case FilePositionInformation:
3448 ntStatus = STATUS_INVALID_PARAMETER;
3450 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3451 AFS_TRACE_LEVEL_WARNING,
3452 "AFSProcessPIOCtlQueryInfo (FilePositionInformation) Not Implemented\n");
3457 case FileAlternateNameInformation:
3459 ntStatus = STATUS_INVALID_PARAMETER;
3461 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3462 AFS_TRACE_LEVEL_WARNING,
3463 "AFSProcessPIOCtlQueryInfo (FileAlternateNameInformation) Not Implemented\n");
3468 case FileNetworkOpenInformation:
3470 ntStatus = STATUS_INVALID_PARAMETER;
3472 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3473 AFS_TRACE_LEVEL_WARNING,
3474 "AFSProcessPIOCtlQueryInfo (FileNetworkOpenInformation) Not Implemented\n");
3479 case FileStreamInformation:
3481 ntStatus = STATUS_INVALID_PARAMETER;
3483 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3484 AFS_TRACE_LEVEL_WARNING,
3485 "AFSProcessPIOCtlQueryInfo (FileStreamInformation) Not Implemented\n");
3490 case FileAttributeTagInformation:
3492 ntStatus = STATUS_INVALID_PARAMETER;
3494 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3495 AFS_TRACE_LEVEL_WARNING,
3496 "AFSProcessPIOCtlQueryInfo (FileAttributeTagInformation) Not Implemented\n");
3501 case FileRemoteProtocolInformation:
3503 ntStatus = STATUS_INVALID_PARAMETER;
3505 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3506 AFS_TRACE_LEVEL_WARNING,
3507 "AFSProcessPIOCtlQueryInfo (FileRemoteProtocolInformation) Not Implemented\n");
3512 case FileNetworkPhysicalNameInformation:
3514 ntStatus = STATUS_INVALID_PARAMETER;
3516 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3517 AFS_TRACE_LEVEL_WARNING,
3518 "AFSProcessPIOCtlQueryInfo (FileNetworkPhysicalNameInformation) Not Implemented\n");
3525 ntStatus = STATUS_INVALID_PARAMETER;
3527 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3528 AFS_TRACE_LEVEL_WARNING,
3529 "AFSProcessPIOCtlQueryInfo Not handling request %08lX\n",
3530 ulFileInformationClass);
3537 AFSDbgLogMsg( AFS_SUBSYSTEM_PIOCTL_PROCESSING,
3538 AFS_TRACE_LEVEL_VERBOSE,
3539 "AFSProcessPIOCtlQueryInfo ntStatus %08lX\n",