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
svn path=/trunk/; revision=64800
PNTFS_ATTR_RECORD AttrRecord;
PNTFS_ATTR_RECORD AttrRecordEnd;
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);
AttrRecord = (PNTFS_ATTR_RECORD)((PCHAR)MftRecord + MftRecord->AttributeOffset);
AttrRecordEnd = (PNTFS_ATTR_RECORD)((PCHAR)MftRecord + Vcb->NtfsInfo.BytesPerFileRecord);
PUNICODE_STRING FileName,
PULONG FirstEntry,
BOOLEAN DirSearch,
PUNICODE_STRING FileName,
PULONG FirstEntry,
BOOLEAN DirSearch,
- ULONGLONG *OutMFTIndex,
- PWSTR OutName)
+ ULONGLONG *OutMFTIndex)
{
PFILE_RECORD_HEADER MftRecord;
//ULONG Magic;
{
PFILE_RECORD_HEADER MftRecord;
//ULONG Magic;
NTSTATUS Status;
ULONG CurrentEntry = 0;
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,
MftRecord = ExAllocatePoolWithTag(NonPagedPool,
Vcb->NtfsInfo.BytesPerFileRecord,
{
*OutMFTIndex = (IndexEntry->Data.Directory.IndexedFile & NTFS_MFT_MASK);
*FirstEntry = CurrentEntry;
{
*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;
ExFreePoolWithTag(IndexRecord, TAG_NTFS);
ExFreePoolWithTag(MftRecord, TAG_NTFS);
return STATUS_SUCCESS;
DPRINT("File found\n");
*OutMFTIndex = (IndexEntry->Data.Directory.IndexedFile & NTFS_MFT_MASK);
*FirstEntry = CurrentEntry;
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);
ExFreePoolWithTag(BitmapData, TAG_NTFS);
ExFreePoolWithTag(IndexRecord, TAG_NTFS);
ExFreePoolWithTag(MftRecord, TAG_NTFS);
{
UNICODE_STRING Current, Remaining;
NTSTATUS Status;
{
UNICODE_STRING Current, Remaining;
NTSTATUS Status;
- WCHAR FoundName[MAX_PATH + 1];
- ULONG FirstEntry = 0, Length;
DPRINT1("NtfsLookupFileAt(%p, %wZ, %p, %p, %I64x)\n", Vcb, PathName, FileRecord, DataContext, CurrentMFTIndex);
DPRINT1("NtfsLookupFileAt(%p, %wZ, %p, %p, %I64x)\n", Vcb, PathName, FileRecord, DataContext, CurrentMFTIndex);
{
DPRINT1("Current: %wZ\n", &Current);
{
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;
if (!NT_SUCCESS(Status))
{
return Status;
- Length = wcslen(FoundName) * sizeof(WCHAR);
-
- Status = FindAttribute(Vcb, *FileRecord, AttributeData, FoundName, Length, DataContext);
- if (!NT_SUCCESS(Status))
+ if (!((*FileRecord)->Flags & FRH_DIRECTORY))
- DPRINT("NtfsLookupFileAt: Can't find data attribute\n");
- ExFreePoolWithTag(*FileRecord, TAG_NTFS);
- return Status;
+ 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;
}
*MFTIndex = CurrentMFTIndex;
ULONGLONG CurrentMFTIndex)
{
NTSTATUS Status;
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);
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;
if (!NT_SUCCESS(Status))
{
return Status;
- Length = wcslen(FoundName) * sizeof(WCHAR);
-
- Status = FindAttribute(Vcb, *FileRecord, AttributeData, FoundName, Length, DataContext);
- if (!NT_SUCCESS(Status))
+ if (!((*FileRecord)->Flags & FRH_DIRECTORY))
- DPRINT("NtfsFindFileAt: Can't find data attribute\n");
- ExFreePoolWithTag(*FileRecord, TAG_NTFS);
- return Status;
+ 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;
}
*MFTIndex = CurrentMFTIndex;