X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=drivers%2Ffilesystems%2Ffastfat%2Fdir.c;h=284c04bca1047a316efb4aea6a20a1900d24fb10;hp=db962572819d67e64fb781f7aad1e15b0f7e3f16;hb=9f3c80193e5f5d9c0497033322c515cdb3690e8c;hpb=d086a431cb9a31cb9ed7a4f592b8c82efbd1b552 diff --git a/drivers/filesystems/fastfat/dir.c b/drivers/filesystems/fastfat/dir.c index db962572819..284c04bca10 100644 --- a/drivers/filesystems/fastfat/dir.c +++ b/drivers/filesystems/fastfat/dir.c @@ -89,6 +89,47 @@ FsdSystemTimeToDosDateTime( static NTSTATUS VfatGetFileNameInformation( + PVFAT_DIRENTRY_CONTEXT DirContext, + PFILE_NAME_INFORMATION pInfo, + ULONG BufferLength, + PULONG Written, + BOOLEAN First) +{ + NTSTATUS Status; + ULONG BytesToCopy = 0; + + *Written = 0; + Status = STATUS_BUFFER_OVERFLOW; + + if (FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName) > BufferLength) + return Status; + + if (First || (BufferLength >= FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName) + DirContext->LongNameU.Length)) + { + pInfo->FileNameLength = DirContext->LongNameU.Length; + + *Written = FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName); + if (BufferLength > FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName)) + { + BytesToCopy = min(DirContext->LongNameU.Length, BufferLength - FIELD_OFFSET(FILE_NAMES_INFORMATION, FileName)); + RtlCopyMemory(pInfo->FileName, + DirContext->LongNameU.Buffer, + BytesToCopy); + *Written += BytesToCopy; + + if (BytesToCopy == DirContext->LongNameU.Length) + { + Status = STATUS_SUCCESS; + } + } + } + + return Status; +} + +static +NTSTATUS +VfatGetFileNamesInformation( PVFAT_DIRENTRY_CONTEXT DirContext, PFILE_NAMES_INFORMATION pInfo, ULONG BufferLength, @@ -622,7 +663,7 @@ DoQuery( { case FileNameInformation: Status = VfatGetFileNameInformation(&DirContext, - (PFILE_NAMES_INFORMATION)Buffer, + (PFILE_NAME_INFORMATION)Buffer, BufferLength, &Written, Buffer0 == NULL); @@ -655,6 +696,14 @@ DoQuery( Buffer0 == NULL); break; + case FileNamesInformation: + Status = VfatGetFileNamesInformation(&DirContext, + (PFILE_NAMES_INFORMATION)Buffer, + BufferLength, + &Written, + Buffer0 == NULL); + break; + default: Status = STATUS_INVALID_INFO_CLASS; break;