mirror of
https://github.com/reactos/reactos.git
synced 2025-07-12 22:24:13 +00:00
[NTFS] - Add some utility functions and improve some comments. Improve NtfsAddFilenameToDirectory().
+PrintAllVCNs() - Diagnostic function which prints VCN of every node in an index allocation. +GetAllocationOffsetFromVCN() - Calculates location of an index buffer from the node's VCN. +GetInfoClassName() - Gets a string representation of an info class enumeration, to speed up development of unimplemented classes. -NtfsSetInformation() & NtfsQueryInformation() - Use GetInfoClassName to report unhandled information classes. -CompareTreeKeys() - Add a comment and clarify some comments. -NtfsAddFilenameToDirectory() - Don't try to update the size of Index Root on disk if the attribute length hasn't changed. svn path=/branches/GSoC_2016/NTFS/; revision=75424
This commit is contained in:
parent
9cef425464
commit
5579428b4f
4 changed files with 206 additions and 22 deletions
|
@ -32,6 +32,47 @@
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
|
// TEMP FUNCTION for diagnostic purposes.
|
||||||
|
// Prints VCN of every node in an index allocation
|
||||||
|
VOID
|
||||||
|
PrintAllVCNs(PDEVICE_EXTENSION Vcb,
|
||||||
|
PNTFS_ATTR_CONTEXT IndexAllocationContext,
|
||||||
|
ULONG NodeSize)
|
||||||
|
{
|
||||||
|
ULONGLONG CurrentOffset = 0;
|
||||||
|
PINDEX_BUFFER CurrentNode, Buffer;
|
||||||
|
ULONGLONG BufferSize = AttributeDataLength(&IndexAllocationContext->Record);
|
||||||
|
ULONGLONG i;
|
||||||
|
int Count = 0;
|
||||||
|
|
||||||
|
Buffer = ExAllocatePoolWithTag(NonPagedPool, BufferSize, TAG_NTFS);
|
||||||
|
|
||||||
|
ULONG BytesRead = ReadAttribute(Vcb, IndexAllocationContext, 0, (PCHAR)Buffer, BufferSize);
|
||||||
|
|
||||||
|
ASSERT(BytesRead = BufferSize);
|
||||||
|
|
||||||
|
CurrentNode = Buffer;
|
||||||
|
|
||||||
|
// loop through all the nodes
|
||||||
|
for (i = 0; i < BufferSize; i += NodeSize)
|
||||||
|
{
|
||||||
|
NTSTATUS Status = FixupUpdateSequenceArray(Vcb, &CurrentNode->Ntfs);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("ERROR: Fixing fixup failed!\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT1("Node #%d, VCN: %I64u\n", Count, CurrentNode->VCN);
|
||||||
|
|
||||||
|
CurrentNode = (PINDEX_BUFFER)((ULONG_PTR)CurrentNode + NodeSize);
|
||||||
|
CurrentOffset += NodeSize;
|
||||||
|
Count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExFreePoolWithTag(Buffer, TAG_NTFS);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name CompareTreeKeys
|
* @name CompareTreeKeys
|
||||||
* @implemented
|
* @implemented
|
||||||
|
@ -62,6 +103,7 @@ CompareTreeKeys(PB_TREE_KEY Key1, PB_TREE_KEY Key2, BOOLEAN CaseSensitive)
|
||||||
UNICODE_STRING Key1Name, Key2Name;
|
UNICODE_STRING Key1Name, Key2Name;
|
||||||
LONG Comparison;
|
LONG Comparison;
|
||||||
|
|
||||||
|
// Key1 must not be the final key (AKA the dummy key)
|
||||||
ASSERT(!(Key1->IndexEntry->Flags & NTFS_INDEX_ENTRY_END));
|
ASSERT(!(Key1->IndexEntry->Flags & NTFS_INDEX_ENTRY_END));
|
||||||
|
|
||||||
// If Key2 is the "dummy key", key 1 will always come first
|
// If Key2 is the "dummy key", key 1 will always come first
|
||||||
|
@ -89,7 +131,7 @@ CompareTreeKeys(PB_TREE_KEY Key1, PB_TREE_KEY Key2, BOOLEAN CaseSensitive)
|
||||||
// Compare the names of the same length
|
// Compare the names of the same length
|
||||||
Comparison = RtlCompareUnicodeString(&Key1Name, &Key2Name, !CaseSensitive);
|
Comparison = RtlCompareUnicodeString(&Key1Name, &Key2Name, !CaseSensitive);
|
||||||
|
|
||||||
// If the truncated files are the same length, the shorter one comes first
|
// If the truncated names are the same length, the shorter one comes first
|
||||||
if (Comparison == 0)
|
if (Comparison == 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -102,7 +144,7 @@ CompareTreeKeys(PB_TREE_KEY Key1, PB_TREE_KEY Key2, BOOLEAN CaseSensitive)
|
||||||
// Compare the names of the same length
|
// Compare the names of the same length
|
||||||
Comparison = RtlCompareUnicodeString(&Key1Name, &Key2Name, !CaseSensitive);
|
Comparison = RtlCompareUnicodeString(&Key1Name, &Key2Name, !CaseSensitive);
|
||||||
|
|
||||||
// If the truncated files are the same length, the shorter one comes first
|
// If the truncated names are the same length, the shorter one comes first
|
||||||
if (Comparison == 0)
|
if (Comparison == 0)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -289,6 +289,128 @@ NtfsGetSteamInformation(PNTFS_FCB Fcb,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert enum value to friendly name
|
||||||
|
const PCSTR
|
||||||
|
GetInfoClassName(FILE_INFORMATION_CLASS infoClass)
|
||||||
|
{
|
||||||
|
const PCSTR fileInfoClassNames[] = { "???????",
|
||||||
|
"FileDirectoryInformation",
|
||||||
|
"FileFullDirectoryInformation",
|
||||||
|
"FileBothDirectoryInformation",
|
||||||
|
"FileBasicInformation",
|
||||||
|
"FileStandardInformation",
|
||||||
|
"FileInternalInformation",
|
||||||
|
"FileEaInformation",
|
||||||
|
"FileAccessInformation",
|
||||||
|
"FileNameInformation",
|
||||||
|
"FileRenameInformation",
|
||||||
|
"FileLinkInformation",
|
||||||
|
"FileNamesInformation",
|
||||||
|
"FileDispositionInformation",
|
||||||
|
"FilePositionInformation",
|
||||||
|
"FileFullEaInformation",
|
||||||
|
"FileModeInformation",
|
||||||
|
"FileAlignmentInformation",
|
||||||
|
"FileAllInformation",
|
||||||
|
"FileAllocationInformation",
|
||||||
|
"FileEndOfFileInformation",
|
||||||
|
"FileAlternateNameInformation",
|
||||||
|
"FileStreamInformation",
|
||||||
|
"FilePipeInformation",
|
||||||
|
"FilePipeLocalInformation",
|
||||||
|
"FilePipeRemoteInformation",
|
||||||
|
"FileMailslotQueryInformation",
|
||||||
|
"FileMailslotSetInformation",
|
||||||
|
"FileCompressionInformation",
|
||||||
|
"FileObjectIdInformation",
|
||||||
|
"FileCompletionInformation",
|
||||||
|
"FileMoveClusterInformation",
|
||||||
|
"FileQuotaInformation",
|
||||||
|
"FileReparsePointInformation",
|
||||||
|
"FileNetworkOpenInformation",
|
||||||
|
"FileAttributeTagInformation",
|
||||||
|
"FileTrackingInformation",
|
||||||
|
"FileIdBothDirectoryInformation",
|
||||||
|
"FileIdFullDirectoryInformation",
|
||||||
|
"FileValidDataLengthInformation",
|
||||||
|
"FileShortNameInformation",
|
||||||
|
"FileIoCompletionNotificationInformation",
|
||||||
|
"FileIoStatusBlockRangeInformation",
|
||||||
|
"FileIoPriorityHintInformation",
|
||||||
|
"FileSfioReserveInformation",
|
||||||
|
"FileSfioVolumeInformation",
|
||||||
|
"FileHardLinkInformation",
|
||||||
|
"FileProcessIdsUsingFileInformation",
|
||||||
|
"FileNormalizedNameInformation",
|
||||||
|
"FileNetworkPhysicalNameInformation",
|
||||||
|
"FileIdGlobalTxDirectoryInformation",
|
||||||
|
"FileIsRemoteDeviceInformation",
|
||||||
|
"FileAttributeCacheInformation",
|
||||||
|
"FileNumaNodeInformation",
|
||||||
|
"FileStandardLinkInformation",
|
||||||
|
"FileRemoteProtocolInformation",
|
||||||
|
"FileReplaceCompletionInformation",
|
||||||
|
"FileMaximumInformation",
|
||||||
|
"FileDirectoryInformation",
|
||||||
|
"FileFullDirectoryInformation",
|
||||||
|
"FileBothDirectoryInformation",
|
||||||
|
"FileBasicInformation",
|
||||||
|
"FileStandardInformation",
|
||||||
|
"FileInternalInformation",
|
||||||
|
"FileEaInformation",
|
||||||
|
"FileAccessInformation",
|
||||||
|
"FileNameInformation",
|
||||||
|
"FileRenameInformation",
|
||||||
|
"FileLinkInformation",
|
||||||
|
"FileNamesInformation",
|
||||||
|
"FileDispositionInformation",
|
||||||
|
"FilePositionInformation",
|
||||||
|
"FileFullEaInformation",
|
||||||
|
"FileModeInformation",
|
||||||
|
"FileAlignmentInformation",
|
||||||
|
"FileAllInformation",
|
||||||
|
"FileAllocationInformation",
|
||||||
|
"FileEndOfFileInformation",
|
||||||
|
"FileAlternateNameInformation",
|
||||||
|
"FileStreamInformation",
|
||||||
|
"FilePipeInformation",
|
||||||
|
"FilePipeLocalInformation",
|
||||||
|
"FilePipeRemoteInformation",
|
||||||
|
"FileMailslotQueryInformation",
|
||||||
|
"FileMailslotSetInformation",
|
||||||
|
"FileCompressionInformation",
|
||||||
|
"FileObjectIdInformation",
|
||||||
|
"FileCompletionInformation",
|
||||||
|
"FileMoveClusterInformation",
|
||||||
|
"FileQuotaInformation",
|
||||||
|
"FileReparsePointInformation",
|
||||||
|
"FileNetworkOpenInformation",
|
||||||
|
"FileAttributeTagInformation",
|
||||||
|
"FileTrackingInformation",
|
||||||
|
"FileIdBothDirectoryInformation",
|
||||||
|
"FileIdFullDirectoryInformation",
|
||||||
|
"FileValidDataLengthInformation",
|
||||||
|
"FileShortNameInformation",
|
||||||
|
"FileIoCompletionNotificationInformation",
|
||||||
|
"FileIoStatusBlockRangeInformation",
|
||||||
|
"FileIoPriorityHintInformation",
|
||||||
|
"FileSfioReserveInformation",
|
||||||
|
"FileSfioVolumeInformation",
|
||||||
|
"FileHardLinkInformation",
|
||||||
|
"FileProcessIdsUsingFileInformation",
|
||||||
|
"FileNormalizedNameInformation",
|
||||||
|
"FileNetworkPhysicalNameInformation",
|
||||||
|
"FileIdGlobalTxDirectoryInformation",
|
||||||
|
"FileIsRemoteDeviceInformation",
|
||||||
|
"FileAttributeCacheInformation",
|
||||||
|
"FileNumaNodeInformation",
|
||||||
|
"FileStandardLinkInformation",
|
||||||
|
"FileRemoteProtocolInformation",
|
||||||
|
"FileReplaceCompletionInformation",
|
||||||
|
"FileMaximumInformation" };
|
||||||
|
return fileInfoClassNames[infoClass];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Retrieve the specified file information
|
* FUNCTION: Retrieve the specified file information
|
||||||
*/
|
*/
|
||||||
|
@ -376,12 +498,12 @@ NtfsQueryInformation(PNTFS_IRP_CONTEXT IrpContext)
|
||||||
|
|
||||||
case FileAlternateNameInformation:
|
case FileAlternateNameInformation:
|
||||||
case FileAllInformation:
|
case FileAllInformation:
|
||||||
DPRINT1("Unimplemented information class %u\n", FileInformationClass);
|
DPRINT1("Unimplemented information class: %s\n", GetInfoClassName(FileInformationClass));
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINT1("Unimplemented information class %u\n", FileInformationClass);
|
DPRINT1("Unimplemented information class: %s\n", GetInfoClassName(FileInformationClass));
|
||||||
Status = STATUS_INVALID_PARAMETER;
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,7 +767,7 @@ NtfsSetInformation(PNTFS_IRP_CONTEXT IrpContext)
|
||||||
// TODO: all other information classes
|
// TODO: all other information classes
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DPRINT1("FIXME: Unimplemented information class %u\n", FileInformationClass);
|
DPRINT1("FIXME: Unimplemented information class: %s\n", GetInfoClassName(FileInformationClass));
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2018,6 +2018,9 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
|
||||||
// we must create an index allocation and index bitmap (TODO). Also TODO: support file records with
|
// we must create an index allocation and index bitmap (TODO). Also TODO: support file records with
|
||||||
// $ATTRIBUTE_LIST's.
|
// $ATTRIBUTE_LIST's.
|
||||||
AttributeLength = NewIndexRoot->Header.AllocatedSize + FIELD_OFFSET(INDEX_ROOT_ATTRIBUTE, Header);
|
AttributeLength = NewIndexRoot->Header.AllocatedSize + FIELD_OFFSET(INDEX_ROOT_ATTRIBUTE, Header);
|
||||||
|
|
||||||
|
if (AttributeLength != IndexRootContext->Record.Resident.ValueLength)
|
||||||
|
{
|
||||||
DestinationAttribute = (PNTFS_ATTR_RECORD)((ULONG_PTR)ParentFileRecord + IndexRootOffset);
|
DestinationAttribute = (PNTFS_ATTR_RECORD)((ULONG_PTR)ParentFileRecord + IndexRootOffset);
|
||||||
|
|
||||||
// Find the attribute (or attribute-end marker) after the index root
|
// Find the attribute (or attribute-end marker) after the index root
|
||||||
|
@ -2037,6 +2040,7 @@ NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt,
|
||||||
ParentFileRecord,
|
ParentFileRecord,
|
||||||
IndexRootOffset,
|
IndexRootOffset,
|
||||||
AttributeLength);
|
AttributeLength);
|
||||||
|
}
|
||||||
|
|
||||||
NT_ASSERT(ParentFileRecord->BytesInUse <= DeviceExt->NtfsInfo.BytesPerFileRecord);
|
NT_ASSERT(ParentFileRecord->BytesInUse <= DeviceExt->NtfsInfo.BytesPerFileRecord);
|
||||||
|
|
||||||
|
|
|
@ -208,6 +208,9 @@ typedef enum
|
||||||
#define INDEX_ROOT_SMALL 0x0
|
#define INDEX_ROOT_SMALL 0x0
|
||||||
#define INDEX_ROOT_LARGE 0x1
|
#define INDEX_ROOT_LARGE 0x1
|
||||||
|
|
||||||
|
#define INDEX_NODE_SMALL 0x0
|
||||||
|
#define INDEX_NODE_LARGE 0x1
|
||||||
|
|
||||||
#define NTFS_INDEX_ENTRY_NODE 1
|
#define NTFS_INDEX_ENTRY_NODE 1
|
||||||
#define NTFS_INDEX_ENTRY_END 2
|
#define NTFS_INDEX_ENTRY_END 2
|
||||||
|
|
||||||
|
@ -700,9 +703,22 @@ CreateIndexRootFromBTree(PDEVICE_EXTENSION DeviceExt,
|
||||||
VOID
|
VOID
|
||||||
DestroyBTree(PB_TREE Tree);
|
DestroyBTree(PB_TREE Tree);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
DestroyBTreeNode(PB_TREE_FILENAME_NODE Node);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DumpBTree(PB_TREE Tree);
|
DumpBTree(PB_TREE Tree);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
DumpBTreeNode(PB_TREE_FILENAME_NODE Node,
|
||||||
|
ULONG Number,
|
||||||
|
ULONG Depth);
|
||||||
|
|
||||||
|
ULONGLONG
|
||||||
|
GetAllocationOffsetFromVCN(PDEVICE_EXTENSION DeviceExt,
|
||||||
|
ULONG IndexBufferSize,
|
||||||
|
ULONGLONG Vcn);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NtfsInsertKey(ULONGLONG FileReference,
|
NtfsInsertKey(ULONGLONG FileReference,
|
||||||
PFILENAME_ATTRIBUTE FileNameAttribute,
|
PFILENAME_ATTRIBUTE FileNameAttribute,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue