From 5423c59abe03dc41976bbca7dc2e5c152b4b42fc Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 6 Sep 2012 18:36:48 +0000 Subject: [PATCH] [FORMATTING] * No code changes. svn path=/trunk/; revision=57246 --- reactos/drivers/filesystems/fastfat/dir.c | 920 ++++++++++++---------- 1 file changed, 509 insertions(+), 411 deletions(-) diff --git a/reactos/drivers/filesystems/fastfat/dir.c b/reactos/drivers/filesystems/fastfat/dir.c index 4f81d86f4a4..9195b3bb02b 100644 --- a/reactos/drivers/filesystems/fastfat/dir.c +++ b/reactos/drivers/filesystems/fastfat/dir.c @@ -8,504 +8,602 @@ */ +/* INCLUDES *****************************************************************/ + #define NDEBUG #include "vfat.h" +/* FUNCTIONS ****************************************************************/ -// function like DosDateTimeToFileTime +/* Function like DosDateTimeToFileTime */ BOOLEAN -FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt, USHORT DosDate, USHORT DosTime, PLARGE_INTEGER SystemTime) +FsdDosDateTimeToSystemTime(PDEVICE_EXTENSION DeviceExt, + USHORT DosDate, + USHORT DosTime, + PLARGE_INTEGER SystemTime) { - PDOSTIME pdtime = (PDOSTIME) &DosTime; - PDOSDATE pddate = (PDOSDATE) &DosDate; - TIME_FIELDS TimeFields; - LARGE_INTEGER LocalTime; + PDOSTIME pdtime = (PDOSTIME)&DosTime; + PDOSDATE pddate = (PDOSDATE)&DosDate; + TIME_FIELDS TimeFields; + LARGE_INTEGER LocalTime; - if (SystemTime == NULL) - return FALSE; + if (SystemTime == NULL) + return FALSE; - TimeFields.Milliseconds = 0; - TimeFields.Second = pdtime->Second * 2; - TimeFields.Minute = pdtime->Minute; - TimeFields.Hour = pdtime->Hour; + TimeFields.Milliseconds = 0; + TimeFields.Second = pdtime->Second * 2; + TimeFields.Minute = pdtime->Minute; + TimeFields.Hour = pdtime->Hour; - TimeFields.Day = pddate->Day; - TimeFields.Month = pddate->Month; - TimeFields.Year = (CSHORT)(DeviceExt->BaseDateYear + pddate->Year); + TimeFields.Day = pddate->Day; + TimeFields.Month = pddate->Month; + TimeFields.Year = (CSHORT)(DeviceExt->BaseDateYear + pddate->Year); - RtlTimeFieldsToTime (&TimeFields, &LocalTime); - ExLocalTimeToSystemTime(&LocalTime, SystemTime); + RtlTimeFieldsToTime(&TimeFields, &LocalTime); + ExLocalTimeToSystemTime(&LocalTime, SystemTime); - return TRUE; + return TRUE; } -// function like FileTimeToDosDateTime +/* Function like FileTimeToDosDateTime */ BOOLEAN -FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER SystemTime, USHORT *pDosDate, USHORT *pDosTime) +FsdSystemTimeToDosDateTime(PDEVICE_EXTENSION DeviceExt, + PLARGE_INTEGER SystemTime, + PUSHORT pDosDate, + PUSHORT pDosTime) { - PDOSTIME pdtime = (PDOSTIME) pDosTime; - PDOSDATE pddate = (PDOSDATE) pDosDate; - TIME_FIELDS TimeFields; - LARGE_INTEGER LocalTime; + PDOSTIME pdtime = (PDOSTIME)pDosTime; + PDOSDATE pddate = (PDOSDATE)pDosDate; + TIME_FIELDS TimeFields; + LARGE_INTEGER LocalTime; - if (SystemTime == NULL) - return FALSE; + if (SystemTime == NULL) + return FALSE; - ExSystemTimeToLocalTime (SystemTime, &LocalTime); - RtlTimeToTimeFields (&LocalTime, &TimeFields); + ExSystemTimeToLocalTime(SystemTime, &LocalTime); + RtlTimeToTimeFields(&LocalTime, &TimeFields); - if (pdtime) + if (pdtime) { - pdtime->Second = TimeFields.Second / 2; - pdtime->Minute = TimeFields.Minute; - pdtime->Hour = TimeFields.Hour; + pdtime->Second = TimeFields.Second / 2; + pdtime->Minute = TimeFields.Minute; + pdtime->Hour = TimeFields.Hour; } - if (pddate) + if (pddate) { - pddate->Day = TimeFields.Day; - pddate->Month = TimeFields.Month; - pddate->Year = (USHORT) (TimeFields.Year - DeviceExt->BaseDateYear); + pddate->Day = TimeFields.Day; + pddate->Month = TimeFields.Month; + pddate->Year = (USHORT) (TimeFields.Year - DeviceExt->BaseDateYear); } - return TRUE; + return TRUE; } #define ULONG_ROUND_UP(x) ROUND_UP((x), (sizeof(ULONG))) static NTSTATUS -VfatGetFileNameInformation (PVFAT_DIRENTRY_CONTEXT DirContext, - PFILE_NAMES_INFORMATION pInfo, ULONG BufferLength) +VfatGetFileNameInformation(PVFAT_DIRENTRY_CONTEXT DirContext, + PFILE_NAMES_INFORMATION pInfo, + ULONG BufferLength) { - if ((sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) - return STATUS_BUFFER_OVERFLOW; - pInfo->FileNameLength = DirContext->LongNameU.Length; - pInfo->NextEntryOffset = - ULONG_ROUND_UP (sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length); - RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); - return STATUS_SUCCESS; + if ((sizeof(FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) + return STATUS_BUFFER_OVERFLOW; + + pInfo->FileNameLength = DirContext->LongNameU.Length; + pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) + + DirContext->LongNameU.Length); + + RtlCopyMemory(pInfo->FileName, + DirContext->LongNameU.Buffer, + DirContext->LongNameU.Length); + + return STATUS_SUCCESS; } static NTSTATUS -VfatGetFileDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext, - PDEVICE_EXTENSION DeviceExt, - PFILE_DIRECTORY_INFORMATION pInfo, - ULONG BufferLength) +VfatGetFileDirectoryInformation(PVFAT_DIRENTRY_CONTEXT DirContext, + PDEVICE_EXTENSION DeviceExt, + PFILE_DIRECTORY_INFORMATION pInfo, + ULONG BufferLength) { - if ((sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) - return STATUS_BUFFER_OVERFLOW; - pInfo->FileNameLength = DirContext->LongNameU.Length; - pInfo->NextEntryOffset = - ULONG_ROUND_UP (sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length); - RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); -// pInfo->FileIndex=; - if (DeviceExt->Flags & VCB_IS_FATX) - { - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.CreationDate, - DirContext->DirEntry.FatX.CreationTime, - &pInfo->CreationTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.AccessDate, - DirContext->DirEntry.FatX.AccessTime, - &pInfo->LastAccessTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.UpdateDate, - DirContext->DirEntry.FatX.UpdateTime, - &pInfo->LastWriteTime); - pInfo->ChangeTime = pInfo->LastWriteTime; - if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY) - { - pInfo->EndOfFile.QuadPart = 0; - pInfo->AllocationSize.QuadPart = 0; - } + if ((sizeof(FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) + return STATUS_BUFFER_OVERFLOW; + + pInfo->FileNameLength = DirContext->LongNameU.Length; + pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) + + DirContext->LongNameU.Length); + /* pInfo->FileIndex = ; */ + + RtlCopyMemory(pInfo->FileName, + DirContext->LongNameU.Buffer, + DirContext->LongNameU.Length); + + if (DeviceExt->Flags & VCB_IS_FATX) + { + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.CreationDate, + DirContext->DirEntry.FatX.CreationTime, + &pInfo->CreationTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.AccessDate, + DirContext->DirEntry.FatX.AccessTime, + &pInfo->LastAccessTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.UpdateDate, + DirContext->DirEntry.FatX.UpdateTime, + &pInfo->LastWriteTime); + + pInfo->ChangeTime = pInfo->LastWriteTime; + + if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY) + { + pInfo->EndOfFile.QuadPart = 0; + pInfo->AllocationSize.QuadPart = 0; + } + else + { + pInfo->EndOfFile.u.HighPart = 0; + pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; + /* Make allocsize a rounded up multiple of BytesPerCluster */ + pInfo->AllocationSize.u.HighPart = 0; + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, + DeviceExt->FatInfo.BytesPerCluster); + } + + pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; + } else - { + { + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.CreationDate, + DirContext->DirEntry.Fat.CreationTime, + &pInfo->CreationTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.AccessDate, + 0, + &pInfo->LastAccessTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.UpdateDate, + DirContext->DirEntry.Fat.UpdateTime, + &pInfo->LastWriteTime); + + pInfo->ChangeTime = pInfo->LastWriteTime; + + if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY) + { + pInfo->EndOfFile.QuadPart = 0; + pInfo->AllocationSize.QuadPart = 0; + } + else + { + pInfo->EndOfFile.u.HighPart = 0; + pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; + /* Make allocsize a rounded up multiple of BytesPerCluster */ + pInfo->AllocationSize.u.HighPart = 0; + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, + DeviceExt->FatInfo.BytesPerCluster); + } + + pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; + } + + return STATUS_SUCCESS; +} + +static NTSTATUS +VfatGetFileFullDirectoryInformation(PVFAT_DIRENTRY_CONTEXT DirContext, + PDEVICE_EXTENSION DeviceExt, + PFILE_FULL_DIR_INFORMATION pInfo, + ULONG BufferLength) +{ + if ((sizeof(FILE_FULL_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) + return STATUS_BUFFER_OVERFLOW; + + pInfo->FileNameLength = DirContext->LongNameU.Length; + pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_FULL_DIR_INFORMATION) + + DirContext->LongNameU.Length); + /* pInfo->FileIndex = ; */ + /* pInfo->EaSize = ; */ + + RtlCopyMemory(pInfo->FileName, + DirContext->LongNameU.Buffer, + DirContext->LongNameU.Length); + + if (DeviceExt->Flags & VCB_IS_FATX) + { + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.CreationDate, + DirContext->DirEntry.FatX.CreationTime, + &pInfo->CreationTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.AccessDate, + DirContext->DirEntry.FatX.AccessTime, + &pInfo->LastAccessTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.UpdateDate, + DirContext->DirEntry.FatX.UpdateTime, + &pInfo->LastWriteTime); + + pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->EndOfFile.u.HighPart = 0; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; /* Make allocsize a rounded up multiple of BytesPerCluster */ pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, DeviceExt->FatInfo.BytesPerCluster); - } - pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; - } - else - { - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.CreationDate, - DirContext->DirEntry.Fat.CreationTime, - &pInfo->CreationTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.AccessDate, 0, - &pInfo->LastAccessTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.UpdateDate, - DirContext->DirEntry.Fat.UpdateTime, - &pInfo->LastWriteTime); - pInfo->ChangeTime = pInfo->LastWriteTime; - if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY) - { - pInfo->EndOfFile.QuadPart = 0; - pInfo->AllocationSize.QuadPart = 0; - } + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, + DeviceExt->FatInfo.BytesPerCluster); + pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; + } else - { + { + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.CreationDate, + DirContext->DirEntry.Fat.CreationTime, + &pInfo->CreationTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.AccessDate, + 0, + &pInfo->LastAccessTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.UpdateDate, + DirContext->DirEntry.Fat.UpdateTime, + &pInfo->LastWriteTime); + + pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->EndOfFile.u.HighPart = 0; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; /* Make allocsize a rounded up multiple of BytesPerCluster */ pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); - } - pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; - } + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, + DeviceExt->FatInfo.BytesPerCluster); + pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } static NTSTATUS -VfatGetFileFullDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext, - PDEVICE_EXTENSION DeviceExt, - PFILE_FULL_DIR_INFORMATION pInfo, - ULONG BufferLength) +VfatGetFileBothInformation(PVFAT_DIRENTRY_CONTEXT DirContext, + PDEVICE_EXTENSION DeviceExt, + PFILE_BOTH_DIR_INFORMATION pInfo, + ULONG BufferLength) { - if ((sizeof (FILE_FULL_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) - return STATUS_BUFFER_OVERFLOW; - pInfo->FileNameLength = DirContext->LongNameU.Length; - pInfo->NextEntryOffset = - ULONG_ROUND_UP (sizeof (FILE_FULL_DIR_INFORMATION) + DirContext->LongNameU.Length); - RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); -// pInfo->FileIndex=; - if (DeviceExt->Flags & VCB_IS_FATX) - { - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.CreationDate, - DirContext->DirEntry.FatX.CreationTime, - &pInfo->CreationTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.AccessDate, - DirContext->DirEntry.FatX.AccessTime, - &pInfo->LastAccessTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.UpdateDate, - DirContext->DirEntry.FatX.UpdateTime, - &pInfo->LastWriteTime); - pInfo->ChangeTime = pInfo->LastWriteTime; - pInfo->EndOfFile.u.HighPart = 0; - pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; - /* Make allocsize a rounded up multiple of BytesPerCluster */ - pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, DeviceExt->FatInfo.BytesPerCluster); - pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; - } - else - { - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.CreationDate, - DirContext->DirEntry.Fat.CreationTime, - &pInfo->CreationTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.AccessDate, - 0, &pInfo->LastAccessTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.UpdateDate, - DirContext->DirEntry.Fat.UpdateTime, - &pInfo->LastWriteTime); - pInfo->ChangeTime = pInfo->LastWriteTime; - pInfo->EndOfFile.u.HighPart = 0; - pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; - /* Make allocsize a rounded up multiple of BytesPerCluster */ - pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); - pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; - } -// pInfo->EaSize=; - return STATUS_SUCCESS; + if ((sizeof(FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) + return STATUS_BUFFER_OVERFLOW; + + pInfo->EaSize = 0; + + if (DeviceExt->Flags & VCB_IS_FATX) + { + pInfo->FileNameLength = DirContext->LongNameU.Length; + + RtlCopyMemory(pInfo->FileName, + DirContext->LongNameU.Buffer, + DirContext->LongNameU.Length); + + pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + + DirContext->LongNameU.Length); + pInfo->ShortName[0] = 0; + pInfo->ShortNameLength = 0; + /* pInfo->FileIndex = ; */ + + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.CreationDate, + DirContext->DirEntry.FatX.CreationTime, + &pInfo->CreationTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.AccessDate, + DirContext->DirEntry.FatX.AccessTime, + &pInfo->LastAccessTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.FatX.UpdateDate, + DirContext->DirEntry.FatX.UpdateTime, + &pInfo->LastWriteTime); + + pInfo->ChangeTime = pInfo->LastWriteTime; + + if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY) + { + pInfo->EndOfFile.QuadPart = 0; + pInfo->AllocationSize.QuadPart = 0; + } + else + { + pInfo->EndOfFile.u.HighPart = 0; + pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; + /* Make allocsize a rounded up multiple of BytesPerCluster */ + pInfo->AllocationSize.u.HighPart = 0; + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, + DeviceExt->FatInfo.BytesPerCluster); + } + + pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; + } + else + { + pInfo->FileNameLength = DirContext->LongNameU.Length; + pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) + + DirContext->LongNameU.Length); + + RtlCopyMemory(pInfo->ShortName, + DirContext->ShortNameU.Buffer, + DirContext->ShortNameU.Length); + + pInfo->ShortNameLength = (CCHAR)DirContext->ShortNameU.Length; + + RtlCopyMemory(pInfo->FileName, + DirContext->LongNameU.Buffer, + DirContext->LongNameU.Length); + + /* pInfo->FileIndex = ; */ + + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.CreationDate, + DirContext->DirEntry.Fat.CreationTime, + &pInfo->CreationTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.AccessDate, + 0, + &pInfo->LastAccessTime); + FsdDosDateTimeToSystemTime(DeviceExt, + DirContext->DirEntry.Fat.UpdateDate, + DirContext->DirEntry.Fat.UpdateTime, + &pInfo->LastWriteTime); + + pInfo->ChangeTime = pInfo->LastWriteTime; + + if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY) + { + pInfo->EndOfFile.QuadPart = 0; + pInfo->AllocationSize.QuadPart = 0; + } + else + { + pInfo->EndOfFile.u.HighPart = 0; + pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; + /* Make allocsize a rounded up multiple of BytesPerCluster */ + pInfo->AllocationSize.u.HighPart = 0; + pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); + } + + pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; + } + + return STATUS_SUCCESS; } static NTSTATUS -VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext, - PDEVICE_EXTENSION DeviceExt, - PFILE_BOTH_DIR_INFORMATION pInfo, - ULONG BufferLength) +DoQuery(PVFAT_IRP_CONTEXT IrpContext) { - if ((sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) - return STATUS_BUFFER_OVERFLOW; + NTSTATUS Status = STATUS_SUCCESS; + LONG BufferLength = 0; + PUNICODE_STRING pSearchPattern = NULL; + FILE_INFORMATION_CLASS FileInformationClass; + PUCHAR Buffer = NULL; + PFILE_NAMES_INFORMATION Buffer0 = NULL; + PVFATFCB pFcb; + PVFATCCB pCcb; + BOOLEAN FirstQuery = FALSE; + BOOLEAN FirstCall = TRUE; + VFAT_DIRENTRY_CONTEXT DirContext; + WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH + 1]; + WCHAR ShortNameBuffer[13]; - if (DeviceExt->Flags & VCB_IS_FATX) - { - pInfo->FileNameLength = DirContext->LongNameU.Length; - RtlCopyMemory(pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); - pInfo->NextEntryOffset = - ULONG_ROUND_UP (sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length); - pInfo->ShortName[0] = 0; - pInfo->ShortNameLength = 0; - // pInfo->FileIndex=; - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.CreationDate, - DirContext->DirEntry.FatX.CreationTime, - &pInfo->CreationTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.AccessDate, - DirContext->DirEntry.FatX.AccessTime, - &pInfo->LastAccessTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.UpdateDate, - DirContext->DirEntry.FatX.UpdateTime, - &pInfo->LastWriteTime); - pInfo->ChangeTime = pInfo->LastWriteTime; - if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY) - { - pInfo->EndOfFile.QuadPart = 0; - pInfo->AllocationSize.QuadPart = 0; - } - else - { - pInfo->EndOfFile.u.HighPart = 0; - pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; - /* Make allocsize a rounded up multiple of BytesPerCluster */ - pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, DeviceExt->FatInfo.BytesPerCluster); - } - pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; - } - else - { - pInfo->FileNameLength = DirContext->LongNameU.Length; - pInfo->NextEntryOffset = - ULONG_ROUND_UP (sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length); - RtlCopyMemory(pInfo->ShortName, DirContext->ShortNameU.Buffer, DirContext->ShortNameU.Length); - pInfo->ShortNameLength = (CCHAR)DirContext->ShortNameU.Length; - RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); - // pInfo->FileIndex=; - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.CreationDate, - DirContext->DirEntry.Fat.CreationTime, - &pInfo->CreationTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.AccessDate, 0, - &pInfo->LastAccessTime); - FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.UpdateDate, - DirContext->DirEntry.Fat.UpdateTime, - &pInfo->LastWriteTime); - pInfo->ChangeTime = pInfo->LastWriteTime; - if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY) - { - pInfo->EndOfFile.QuadPart = 0; - pInfo->AllocationSize.QuadPart = 0; - } - else - { - pInfo->EndOfFile.u.HighPart = 0; - pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; - /* Make allocsize a rounded up multiple of BytesPerCluster */ - pInfo->AllocationSize.u.HighPart = 0; - pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); - } - pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; - } - pInfo->EaSize=0; - return STATUS_SUCCESS; -} + PIO_STACK_LOCATION Stack = IrpContext->Stack; -static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext) -{ - NTSTATUS RC = STATUS_SUCCESS; - long BufferLength = 0; - PUNICODE_STRING pSearchPattern = NULL; - FILE_INFORMATION_CLASS FileInformationClass; - unsigned char *Buffer = NULL; - PFILE_NAMES_INFORMATION Buffer0 = NULL; - PVFATFCB pFcb; - PVFATCCB pCcb; - BOOLEAN FirstQuery = FALSE; - BOOLEAN FirstCall = TRUE; - VFAT_DIRENTRY_CONTEXT DirContext; - WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH + 1]; - WCHAR ShortNameBuffer[13]; + pCcb = (PVFATCCB)IrpContext->FileObject->FsContext2; + pFcb = (PVFATFCB)IrpContext->FileObject->FsContext; - PIO_STACK_LOCATION Stack = IrpContext->Stack; - - pCcb = (PVFATCCB) IrpContext->FileObject->FsContext2; - pFcb = (PVFATFCB) IrpContext->FileObject->FsContext; - - // determine Buffer for result : - BufferLength = Stack->Parameters.QueryDirectory.Length; + /* Determine Buffer for result : */ + BufferLength = Stack->Parameters.QueryDirectory.Length; #if 0 - /* Do not probe the user buffer until SEH is available */ - if (IrpContext->Irp->RequestorMode != KernelMode && - IrpContext->Irp->MdlAddress == NULL && - IrpContext->Irp->UserBuffer != NULL) + /* Do not probe the user buffer until SEH is available */ + if (IrpContext->Irp->RequestorMode != KernelMode && + IrpContext->Irp->MdlAddress == NULL && + IrpContext->Irp->UserBuffer != NULL) { - ProbeForWrite(IrpContext->Irp->UserBuffer, BufferLength, 1); + ProbeForWrite(IrpContext->Irp->UserBuffer, BufferLength, 1); } #endif - Buffer = VfatGetUserBuffer(IrpContext->Irp); + Buffer = VfatGetUserBuffer(IrpContext->Irp); - if (!ExAcquireResourceSharedLite(&pFcb->MainResource, - (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT))) + if (!ExAcquireResourceSharedLite(&pFcb->MainResource, + (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT))) { - RC = VfatLockUserBuffer(IrpContext->Irp, BufferLength, IoWriteAccess); - if (NT_SUCCESS(RC)) - { - RC = STATUS_PENDING; - } - return RC; + Status = VfatLockUserBuffer(IrpContext->Irp, BufferLength, IoWriteAccess); + if (NT_SUCCESS(Status)) + Status = STATUS_PENDING; + + return Status; } - /* Obtain the callers parameters */ + /* Obtain the callers parameters */ #ifdef _MSC_VER - /* HACKHACK: Bug in the MS ntifs.h header: - * FileName is really a PUNICODE_STRING, not a PSTRING */ - pSearchPattern = (PUNICODE_STRING)Stack->Parameters.QueryDirectory.FileName; + /* HACKHACK: Bug in the MS ntifs.h header: + * FileName is really a PUNICODE_STRING, not a PSTRING */ + pSearchPattern = (PUNICODE_STRING)Stack->Parameters.QueryDirectory.FileName; #else - pSearchPattern = Stack->Parameters.QueryDirectory.FileName; + pSearchPattern = Stack->Parameters.QueryDirectory.FileName; #endif - FileInformationClass = - Stack->Parameters.QueryDirectory.FileInformationClass; - if (pSearchPattern) + FileInformationClass = Stack->Parameters.QueryDirectory.FileInformationClass; + + if (pSearchPattern) { - if (!pCcb->SearchPattern.Buffer) + if (!pCcb->SearchPattern.Buffer) { - FirstQuery = TRUE; - pCcb->SearchPattern.MaximumLength = pSearchPattern->Length + sizeof(WCHAR); - pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, pCcb->SearchPattern.MaximumLength, TAG_VFAT); - if (!pCcb->SearchPattern.Buffer) + FirstQuery = TRUE; + pCcb->SearchPattern.MaximumLength = pSearchPattern->Length + sizeof(WCHAR); + pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, + pCcb->SearchPattern.MaximumLength, + TAG_VFAT); + if (!pCcb->SearchPattern.Buffer) { - ExReleaseResourceLite(&pFcb->MainResource); - return STATUS_INSUFFICIENT_RESOURCES; + ExReleaseResourceLite(&pFcb->MainResource); + return STATUS_INSUFFICIENT_RESOURCES; } - RtlCopyUnicodeString(&pCcb->SearchPattern, pSearchPattern); - pCcb->SearchPattern.Buffer[pCcb->SearchPattern.Length / sizeof(WCHAR)] = 0; - } - } - else if (!pCcb->SearchPattern.Buffer) - { - FirstQuery = TRUE; - pCcb->SearchPattern.MaximumLength = 2 * sizeof(WCHAR); - pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, 2 * sizeof(WCHAR), TAG_VFAT); - if (!pCcb->SearchPattern.Buffer) - { - ExReleaseResourceLite(&pFcb->MainResource); - return STATUS_INSUFFICIENT_RESOURCES; + RtlCopyUnicodeString(&pCcb->SearchPattern, pSearchPattern); + pCcb->SearchPattern.Buffer[pCcb->SearchPattern.Length / sizeof(WCHAR)] = 0; } - pCcb->SearchPattern.Buffer[0] = L'*'; - pCcb->SearchPattern.Buffer[1] = 0; - pCcb->SearchPattern.Length = sizeof(WCHAR); } - - if (IrpContext->Stack->Flags & SL_INDEX_SPECIFIED) + else if (!pCcb->SearchPattern.Buffer) { - DirContext.DirIndex = pCcb->Entry = Stack->Parameters.QueryDirectory.FileIndex; - } - else if (FirstQuery || (IrpContext->Stack->Flags & SL_RESTART_SCAN)) - { - DirContext.DirIndex = pCcb->Entry = 0; - } - else - { - DirContext.DirIndex = pCcb->Entry; - } - - DPRINT ("Buffer=%p tofind=%wZ\n", Buffer, &pCcb->SearchPattern); - - DirContext.LongNameU.Buffer = LongNameBuffer; - DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer); - DirContext.ShortNameU.Buffer = ShortNameBuffer; - DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer); - - while (RC == STATUS_SUCCESS && BufferLength > 0) - { - RC = FindFile (IrpContext->DeviceExt, pFcb, - &pCcb->SearchPattern, &DirContext, FirstCall); - pCcb->Entry = DirContext.DirIndex; - DPRINT ("Found %wZ, RC=%x, entry %x\n", &DirContext.LongNameU, RC, pCcb->Entry); - FirstCall = FALSE; - if (NT_SUCCESS (RC)) + FirstQuery = TRUE; + pCcb->SearchPattern.MaximumLength = 2 * sizeof(WCHAR); + pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, + 2 * sizeof(WCHAR), + TAG_VFAT); + if (!pCcb->SearchPattern.Buffer) { - switch (FileInformationClass) - { - case FileNameInformation: - RC = VfatGetFileNameInformation (&DirContext, - (PFILE_NAMES_INFORMATION) Buffer, - BufferLength); - break; - case FileDirectoryInformation: - RC = VfatGetFileDirectoryInformation (&DirContext, - IrpContext->DeviceExt, - (PFILE_DIRECTORY_INFORMATION) Buffer, - BufferLength); - break; - case FileFullDirectoryInformation: - RC = VfatGetFileFullDirectoryInformation (&DirContext, - IrpContext->DeviceExt, - (PFILE_FULL_DIR_INFORMATION) Buffer, - BufferLength); - break; - case FileBothDirectoryInformation: - RC = VfatGetFileBothInformation (&DirContext, - IrpContext->DeviceExt, - (PFILE_BOTH_DIR_INFORMATION) Buffer, - BufferLength); - break; - default: - RC = STATUS_INVALID_INFO_CLASS; - } - if (RC == STATUS_BUFFER_OVERFLOW || RC == STATUS_INVALID_INFO_CLASS) - { - break; - } - } - else - { - if (FirstQuery) - { - RC = STATUS_NO_SUCH_FILE; - } - else - { - RC = STATUS_NO_MORE_FILES; - } - break; - } - Buffer0 = (PFILE_NAMES_INFORMATION) Buffer; - Buffer0->FileIndex = DirContext.DirIndex; - pCcb->Entry = ++DirContext.DirIndex; - BufferLength -= Buffer0->NextEntryOffset; - if (IrpContext->Stack->Flags & SL_RETURN_SINGLE_ENTRY) - { - break; + ExReleaseResourceLite(&pFcb->MainResource); + return STATUS_INSUFFICIENT_RESOURCES; } - Buffer += Buffer0->NextEntryOffset; + pCcb->SearchPattern.Buffer[0] = L'*'; + pCcb->SearchPattern.Buffer[1] = 0; + pCcb->SearchPattern.Length = sizeof(WCHAR); } - if (Buffer0) - { - Buffer0->NextEntryOffset = 0; - RC = STATUS_SUCCESS; - IrpContext->Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length - BufferLength; + if (IrpContext->Stack->Flags & SL_INDEX_SPECIFIED) + { + DirContext.DirIndex = pCcb->Entry = Stack->Parameters.QueryDirectory.FileIndex; } - ExReleaseResourceLite(&pFcb->MainResource); - return RC; + else if (FirstQuery || (IrpContext->Stack->Flags & SL_RESTART_SCAN)) + { + DirContext.DirIndex = pCcb->Entry = 0; + } + else + { + DirContext.DirIndex = pCcb->Entry; + } + + DPRINT("Buffer=%p tofind=%wZ\n", Buffer, &pCcb->SearchPattern); + + DirContext.LongNameU.Buffer = LongNameBuffer; + DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer); + DirContext.ShortNameU.Buffer = ShortNameBuffer; + DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer); + + while ((Status == STATUS_SUCCESS) && (BufferLength > 0)) + { + Status = FindFile(IrpContext->DeviceExt, + pFcb, + &pCcb->SearchPattern, + &DirContext, + FirstCall); + pCcb->Entry = DirContext.DirIndex; + + DPRINT("Found %wZ, Status=%x, entry %x\n", &DirContext.LongNameU, Status, pCcb->Entry); + + FirstCall = FALSE; + if (NT_SUCCESS(Status)) + { + switch (FileInformationClass) + { + case FileNameInformation: + Status = VfatGetFileNameInformation(&DirContext, + (PFILE_NAMES_INFORMATION)Buffer, + BufferLength); + break; + + case FileDirectoryInformation: + Status = VfatGetFileDirectoryInformation(&DirContext, + IrpContext->DeviceExt, + (PFILE_DIRECTORY_INFORMATION)Buffer, + BufferLength); + break; + + case FileFullDirectoryInformation: + Status = VfatGetFileFullDirectoryInformation(&DirContext, + IrpContext->DeviceExt, + (PFILE_FULL_DIR_INFORMATION)Buffer, + BufferLength); + break; + + case FileBothDirectoryInformation: + Status = VfatGetFileBothInformation(&DirContext, + IrpContext->DeviceExt, + (PFILE_BOTH_DIR_INFORMATION)Buffer, + BufferLength); + break; + + default: + Status = STATUS_INVALID_INFO_CLASS; + break; + } + + if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_INVALID_INFO_CLASS) + break; + } + else + { + Status = (FirstQuery ? STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES); + break; + } + + Buffer0 = (PFILE_NAMES_INFORMATION) Buffer; + Buffer0->FileIndex = DirContext.DirIndex; + pCcb->Entry = ++DirContext.DirIndex; + BufferLength -= Buffer0->NextEntryOffset; + + if (IrpContext->Stack->Flags & SL_RETURN_SINGLE_ENTRY) + break; + + Buffer += Buffer0->NextEntryOffset; + } + + if (Buffer0) + { + Buffer0->NextEntryOffset = 0; + Status = STATUS_SUCCESS; + IrpContext->Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length - BufferLength; + } + + ExReleaseResourceLite(&pFcb->MainResource); + + return Status; } -NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT IrpContext) /* * FUNCTION: directory control : read/write directory informations */ +NTSTATUS +VfatDirectoryControl(PVFAT_IRP_CONTEXT IrpContext) { - NTSTATUS RC = STATUS_SUCCESS; - IrpContext->Irp->IoStatus.Information = 0; - switch (IrpContext->MinorFunction) + NTSTATUS Status = STATUS_SUCCESS; + + IrpContext->Irp->IoStatus.Information = 0; + + switch (IrpContext->MinorFunction) { - case IRP_MN_QUERY_DIRECTORY: - RC = DoQuery (IrpContext); - break; - case IRP_MN_NOTIFY_CHANGE_DIRECTORY: - DPRINT (" vfat, dir : change\n"); - RC = STATUS_NOT_IMPLEMENTED; - break; - default: - // error - DbgPrint ("unexpected minor function %x in VFAT driver\n", - IrpContext->MinorFunction); - RC = STATUS_INVALID_DEVICE_REQUEST; - break; + case IRP_MN_QUERY_DIRECTORY: + Status = DoQuery (IrpContext); + break; + + case IRP_MN_NOTIFY_CHANGE_DIRECTORY: + DPRINT("VFAT, dir : change\n"); + Status = STATUS_NOT_IMPLEMENTED; + break; + + default: + /* Error */ + DPRINT("Unexpected minor function %x in VFAT driver\n", + IrpContext->MinorFunction); + Status = STATUS_INVALID_DEVICE_REQUEST; + break; } - if (RC == STATUS_PENDING) - { - RC = VfatQueueRequest(IrpContext); - } - else - { - IrpContext->Irp->IoStatus.Status = RC; - IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT); - VfatFreeIrpContext(IrpContext); - } - return RC; + + if (Status == STATUS_PENDING) + { + Status = VfatQueueRequest(IrpContext); + } + else + { + IrpContext->Irp->IoStatus.Status = Status; + IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT); + VfatFreeIrpContext(IrpContext); + } + + return Status; } - +/* EOF */ \ No newline at end of file