Author: pschweitzer
Date: Sat Oct 18 12:18:37 2014
New Revision: 64800
URL:
http://svn.reactos.org/svn/reactos?rev=64800&view=rev
Log:
[NTFS]
Bugfixing... Part 5/X:
- Actually, we don't care about the name in the file index. We don't need it to
read the data attribute, it's unnamed. And the returned name was buggy (this still
needs work though)
- When we are getting a file record which is a directory, there is NO data attribute.
Don't attempt to read it. This prevents failure on directory entry return.
These fixes enable NTFS directory listing in ReactOS!
Even though, more fixes are required. So far, the metadata of the files are kind of
broken. Explorer seems to be unable to list files.
This keeps anyway being a major step forward, as this was totally impossible a month ago
;-).
For these willing to see NTFS in action in ReactOS:
http://www.heisspiter.net/~Pierre/rostests/NTFS_listing.png
Modified:
trunk/reactos/drivers/filesystems/ntfs/mft.c
Modified: trunk/reactos/drivers/filesystems/ntfs/mft.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/ntfs/m…
==============================================================================
--- trunk/reactos/drivers/filesystems/ntfs/mft.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/ntfs/mft.c [iso-8859-1] Sat Oct 18 12:18:37 2014
@@ -180,7 +180,7 @@
PNTFS_ATTR_RECORD AttrRecord;
PNTFS_ATTR_RECORD AttrRecordEnd;
- DPRINT1("NtfsFindAttribute(%p, %p, %u, %S, %u, %p)\n", Vcb, MftRecord,
Type, Name, NameLength, AttrCtx);
+ DPRINT1("FindAttribute(%p, %p, %u, %S, %u, %p)\n", Vcb, MftRecord, Type,
Name, NameLength, AttrCtx);
AttrRecord = (PNTFS_ATTR_RECORD)((PCHAR)MftRecord + MftRecord->AttributeOffset);
AttrRecordEnd = (PNTFS_ATTR_RECORD)((PCHAR)MftRecord +
Vcb->NtfsInfo.BytesPerFileRecord);
@@ -488,8 +488,7 @@
PUNICODE_STRING FileName,
PULONG FirstEntry,
BOOLEAN DirSearch,
- ULONGLONG *OutMFTIndex,
- PWSTR OutName)
+ ULONGLONG *OutMFTIndex)
{
PFILE_RECORD_HEADER MftRecord;
//ULONG Magic;
@@ -508,7 +507,7 @@
NTSTATUS Status;
ULONG CurrentEntry = 0;
- DPRINT1("NtfsFindMftRecord(%p, %I64d, %wZ, %p, %u, %p, %p)\n", Vcb,
MFTIndex, FileName, FirstEntry, DirSearch, OutMFTIndex, OutName);
+ DPRINT1("NtfsFindMftRecord(%p, %I64d, %wZ, %p, %u, %p)\n", Vcb, MFTIndex,
FileName, FirstEntry, DirSearch, OutMFTIndex);
MftRecord = ExAllocatePoolWithTag(NonPagedPool,
Vcb->NtfsInfo.BytesPerFileRecord,
@@ -554,8 +553,6 @@
{
*OutMFTIndex = (IndexEntry->Data.Directory.IndexedFile &
NTFS_MFT_MASK);
*FirstEntry = CurrentEntry;
- RtlCopyMemory(OutName, IndexEntry->FileName.Name,
IndexEntry->FileName.NameLength);
- OutName[IndexEntry->FileName.NameLength / sizeof(WCHAR)] =
UNICODE_NULL;
ExFreePoolWithTag(IndexRecord, TAG_NTFS);
ExFreePoolWithTag(MftRecord, TAG_NTFS);
return STATUS_SUCCESS;
@@ -648,8 +645,6 @@
DPRINT("File found\n");
*OutMFTIndex = (IndexEntry->Data.Directory.IndexedFile &
NTFS_MFT_MASK);
*FirstEntry = CurrentEntry;
- RtlCopyMemory(OutName, IndexEntry->FileName.Name,
IndexEntry->FileName.NameLength);
- OutName[IndexEntry->FileName.NameLength / sizeof(WCHAR)] =
UNICODE_NULL;
ExFreePoolWithTag(BitmapData, TAG_NTFS);
ExFreePoolWithTag(IndexRecord, TAG_NTFS);
ExFreePoolWithTag(MftRecord, TAG_NTFS);
@@ -689,8 +684,7 @@
{
UNICODE_STRING Current, Remaining;
NTSTATUS Status;
- WCHAR FoundName[MAX_PATH + 1];
- ULONG FirstEntry = 0, Length;
+ ULONG FirstEntry = 0;
DPRINT1("NtfsLookupFileAt(%p, %wZ, %p, %p, %I64x)\n", Vcb, PathName,
FileRecord, DataContext, CurrentMFTIndex);
@@ -700,7 +694,7 @@
{
DPRINT1("Current: %wZ\n", &Current);
- Status = NtfsFindMftRecord(Vcb, CurrentMFTIndex, &Current, &FirstEntry,
FALSE, &CurrentMFTIndex, FoundName);
+ Status = NtfsFindMftRecord(Vcb, CurrentMFTIndex, &Current, &FirstEntry,
FALSE, &CurrentMFTIndex);
if (!NT_SUCCESS(Status))
{
return Status;
@@ -727,14 +721,19 @@
return Status;
}
- Length = wcslen(FoundName) * sizeof(WCHAR);
-
- Status = FindAttribute(Vcb, *FileRecord, AttributeData, FoundName, Length,
DataContext);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("NtfsLookupFileAt: Can't find data attribute\n");
- ExFreePoolWithTag(*FileRecord, TAG_NTFS);
- return Status;
+ if (!((*FileRecord)->Flags & FRH_DIRECTORY))
+ {
+ Status = FindAttribute(Vcb, *FileRecord, AttributeData, L"", 0,
DataContext);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtfsLookupFileAt: Can't find data attribute\n");
+ ExFreePoolWithTag(*FileRecord, TAG_NTFS);
+ return Status;
+ }
+ }
+ else
+ {
+ *DataContext = NULL;
}
*MFTIndex = CurrentMFTIndex;
@@ -762,12 +761,10 @@
ULONGLONG CurrentMFTIndex)
{
NTSTATUS Status;
- WCHAR FoundName[MAX_PATH + 1];
- ULONG Length;
DPRINT1("NtfsFindFileAt(%p, %wZ, %p, %p, %p, %p, %I64x)\n", Vcb,
SearchPattern, FirstEntry, FileRecord, DataContext, MFTIndex, CurrentMFTIndex);
- Status = NtfsFindMftRecord(Vcb, CurrentMFTIndex, SearchPattern, FirstEntry, TRUE,
&CurrentMFTIndex, FoundName);
+ Status = NtfsFindMftRecord(Vcb, CurrentMFTIndex, SearchPattern, FirstEntry, TRUE,
&CurrentMFTIndex);
if (!NT_SUCCESS(Status))
{
return Status;
@@ -788,14 +785,19 @@
return Status;
}
- Length = wcslen(FoundName) * sizeof(WCHAR);
-
- Status = FindAttribute(Vcb, *FileRecord, AttributeData, FoundName, Length,
DataContext);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("NtfsFindFileAt: Can't find data attribute\n");
- ExFreePoolWithTag(*FileRecord, TAG_NTFS);
- return Status;
+ if (!((*FileRecord)->Flags & FRH_DIRECTORY))
+ {
+ Status = FindAttribute(Vcb, *FileRecord, AttributeData, L"", 0,
DataContext);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtfsFindFileAt: Can't find data attribute\n");
+ ExFreePoolWithTag(*FileRecord, TAG_NTFS);
+ return Status;
+ }
+ }
+ else
+ {
+ *DataContext = NULL;
}
*MFTIndex = CurrentMFTIndex;