Author: zguo Date: Thu Oct 23 15:45:12 2014 New Revision: 64927
URL: http://svn.reactos.org/svn/reactos?rev=64927&view=rev Log: [NTFS] Cherrypick NTFS related changes from trunk for 0.3.17.
Modified: branches/0.3.17/ (props changed) branches/0.3.17/reactos/ (props changed) branches/0.3.17/reactos/drivers/filesystems/ntfs/dirctl.c branches/0.3.17/reactos/drivers/filesystems/ntfs/fsctl.c branches/0.3.17/reactos/drivers/filesystems/ntfs/mft.c branches/0.3.17/reactos/drivers/filesystems/ntfs/misc.c branches/0.3.17/reactos/drivers/filesystems/ntfs/ntfs.h branches/0.3.17/reactos/drivers/filesystems/ntfs/volinfo.c
Propchange: branches/0.3.17/ ------------------------------------------------------------------------------ svn:mergeinfo = /trunk:64769
Propchange: branches/0.3.17/reactos/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Oct 23 15:45:12 2014 @@ -18,4 +18,4 @@ /branches/usb-bringup:51335,51337,51341-51343,51348,51350,51353,51355,51365-51369,51372,51384-54388,54396-54398,54736-54737,54752-54754,54756-54760,54762,54764-54765,54767-54768,54772,54774-54777,54781,54787,54790-54792,54797-54798,54806,54808,54834-54838,54843,54850,54852,54856,54858-54859 /branches/usb-bringup-trunk:55019-55543,55548-55554,55556-55567 /branches/wlan-bringup:54809-54998 -/trunk/reactos:64769 +/trunk/reactos:64752-64754,64765,64769,64771,64776,64793,64800,64825,64829,64832-64833
Modified: branches/0.3.17/reactos/drivers/filesystems/ntfs/dirctl.c URL: http://svn.reactos.org/svn/reactos/branches/0.3.17/reactos/drivers/filesyste... ============================================================================== --- branches/0.3.17/reactos/drivers/filesystems/ntfs/dirctl.c [iso-8859-1] (original) +++ branches/0.3.17/reactos/drivers/filesystems/ntfs/dirctl.c [iso-8859-1] Thu Oct 23 15:45:12 2014 @@ -120,400 +120,206 @@
return(STATUS_SUCCESS); } +#endif
static NTSTATUS -CdfsFindFile(PDEVICE_EXTENSION DeviceExt, - PFCB Fcb, - PFCB Parent, - PWSTR FileToFind, - PULONG pDirIndex, - PULONG pDirIndex2) -/* - * FUNCTION: Find a file - */ -{ - WCHAR name[256]; - WCHAR TempStr[2]; - PVOID Block; - NTSTATUS Status; - ULONG len; - ULONG DirIndex; - ULONG Offset; - ULONG Read; - BOOLEAN IsRoot; - PVOID Context = NULL; - ULONG DirSize; - PUCHAR Ptr; - PDIR_RECORD Record; - LARGE_INTEGER StreamOffset; - - DPRINT("FindFile(Parent %x, FileToFind '%S', DirIndex: %d)\n", - Parent, FileToFind, pDirIndex ? *pDirIndex : 0); - DPRINT("FindFile: old Pathname %x, old Objectname %x)\n", - Fcb->PathName, Fcb->ObjectName); - - IsRoot = FALSE; - DirIndex = 0; - if (wcslen (FileToFind) == 0) - { - CHECKPOINT; - TempStr[0] = (WCHAR) '.'; - TempStr[1] = 0; - FileToFind = (PWSTR)&TempStr; - } - - if (Parent) - { - if (Parent->Entry.ExtentLocationL == DeviceExt->CdInfo.RootStart) - { - IsRoot = TRUE; - } - } - else - { - IsRoot = TRUE; - } - - if (IsRoot == TRUE) - { - StreamOffset.QuadPart = (LONGLONG)DeviceExt->CdInfo.RootStart * (LONGLONG)BLOCKSIZE; - DirSize = DeviceExt->CdInfo.RootSize; - - - if (FileToFind[0] == 0 || (FileToFind[0] == '\' && FileToFind[1] == 0) - || (FileToFind[0] == '.' && FileToFind[1] == 0)) - { - /* it's root : complete essentials fields then return ok */ - RtlZeroMemory(Fcb, sizeof(FCB)); - - Fcb->PathName[0]='\'; - Fcb->ObjectName = &Fcb->PathName[1]; - Fcb->Entry.ExtentLocationL = DeviceExt->CdInfo.RootStart; - Fcb->Entry.DataLengthL = DeviceExt->CdInfo.RootSize; - Fcb->Entry.FileFlags = 0x02; //FILE_ATTRIBUTE_DIRECTORY; - - if (pDirIndex) - *pDirIndex = 0; - if (pDirIndex2) - *pDirIndex2 = 0; - DPRINT("CdfsFindFile: new Pathname %S, new Objectname %S)\n",Fcb->PathName, Fcb->ObjectName); - return (STATUS_SUCCESS); - } - } - else - { - StreamOffset.QuadPart = (LONGLONG)Parent->Entry.ExtentLocationL * (LONGLONG)BLOCKSIZE; - DirSize = Parent->Entry.DataLengthL; - } - - DPRINT("StreamOffset %I64u DirSize %lu\n", StreamOffset.QuadPart, DirSize); - - if (pDirIndex && (*pDirIndex)) - DirIndex = *pDirIndex; - - if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset, - BLOCKSIZE, TRUE, &Context, &Block)) - { - DPRINT("CcMapData() failed\n"); - return(STATUS_UNSUCCESSFUL); - } - - Ptr = (PUCHAR)Block; - while(TRUE) - { - Record = (PDIR_RECORD)Ptr; - if (Record->RecordLength == 0) - { - DPRINT1("Stopped!\n"); - break; - } - - DPRINT("RecordLength %u ExtAttrRecordLength %u NameLength %u\n", - Record->RecordLength, Record->ExtAttrRecordLength, Record->FileIdLength); - - Status = CdfsGetEntryName(DeviceExt, &Context, &Block, &StreamOffset, - DirSize, (PVOID*)&Ptr, name, &DirIndex, pDirIndex2); - if (Status == STATUS_NO_MORE_ENTRIES) - { - break; - } - else if (Status == STATUS_UNSUCCESSFUL) - { - /* Note: the directory cache has already been unpinned */ - return(Status); - } - - DPRINT("Name '%S'\n", name); - - if (wstrcmpjoki(name, FileToFind)) /* || wstrcmpjoki (name2, FileToFind)) */ - { - if (Parent && Parent->PathName) - { - len = wcslen(Parent->PathName); - memcpy(Fcb->PathName, Parent->PathName, len*sizeof(WCHAR)); - Fcb->ObjectName=&Fcb->PathName[len]; - if (len != 1 || Fcb->PathName[0] != '\') - { - Fcb->ObjectName[0] = '\'; - Fcb->ObjectName = &Fcb->ObjectName[1]; - } - } - else - { - Fcb->ObjectName=Fcb->PathName; - Fcb->ObjectName[0]='\'; - Fcb->ObjectName=&Fcb->ObjectName[1]; - } - - DPRINT("PathName '%S' ObjectName '%S'\n", Fcb->PathName, Fcb->ObjectName); - - memcpy(&Fcb->Entry, Ptr, sizeof(DIR_RECORD)); - wcsncpy(Fcb->ObjectName, name, MAX_PATH); - if (pDirIndex) - *pDirIndex = DirIndex; - - DPRINT("FindFile: new Pathname %S, new Objectname %S, DirIndex %d\n", - Fcb->PathName, Fcb->ObjectName, DirIndex); - - CcUnpinData(Context); - - return(STATUS_SUCCESS); - } - - - Ptr = Ptr + Record->RecordLength; - DirIndex++; - - if (((ULONG)Ptr - (ULONG)Block) >= DirSize) - { - DPRINT("Stopped!\n"); - break; - } - } - - CcUnpinData(Context); - - if (pDirIndex) - *pDirIndex = DirIndex; - - return(STATUS_UNSUCCESSFUL); +NtfsGetNameInformation(PDEVICE_EXTENSION DeviceExt, + PFILE_RECORD_HEADER FileRecord, + PNTFS_ATTR_CONTEXT DataContext, + PFILE_NAMES_INFORMATION Info, + ULONG BufferLength) +{ + ULONG Length; + PFILENAME_ATTRIBUTE FileName; + + DPRINT("NtfsGetNameInformation() called\n"); + + FileName = GetFileNameFromRecord(FileRecord); + ASSERT(FileName != NULL); + + Length = FileName->NameLength * sizeof (WCHAR); + if ((sizeof(FILE_NAMES_INFORMATION) + Length) > BufferLength) + return(STATUS_BUFFER_OVERFLOW); + + Info->FileNameLength = Length; + Info->NextEntryOffset = + ROUND_UP(sizeof(FILE_NAMES_INFORMATION) + Length, sizeof(ULONG)); + RtlCopyMemory(Info->FileName, FileName->Name, Length); + + return(STATUS_SUCCESS); }
static NTSTATUS -CdfsGetNameInformation(PFCB Fcb, - PDEVICE_EXTENSION DeviceExt, - PFILE_NAMES_INFORMATION Info, - ULONG BufferLength) -{ - ULONG Length; - - DPRINT("CdfsGetNameInformation() called\n"); - - Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR); - if ((sizeof (FILE_BOTH_DIRECTORY_INFORMATION) + Length) > BufferLength) - return(STATUS_BUFFER_OVERFLOW); - - Info->FileNameLength = Length; - Info->NextEntryOffset = - ROUND_UP(sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + Length, 4); - memcpy(Info->FileName, Fcb->ObjectName, Length); - - return(STATUS_SUCCESS); +NtfsGetDirectoryInformation(PDEVICE_EXTENSION DeviceExt, + PFILE_RECORD_HEADER FileRecord, + PNTFS_ATTR_CONTEXT DataContext, + PFILE_DIRECTORY_INFORMATION Info, + ULONG BufferLength) +{ + ULONG Length; + PFILENAME_ATTRIBUTE FileName; + + DPRINT("NtfsGetDirectoryInformation() called\n"); + + FileName = GetFileNameFromRecord(FileRecord); + ASSERT(FileName != NULL); + + Length = FileName->NameLength * sizeof (WCHAR); + if ((sizeof(FILE_DIRECTORY_INFORMATION) + Length) > BufferLength) + return(STATUS_BUFFER_OVERFLOW); + + Info->FileNameLength = Length; + Info->NextEntryOffset = + ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) + Length, sizeof(ULONG)); + RtlCopyMemory(Info->FileName, FileName->Name, Length); + + Info->CreationTime.QuadPart = FileName->CreationTime; + Info->LastAccessTime.QuadPart = FileName->LastAccessTime; + Info->LastWriteTime.QuadPart = FileName->LastWriteTime; + Info->ChangeTime.QuadPart = FileName->ChangeTime; + + /* Convert file flags */ + NtfsFileFlagsToAttributes(FileName->FileAttributes, &Info->FileAttributes); + + Info->EndOfFile.QuadPart = FileName->AllocatedSize; + Info->AllocationSize.QuadPart = ROUND_UP(FileName->AllocatedSize, DeviceExt->NtfsInfo.BytesPerCluster); + +// Info->FileIndex=; + + return STATUS_SUCCESS; }
static NTSTATUS -CdfsGetDirectoryInformation(PFCB Fcb, - PDEVICE_EXTENSION DeviceExt, - PFILE_DIRECTORY_INFORMATION Info, - ULONG BufferLength) -{ - ULONG Length; - - DPRINT("CdfsGetDirectoryInformation() called\n"); - - Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR); - if ((sizeof (FILE_BOTH_DIRECTORY_INFORMATION) + Length) > BufferLength) - return(STATUS_BUFFER_OVERFLOW); - - Info->FileNameLength = Length; - Info->NextEntryOffset = - ROUND_UP(sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + Length, 4); - memcpy(Info->FileName, Fcb->ObjectName, Length); - - /* Convert file times */ - CdfsDateTimeToFileTime(Fcb, - &Info->CreationTime); - CdfsDateTimeToFileTime(Fcb, - &Info->LastAccessTime); - CdfsDateTimeToFileTime(Fcb, - &Info->LastWriteTime); - CdfsDateTimeToFileTime(Fcb, - &Info->ChangeTime); - - /* Convert file flags */ - CdfsFileFlagsToAttributes(Fcb, - &Info->FileAttributes); - - Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - - /* Make AllocSize a rounded up multiple of the sector size */ - Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); +NtfsGetFullDirectoryInformation(PDEVICE_EXTENSION DeviceExt, + PFILE_RECORD_HEADER FileRecord, + PNTFS_ATTR_CONTEXT DataContext, + PFILE_FULL_DIRECTORY_INFORMATION Info, + ULONG BufferLength) +{ + ULONG Length; + PFILENAME_ATTRIBUTE FileName; + + DPRINT("NtfsGetFullDirectoryInformation() called\n"); + + FileName = GetFileNameFromRecord(FileRecord); + ASSERT(FileName != NULL); + + Length = FileName->NameLength * sizeof (WCHAR); + if ((sizeof(FILE_FULL_DIRECTORY_INFORMATION) + Length) > BufferLength) + return(STATUS_BUFFER_OVERFLOW); + + Info->FileNameLength = Length; + Info->NextEntryOffset = + ROUND_UP(sizeof(FILE_FULL_DIRECTORY_INFORMATION) + Length, sizeof(ULONG)); + RtlCopyMemory(Info->FileName, FileName->Name, Length); + + Info->CreationTime.QuadPart = FileName->CreationTime; + Info->LastAccessTime.QuadPart = FileName->LastAccessTime; + Info->LastWriteTime.QuadPart = FileName->LastWriteTime; + Info->ChangeTime.QuadPart = FileName->ChangeTime; + + /* Convert file flags */ + NtfsFileFlagsToAttributes(FileName->FileAttributes, &Info->FileAttributes); + + Info->EndOfFile.QuadPart = FileName->AllocatedSize; + Info->AllocationSize.QuadPart = ROUND_UP(FileName->AllocatedSize, DeviceExt->NtfsInfo.BytesPerCluster);
// Info->FileIndex=; - - return(STATUS_SUCCESS); + Info->EaSize = 0; + + return STATUS_SUCCESS; }
static NTSTATUS -CdfsGetFullDirectoryInformation(PFCB Fcb, - PDEVICE_EXTENSION DeviceExt, - PFILE_FULL_DIRECTORY_INFORMATION Info, - ULONG BufferLength) -{ - ULONG Length; - - DPRINT("CdfsGetFullDirectoryInformation() called\n"); - - Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR); - if ((sizeof (FILE_BOTH_DIRECTORY_INFORMATION) + Length) > BufferLength) - return(STATUS_BUFFER_OVERFLOW); - - Info->FileNameLength = Length; - Info->NextEntryOffset = - ROUND_UP(sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + Length, 4); - memcpy(Info->FileName, Fcb->ObjectName, Length); - - /* Convert file times */ - CdfsDateTimeToFileTime(Fcb, - &Info->CreationTime); - CdfsDateTimeToFileTime(Fcb, - &Info->LastAccessTime); - CdfsDateTimeToFileTime(Fcb, - &Info->LastWriteTime); - CdfsDateTimeToFileTime(Fcb, - &Info->ChangeTime); - - /* Convert file flags */ - CdfsFileFlagsToAttributes(Fcb, - &Info->FileAttributes); - - Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - - /* Make AllocSize a rounded up multiple of the sector size */ - Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); +NtfsGetBothDirectoryInformation(PDEVICE_EXTENSION DeviceExt, + PFILE_RECORD_HEADER FileRecord, + PNTFS_ATTR_CONTEXT DataContext, + PFILE_BOTH_DIR_INFORMATION Info, + ULONG BufferLength) +{ + ULONG Length; + PFILENAME_ATTRIBUTE FileName; + + DPRINT("NtfsGetBothDirectoryInformation() called\n"); + + FileName = GetFileNameFromRecord(FileRecord); + ASSERT(FileName != NULL); + + Length = FileName->NameLength * sizeof (WCHAR); + if ((sizeof(FILE_BOTH_DIR_INFORMATION) + Length) > BufferLength) + return(STATUS_BUFFER_OVERFLOW); + + Info->FileNameLength = Length; + Info->NextEntryOffset = + ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + Length, sizeof(ULONG)); + RtlCopyMemory(Info->FileName, FileName->Name, Length); + + Info->CreationTime.QuadPart = FileName->CreationTime; + Info->LastAccessTime.QuadPart = FileName->LastAccessTime; + Info->LastWriteTime.QuadPart = FileName->LastWriteTime; + Info->ChangeTime.QuadPart = FileName->ChangeTime; + + /* Convert file flags */ + NtfsFileFlagsToAttributes(FileName->FileAttributes, &Info->FileAttributes); + + Info->EndOfFile.QuadPart = FileName->AllocatedSize; + Info->AllocationSize.QuadPart = ROUND_UP(FileName->AllocatedSize, DeviceExt->NtfsInfo.BytesPerCluster);
// Info->FileIndex=; - Info->EaSize = 0; - - return(STATUS_SUCCESS); -} - - -static NTSTATUS -CdfsGetBothDirectoryInformation(PFCB Fcb, - PDEVICE_EXTENSION DeviceExt, - PFILE_BOTH_DIRECTORY_INFORMATION Info, - ULONG BufferLength) -{ - ULONG Length; - - DPRINT("CdfsGetBothDirectoryInformation() called\n"); - - Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR); - if ((sizeof (FILE_BOTH_DIRECTORY_INFORMATION) + Length) > BufferLength) - return(STATUS_BUFFER_OVERFLOW); - - Info->FileNameLength = Length; - Info->NextEntryOffset = - ROUND_UP(sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + Length, 4); - memcpy(Info->FileName, Fcb->ObjectName, Length); - - /* Convert file times */ - CdfsDateTimeToFileTime(Fcb, - &Info->CreationTime); - CdfsDateTimeToFileTime(Fcb, - &Info->LastAccessTime); - CdfsDateTimeToFileTime(Fcb, - &Info->LastWriteTime); - CdfsDateTimeToFileTime(Fcb, - &Info->ChangeTime); - - /* Convert file flags */ - CdfsFileFlagsToAttributes(Fcb, - &Info->FileAttributes); - - Info->EndOfFile.QuadPart = Fcb->Entry.DataLengthL; - - /* Make AllocSize a rounded up multiple of the sector size */ - Info->AllocationSize.QuadPart = ROUND_UP(Fcb->Entry.DataLengthL, BLOCKSIZE); - -// Info->FileIndex=; - Info->EaSize = 0; - - if (DeviceExt->CdInfo.JolietLevel == 0) - { - /* Standard ISO-9660 format */ - Info->ShortNameLength = Length; - memcpy(Info->ShortName, Fcb->ObjectName, Length); - } - else - { - /* Joliet extension */ - - /* FIXME: Copy or create a short file name */ - - Info->ShortName[0] = 0; - Info->ShortNameLength = 0; - } - - return(STATUS_SUCCESS); -} -#endif + Info->EaSize = 0; + + Info->ShortName[0] = 0; + Info->ShortNameLength = 0; + + return STATUS_SUCCESS; +}
NTSTATUS NtfsQueryDirectory(PNTFS_IRP_CONTEXT IrpContext) { PIRP Irp; - //PDEVICE_OBJECT DeviceObject; - //PDEVICE_EXTENSION DeviceExtension; - //LONG BufferLength = 0; + PDEVICE_OBJECT DeviceObject; + PDEVICE_EXTENSION DeviceExtension; + LONG BufferLength = 0; PUNICODE_STRING SearchPattern = NULL; - //FILE_INFORMATION_CLASS FileInformationClass; + FILE_INFORMATION_CLASS FileInformationClass; ULONG FileIndex = 0; PUCHAR Buffer = NULL; PFILE_NAMES_INFORMATION Buffer0 = NULL; - //PNTFS_FCB Fcb; + PNTFS_FCB Fcb; PNTFS_CCB Ccb; -// FCB TempFcb; BOOLEAN First = FALSE; PIO_STACK_LOCATION Stack; PFILE_OBJECT FileObject; - //NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status = STATUS_SUCCESS; + PFILE_RECORD_HEADER FileRecord; + PNTFS_ATTR_CONTEXT DataContext; + ULONGLONG MFTRecord; + UNICODE_STRING Pattern;
DPRINT1("NtfsQueryDirectory() called\n");
ASSERT(IrpContext); Irp = IrpContext->Irp; -// DeviceObject = IrpContext->DeviceObject; - -// DeviceExtension = DeviceObject->DeviceExtension; + DeviceObject = IrpContext->DeviceObject; + + DeviceExtension = DeviceObject->DeviceExtension; Stack = IoGetCurrentIrpStackLocation(Irp); FileObject = Stack->FileObject;
Ccb = (PNTFS_CCB)FileObject->FsContext2; -// Fcb = (PNTFS_FCB)FileObject->FsContext; + Fcb = (PNTFS_FCB)FileObject->FsContext;
/* Obtain the callers parameters */ - //BufferLength = Stack->Parameters.QueryDirectory.Length; + BufferLength = Stack->Parameters.QueryDirectory.Length; SearchPattern = Stack->Parameters.QueryDirectory.FileName; - //FileInformationClass = Stack->Parameters.QueryDirectory.FileInformationClass; + FileInformationClass = Stack->Parameters.QueryDirectory.FileInformationClass; FileIndex = Stack->Parameters.QueryDirectory.FileIndex; -
if (SearchPattern != NULL) { @@ -546,7 +352,10 @@ Ccb->DirectorySearchPattern[1] = 0; }
- DPRINT("Search pattern '%S'\n", Ccb->DirectorySearchPattern); + RtlInitUnicodeString(&Pattern, Ccb->DirectorySearchPattern); + + DPRINT1("Search pattern '%S'\n", Ccb->DirectorySearchPattern); + DPRINT1("In: '%S'\n", Fcb->PathName);
/* Determine directory index */ if (Stack->Flags & SL_INDEX_SPECIFIED) @@ -570,93 +379,96 @@
DPRINT("Buffer=%p tofind=%S\n", Buffer, Ccb->DirectorySearchPattern);
-#if 0 - TempFcb.ObjectName = TempFcb.PathName; - while (Status == STATUS_SUCCESS && BufferLength > 0) - { - Status = CdfsFindFile(DeviceExtension, - &TempFcb, - Fcb, - Ccb->DirectorySearchPattern, - &Ccb->Entry, - NULL); - DPRINT("Found %S, Status=%x, entry %x\n", TempFcb.ObjectName, Status, Ccb->Entry); - - if (NT_SUCCESS(Status)) - { - switch (FileInformationClass) - { - case FileNameInformation: - Status = CdfsGetNameInformation(&TempFcb, - DeviceExtension, - (PFILE_NAMES_INFORMATION)Buffer, - BufferLength); - break; - - case FileDirectoryInformation: - Status = CdfsGetDirectoryInformation(&TempFcb, - DeviceExtension, - (PFILE_DIRECTORY_INFORMATION)Buffer, - BufferLength); - break; - - case FileFullDirectoryInformation: - Status = CdfsGetFullDirectoryInformation(&TempFcb, - DeviceExtension, - (PFILE_FULL_DIRECTORY_INFORMATION)Buffer, - BufferLength); - break; - - case FileBothDirectoryInformation: - Status = NtfsGetBothDirectoryInformation(&TempFcb, - DeviceExtension, - (PFILE_BOTH_DIRECTORY_INFORMATION)Buffer, - BufferLength); - break; - - default: - Status = STATUS_INVALID_INFO_CLASS; - } - - if (Status == STATUS_BUFFER_OVERFLOW) - { - if (Buffer0) - { - Buffer0->NextEntryOffset = 0; - } - break; - } - } - else - { - if (Buffer0) - { - Buffer0->NextEntryOffset = 0; - } - - if (First) - { - Status = STATUS_NO_SUCH_FILE; - } - else - { - Status = STATUS_NO_MORE_FILES; - } - break; - } - - Buffer0 = (PFILE_NAMES_INFORMATION)Buffer; - Buffer0->FileIndex = FileIndex++; - Ccb->Entry++; - - if (Stack->Flags & SL_RETURN_SINGLE_ENTRY) - { - break; - } - BufferLength -= Buffer0->NextEntryOffset; - Buffer += Buffer0->NextEntryOffset; - } -#endif + while (Status == STATUS_SUCCESS && BufferLength > 0) + { + Status = NtfsFindFileAt(DeviceExtension, + &Pattern, + &Ccb->Entry, + &FileRecord, + &DataContext, + &MFTRecord, + Fcb->MFTIndex); + //DPRINT("Found %S, Status=%x, entry %x\n", TempFcb.ObjectName, Status, Ccb->Entry); + + if (NT_SUCCESS(Status)) + { + switch (FileInformationClass) + { + case FileNameInformation: + Status = NtfsGetNameInformation(DeviceExtension, + FileRecord, + DataContext, + (PFILE_NAMES_INFORMATION)Buffer, + BufferLength); + break; + + case FileDirectoryInformation: + Status = NtfsGetDirectoryInformation(DeviceExtension, + FileRecord, + DataContext, + (PFILE_DIRECTORY_INFORMATION)Buffer, + BufferLength); + break; + + case FileFullDirectoryInformation: + Status = NtfsGetFullDirectoryInformation(DeviceExtension, + FileRecord, + DataContext, + (PFILE_FULL_DIRECTORY_INFORMATION)Buffer, + BufferLength); + break; + + case FileBothDirectoryInformation: + Status = NtfsGetBothDirectoryInformation(DeviceExtension, + FileRecord, + DataContext, + (PFILE_BOTH_DIR_INFORMATION)Buffer, + BufferLength); + break; + + default: + Status = STATUS_INVALID_INFO_CLASS; + } + + if (Status == STATUS_BUFFER_OVERFLOW) + { + if (Buffer0) + { + Buffer0->NextEntryOffset = 0; + } + break; + } + } + else + { + if (Buffer0) + { + Buffer0->NextEntryOffset = 0; + } + + if (First) + { + Status = STATUS_NO_SUCH_FILE; + } + else + { + Status = STATUS_NO_MORE_FILES; + } + break; + } + + Buffer0 = (PFILE_NAMES_INFORMATION)Buffer; + Buffer0->FileIndex = FileIndex++; + Ccb->Entry++; + + if (Stack->Flags & SL_RETURN_SINGLE_ENTRY) + { + break; + } + BufferLength -= Buffer0->NextEntryOffset; + Buffer += Buffer0->NextEntryOffset; + ExFreePoolWithTag(FileRecord, TAG_NTFS); + }
if (Buffer0) { @@ -665,11 +477,10 @@
if (FileIndex > 0) { - //Status = STATUS_SUCCESS; - } - -// return Status; - return STATUS_NO_MORE_FILES; + Status = STATUS_SUCCESS; + } + + return Status; }
Modified: branches/0.3.17/reactos/drivers/filesystems/ntfs/fsctl.c URL: http://svn.reactos.org/svn/reactos/branches/0.3.17/reactos/drivers/filesyste... ============================================================================== --- branches/0.3.17/reactos/drivers/filesystems/ntfs/fsctl.c [iso-8859-1] (original) +++ branches/0.3.17/reactos/drivers/filesystems/ntfs/fsctl.c [iso-8859-1] Thu Oct 23 15:45:12 2014 @@ -34,8 +34,6 @@ #define NDEBUG #include <debug.h>
-UNICODE_STRING EmptyName = RTL_CONSTANT_STRING(L""); - /* FUNCTIONS ****************************************************************/
/* @@ -274,7 +272,7 @@ return Status; }
- Status = FindAttribute(DeviceExt, DeviceExt->MasterFileTable, AttributeData, &EmptyName, &DeviceExt->MFTContext); + Status = FindAttribute(DeviceExt, DeviceExt->MasterFileTable, AttributeData, L"", 0, &DeviceExt->MFTContext); if (!NT_SUCCESS(Status)) { DPRINT1("Can't find data attribute for Master File Table.\n"); @@ -312,7 +310,7 @@ NtfsDumpFileAttributes(VolumeRecord);
/* Get volume name */ - Status = FindAttribute(DeviceExt, VolumeRecord, AttributeVolumeName, &EmptyName, &AttrCtxt); + Status = FindAttribute(DeviceExt, VolumeRecord, AttributeVolumeName, L"", 0, &AttrCtxt);
if (NT_SUCCESS(Status) && AttrCtxt->Record.Resident.ValueLength != 0) { @@ -348,7 +346,7 @@ DeviceExt->VolumeFcb = VolumeFcb;
/* Get volume information */ - Status = FindAttribute(DeviceExt, VolumeRecord, AttributeVolumeInformation, &EmptyName, &AttrCtxt); + Status = FindAttribute(DeviceExt, VolumeRecord, AttributeVolumeInformation, L"", 0, &AttrCtxt);
if (NT_SUCCESS(Status) && AttrCtxt->Record.Resident.ValueLength != 0) {
Modified: branches/0.3.17/reactos/drivers/filesystems/ntfs/mft.c URL: http://svn.reactos.org/svn/reactos/branches/0.3.17/reactos/drivers/filesyste... ============================================================================== --- branches/0.3.17/reactos/drivers/filesystems/ntfs/mft.c [iso-8859-1] (original) +++ branches/0.3.17/reactos/drivers/filesystems/ntfs/mft.c [iso-8859-1] Thu Oct 23 15:45:12 2014 @@ -31,8 +31,6 @@ #define NDEBUG #include <debug.h>
-UNICODE_STRING IndexOfFileNames = RTL_CONSTANT_STRING(L"$I30"); - /* FUNCTIONS ****************************************************************/
PNTFS_ATTR_CONTEXT @@ -84,10 +82,10 @@ PNTFS_ATTR_RECORD AttrRecord, PNTFS_ATTR_RECORD AttrRecordEnd, ULONG Type, - const WCHAR *Name, + PCWSTR Name, ULONG NameLength) { - DPRINT("FindAttributeHelper(%p, %p, %p, 0x%x, %s, %u)\n", Vcb, AttrRecord, AttrRecordEnd, Type, Name, NameLength); + DPRINT1("FindAttributeHelper(%p, %p, %p, 0x%x, %S, %u)\n", Vcb, AttrRecord, AttrRecordEnd, Type, Name, NameLength);
while (AttrRecord < AttrRecordEnd) { @@ -143,7 +141,6 @@
if (AttrRecord->Type == Type) { - DPRINT("%d, %d\n", AttrRecord->NameLength, NameLength); if (AttrRecord->NameLength == NameLength) { PWCHAR AttrName; @@ -176,18 +173,19 @@ FindAttribute(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER MftRecord, ULONG Type, - PUNICODE_STRING Name, + PCWSTR Name, + ULONG NameLength, PNTFS_ATTR_CONTEXT * AttrCtx) { PNTFS_ATTR_RECORD AttrRecord; PNTFS_ATTR_RECORD AttrRecordEnd;
- DPRINT("NtfsFindAttribute(%p, %p, %u, %s)\n", Vcb, MftRecord, Type, Name); + 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);
- *AttrCtx = FindAttributeHelper(Vcb, AttrRecord, AttrRecordEnd, Type, Name->Buffer, Name->Length); + *AttrCtx = FindAttributeHelper(Vcb, AttrRecord, AttrRecordEnd, Type, Name, NameLength); if (*AttrCtx == NULL) { return STATUS_OBJECT_NAME_NOT_FOUND; @@ -399,6 +397,8 @@ { ULONGLONG BytesRead;
+ DPRINT1("ReadFileRecord(%p, %I64x, %p)\n", Vcb, index, file); + BytesRead = ReadAttribute(Vcb, Vcb->MFTContext, index * Vcb->NtfsInfo.BytesPerFileRecord, (PCHAR)file, Vcb->NtfsInfo.BytesPerFileRecord); if (BytesRead != 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; @@ -497,6 +496,7 @@ PNTFS_ATTR_CONTEXT IndexBitmapCtx; PNTFS_ATTR_CONTEXT IndexAllocationCtx; PINDEX_ROOT_ATTRIBUTE IndexRoot; + PINDEX_BUFFER IndexBuffer; ULONGLONG BitmapDataSize; ULONGLONG IndexAllocationSize; PCHAR BitmapData; @@ -507,6 +507,8 @@ NTSTATUS Status; ULONG CurrentEntry = 0;
+ DPRINT1("NtfsFindMftRecord(%p, %I64d, %wZ, %p, %u, %p)\n", Vcb, MFTIndex, FileName, FirstEntry, DirSearch, OutMFTIndex); + MftRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS); @@ -519,7 +521,7 @@ { //Magic = MftRecord->Magic;
- Status = FindAttribute(Vcb, MftRecord, AttributeIndexRoot, &IndexOfFileNames, &IndexRootCtx); + Status = FindAttribute(Vcb, MftRecord, AttributeIndexRoot, L"$I30", 4, &IndexRootCtx); if (!NT_SUCCESS(Status)) { ExFreePoolWithTag(MftRecord, TAG_NTFS); @@ -545,12 +547,12 @@ while (IndexEntry < IndexEntryEnd && !(IndexEntry->Flags & NTFS_INDEX_ENTRY_END)) { - if (CurrentEntry >= *FirstEntry && CompareFileName(FileName, IndexEntry, DirSearch)) - { - *OutMFTIndex = IndexEntry->Data.Directory.IndexedFile; + if ((IndexEntry->Data.Directory.IndexedFile & NTFS_MFT_MASK) > 0x10 && + CurrentEntry >= *FirstEntry && + CompareFileName(FileName, IndexEntry, DirSearch)) + { + *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; @@ -566,10 +568,10 @@
IndexBlockSize = IndexRoot->SizeOfEntry;
- Status = FindAttribute(Vcb, MftRecord, AttributeBitmap, &IndexOfFileNames, &IndexBitmapCtx); + Status = FindAttribute(Vcb, MftRecord, AttributeBitmap, L"$I30", 4, &IndexBitmapCtx); if (!NT_SUCCESS(Status)) { - DPRINT("Corrupted filesystem!\n"); + DPRINT1("Corrupted filesystem!\n"); ExFreePoolWithTag(MftRecord, TAG_NTFS); return Status; } @@ -589,7 +591,7 @@ ReadAttribute(Vcb, IndexBitmapCtx, 0, BitmapData, (ULONG)BitmapDataSize); ReleaseAttributeContext(IndexBitmapCtx);
- Status = FindAttribute(Vcb, MftRecord, AttributeIndexAllocation, &IndexOfFileNames, &IndexAllocationCtx); + Status = FindAttribute(Vcb, MftRecord, AttributeIndexAllocation, L"$I30", 4, &IndexAllocationCtx); if (!NT_SUCCESS(Status)) { DPRINT("Corrupted filesystem!\n"); @@ -621,25 +623,28 @@
ReadAttribute(Vcb, IndexAllocationCtx, RecordOffset, IndexRecord, IndexBlockSize);
- if (!FixupUpdateSequenceArray(Vcb, &((PFILE_RECORD_HEADER)IndexRecord)->Ntfs)) + if (!NT_SUCCESS(FixupUpdateSequenceArray(Vcb, &((PFILE_RECORD_HEADER)IndexRecord)->Ntfs))) { break; }
- /* FIXME */ - IndexEntry = (PINDEX_ENTRY_ATTRIBUTE)(IndexRecord + 0x18 + *(USHORT *)(IndexRecord + 0x18)); - IndexEntryEnd = (PINDEX_ENTRY_ATTRIBUTE)(IndexRecord + IndexBlockSize); + IndexBuffer = (PINDEX_BUFFER)IndexRecord; + ASSERT(IndexBuffer->Ntfs.Type == 'XDNI'); + ASSERT(IndexBuffer->Header.AllocatedSize + 0x18 == IndexBlockSize); + IndexEntry = (PINDEX_ENTRY_ATTRIBUTE)(&IndexBuffer->Header + IndexBuffer->Header.FirstEntryOffset); + IndexEntryEnd = (PINDEX_ENTRY_ATTRIBUTE)(&IndexBuffer->Header + IndexBuffer->Header.TotalSizeOfEntries); + //ASSERT(IndexEntryEnd <= (PINDEX_ENTRY_ATTRIBUTE)((ULONG_PTR)IndexBuffer + IndexBlockSize)); FIXME: Why doesn't it work?
while (IndexEntry < IndexEntryEnd && !(IndexEntry->Flags & NTFS_INDEX_ENTRY_END)) { - if (CurrentEntry >= *FirstEntry && CompareFileName(FileName, IndexEntry, DirSearch)) + if ((IndexEntry->Data.Directory.IndexedFile & NTFS_MFT_MASK) > 0x10 && + CurrentEntry >= *FirstEntry && + CompareFileName(FileName, IndexEntry, DirSearch)) { DPRINT("File found\n"); - *OutMFTIndex = IndexEntry->Data.Directory.IndexedFile; + *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); @@ -677,9 +682,8 @@ PULONGLONG MFTIndex, ULONGLONG CurrentMFTIndex) { - UNICODE_STRING Current, Remaining, Found; + UNICODE_STRING Current, Remaining; NTSTATUS Status; - WCHAR FoundName[MAX_PATH + 1]; ULONG FirstEntry = 0;
DPRINT1("NtfsLookupFileAt(%p, %wZ, %p, %p, %I64x)\n", Vcb, PathName, FileRecord, DataContext, CurrentMFTIndex); @@ -688,15 +692,18 @@
while (Current.Length != 0) { - DPRINT1("Lookup: %wZ\n", &Current); - - Status = NtfsFindMftRecord(Vcb, CurrentMFTIndex, &Current, &FirstEntry, FALSE, &CurrentMFTIndex, FoundName); + DPRINT1("Current: %wZ\n", &Current); + + Status = NtfsFindMftRecord(Vcb, CurrentMFTIndex, &Current, &FirstEntry, FALSE, &CurrentMFTIndex); if (!NT_SUCCESS(Status)) { return Status; }
- FsRtlDissectName(*PathName, &Current, &Remaining); + if (Remaining.Length == 0) + return STATUS_OBJECT_PATH_NOT_FOUND; + + FsRtlDissectName(Current, &Current, &Remaining); }
*FileRecord = ExAllocatePoolWithTag(NonPagedPool, Vcb->NtfsInfo.BytesPerFileRecord, TAG_NTFS); @@ -710,18 +717,23 @@ if (!NT_SUCCESS(Status)) { DPRINT("NtfsLookupFileAt: Can't read MFT record\n"); - ExFreePoolWithTag(FileRecord, TAG_NTFS); + ExFreePoolWithTag(*FileRecord, TAG_NTFS); return Status; }
- RtlInitUnicodeString(&Found, FoundName); - - Status = FindAttribute(Vcb, *FileRecord, AttributeData, &Found, 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; @@ -748,13 +760,11 @@ PULONGLONG MFTIndex, ULONGLONG CurrentMFTIndex) { - UNICODE_STRING Found; NTSTATUS Status; - WCHAR FoundName[MAX_PATH + 1];
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; @@ -771,18 +781,23 @@ if (!NT_SUCCESS(Status)) { DPRINT("NtfsFindFileAt: Can't read MFT record\n"); - ExFreePoolWithTag(FileRecord, TAG_NTFS); + ExFreePoolWithTag(*FileRecord, TAG_NTFS); return Status; }
- RtlInitUnicodeString(&Found, FoundName); - - Status = FindAttribute(Vcb, *FileRecord, AttributeData, &Found, 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;
Modified: branches/0.3.17/reactos/drivers/filesystems/ntfs/misc.c URL: http://svn.reactos.org/svn/reactos/branches/0.3.17/reactos/drivers/filesyste... ============================================================================== --- branches/0.3.17/reactos/drivers/filesystems/ntfs/misc.c [iso-8859-1] (original) +++ branches/0.3.17/reactos/drivers/filesystems/ntfs/misc.c [iso-8859-1] Thu Oct 23 15:45:12 2014 @@ -97,4 +97,19 @@ return IrpContext; }
+VOID +NtfsFileFlagsToAttributes(ULONG NtfsAttributes, + PULONG FileAttributes) +{ + *FileAttributes = NtfsAttributes; + if ((NtfsAttributes & NTFS_FILE_TYPE_DIRECTORY) == NTFS_FILE_TYPE_DIRECTORY) + { + *FileAttributes = NtfsAttributes & ~NTFS_FILE_TYPE_DIRECTORY; + *FileAttributes |= FILE_ATTRIBUTE_DIRECTORY; + } + + if (NtfsAttributes == 0) + *FileAttributes = FILE_ATTRIBUTE_NORMAL; +} + /* EOF */
Modified: branches/0.3.17/reactos/drivers/filesystems/ntfs/ntfs.h URL: http://svn.reactos.org/svn/reactos/branches/0.3.17/reactos/drivers/filesyste... ============================================================================== --- branches/0.3.17/reactos/drivers/filesystems/ntfs/ntfs.h [iso-8859-1] (original) +++ branches/0.3.17/reactos/drivers/filesystems/ntfs/ntfs.h [iso-8859-1] Thu Oct 23 15:45:12 2014 @@ -168,6 +168,8 @@ #define NTFS_FILE_QUOTA 9 #define NTFS_FILE_UPCASE 10 #define NTFS_FILE_EXTEND 11 + +#define NTFS_MFT_MASK 0x0000FFFFFFFFFFFFULL
#define COLLATION_BINARY 0x00 #define COLLATION_FILE_NAME 0x01 @@ -331,6 +333,13 @@
typedef struct { + NTFS_RECORD_HEADER Ntfs; + ULONGLONG VCN; + INDEX_HEADER_ATTRIBUTE Header; +} INDEX_BUFFER, *PINDEX_BUFFER; + +typedef struct +{ union { struct @@ -613,7 +622,8 @@ FindAttribute(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER MftRecord, ULONG Type, - PUNICODE_STRING Name, + PCWSTR Name, + ULONG NameLength, PNTFS_ATTR_CONTEXT * AttrCtx);
VOID @@ -680,15 +690,11 @@ CdfsSwapString(PWCHAR Out, PUCHAR In, ULONG Count); - -VOID -CdfsDateTimeToFileTime(PFCB Fcb, - TIME *FileTime); - -VOID -CdfsFileFlagsToAttributes(PFCB Fcb, - PULONG FileAttributes); #endif + +VOID +NtfsFileFlagsToAttributes(ULONG NtfsAttributes, + PULONG FileAttributes);
/* rw.c */
Modified: branches/0.3.17/reactos/drivers/filesystems/ntfs/volinfo.c URL: http://svn.reactos.org/svn/reactos/branches/0.3.17/reactos/drivers/filesyste... ============================================================================== --- branches/0.3.17/reactos/drivers/filesystems/ntfs/volinfo.c [iso-8859-1] (original) +++ branches/0.3.17/reactos/drivers/filesystems/ntfs/volinfo.c [iso-8859-1] Thu Oct 23 15:45:12 2014 @@ -31,6 +31,14 @@ #include <debug.h>
/* FUNCTIONS ****************************************************************/ + +static +ULONGLONG +NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt) +{ + UNIMPLEMENTED; + return 0; +}
static NTSTATUS @@ -130,8 +138,8 @@
DeviceExt = DeviceObject->DeviceExtension;
- FsSizeInfo->AvailableAllocationUnits.QuadPart = 0; - FsSizeInfo->TotalAllocationUnits.QuadPart = DeviceExt->NtfsInfo.SectorCount; /* ?? */ + FsSizeInfo->AvailableAllocationUnits.QuadPart = NtfsGetFreeClusters(DeviceExt); + FsSizeInfo->TotalAllocationUnits.QuadPart = DeviceExt->NtfsInfo.SectorCount / DeviceExt->NtfsInfo.SectorsPerCluster; FsSizeInfo->SectorsPerAllocationUnit = DeviceExt->NtfsInfo.SectorsPerCluster; FsSizeInfo->BytesPerSector = DeviceExt->NtfsInfo.BytesPerSector;
@@ -145,7 +153,8 @@
static NTSTATUS -NtfsGetFsDeviceInformation(PFILE_FS_DEVICE_INFORMATION FsDeviceInfo, +NtfsGetFsDeviceInformation(PDEVICE_OBJECT DeviceObject, + PFILE_FS_DEVICE_INFORMATION FsDeviceInfo, PULONG BufferLength) { DPRINT("NtfsGetFsDeviceInformation()\n"); @@ -157,7 +166,7 @@ return STATUS_BUFFER_OVERFLOW;
FsDeviceInfo->DeviceType = FILE_DEVICE_DISK; - FsDeviceInfo->Characteristics = 0; /* FIXME: fix this !! */ + FsDeviceInfo->Characteristics = DeviceObject->Characteristics;
DPRINT("NtfsGetFsDeviceInformation() finished.\n");
@@ -215,7 +224,8 @@ break;
case FileFsDeviceInformation: - Status = NtfsGetFsDeviceInformation(SystemBuffer, + Status = NtfsGetFsDeviceInformation(DeviceObject, + SystemBuffer, &BufferLength); break;