23 #pragma alloc_text(PAGE, NcPreQueryAlternateName) 24 #pragma alloc_text(PAGE, NcPostQueryHardLinks) 25 #pragma alloc_text(PAGE, NcPostQueryName) 26 #pragma alloc_text(PAGE, NcPreSetDisposition) 27 #pragma alloc_text(PAGE, NcPreSetLinkInformation) 28 #pragma alloc_text(PAGE, NcPreSetShortName) 29 #pragma alloc_text(PAGE, NcPreRename) 32 FLT_POSTOP_CALLBACK_STATUS
34 _Inout_ PFLT_CALLBACK_DATA Data,
35 _In_ PCFLT_RELATED_OBJECTS FltObjects,
36 _In_opt_ PVOID CompletionContext,
37 _In_ FLT_POST_OPERATION_FLAGS Flags
72 NTSTATUS
Status = STATUS_SUCCESS;
75 FILE_INFORMATION_CLASS InfoClass = Data->Iopb->Parameters.QueryFileInformation.FileInformationClass;
76 PVOID UserBuffer = Data->Iopb->Parameters.QueryFileInformation.InfoBuffer;
77 ULONG UserBufferLength = Data->Iopb->Parameters.QueryFileInformation.Length;
78 ULONG SizeActuallyReturned = (ULONG)Data->IoStatus.Information;
79 ULONG LengthNeeded = 0;
80 ULONG UserStructureSize = 0;
81 ULONG RequiredNameSize = 0;
82 ULONG NameLengthAvailable = 0;
83 PFILE_NAME_INFORMATION NameInfo;
84 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
85 FO_OPENED_CASE_SENSITIVE );
86 UNICODE_STRING Remainder;
88 UNICODE_STRING ReturnedName;
102 if (!NT_SUCCESS( Data->IoStatus.Status ) &&
103 (Data->IoStatus.Status != STATUS_BUFFER_OVERFLOW)) {
105 Status = Data->IoStatus.Status;
106 goto NcPostQueryNameInformationCleanup;
113 Status = FltGetInstanceContext( FltObjects->Instance,
116 if (!NT_SUCCESS( Status )) {
118 goto NcPostQueryNameInformationCleanup;
125 if (InfoClass == FileAllInformation) {
127 NameInfo = & ((PFILE_ALL_INFORMATION) UserBuffer)->NameInformation;
132 InfoClass == FileNormalizedNameInformation );
134 NameInfo = UserBuffer;
143 if (NameInfo->FileNameLength >= MAXUSHORT) {
145 Status = STATUS_OBJECT_PATH_INVALID;
146 goto NcPostQueryNameInformationCleanup;
154 if (Data->IoStatus.Status == STATUS_BUFFER_OVERFLOW) {
170 Status = Data->IoStatus.Status;
171 LengthNeeded = SizeActuallyReturned;
173 goto NcPostQueryNameInformationCleanup;
176 ReturnedName.Buffer = NameInfo->FileName;
177 ReturnedName.MaximumLength =
178 ReturnedName.Length = (USHORT)NameInfo->FileNameLength;
194 Status = Data->IoStatus.Status;
195 LengthNeeded = SizeActuallyReturned;
197 goto NcPostQueryNameInformationCleanup;
204 UserStructureSize = FIELD_OFFSET( FILE_NAME_INFORMATION, FileName );
206 if (InfoClass == FileAllInformation) {
208 UserStructureSize += FIELD_OFFSET( FILE_ALL_INFORMATION, NameInformation );
220 RequiredNameSize += Remainder.Length +
sizeof(WCHAR);
223 LengthNeeded = UserStructureSize + RequiredNameSize;
231 NameInfo->FileNameLength = RequiredNameSize;
240 if (UserBufferLength < LengthNeeded) {
242 NameLengthAvailable = UserBufferLength - UserStructureSize;
250 LengthNeeded = UserBufferLength;
252 Status = STATUS_BUFFER_OVERFLOW;
260 NameLengthAvailable = NameInfo->FileNameLength;
262 Status = STATUS_SUCCESS;
275 RemainderCopy.Buffer = ExAllocatePoolWithTag( PagedPool,
279 if (RemainderCopy.Buffer ==
NULL) {
281 Status = STATUS_INSUFFICIENT_RESOURCES;
282 goto NcPostQueryNameInformationCleanup;
289 RemainderCopy.MaximumLength =
290 RemainderCopy.Length = Remainder.Length;
300 NameLengthAvailable) );
308 NameLengthAvailable = 0;
316 if ((NameLengthAvailable > 0) &&
323 RemainderCopy.Buffer,
324 min(RemainderCopy.Length, NameLengthAvailable) );
331 NcPostQueryNameInformationCleanup:
333 Data->IoStatus.Status =
Status;
343 if (NT_SUCCESS( Status ) ||
344 (Status == STATUS_BUFFER_OVERFLOW)) {
346 Data->IoStatus.Information = LengthNeeded;
350 Data->IoStatus.Information = 0;
353 if (RemainderCopy.Buffer !=
NULL) {
355 ExFreePoolWithTag( RemainderCopy.Buffer,
NC_TAG );
358 if (InstanceContext !=
NULL) {
360 FltReleaseContext( InstanceContext );
363 return FLT_POSTOP_FINISHED_PROCESSING;
366 FLT_PREOP_CALLBACK_STATUS
368 _Inout_ PFLT_CALLBACK_DATA Data,
369 _In_ PCFLT_RELATED_OBJECTS FltObjects,
370 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
399 FLT_PREOP_CALLBACK_STATUS ReturnValue;
401 PFLT_FILE_NAME_INFORMATION FileInfo =
NULL;
403 PVOID UserBuffer = Data->Iopb->Parameters.QueryFileInformation.InfoBuffer;
404 ULONG UserBufferLength = Data->Iopb->Parameters.QueryFileInformation.Length;
405 ULONG LengthNeeded = 0;
406 PFILE_NAME_INFORMATION NameInfo;
407 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
408 FO_OPENED_CASE_SENSITIVE );
409 PUNICODE_STRING FinalComponentToReturn;
421 Status = FltGetInstanceContext( FltObjects->Instance,
424 if (!NT_SUCCESS( Status )) {
426 ReturnValue = FLT_PREOP_COMPLETE;
427 goto NcPreQueryAlternateNameInformationCleanup;
434 Status = NcGetFileNameInformation( Data,
437 FLT_FILE_NAME_OPENED |
438 FLT_FILE_NAME_QUERY_DEFAULT |
439 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
442 if (!NT_SUCCESS( Status )) {
444 ReturnValue = FLT_PREOP_COMPLETE;
445 goto NcPreQueryAlternateNameInformationCleanup;
448 Status = FltParseFileNameInformation( FileInfo );
450 if (!NT_SUCCESS( Status )) {
452 ReturnValue = FLT_PREOP_COMPLETE;
453 goto NcPreQueryAlternateNameInformationCleanup;
470 if (!Overlap.
Match) {
481 if (!Overlap.
Match) {
488 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
489 goto NcPreQueryAlternateNameInformationCleanup;
516 LengthNeeded = FIELD_OFFSET( FILE_NAME_INFORMATION, FileName );
518 LengthNeeded += FinalComponentToReturn->Length;
520 if (UserBufferLength < LengthNeeded) {
522 Status = STATUS_BUFFER_OVERFLOW;
523 ReturnValue = FLT_PREOP_COMPLETE;
524 goto NcPreQueryAlternateNameInformationCleanup;
527 NameInfo = UserBuffer;
534 FinalComponentToReturn->Buffer,
535 FinalComponentToReturn->Length );
537 NameInfo->FileNameLength = FinalComponentToReturn->Length;
543 Status = STATUS_SUCCESS;
544 ReturnValue = FLT_PREOP_COMPLETE;
546 NcPreQueryAlternateNameInformationCleanup:
548 if (ReturnValue == FLT_PREOP_COMPLETE) {
550 Data->IoStatus.Status =
Status;
557 if (NT_SUCCESS( Status )) {
559 Data->IoStatus.Information = LengthNeeded;
562 Data->IoStatus.Information = 0;
566 if (FileInfo !=
NULL) {
568 FltReleaseFileNameInformation( FileInfo );
571 if (InstanceContext !=
NULL) {
573 FltReleaseContext( InstanceContext );
580 FLT_POSTOP_CALLBACK_STATUS
582 _Inout_ PFLT_CALLBACK_DATA Data,
583 _In_ PCFLT_RELATED_OBJECTS FltObjects,
584 _In_opt_ PVOID CompletionContext,
585 _In_ FLT_POST_OPERATION_FLAGS Flags
614 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
615 FO_OPENED_CASE_SENSITIVE );
623 PFILE_LINKS_INFORMATION UserBuffer = Data->Iopb->Parameters.QueryFileInformation.InfoBuffer;
624 ULONG UserBufferLength = Data->Iopb->Parameters.QueryFileInformation.Length;
625 ULONG SizeActuallyReturned = (ULONG)Data->IoStatus.Information;
626 ULONG BytesWritten = 0;
635 UNICODE_STRING EntryName;
645 PFILE_LINKS_INFORMATION OriginalBuffer =
NULL;
646 PFILE_LINK_ENTRY_INFORMATION SourceEntry;
647 PFILE_LINK_ENTRY_INFORMATION DestEntry;
648 PFILE_LINK_ENTRY_INFORMATION PrevDestEntry =
NULL;
655 OBJECT_ATTRIBUTES MappingParentAttributes;
656 HANDLE MappingParentHandle =
NULL;
657 PFILE_OBJECT MappingParentFileObject =
NULL;
658 IO_STATUS_BLOCK MappingParentStatusBlock;
664 LONGLONG RealMappingParentId;
665 LONGLONG UserMappingParentId;
687 if (SizeActuallyReturned <= (ULONG)FIELD_OFFSET( FILE_LINKS_INFORMATION, Entry ) ||
688 !NT_SUCCESS( Data->IoStatus.Status )) {
690 BytesWritten = SizeActuallyReturned;
692 Status = Data->IoStatus.Status;
693 goto NcPostQueryHardLinkInformationCleanup;
700 Status = FltGetInstanceContext( FltObjects->Instance,
703 if (!NT_SUCCESS( Status )) {
705 goto NcPostQueryHardLinkInformationCleanup;
712 InitializeObjectAttributes( &MappingParentAttributes,
714 OBJ_KERNEL_HANDLE | (IgnoreCase?OBJ_CASE_INSENSITIVE:0),
719 Data->Iopb->TargetInstance,
720 &MappingParentHandle,
721 &MappingParentFileObject,
722 FILE_READ_ATTRIBUTES|FILE_TRAVERSE,
723 &MappingParentAttributes,
724 &MappingParentStatusBlock,
726 FILE_ATTRIBUTE_NORMAL,
732 IO_IGNORE_SHARE_ACCESS_CHECK,
733 Data->Iopb->TargetFileObject );
735 if (!NT_SUCCESS( Status )) {
737 FLT_ASSERT( Status != STATUS_OBJECT_PATH_NOT_FOUND &&
738 Status != STATUS_OBJECT_NAME_NOT_FOUND );
740 goto NcPostQueryHardLinkInformationCleanup;
743 Status = FltQueryInformationFile( Data->Iopb->TargetInstance,
744 MappingParentFileObject,
745 &RealMappingParentId,
746 sizeof(RealMappingParentId),
747 FileInternalInformation,
750 if (!NT_SUCCESS( Status )) {
752 goto NcPostQueryHardLinkInformationCleanup;
755 FltClose( MappingParentHandle );
756 ObDereferenceObject( MappingParentFileObject );
758 MappingParentHandle =
NULL;
759 MappingParentFileObject =
NULL;
761 InitializeObjectAttributes( &MappingParentAttributes,
763 OBJ_KERNEL_HANDLE | (IgnoreCase?OBJ_CASE_INSENSITIVE:0),
768 Data->Iopb->TargetInstance,
769 &MappingParentHandle,
770 &MappingParentFileObject,
771 FILE_READ_ATTRIBUTES|FILE_TRAVERSE,
772 &MappingParentAttributes,
773 &MappingParentStatusBlock,
775 FILE_ATTRIBUTE_NORMAL,
781 IO_IGNORE_SHARE_ACCESS_CHECK,
782 Data->Iopb->TargetFileObject );
784 if (!NT_SUCCESS( Status )) {
786 FLT_ASSERT( Status != STATUS_OBJECT_PATH_NOT_FOUND &&
787 Status != STATUS_OBJECT_NAME_NOT_FOUND );
789 goto NcPostQueryHardLinkInformationCleanup;
792 Status = FltQueryInformationFile( Data->Iopb->TargetInstance,
793 MappingParentFileObject,
794 &UserMappingParentId,
795 sizeof(UserMappingParentId),
796 FileInternalInformation,
799 if (!NT_SUCCESS( Status )) {
801 goto NcPostQueryHardLinkInformationCleanup;
804 FltClose( MappingParentHandle );
805 ObDereferenceObject( MappingParentFileObject );
807 MappingParentHandle =
NULL;
808 MappingParentFileObject =
NULL;
814 OriginalBuffer = ExAllocatePoolWithTag( PagedPool,
815 SizeActuallyReturned,
818 if (OriginalBuffer ==
NULL) {
820 Status = STATUS_INSUFFICIENT_RESOURCES;
821 goto NcPostQueryHardLinkInformationCleanup;
824 RtlCopyMemory( OriginalBuffer, UserBuffer, SizeActuallyReturned );
830 DestEntry = &UserBuffer->Entry;
832 if (UserBuffer->EntriesReturned >= 1) {
833 SourceEntry = &OriginalBuffer->Entry;
837 UserBuffer->EntriesReturned = 0;
838 BytesWritten = FIELD_OFFSET( FILE_LINKS_INFORMATION, Entry );
839 UserBuffer->BytesNeeded = BytesWritten;
841 while( SourceEntry ) {
851 if (SourceEntry->ParentFileId == RealMappingParentId) {
853 if (SourceEntry->FileNameLength *
sizeof(WCHAR) >= MAXUSHORT) {
855 Status = STATUS_OBJECT_PATH_INVALID;
856 goto NcPostQueryHardLinkInformationCleanup;
859 EntryName.Buffer = SourceEntry->FileName;
860 EntryName.Length = EntryName.MaximumLength = (USHORT)SourceEntry->FileNameLength *
sizeof(WCHAR);
885 EntrySize = FIELD_OFFSET( FILE_LINK_ENTRY_INFORMATION, FileName ) +
892 EntrySize = FIELD_OFFSET( FILE_LINK_ENTRY_INFORMATION, FileName ) +
893 SourceEntry->FileNameLength *
sizeof(WCHAR);
902 UserBuffer->BytesNeeded += EntrySize;
909 if (BytesWritten + EntrySize <= UserBufferLength) {
913 DestEntry->NextEntryOffset = EntrySize;
914 DestEntry->ParentFileId = UserMappingParentId;
923 PrevDestEntry = DestEntry;
924 DestEntry =
Add2Ptr( DestEntry, EntrySize );
925 UserBuffer->EntriesReturned++;
926 BytesWritten += EntrySize;
934 if (SourceEntry->NextEntryOffset != 0) {
935 SourceEntry =
Add2Ptr( SourceEntry, SourceEntry->NextEntryOffset );
946 if (PrevDestEntry !=
NULL) {
947 PrevDestEntry->NextEntryOffset = 0;
955 if (BytesWritten == UserBuffer->BytesNeeded) {
956 Status = STATUS_SUCCESS;
958 Status = STATUS_BUFFER_OVERFLOW;
961 NcPostQueryHardLinkInformationCleanup:
963 Data->IoStatus.Status =
Status;
965 if (NT_SUCCESS( Status ) || Status == STATUS_BUFFER_OVERFLOW) {
967 Data->IoStatus.Information = BytesWritten;
970 Data->IoStatus.Information = 0;
973 if (MappingParentHandle !=
NULL) {
975 FltClose( MappingParentHandle );
976 MappingParentHandle =
NULL;
979 if (MappingParentFileObject !=
NULL) {
981 ObDereferenceObject( MappingParentFileObject );
982 MappingParentFileObject =
NULL;
985 if (OriginalBuffer !=
NULL) {
987 ExFreePoolWithTag( OriginalBuffer,
NC_TAG );
990 if (InstanceContext !=
NULL) {
992 FltReleaseContext( InstanceContext );
995 return FLT_POSTOP_FINISHED_PROCESSING;
998 FLT_PREOP_CALLBACK_STATUS
1000 _Inout_ PFLT_CALLBACK_DATA Data,
1001 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1002 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1029 FLT_PREOP_CALLBACK_STATUS ReturnValue;
1031 PFILE_NAME_INFORMATION NameInfo =
1032 Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
1033 PFLT_FILE_NAME_INFORMATION FileInfo =
NULL;
1037 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
1038 FO_OPENED_CASE_SENSITIVE );
1046 Status = FltGetInstanceContext( FltObjects->Instance,
1049 if (!NT_SUCCESS( Status )) {
1051 ReturnValue = FLT_PREOP_COMPLETE;
1052 goto NcPreSetShortNameCleanup;
1063 ReturnValue = FLT_PREOP_COMPLETE;
1064 goto NcPreSetShortNameCleanup;
1071 Status = NcGetFileNameInformation( Data,
1074 FLT_FILE_NAME_OPENED |
1075 FLT_FILE_NAME_QUERY_DEFAULT |
1076 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
1079 if (!NT_SUCCESS( Status )) {
1081 ReturnValue = FLT_PREOP_COMPLETE;
1082 goto NcPreSetShortNameCleanup;
1085 Status = FltParseFileNameInformation( FileInfo );
1087 if (!NT_SUCCESS( Status )) {
1089 ReturnValue = FLT_PREOP_COMPLETE;
1090 goto NcPreSetShortNameCleanup;
1119 if (RealOverlap.
Match ||
1120 UserOverlap.
Match ||
1123 NameInfo->FileNameLength > MAXUSHORT) {
1125 Status = STATUS_ACCESS_DENIED;
1126 ReturnValue = FLT_PREOP_COMPLETE;
1127 goto NcPreSetShortNameCleanup;
1137 if (UserOverlap.
Peer) {
1139 UNICODE_STRING TargetComponent;
1141 TargetComponent.Buffer = NameInfo->FileName;
1142 TargetComponent.Length = TargetComponent.MaximumLength = (USHORT)NameInfo->FileNameLength;
1144 if( RtlCompareUnicodeString( &TargetComponent,
1147 RtlCompareUnicodeString( &TargetComponent,
1149 IgnoreCase) == 0 ) {
1151 Status = STATUS_ACCESS_DENIED;
1152 ReturnValue = FLT_PREOP_COMPLETE;
1153 goto NcPreSetShortNameCleanup;
1164 Status = STATUS_SUCCESS;
1165 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1167 NcPreSetShortNameCleanup:
1169 if (ReturnValue == FLT_PREOP_COMPLETE) {
1171 Data->IoStatus.Status =
Status;
1174 if (FileInfo !=
NULL) {
1176 FltReleaseFileNameInformation( FileInfo );
1179 if (InstanceContext !=
NULL) {
1181 FltReleaseContext( InstanceContext );
1188 FLT_PREOP_CALLBACK_STATUS
1190 _Inout_ PFLT_CALLBACK_DATA Data,
1191 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1192 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1221 FLT_PREOP_CALLBACK_STATUS ReturnValue;
1222 PFLT_FILE_NAME_INFORMATION FileInfo =
NULL;
1227 FILE_INFORMATION_CLASS fileInformationClass;
1228 BOOLEAN IsDeleteFile;
1229 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
1230 FO_OPENED_CASE_SENSITIVE );
1238 fileInformationClass = Data->Iopb->Parameters.SetFileInformation.FileInformationClass;
1246 IsDeleteFile = (fileInformationClass == FileDispositionInformationEx) ?
1247 BooleanFlagOn( ((PFILE_DISPOSITION_INFORMATION_EX)Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->Flags, FILE_DISPOSITION_DELETE ) :
1248 ((PFILE_DISPOSITION_INFORMATION)Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile;
1250 if (IsDeleteFile == FALSE) {
1252 Status = STATUS_SUCCESS;
1253 goto NcPreSetDispositionCleanup;
1265 Status = NcGetFileNameInformation( Data,
1268 FLT_FILE_NAME_OPENED |
1269 FLT_FILE_NAME_QUERY_DEFAULT |
1270 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
1273 if (!NT_SUCCESS( Status )) {
1275 goto NcPreSetDispositionCleanup;
1278 Status = FltParseFileNameInformation( FileInfo );
1280 if (!NT_SUCCESS( Status )) {
1282 goto NcPreSetDispositionCleanup;
1289 Status = FltGetInstanceContext( FltObjects->Instance,
1292 if (!NT_SUCCESS( Status )) {
1294 goto NcPreSetDispositionCleanup;
1297 Mapping = &InstanceContext->
Mapping;
1317 Status = STATUS_ACCESS_DENIED;
1318 goto NcPreSetDispositionCleanup;
1339 Status = STATUS_ACCESS_DENIED;
1340 goto NcPreSetDispositionCleanup;
1347 Status = STATUS_SUCCESS;
1348 goto NcPreSetDispositionCleanup;
1350 NcPreSetDispositionCleanup:
1352 if (!NT_SUCCESS( Status )) {
1354 ReturnValue = FLT_PREOP_COMPLETE;
1355 Data->IoStatus.Status =
Status;
1359 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1364 FltReleaseFileNameInformation( FileInfo );
1367 if (InstanceContext) {
1369 FltReleaseContext( InstanceContext );
1376 FLT_PREOP_CALLBACK_STATUS
1378 _Inout_ PFLT_CALLBACK_DATA Data,
1379 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1380 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1407 FLT_PREOP_CALLBACK_STATUS ReturnValue;
1409 PFILE_LINK_INFORMATION LinkInfo =
1410 Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
1411 PFILE_LINK_INFORMATION MungedLinkInfo =
NULL;
1412 ULONG MungedLinkInfoSize;
1413 PFLT_FILE_NAME_INFORMATION FileInfo =
NULL;
1417 UNICODE_STRING UserRemainder;
1419 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
1420 FO_OPENED_CASE_SENSITIVE );
1428 Status = FltGetInstanceContext( FltObjects->Instance,
1431 if (!NT_SUCCESS( Status )) {
1433 ReturnValue = FLT_PREOP_COMPLETE;
1434 goto NcPreSetLinkInformationCleanup;
1437 Status = FltGetDestinationFileNameInformation( FltObjects->Instance,
1438 FltObjects->FileObject,
1439 LinkInfo->RootDirectory,
1441 LinkInfo->FileNameLength,
1442 FLT_FILE_NAME_OPENED |
1443 FLT_FILE_NAME_QUERY_DEFAULT |
1444 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
1447 if (!NT_SUCCESS( Status )) {
1449 ReturnValue = FLT_PREOP_COMPLETE;
1450 goto NcPreSetLinkInformationCleanup;
1453 Status = FltParseFileNameInformation( FileInfo );
1455 if (!NT_SUCCESS( Status )) {
1457 ReturnValue = FLT_PREOP_COMPLETE;
1458 goto NcPreSetLinkInformationCleanup;
1484 if (RealOverlap.
Match) {
1486 Status = STATUS_ACCESS_DENIED;
1487 ReturnValue = FLT_PREOP_COMPLETE;
1488 goto NcPreSetLinkInformationCleanup;
1499 Status = STATUS_OBJECT_PATH_NOT_FOUND;
1500 ReturnValue = FLT_PREOP_COMPLETE;
1501 goto NcPreSetLinkInformationCleanup;
1504 LinkInfo->ReplaceIfExists) {
1511 Status = STATUS_ACCESS_DENIED;
1512 ReturnValue = FLT_PREOP_COMPLETE;
1513 goto NcPreSetLinkInformationCleanup;
1527 Status = STATUS_SUCCESS;
1528 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1529 goto NcPreSetLinkInformationCleanup;
1546 if (!NT_SUCCESS( Status )) {
1548 ReturnValue = FLT_PREOP_COMPLETE;
1549 goto NcPreSetLinkInformationCleanup;
1556 MungedLinkInfoSize =
sizeof(FILE_LINK_INFORMATION) + MungedName.Length -
sizeof(WCHAR);
1557 MungedLinkInfo = ExAllocatePoolWithTag( PagedPool,
1561 if (MungedLinkInfo ==
NULL) {
1563 Status = STATUS_INSUFFICIENT_RESOURCES;
1564 ReturnValue = FLT_PREOP_COMPLETE;
1565 goto NcPreSetLinkInformationCleanup;
1568 MungedLinkInfo->ReplaceIfExists = LinkInfo->ReplaceIfExists;
1569 MungedLinkInfo->RootDirectory =
NULL;
1570 MungedLinkInfo->FileNameLength = MungedName.Length;
1572 RtlCopyMemory( &MungedLinkInfo->FileName, MungedName.Buffer, MungedName.Length );
1578 Status = FltSetInformationFile( FltObjects->Instance,
1579 FltObjects->FileObject,
1582 FileLinkInformation );
1588 ReturnValue = FLT_PREOP_COMPLETE;
1590 NcPreSetLinkInformationCleanup:
1592 if (ReturnValue == FLT_PREOP_COMPLETE) {
1594 Data->IoStatus.Status =
Status;
1597 if (MungedLinkInfo !=
NULL) {
1602 if (FileInfo !=
NULL) {
1604 FltReleaseFileNameInformation( FileInfo );
1607 if (InstanceContext !=
NULL) {
1609 FltReleaseContext( InstanceContext );
1612 if (MungedName.Buffer !=
NULL) {
1614 ExFreePoolWithTag( MungedName.Buffer,
NC_TAG );
1620 FLT_PREOP_CALLBACK_STATUS
1622 _Inout_ PFLT_CALLBACK_DATA Data,
1623 _In_ PCFLT_RELATED_OBJECTS FltObjects,
1624 _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
1656 FLT_PREOP_CALLBACK_STATUS ReturnValue;
1668 PFILE_RENAME_INFORMATION RenameInfo =
1669 Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
1675 PFLT_FILE_NAME_INFORMATION TargetInfo =
NULL;
1676 PFLT_FILE_NAME_INFORMATION SrcInfo =
NULL;
1683 UNICODE_STRING TargetRealRemainder;
1690 UNICODE_STRING TargetUserRemainder;
1704 PFILE_RENAME_INFORMATION MungedRenameInfo =
NULL;
1705 ULONG MungedRenameLength;
1706 BOOLEAN IgnoreCase = !BooleanFlagOn( FltObjects->FileObject->Flags,
1707 FO_OPENED_CASE_SENSITIVE );
1709 FILE_INFORMATION_CLASS fileInformationClass;
1710 BOOLEAN ReplaceIfExists;
1712 fileInformationClass = Data->Iopb->Parameters.SetFileInformation.FileInformationClass;
1713 ReplaceIfExists = (fileInformationClass == FileRenameInformationEx) ?
1714 BooleanFlagOn( RenameInfo->Flags, FILE_RENAME_REPLACE_IF_EXISTS ) :
1715 RenameInfo->ReplaceIfExists;
1724 FLT_ASSERT( (fileInformationClass == FileRenameInformation) ||
1725 (fileInformationClass == FileRenameInformationEx) );
1731 Status = FltGetInstanceContext( FltObjects->Instance,
1734 if (!NT_SUCCESS( Status )) {
1736 ReturnValue = FLT_PREOP_COMPLETE;
1737 goto NcPreRenameCleanup;
1744 Status = NcGetFileNameInformation( Data,
1747 FLT_FILE_NAME_OPENED |
1748 FLT_FILE_NAME_QUERY_DEFAULT |
1749 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
1752 if (!NT_SUCCESS( Status )) {
1754 ReturnValue = FLT_PREOP_COMPLETE;
1755 goto NcPreRenameCleanup;
1758 Status = FltParseFileNameInformation( SrcInfo );
1760 if (!NT_SUCCESS( Status )) {
1762 ReturnValue = FLT_PREOP_COMPLETE;
1763 goto NcPreRenameCleanup;
1791 ReturnValue = FLT_PREOP_COMPLETE;
1792 Status = STATUS_ACCESS_DENIED;
1793 goto NcPreRenameCleanup;
1800 Status = FltGetDestinationFileNameInformation( FltObjects->Instance,
1801 FltObjects->FileObject,
1802 RenameInfo->RootDirectory,
1803 RenameInfo->FileName,
1804 RenameInfo->FileNameLength,
1805 FLT_FILE_NAME_OPENED |
1806 FLT_FILE_NAME_QUERY_DEFAULT |
1807 FLT_FILE_NAME_REQUEST_FROM_CURRENT_PROVIDER,
1810 if (!NT_SUCCESS( Status )) {
1812 ReturnValue = FLT_PREOP_COMPLETE;
1813 goto NcPreRenameCleanup;
1816 Status = FltParseFileNameInformation( TargetInfo );
1818 if( !NT_SUCCESS( Status ) ) {
1822 ReturnValue = FLT_PREOP_COMPLETE;
1823 goto NcPreRenameCleanup;
1832 &TargetRealRemainder,
1835 &TargetRealOverlap );
1839 &TargetUserRemainder,
1842 &TargetUserOverlap );
1852 Status = STATUS_ACCESS_DENIED;
1853 ReturnValue = FLT_PREOP_COMPLETE;
1854 goto NcPreRenameCleanup;
1859 Status = STATUS_ACCESS_DENIED;
1860 ReturnValue = FLT_PREOP_COMPLETE;
1861 goto NcPreRenameCleanup;
1872 (RenameInfo->FileName[0] !=
':')) {
1875 &TargetUserRemainder,
1877 &MungedTargetName );
1879 if (!NT_SUCCESS( Status )) {
1881 ReturnValue = FLT_PREOP_COMPLETE;
1882 goto NcPreRenameCleanup;
1895 MungedRenameLength =
sizeof(FILE_RENAME_INFORMATION) -
1897 MungedTargetName.Length;
1899 MungedRenameInfo = ExAllocatePoolWithTag( PagedPool,
1903 if (MungedRenameInfo ==
NULL) {
1905 Status = STATUS_INSUFFICIENT_RESOURCES;
1906 ReturnValue = FLT_PREOP_COMPLETE;
1907 goto NcPreRenameCleanup;
1914 MungedRenameInfo->Flags = RenameInfo->Flags;
1915 MungedRenameInfo->RootDirectory =
NULL;
1916 MungedRenameInfo->FileNameLength = MungedTargetName.Length;
1918 MungedTargetName.Buffer,
1919 MungedTargetName.Length );
1928 Status = FltSetInformationFile( FltObjects->Instance,
1929 FltObjects->FileObject,
1932 fileInformationClass );
1938 ReturnValue = FLT_PREOP_COMPLETE;
1939 goto NcPreRenameCleanup;
1948 ReturnValue = FLT_PREOP_SUCCESS_NO_CALLBACK;
1949 goto NcPreRenameCleanup;
1955 if (ReturnValue == FLT_PREOP_COMPLETE) {
1957 Data->IoStatus.Status =
Status;
1960 if (InstanceContext !=
NULL) {
1962 FltReleaseContext( InstanceContext );
1965 if (TargetInfo !=
NULL) {
1967 FltReleaseFileNameInformation( TargetInfo );
1970 if (SrcInfo !=
NULL) {
1972 FltReleaseFileNameInformation( SrcInfo );
1975 if (MungedTargetName.Buffer !=
NULL) {
1980 if (MungedRenameInfo !=
NULL) {
#define EMPTY_UNICODE_STRING
UNICODE_STRING FinalComponentName
FLT_PREOP_CALLBACK_STATUS NcPreRename(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
NC_MAPPING_ENTRY RealMapping
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
FLT_PREOP_CALLBACK_STATUS NcPreSetShortName(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
#define NC_RENAME_BUFFER_TAG
NC_MAPPING_PATH ShortNamePath
NC_MAPPING_PATH LongNamePath
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
#define NC_SET_LINK_BUFFER_TAG
UNICODE_STRING VolumelessName
FLT_FILESYSTEM_TYPE VolumeFilesystemType
NC_MAPPING_ENTRY UserMapping
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE _In_ FLT_FILE_NAME_OPTIONS _Outptr_ PFLT_FILE_NAME_INFORMATION * FileNameInformation
FLT_POSTOP_CALLBACK_STATUS NcPostQueryHardLinks(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_opt_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
UNREFERENCED_PARAMETER(FileObject)
NcLoadRegistryStringRetry NULL
FLT_POSTOP_CALLBACK_STATUS NcPostQueryName(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _In_opt_ PVOID CompletionContext, _In_ FLT_POST_OPERATION_FLAGS Flags)
UNICODE_STRING ParentPath
BOOLEAN NcComparePath(_In_ PCUNICODE_STRING Name, _In_ PNC_MAPPING_ENTRY Mapping, _Out_opt_ PUNICODE_STRING Remainder, _In_ BOOLEAN IgnoreCase, _In_ BOOLEAN ContainsDevice, _Out_ PNC_PATH_OVERLAP Overlap)
NC_GLOBAL_DATA NcGlobalData
FLT_PREOP_CALLBACK_STATUS NcPreSetDisposition(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
#define AlignToSize(_length, _alignment)
NTSTATUS NcCreateFileHelper(_In_ PFLT_FILTER Filter, _In_opt_ PFLT_INSTANCE Instance, _Out_ PHANDLE FileHandle, _Outptr_opt_ PFILE_OBJECT *FileObject, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_opt_ PLARGE_INTEGER AllocationSize, _In_ ULONG FileAttributes, _In_ ULONG ShareAccess, _In_ ULONG CreateDisposition, _In_ ULONG CreateOptions, _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, _In_ ULONG EaLength, _In_ ULONG Flags, _In_opt_ PFILE_OBJECT ParentFileObject)
NcLoadRegistryStringCleanup NC_TAG
#define NC_GENERATE_NAME_TAG
FLT_PREOP_CALLBACK_STATUS NcPreSetLinkInformation(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)
FLT_PREOP_CALLBACK_STATUS NcPreQueryAlternateName(_Inout_ PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, _Flt_CompletionContext_Outptr_ PVOID *CompletionContext)