[FORMATTING]

* No code changes.

svn path=/trunk/; revision=57246
This commit is contained in:
Amine Khaldi 2012-09-06 18:36:48 +00:00
parent 93c87d7be9
commit 5423c59abe

View file

@ -8,16 +8,22 @@
*/ */
/* INCLUDES *****************************************************************/
#define NDEBUG #define NDEBUG
#include "vfat.h" #include "vfat.h"
/* FUNCTIONS ****************************************************************/
// function like DosDateTimeToFileTime /* Function like DosDateTimeToFileTime */
BOOLEAN 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; PDOSTIME pdtime = (PDOSTIME)&DosTime;
PDOSDATE pddate = (PDOSDATE) &DosDate; PDOSDATE pddate = (PDOSDATE)&DosDate;
TIME_FIELDS TimeFields; TIME_FIELDS TimeFields;
LARGE_INTEGER LocalTime; LARGE_INTEGER LocalTime;
@ -33,26 +39,29 @@ FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt, USHORT DosDate, USHORT
TimeFields.Month = pddate->Month; TimeFields.Month = pddate->Month;
TimeFields.Year = (CSHORT)(DeviceExt->BaseDateYear + pddate->Year); TimeFields.Year = (CSHORT)(DeviceExt->BaseDateYear + pddate->Year);
RtlTimeFieldsToTime (&TimeFields, &LocalTime); RtlTimeFieldsToTime(&TimeFields, &LocalTime);
ExLocalTimeToSystemTime(&LocalTime, SystemTime); ExLocalTimeToSystemTime(&LocalTime, SystemTime);
return TRUE; return TRUE;
} }
// function like FileTimeToDosDateTime /* Function like FileTimeToDosDateTime */
BOOLEAN 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; PDOSTIME pdtime = (PDOSTIME)pDosTime;
PDOSDATE pddate = (PDOSDATE) pDosDate; PDOSDATE pddate = (PDOSDATE)pDosDate;
TIME_FIELDS TimeFields; TIME_FIELDS TimeFields;
LARGE_INTEGER LocalTime; LARGE_INTEGER LocalTime;
if (SystemTime == NULL) if (SystemTime == NULL)
return FALSE; return FALSE;
ExSystemTimeToLocalTime (SystemTime, &LocalTime); ExSystemTimeToLocalTime(SystemTime, &LocalTime);
RtlTimeToTimeFields (&LocalTime, &TimeFields); RtlTimeToTimeFields(&LocalTime, &TimeFields);
if (pdtime) if (pdtime)
{ {
@ -74,43 +83,59 @@ FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER SystemTi
#define ULONG_ROUND_UP(x) ROUND_UP((x), (sizeof(ULONG))) #define ULONG_ROUND_UP(x) ROUND_UP((x), (sizeof(ULONG)))
static NTSTATUS static NTSTATUS
VfatGetFileNameInformation (PVFAT_DIRENTRY_CONTEXT DirContext, VfatGetFileNameInformation(PVFAT_DIRENTRY_CONTEXT DirContext,
PFILE_NAMES_INFORMATION pInfo, ULONG BufferLength) PFILE_NAMES_INFORMATION pInfo,
ULONG BufferLength)
{ {
if ((sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) if ((sizeof(FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength)
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
pInfo->FileNameLength = DirContext->LongNameU.Length; pInfo->FileNameLength = DirContext->LongNameU.Length;
pInfo->NextEntryOffset = pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) +
ULONG_ROUND_UP (sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length); DirContext->LongNameU.Length);
RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length);
RtlCopyMemory(pInfo->FileName,
DirContext->LongNameU.Buffer,
DirContext->LongNameU.Length);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS static NTSTATUS
VfatGetFileDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext, VfatGetFileDirectoryInformation(PVFAT_DIRENTRY_CONTEXT DirContext,
PDEVICE_EXTENSION DeviceExt, PDEVICE_EXTENSION DeviceExt,
PFILE_DIRECTORY_INFORMATION pInfo, PFILE_DIRECTORY_INFORMATION pInfo,
ULONG BufferLength) ULONG BufferLength)
{ {
if ((sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) if ((sizeof(FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length) > BufferLength)
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
pInfo->FileNameLength = DirContext->LongNameU.Length; pInfo->FileNameLength = DirContext->LongNameU.Length;
pInfo->NextEntryOffset = pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_DIRECTORY_INFORMATION) +
ULONG_ROUND_UP (sizeof (FILE_DIRECTORY_INFORMATION) + DirContext->LongNameU.Length); DirContext->LongNameU.Length);
RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); /* pInfo->FileIndex = ; */
// pInfo->FileIndex=;
RtlCopyMemory(pInfo->FileName,
DirContext->LongNameU.Buffer,
DirContext->LongNameU.Length);
if (DeviceExt->Flags & VCB_IS_FATX) if (DeviceExt->Flags & VCB_IS_FATX)
{ {
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.CreationDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.CreationDate,
DirContext->DirEntry.FatX.CreationTime, DirContext->DirEntry.FatX.CreationTime,
&pInfo->CreationTime); &pInfo->CreationTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.AccessDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.AccessDate,
DirContext->DirEntry.FatX.AccessTime, DirContext->DirEntry.FatX.AccessTime,
&pInfo->LastAccessTime); &pInfo->LastAccessTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.UpdateDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.UpdateDate,
DirContext->DirEntry.FatX.UpdateTime, DirContext->DirEntry.FatX.UpdateTime,
&pInfo->LastWriteTime); &pInfo->LastWriteTime);
pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->ChangeTime = pInfo->LastWriteTime;
if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY) if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY)
{ {
pInfo->EndOfFile.QuadPart = 0; pInfo->EndOfFile.QuadPart = 0;
@ -122,21 +147,29 @@ VfatGetFileDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize;
/* Make allocsize a rounded up multiple of BytesPerCluster */ /* Make allocsize a rounded up multiple of BytesPerCluster */
pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.HighPart = 0;
pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, DeviceExt->FatInfo.BytesPerCluster); pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize,
DeviceExt->FatInfo.BytesPerCluster);
} }
pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f;
} }
else else
{ {
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.CreationDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.CreationDate,
DirContext->DirEntry.Fat.CreationTime, DirContext->DirEntry.Fat.CreationTime,
&pInfo->CreationTime); &pInfo->CreationTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.AccessDate, 0, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.AccessDate,
0,
&pInfo->LastAccessTime); &pInfo->LastAccessTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.UpdateDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.UpdateDate,
DirContext->DirEntry.Fat.UpdateTime, DirContext->DirEntry.Fat.UpdateTime,
&pInfo->LastWriteTime); &pInfo->LastWriteTime);
pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->ChangeTime = pInfo->LastWriteTime;
if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY) if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY)
{ {
pInfo->EndOfFile.QuadPart = 0; pInfo->EndOfFile.QuadPart = 0;
@ -148,8 +181,10 @@ VfatGetFileDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize;
/* Make allocsize a rounded up multiple of BytesPerCluster */ /* Make allocsize a rounded up multiple of BytesPerCluster */
pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.HighPart = 0;
pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize,
DeviceExt->FatInfo.BytesPerCluster);
} }
pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f;
} }
@ -157,87 +192,116 @@ VfatGetFileDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
} }
static NTSTATUS static NTSTATUS
VfatGetFileFullDirectoryInformation (PVFAT_DIRENTRY_CONTEXT DirContext, VfatGetFileFullDirectoryInformation(PVFAT_DIRENTRY_CONTEXT DirContext,
PDEVICE_EXTENSION DeviceExt, PDEVICE_EXTENSION DeviceExt,
PFILE_FULL_DIR_INFORMATION pInfo, PFILE_FULL_DIR_INFORMATION pInfo,
ULONG BufferLength) ULONG BufferLength)
{ {
if ((sizeof (FILE_FULL_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) if ((sizeof(FILE_FULL_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength)
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
pInfo->FileNameLength = DirContext->LongNameU.Length; pInfo->FileNameLength = DirContext->LongNameU.Length;
pInfo->NextEntryOffset = pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_FULL_DIR_INFORMATION) +
ULONG_ROUND_UP (sizeof (FILE_FULL_DIR_INFORMATION) + DirContext->LongNameU.Length); DirContext->LongNameU.Length);
RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length); /* pInfo->FileIndex = ; */
// pInfo->FileIndex=; /* pInfo->EaSize = ; */
RtlCopyMemory(pInfo->FileName,
DirContext->LongNameU.Buffer,
DirContext->LongNameU.Length);
if (DeviceExt->Flags & VCB_IS_FATX) if (DeviceExt->Flags & VCB_IS_FATX)
{ {
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.CreationDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.CreationDate,
DirContext->DirEntry.FatX.CreationTime, DirContext->DirEntry.FatX.CreationTime,
&pInfo->CreationTime); &pInfo->CreationTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.AccessDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.AccessDate,
DirContext->DirEntry.FatX.AccessTime, DirContext->DirEntry.FatX.AccessTime,
&pInfo->LastAccessTime); &pInfo->LastAccessTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.UpdateDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.UpdateDate,
DirContext->DirEntry.FatX.UpdateTime, DirContext->DirEntry.FatX.UpdateTime,
&pInfo->LastWriteTime); &pInfo->LastWriteTime);
pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->ChangeTime = pInfo->LastWriteTime;
pInfo->EndOfFile.u.HighPart = 0; pInfo->EndOfFile.u.HighPart = 0;
pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize;
/* Make allocsize a rounded up multiple of BytesPerCluster */ /* Make allocsize a rounded up multiple of BytesPerCluster */
pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.HighPart = 0;
pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, DeviceExt->FatInfo.BytesPerCluster); pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize,
DeviceExt->FatInfo.BytesPerCluster);
pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f;
} }
else else
{ {
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.CreationDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.CreationDate,
DirContext->DirEntry.Fat.CreationTime, DirContext->DirEntry.Fat.CreationTime,
&pInfo->CreationTime); &pInfo->CreationTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.AccessDate, FsdDosDateTimeToSystemTime(DeviceExt,
0, &pInfo->LastAccessTime); DirContext->DirEntry.Fat.AccessDate,
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.UpdateDate, 0,
&pInfo->LastAccessTime);
FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.UpdateDate,
DirContext->DirEntry.Fat.UpdateTime, DirContext->DirEntry.Fat.UpdateTime,
&pInfo->LastWriteTime); &pInfo->LastWriteTime);
pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->ChangeTime = pInfo->LastWriteTime;
pInfo->EndOfFile.u.HighPart = 0; pInfo->EndOfFile.u.HighPart = 0;
pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.Fat.FileSize;
/* Make allocsize a rounded up multiple of BytesPerCluster */ /* Make allocsize a rounded up multiple of BytesPerCluster */
pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.HighPart = 0;
pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize,
DeviceExt->FatInfo.BytesPerCluster);
pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f;
} }
// pInfo->EaSize=;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS static NTSTATUS
VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext, VfatGetFileBothInformation(PVFAT_DIRENTRY_CONTEXT DirContext,
PDEVICE_EXTENSION DeviceExt, PDEVICE_EXTENSION DeviceExt,
PFILE_BOTH_DIR_INFORMATION pInfo, PFILE_BOTH_DIR_INFORMATION pInfo,
ULONG BufferLength) ULONG BufferLength)
{ {
if ((sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength) if ((sizeof(FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length) > BufferLength)
return STATUS_BUFFER_OVERFLOW; return STATUS_BUFFER_OVERFLOW;
pInfo->EaSize = 0;
if (DeviceExt->Flags & VCB_IS_FATX) if (DeviceExt->Flags & VCB_IS_FATX)
{ {
pInfo->FileNameLength = DirContext->LongNameU.Length; pInfo->FileNameLength = DirContext->LongNameU.Length;
RtlCopyMemory(pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length);
pInfo->NextEntryOffset = RtlCopyMemory(pInfo->FileName,
ULONG_ROUND_UP (sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length); DirContext->LongNameU.Buffer,
DirContext->LongNameU.Length);
pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) +
DirContext->LongNameU.Length);
pInfo->ShortName[0] = 0; pInfo->ShortName[0] = 0;
pInfo->ShortNameLength = 0; pInfo->ShortNameLength = 0;
// pInfo->FileIndex=; /* pInfo->FileIndex = ; */
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.CreationDate,
FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.CreationDate,
DirContext->DirEntry.FatX.CreationTime, DirContext->DirEntry.FatX.CreationTime,
&pInfo->CreationTime); &pInfo->CreationTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.AccessDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.AccessDate,
DirContext->DirEntry.FatX.AccessTime, DirContext->DirEntry.FatX.AccessTime,
&pInfo->LastAccessTime); &pInfo->LastAccessTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.FatX.UpdateDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.FatX.UpdateDate,
DirContext->DirEntry.FatX.UpdateTime, DirContext->DirEntry.FatX.UpdateTime,
&pInfo->LastWriteTime); &pInfo->LastWriteTime);
pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->ChangeTime = pInfo->LastWriteTime;
if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY) if (DirContext->DirEntry.FatX.Attrib & FILE_ATTRIBUTE_DIRECTORY)
{ {
pInfo->EndOfFile.QuadPart = 0; pInfo->EndOfFile.QuadPart = 0;
@ -249,28 +313,45 @@ VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize; pInfo->EndOfFile.u.LowPart = DirContext->DirEntry.FatX.FileSize;
/* Make allocsize a rounded up multiple of BytesPerCluster */ /* Make allocsize a rounded up multiple of BytesPerCluster */
pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.HighPart = 0;
pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize, DeviceExt->FatInfo.BytesPerCluster); pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.FatX.FileSize,
DeviceExt->FatInfo.BytesPerCluster);
} }
pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f; pInfo->FileAttributes = DirContext->DirEntry.FatX.Attrib & 0x3f;
} }
else else
{ {
pInfo->FileNameLength = DirContext->LongNameU.Length; pInfo->FileNameLength = DirContext->LongNameU.Length;
pInfo->NextEntryOffset = pInfo->NextEntryOffset = ULONG_ROUND_UP(sizeof(FILE_BOTH_DIR_INFORMATION) +
ULONG_ROUND_UP (sizeof (FILE_BOTH_DIR_INFORMATION) + DirContext->LongNameU.Length); DirContext->LongNameU.Length);
RtlCopyMemory(pInfo->ShortName, DirContext->ShortNameU.Buffer, DirContext->ShortNameU.Length);
RtlCopyMemory(pInfo->ShortName,
DirContext->ShortNameU.Buffer,
DirContext->ShortNameU.Length);
pInfo->ShortNameLength = (CCHAR)DirContext->ShortNameU.Length; pInfo->ShortNameLength = (CCHAR)DirContext->ShortNameU.Length;
RtlCopyMemory (pInfo->FileName, DirContext->LongNameU.Buffer, DirContext->LongNameU.Length);
// pInfo->FileIndex=; RtlCopyMemory(pInfo->FileName,
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.CreationDate, DirContext->LongNameU.Buffer,
DirContext->LongNameU.Length);
/* pInfo->FileIndex = ; */
FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.CreationDate,
DirContext->DirEntry.Fat.CreationTime, DirContext->DirEntry.Fat.CreationTime,
&pInfo->CreationTime); &pInfo->CreationTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.AccessDate, 0, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.AccessDate,
0,
&pInfo->LastAccessTime); &pInfo->LastAccessTime);
FsdDosDateTimeToSystemTime (DeviceExt, DirContext->DirEntry.Fat.UpdateDate, FsdDosDateTimeToSystemTime(DeviceExt,
DirContext->DirEntry.Fat.UpdateDate,
DirContext->DirEntry.Fat.UpdateTime, DirContext->DirEntry.Fat.UpdateTime,
&pInfo->LastWriteTime); &pInfo->LastWriteTime);
pInfo->ChangeTime = pInfo->LastWriteTime; pInfo->ChangeTime = pInfo->LastWriteTime;
if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY) if (DirContext->DirEntry.Fat.Attrib & FILE_ATTRIBUTE_DIRECTORY)
{ {
pInfo->EndOfFile.QuadPart = 0; pInfo->EndOfFile.QuadPart = 0;
@ -284,19 +365,21 @@ VfatGetFileBothInformation (PVFAT_DIRENTRY_CONTEXT DirContext,
pInfo->AllocationSize.u.HighPart = 0; pInfo->AllocationSize.u.HighPart = 0;
pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster); pInfo->AllocationSize.u.LowPart = ROUND_UP(DirContext->DirEntry.Fat.FileSize, DeviceExt->FatInfo.BytesPerCluster);
} }
pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f; pInfo->FileAttributes = DirContext->DirEntry.Fat.Attrib & 0x3f;
} }
pInfo->EaSize=0;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext) static NTSTATUS
DoQuery(PVFAT_IRP_CONTEXT IrpContext)
{ {
NTSTATUS RC = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
long BufferLength = 0; LONG BufferLength = 0;
PUNICODE_STRING pSearchPattern = NULL; PUNICODE_STRING pSearchPattern = NULL;
FILE_INFORMATION_CLASS FileInformationClass; FILE_INFORMATION_CLASS FileInformationClass;
unsigned char *Buffer = NULL; PUCHAR Buffer = NULL;
PFILE_NAMES_INFORMATION Buffer0 = NULL; PFILE_NAMES_INFORMATION Buffer0 = NULL;
PVFATFCB pFcb; PVFATFCB pFcb;
PVFATCCB pCcb; PVFATCCB pCcb;
@ -308,10 +391,10 @@ static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
PIO_STACK_LOCATION Stack = IrpContext->Stack; PIO_STACK_LOCATION Stack = IrpContext->Stack;
pCcb = (PVFATCCB) IrpContext->FileObject->FsContext2; pCcb = (PVFATCCB)IrpContext->FileObject->FsContext2;
pFcb = (PVFATFCB) IrpContext->FileObject->FsContext; pFcb = (PVFATFCB)IrpContext->FileObject->FsContext;
// determine Buffer for result : /* Determine Buffer for result : */
BufferLength = Stack->Parameters.QueryDirectory.Length; BufferLength = Stack->Parameters.QueryDirectory.Length;
#if 0 #if 0
/* Do not probe the user buffer until SEH is available */ /* Do not probe the user buffer until SEH is available */
@ -327,12 +410,11 @@ static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
if (!ExAcquireResourceSharedLite(&pFcb->MainResource, if (!ExAcquireResourceSharedLite(&pFcb->MainResource,
(BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT))) (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT)))
{ {
RC = VfatLockUserBuffer(IrpContext->Irp, BufferLength, IoWriteAccess); Status = VfatLockUserBuffer(IrpContext->Irp, BufferLength, IoWriteAccess);
if (NT_SUCCESS(RC)) if (NT_SUCCESS(Status))
{ Status = STATUS_PENDING;
RC = STATUS_PENDING;
} return Status;
return RC;
} }
/* Obtain the callers parameters */ /* Obtain the callers parameters */
@ -343,15 +425,17 @@ static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
#else #else
pSearchPattern = Stack->Parameters.QueryDirectory.FileName; pSearchPattern = Stack->Parameters.QueryDirectory.FileName;
#endif #endif
FileInformationClass = FileInformationClass = Stack->Parameters.QueryDirectory.FileInformationClass;
Stack->Parameters.QueryDirectory.FileInformationClass;
if (pSearchPattern) if (pSearchPattern)
{ {
if (!pCcb->SearchPattern.Buffer) if (!pCcb->SearchPattern.Buffer)
{ {
FirstQuery = TRUE; FirstQuery = TRUE;
pCcb->SearchPattern.MaximumLength = pSearchPattern->Length + sizeof(WCHAR); pCcb->SearchPattern.MaximumLength = pSearchPattern->Length + sizeof(WCHAR);
pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, pCcb->SearchPattern.MaximumLength, TAG_VFAT); pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool,
pCcb->SearchPattern.MaximumLength,
TAG_VFAT);
if (!pCcb->SearchPattern.Buffer) if (!pCcb->SearchPattern.Buffer)
{ {
ExReleaseResourceLite(&pFcb->MainResource); ExReleaseResourceLite(&pFcb->MainResource);
@ -365,7 +449,9 @@ static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
{ {
FirstQuery = TRUE; FirstQuery = TRUE;
pCcb->SearchPattern.MaximumLength = 2 * sizeof(WCHAR); pCcb->SearchPattern.MaximumLength = 2 * sizeof(WCHAR);
pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool, 2 * sizeof(WCHAR), TAG_VFAT); pCcb->SearchPattern.Buffer = ExAllocatePoolWithTag(NonPagedPool,
2 * sizeof(WCHAR),
TAG_VFAT);
if (!pCcb->SearchPattern.Buffer) if (!pCcb->SearchPattern.Buffer)
{ {
ExReleaseResourceLite(&pFcb->MainResource); ExReleaseResourceLite(&pFcb->MainResource);
@ -389,123 +475,135 @@ static NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
DirContext.DirIndex = pCcb->Entry; DirContext.DirIndex = pCcb->Entry;
} }
DPRINT ("Buffer=%p tofind=%wZ\n", Buffer, &pCcb->SearchPattern); DPRINT("Buffer=%p tofind=%wZ\n", Buffer, &pCcb->SearchPattern);
DirContext.LongNameU.Buffer = LongNameBuffer; DirContext.LongNameU.Buffer = LongNameBuffer;
DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer); DirContext.LongNameU.MaximumLength = sizeof(LongNameBuffer);
DirContext.ShortNameU.Buffer = ShortNameBuffer; DirContext.ShortNameU.Buffer = ShortNameBuffer;
DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer); DirContext.ShortNameU.MaximumLength = sizeof(ShortNameBuffer);
while (RC == STATUS_SUCCESS && BufferLength > 0) while ((Status == STATUS_SUCCESS) && (BufferLength > 0))
{ {
RC = FindFile (IrpContext->DeviceExt, pFcb, Status = FindFile(IrpContext->DeviceExt,
&pCcb->SearchPattern, &DirContext, FirstCall); pFcb,
&pCcb->SearchPattern,
&DirContext,
FirstCall);
pCcb->Entry = DirContext.DirIndex; pCcb->Entry = DirContext.DirIndex;
DPRINT ("Found %wZ, RC=%x, entry %x\n", &DirContext.LongNameU, RC, pCcb->Entry);
DPRINT("Found %wZ, Status=%x, entry %x\n", &DirContext.LongNameU, Status, pCcb->Entry);
FirstCall = FALSE; FirstCall = FALSE;
if (NT_SUCCESS (RC)) if (NT_SUCCESS(Status))
{ {
switch (FileInformationClass) switch (FileInformationClass)
{ {
case FileNameInformation: case FileNameInformation:
RC = VfatGetFileNameInformation (&DirContext, Status = VfatGetFileNameInformation(&DirContext,
(PFILE_NAMES_INFORMATION) Buffer, (PFILE_NAMES_INFORMATION)Buffer,
BufferLength); BufferLength);
break; break;
case FileDirectoryInformation: case FileDirectoryInformation:
RC = VfatGetFileDirectoryInformation (&DirContext, Status = VfatGetFileDirectoryInformation(&DirContext,
IrpContext->DeviceExt, IrpContext->DeviceExt,
(PFILE_DIRECTORY_INFORMATION) Buffer, (PFILE_DIRECTORY_INFORMATION)Buffer,
BufferLength); BufferLength);
break; break;
case FileFullDirectoryInformation: case FileFullDirectoryInformation:
RC = VfatGetFileFullDirectoryInformation (&DirContext, Status = VfatGetFileFullDirectoryInformation(&DirContext,
IrpContext->DeviceExt, IrpContext->DeviceExt,
(PFILE_FULL_DIR_INFORMATION) Buffer, (PFILE_FULL_DIR_INFORMATION)Buffer,
BufferLength); BufferLength);
break; break;
case FileBothDirectoryInformation: case FileBothDirectoryInformation:
RC = VfatGetFileBothInformation (&DirContext, Status = VfatGetFileBothInformation(&DirContext,
IrpContext->DeviceExt, IrpContext->DeviceExt,
(PFILE_BOTH_DIR_INFORMATION) Buffer, (PFILE_BOTH_DIR_INFORMATION)Buffer,
BufferLength); BufferLength);
break; break;
default: default:
RC = STATUS_INVALID_INFO_CLASS; Status = STATUS_INVALID_INFO_CLASS;
}
if (RC == STATUS_BUFFER_OVERFLOW || RC == STATUS_INVALID_INFO_CLASS)
{
break; break;
} }
if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_INVALID_INFO_CLASS)
break;
} }
else else
{ {
if (FirstQuery) Status = (FirstQuery ? STATUS_NO_SUCH_FILE : STATUS_NO_MORE_FILES);
{
RC = STATUS_NO_SUCH_FILE;
}
else
{
RC = STATUS_NO_MORE_FILES;
}
break; break;
} }
Buffer0 = (PFILE_NAMES_INFORMATION) Buffer; Buffer0 = (PFILE_NAMES_INFORMATION) Buffer;
Buffer0->FileIndex = DirContext.DirIndex; Buffer0->FileIndex = DirContext.DirIndex;
pCcb->Entry = ++DirContext.DirIndex; pCcb->Entry = ++DirContext.DirIndex;
BufferLength -= Buffer0->NextEntryOffset; BufferLength -= Buffer0->NextEntryOffset;
if (IrpContext->Stack->Flags & SL_RETURN_SINGLE_ENTRY) if (IrpContext->Stack->Flags & SL_RETURN_SINGLE_ENTRY)
{
break; break;
}
Buffer += Buffer0->NextEntryOffset; Buffer += Buffer0->NextEntryOffset;
} }
if (Buffer0) if (Buffer0)
{ {
Buffer0->NextEntryOffset = 0; Buffer0->NextEntryOffset = 0;
RC = STATUS_SUCCESS; Status = STATUS_SUCCESS;
IrpContext->Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length - BufferLength; IrpContext->Irp->IoStatus.Information = Stack->Parameters.QueryDirectory.Length - BufferLength;
} }
ExReleaseResourceLite(&pFcb->MainResource); ExReleaseResourceLite(&pFcb->MainResource);
return RC;
return Status;
} }
NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT IrpContext)
/* /*
* FUNCTION: directory control : read/write directory informations * FUNCTION: directory control : read/write directory informations
*/ */
NTSTATUS
VfatDirectoryControl(PVFAT_IRP_CONTEXT IrpContext)
{ {
NTSTATUS RC = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
IrpContext->Irp->IoStatus.Information = 0; IrpContext->Irp->IoStatus.Information = 0;
switch (IrpContext->MinorFunction) switch (IrpContext->MinorFunction)
{ {
case IRP_MN_QUERY_DIRECTORY: case IRP_MN_QUERY_DIRECTORY:
RC = DoQuery (IrpContext); Status = DoQuery (IrpContext);
break; break;
case IRP_MN_NOTIFY_CHANGE_DIRECTORY: case IRP_MN_NOTIFY_CHANGE_DIRECTORY:
DPRINT (" vfat, dir : change\n"); DPRINT("VFAT, dir : change\n");
RC = STATUS_NOT_IMPLEMENTED; Status = STATUS_NOT_IMPLEMENTED;
break; break;
default: default:
// error /* Error */
DbgPrint ("unexpected minor function %x in VFAT driver\n", DPRINT("Unexpected minor function %x in VFAT driver\n",
IrpContext->MinorFunction); IrpContext->MinorFunction);
RC = STATUS_INVALID_DEVICE_REQUEST; Status = STATUS_INVALID_DEVICE_REQUEST;
break; break;
} }
if (RC == STATUS_PENDING)
if (Status == STATUS_PENDING)
{ {
RC = VfatQueueRequest(IrpContext); Status = VfatQueueRequest(IrpContext);
} }
else else
{ {
IrpContext->Irp->IoStatus.Status = RC; IrpContext->Irp->IoStatus.Status = Status;
IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT); IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
VfatFreeIrpContext(IrpContext); VfatFreeIrpContext(IrpContext);
} }
return RC;
return Status;
} }
/* EOF */