mirror of
https://github.com/reactos/reactos.git
synced 2025-05-28 21:48:19 +00:00
Based on a patch by Herve Poussineau <poussine@freesurf.fr>:
- Compile using W32API. - Use documented structures names instead of ReactOS equivalent. - Get rid of MAX_PATH constant (only valid in user mode). svn path=/trunk/; revision=12957
This commit is contained in:
parent
fb6e28b8a0
commit
5a27206097
9 changed files with 132 additions and 58 deletions
|
@ -41,7 +41,7 @@
|
||||||
void vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry, PUNICODE_STRING NameU)
|
void vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry, PUNICODE_STRING NameU)
|
||||||
{
|
{
|
||||||
OEM_STRING StringA;
|
OEM_STRING StringA;
|
||||||
ULONG Length;
|
USHORT Length;
|
||||||
CHAR cString[12];
|
CHAR cString[12];
|
||||||
|
|
||||||
RtlCopyMemory(cString, pEntry->Filename, 11);
|
RtlCopyMemory(cString, pEntry->Filename, 11);
|
||||||
|
@ -191,22 +191,39 @@ FindFile (PDEVICE_EXTENSION DeviceExt,
|
||||||
* FUNCTION: Find a file
|
* FUNCTION: Find a file
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
WCHAR PathNameBuffer[MAX_PATH];
|
PWCHAR PathNameBuffer;
|
||||||
|
ULONG PathNameBufferLength;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PVOID Context = NULL;
|
PVOID Context = NULL;
|
||||||
PVOID Page;
|
PVOID Page;
|
||||||
PVFATFCB rcFcb;
|
PVFATFCB rcFcb;
|
||||||
BOOLEAN Found;
|
BOOLEAN Found;
|
||||||
UNICODE_STRING PathNameU;
|
UNICODE_STRING PathNameU;
|
||||||
|
UNICODE_STRING FileToFindUpcase;
|
||||||
BOOLEAN WildCard;
|
BOOLEAN WildCard;
|
||||||
|
|
||||||
DPRINT ("FindFile(Parent %x, FileToFind '%wZ', DirIndex: %d)\n",
|
DPRINT ("FindFile(Parent %x, FileToFind '%wZ', DirIndex: %d)\n",
|
||||||
Parent, FileToFindU, DirContext->DirIndex);
|
Parent, FileToFindU, DirContext->DirIndex);
|
||||||
DPRINT ("FindFile: Path %wZ)\n",&Parent->PathNameU);
|
DPRINT ("FindFile: Path %wZ)\n",&Parent->PathNameU);
|
||||||
|
|
||||||
|
PathNameBufferLength = Parent->PathNameU.Length + LONGNAME_MAX_LENGTH + 2 * sizeof(WCHAR);
|
||||||
|
if (PathNameBufferLength > (USHRT_MAX - 2) * sizeof(WCHAR))
|
||||||
|
{
|
||||||
|
/* A valid filename can't be so long. Do as if the file doesn't exist. */
|
||||||
|
CHECKPOINT;
|
||||||
|
return STATUS_NO_SUCH_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameBufferLength);
|
||||||
|
if (!PathNameBuffer)
|
||||||
|
{
|
||||||
|
CHECKPOINT1;
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
PathNameU.Buffer = PathNameBuffer;
|
PathNameU.Buffer = PathNameBuffer;
|
||||||
PathNameU.Length = 0;
|
PathNameU.Length = 0;
|
||||||
PathNameU.MaximumLength = sizeof(PathNameBuffer);
|
PathNameU.MaximumLength = PathNameBufferLength;
|
||||||
|
|
||||||
DirContext->LongNameU.Length = 0;
|
DirContext->LongNameU.Length = 0;
|
||||||
DirContext->ShortNameU.Length = 0;
|
DirContext->ShortNameU.Length = 0;
|
||||||
|
@ -244,10 +261,21 @@ FindFile (PDEVICE_EXTENSION DeviceExt,
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
vfatReleaseFCB(DeviceExt, rcFcb);
|
vfatReleaseFCB(DeviceExt, rcFcb);
|
||||||
|
ExFreePool(PathNameBuffer);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FsRtlIsNameInExpression need the searched string to be upcase,
|
||||||
|
* even if IgnoreCase is specified */
|
||||||
|
Status = RtlUpcaseUnicodeString(&FileToFindUpcase, FileToFindU, TRUE);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
CHECKPOINT;
|
||||||
|
ExFreePool(PathNameBuffer);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
while(TRUE)
|
while(TRUE)
|
||||||
{
|
{
|
||||||
Status = DeviceExt->GetNextDirEntry(&Context, &Page, Parent, DirContext, First);
|
Status = DeviceExt->GetNextDirEntry(&Context, &Page, Parent, DirContext, First);
|
||||||
|
@ -263,14 +291,13 @@ FindFile (PDEVICE_EXTENSION DeviceExt,
|
||||||
}
|
}
|
||||||
if (WildCard)
|
if (WildCard)
|
||||||
{
|
{
|
||||||
Found = FsRtlIsNameInExpression(FileToFindU, &DirContext->LongNameU, TRUE, NULL) ||
|
Found = FsRtlIsNameInExpression(&FileToFindUpcase, &DirContext->LongNameU, TRUE, NULL) ||
|
||||||
FsRtlIsNameInExpression(FileToFindU, &DirContext->ShortNameU, TRUE, NULL);
|
FsRtlIsNameInExpression(&FileToFindUpcase, &DirContext->ShortNameU, TRUE, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* FIXME: Use FsRtlAreNamesEqual */
|
Found = FsRtlAreNamesEqual(&DirContext->LongNameU, FileToFindU, TRUE, NULL) ||
|
||||||
Found = RtlEqualUnicodeString(&DirContext->LongNameU, FileToFindU, TRUE) ||
|
FsRtlAreNamesEqual(&DirContext->ShortNameU, FileToFindU, TRUE, NULL);
|
||||||
RtlEqualUnicodeString(&DirContext->ShortNameU, FileToFindU, TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Found)
|
if (Found)
|
||||||
|
@ -300,6 +327,8 @@ FindFile (PDEVICE_EXTENSION DeviceExt,
|
||||||
{
|
{
|
||||||
CcUnpinData(Context);
|
CcUnpinData(Context);
|
||||||
}
|
}
|
||||||
|
RtlFreeUnicodeString(&FileToFindUpcase);
|
||||||
|
ExFreePool(PathNameBuffer);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
DirContext->DirIndex++;
|
DirContext->DirIndex++;
|
||||||
|
@ -310,6 +339,8 @@ FindFile (PDEVICE_EXTENSION DeviceExt,
|
||||||
CcUnpinData(Context);
|
CcUnpinData(Context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&FileToFindUpcase);
|
||||||
|
ExFreePool(PathNameBuffer);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -311,7 +311,7 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
|
||||||
BOOLEAN First = FALSE;
|
BOOLEAN First = FALSE;
|
||||||
BOOLEAN FirstCall;
|
BOOLEAN FirstCall;
|
||||||
VFAT_DIRENTRY_CONTEXT DirContext;
|
VFAT_DIRENTRY_CONTEXT DirContext;
|
||||||
WCHAR LongNameBuffer[MAX_PATH];
|
WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH];
|
||||||
WCHAR ShortNameBuffer[13];
|
WCHAR ShortNameBuffer[13];
|
||||||
|
|
||||||
PIO_STACK_LOCATION Stack = IrpContext->Stack;
|
PIO_STACK_LOCATION Stack = IrpContext->Stack;
|
||||||
|
@ -344,7 +344,13 @@ NTSTATUS DoQuery (PVFAT_IRP_CONTEXT IrpContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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;
|
||||||
|
#else
|
||||||
pSearchPattern = Stack->Parameters.QueryDirectory.FileName;
|
pSearchPattern = Stack->Parameters.QueryDirectory.FileName;
|
||||||
|
#endif
|
||||||
FileInformationClass =
|
FileInformationClass =
|
||||||
Stack->Parameters.QueryDirectory.FileInformationClass;
|
Stack->Parameters.QueryDirectory.FileInformationClass;
|
||||||
FileIndex = Stack->Parameters.QueryDirectory.FileIndex;
|
FileIndex = Stack->Parameters.QueryDirectory.FileIndex;
|
||||||
|
|
|
@ -211,7 +211,7 @@ FATAddEntry (PDEVICE_EXTENSION DeviceExt,
|
||||||
BOOLEAN SpacesFound;
|
BOOLEAN SpacesFound;
|
||||||
|
|
||||||
VFAT_DIRENTRY_CONTEXT DirContext;
|
VFAT_DIRENTRY_CONTEXT DirContext;
|
||||||
WCHAR LongNameBuffer[MAX_PATH];
|
WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH];
|
||||||
WCHAR ShortNameBuffer[13];
|
WCHAR ShortNameBuffer[13];
|
||||||
|
|
||||||
DPRINT ("addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &ParentFcb->PathNameU);
|
DPRINT ("addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &ParentFcb->PathNameU);
|
||||||
|
@ -370,16 +370,6 @@ FATAddEntry (PDEVICE_EXTENSION DeviceExt,
|
||||||
}
|
}
|
||||||
/* set dates and times */
|
/* set dates and times */
|
||||||
KeQuerySystemTime (&SystemTime);
|
KeQuerySystemTime (&SystemTime);
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
TIME_FIELDS tf;
|
|
||||||
RtlTimeToTimeFields (&SystemTime, &tf);
|
|
||||||
DPRINT1("%d.%d.%d %02d:%02d:%02d.%03d '%wZ'\n",
|
|
||||||
tf.Day, tf.Month, tf.Year, tf.Hour,
|
|
||||||
tf.Minute, tf.Second, tf.Milliseconds,
|
|
||||||
NameU);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
FsdSystemTimeToDosDateTime (DeviceExt, &SystemTime, &DirContext.DirEntry.Fat.CreationDate,
|
FsdSystemTimeToDosDateTime (DeviceExt, &SystemTime, &DirContext.DirEntry.Fat.CreationDate,
|
||||||
&DirContext.DirEntry.Fat.CreationTime);
|
&DirContext.DirEntry.Fat.CreationTime);
|
||||||
DirContext.DirEntry.Fat.UpdateDate = DirContext.DirEntry.Fat.CreationDate;
|
DirContext.DirEntry.Fat.UpdateDate = DirContext.DirEntry.Fat.CreationDate;
|
||||||
|
@ -566,7 +556,7 @@ FATXAddEntry (PDEVICE_EXTENSION DeviceExt,
|
||||||
NameA.Length = 0;
|
NameA.Length = 0;
|
||||||
NameA.MaximumLength = 42;
|
NameA.MaximumLength = 42;
|
||||||
RtlUnicodeStringToOemString(&NameA, &DirContext.LongNameU, FALSE);
|
RtlUnicodeStringToOemString(&NameA, &DirContext.LongNameU, FALSE);
|
||||||
DirContext.DirEntry.FatX.FilenameLength = NameA.Length;
|
DirContext.DirEntry.FatX.FilenameLength = (unsigned char)NameA.Length;
|
||||||
|
|
||||||
/* set attributes */
|
/* set attributes */
|
||||||
DirContext.DirEntry.FatX.Attrib = ReqAttr;
|
DirContext.DirEntry.FatX.Attrib = ReqAttr;
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
/* ------------------------------------------------------- INCLUDES */
|
/* ------------------------------------------------------- INCLUDES */
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <ntos/kefuncs.h>
|
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <rosrtl/string.h>
|
#include <rosrtl/string.h>
|
||||||
|
@ -26,7 +25,6 @@
|
||||||
|
|
||||||
/* -------------------------------------------------------- DEFINES */
|
/* -------------------------------------------------------- DEFINES */
|
||||||
|
|
||||||
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
|
|
||||||
#define TAG_FCB TAG('V', 'F', 'C', 'B')
|
#define TAG_FCB TAG('V', 'F', 'C', 'B')
|
||||||
|
|
||||||
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
|
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
|
||||||
|
@ -55,7 +53,7 @@ VOID
|
||||||
vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
|
vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
|
||||||
{
|
{
|
||||||
PWCHAR pName;
|
PWCHAR pName;
|
||||||
ULONG Length = 0;
|
USHORT Length = 0;
|
||||||
pName = PathNameU->Buffer + PathNameU->Length / sizeof(WCHAR) - 1;
|
pName = PathNameU->Buffer + PathNameU->Length / sizeof(WCHAR) - 1;
|
||||||
while (*pName != L'\\' && pName >= PathNameU->Buffer)
|
while (*pName != L'\\' && pName >= PathNameU->Buffer)
|
||||||
{
|
{
|
||||||
|
@ -79,9 +77,24 @@ vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_
|
||||||
VOID
|
VOID
|
||||||
vfatInitFcb(PVFATFCB Fcb, PUNICODE_STRING NameU)
|
vfatInitFcb(PVFATFCB Fcb, PUNICODE_STRING NameU)
|
||||||
{
|
{
|
||||||
|
ULONG PathNameBufferLength;
|
||||||
|
|
||||||
|
if (NameU)
|
||||||
|
PathNameBufferLength = NameU->Length + sizeof(WCHAR);
|
||||||
|
else
|
||||||
|
PathNameBufferLength = 0;
|
||||||
|
|
||||||
|
Fcb->PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameBufferLength);
|
||||||
|
if (!Fcb->PathNameBuffer)
|
||||||
|
{
|
||||||
|
/* FIXME: what to do if no more memory? */
|
||||||
|
DPRINT1("Unable to initialize FCB for filename '%wZ'\n", NameU);
|
||||||
|
KEBUGCHECKEX(0, (ULONG_PTR)Fcb, (ULONG_PTR)NameU, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
Fcb->PathNameU.Length = 0;
|
Fcb->PathNameU.Length = 0;
|
||||||
Fcb->PathNameU.Buffer = Fcb->PathNameBuffer;
|
Fcb->PathNameU.Buffer = Fcb->PathNameBuffer;
|
||||||
Fcb->PathNameU.MaximumLength = sizeof(Fcb->PathNameBuffer);
|
Fcb->PathNameU.MaximumLength = PathNameBufferLength;
|
||||||
Fcb->ShortNameU.Length = 0;
|
Fcb->ShortNameU.Length = 0;
|
||||||
Fcb->ShortNameU.Buffer = Fcb->ShortNameBuffer;
|
Fcb->ShortNameU.Buffer = Fcb->ShortNameBuffer;
|
||||||
Fcb->ShortNameU.MaximumLength = sizeof(Fcb->ShortNameBuffer);
|
Fcb->ShortNameU.MaximumLength = sizeof(Fcb->ShortNameBuffer);
|
||||||
|
@ -146,6 +159,7 @@ VOID
|
||||||
vfatDestroyFCB(PVFATFCB pFCB)
|
vfatDestroyFCB(PVFATFCB pFCB)
|
||||||
{
|
{
|
||||||
FsRtlUninitializeFileLock(&pFCB->FileLock);
|
FsRtlUninitializeFileLock(&pFCB->FileLock);
|
||||||
|
ExFreePool(pFCB->PathNameBuffer);
|
||||||
ExDeleteResourceLite(&pFCB->PagingIoResource);
|
ExDeleteResourceLite(&pFCB->PagingIoResource);
|
||||||
ExDeleteResourceLite(&pFCB->MainResource);
|
ExDeleteResourceLite(&pFCB->MainResource);
|
||||||
ExFreeToNPagedLookasideList(&VfatGlobalData->FcbLookasideList, pFCB);
|
ExFreeToNPagedLookasideList(&VfatGlobalData->FcbLookasideList, pFCB);
|
||||||
|
@ -431,20 +445,28 @@ vfatMakeFCBFromDirEntry(PVCB vcb,
|
||||||
PVFATFCB* fileFCB)
|
PVFATFCB* fileFCB)
|
||||||
{
|
{
|
||||||
PVFATFCB rcFCB;
|
PVFATFCB rcFCB;
|
||||||
WCHAR pathName [MAX_PATH];
|
PWCHAR PathNameBuffer;
|
||||||
|
ULONG PathNameLength;
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
ULONG hash;
|
ULONG hash;
|
||||||
|
|
||||||
UNICODE_STRING NameU;
|
UNICODE_STRING NameU;
|
||||||
|
|
||||||
if (directoryFCB->PathNameU.Length + 2 * sizeof(WCHAR) +
|
PathNameLength = (directoryFCB->PathNameU.Length + 2 * sizeof(WCHAR)
|
||||||
+ DirContext->LongNameU.Length > MAX_PATH * sizeof(WCHAR))
|
+ DirContext->LongNameU.Length) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
if (PathNameLength > (USHRT_MAX - 2) * sizeof(WCHAR))
|
||||||
{
|
{
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
}
|
}
|
||||||
NameU.Buffer = pathName;
|
PathNameBuffer = ExAllocatePool(NonPagedPool, PathNameLength);
|
||||||
|
if (!PathNameBuffer)
|
||||||
|
{
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
NameU.Buffer = PathNameBuffer;
|
||||||
NameU.Length = 0;
|
NameU.Length = 0;
|
||||||
NameU.MaximumLength = sizeof(pathName);
|
NameU.MaximumLength = PathNameLength;
|
||||||
|
|
||||||
RtlCopyUnicodeString(&NameU, &directoryFCB->PathNameU);
|
RtlCopyUnicodeString(&NameU, &directoryFCB->PathNameU);
|
||||||
if (!vfatFCBIsRoot (directoryFCB))
|
if (!vfatFCBIsRoot (directoryFCB))
|
||||||
|
@ -516,6 +538,7 @@ vfatMakeFCBFromDirEntry(PVCB vcb,
|
||||||
vfatAddFCBToTable (vcb, rcFCB);
|
vfatAddFCBToTable (vcb, rcFCB);
|
||||||
*fileFCB = rcFCB;
|
*fileFCB = rcFCB;
|
||||||
|
|
||||||
|
ExFreePool(PathNameBuffer);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,7 +576,7 @@ vfatDirFindFile (PDEVICE_EXTENSION pDeviceExt,
|
||||||
PVOID Page = NULL;
|
PVOID Page = NULL;
|
||||||
BOOLEAN First = TRUE;
|
BOOLEAN First = TRUE;
|
||||||
VFAT_DIRENTRY_CONTEXT DirContext;
|
VFAT_DIRENTRY_CONTEXT DirContext;
|
||||||
WCHAR LongNameBuffer[MAX_PATH];
|
WCHAR LongNameBuffer[LONGNAME_MAX_LENGTH];
|
||||||
WCHAR ShortNameBuffer[13];
|
WCHAR ShortNameBuffer[13];
|
||||||
BOOLEAN FoundLong = FALSE;
|
BOOLEAN FoundLong = FALSE;
|
||||||
BOOLEAN FoundShort = FALSE;
|
BOOLEAN FoundShort = FALSE;
|
||||||
|
@ -690,9 +713,9 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
|
||||||
vfatReleaseFCB (pVCB, FCB);
|
vfatReleaseFCB (pVCB, FCB);
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
}
|
}
|
||||||
memmove(pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR),
|
RtlMoveMemory(pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR),
|
||||||
curr, pFileNameU->Length - Length);
|
curr, pFileNameU->Length - Length);
|
||||||
pFileNameU->Length += FCB->PathNameU.Length - Length;
|
pFileNameU->Length += (USHORT)(FCB->PathNameU.Length - Length);
|
||||||
curr = pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR);
|
curr = pFileNameU->Buffer + FCB->PathNameU.Length / sizeof(WCHAR);
|
||||||
last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1;
|
last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1;
|
||||||
}
|
}
|
||||||
|
@ -751,9 +774,9 @@ vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
|
||||||
vfatReleaseFCB (pVCB, parentFCB);
|
vfatReleaseFCB (pVCB, parentFCB);
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
}
|
}
|
||||||
memmove(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr,
|
RtlMoveMemory(prev + parentFCB->LongNameU.Length / sizeof(WCHAR), curr,
|
||||||
pFileNameU->Length - (curr - pFileNameU->Buffer) * sizeof(WCHAR));
|
pFileNameU->Length - (curr - pFileNameU->Buffer) * sizeof(WCHAR));
|
||||||
pFileNameU->Length += parentFCB->LongNameU.Length - Length;
|
pFileNameU->Length += (USHORT)(parentFCB->LongNameU.Length - Length);
|
||||||
curr = prev + parentFCB->LongNameU.Length / sizeof(WCHAR);
|
curr = prev + parentFCB->LongNameU.Length / sizeof(WCHAR);
|
||||||
last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1;
|
last = pFileNameU->Buffer + pFileNameU->Length / sizeof(WCHAR) - 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,8 +226,9 @@ VfatSetDispositionInformation(PFILE_OBJECT FileObject,
|
||||||
PFILE_DISPOSITION_INFORMATION DispositionInfo)
|
PFILE_DISPOSITION_INFORMATION DispositionInfo)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
#ifdef DBG
|
||||||
PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
|
PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
|
||||||
|
#endif
|
||||||
|
|
||||||
DPRINT ("FsdSetDispositionInformation()\n");
|
DPRINT ("FsdSetDispositionInformation()\n");
|
||||||
|
|
||||||
|
@ -248,7 +249,7 @@ VfatSetDispositionInformation(PFILE_OBJECT FileObject,
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DispositionInfo->DoDeleteFile)
|
if (DispositionInfo->DeleteFile)
|
||||||
{
|
{
|
||||||
if (MmFlushImageSection (FileObject->SectionObjectPointer, MmFlushForDelete))
|
if (MmFlushImageSection (FileObject->SectionObjectPointer, MmFlushForDelete))
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
/* INCLUDES *****************************************************************/
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <ntos/kefuncs.h>
|
|
||||||
#include <rosrtl/string.h>
|
#include <rosrtl/string.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
|
@ -654,9 +653,9 @@ VfatGetVolumeBitmap(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
|
VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
{
|
{
|
||||||
PIO_STACK_LOCATION Stack;
|
PIO_STACK_LOCATION Stack;
|
||||||
LARGE_INTEGER Vcn;
|
LARGE_INTEGER Vcn;
|
||||||
PGET_RETRIEVAL_DESCRIPTOR RetrievalPointers;
|
PRETRIEVAL_POINTERS_BUFFER RetrievalPointers;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
ULONG MaxExtentCount;
|
ULONG MaxExtentCount;
|
||||||
PVFATFCB Fcb;
|
PVFATFCB Fcb;
|
||||||
|
@ -677,7 +676,7 @@ VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
if (IrpContext->Irp->UserBuffer == NULL ||
|
if (IrpContext->Irp->UserBuffer == NULL ||
|
||||||
Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GET_RETRIEVAL_DESCRIPTOR) + sizeof(MAPPING_PAIR))
|
Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(RETRIEVAL_POINTERS_BUFFER))
|
||||||
{
|
{
|
||||||
return STATUS_BUFFER_TOO_SMALL;
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
}
|
}
|
||||||
|
@ -689,7 +688,7 @@ VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
Vcn = *(PLARGE_INTEGER)Stack->Parameters.DeviceIoControl.Type3InputBuffer;
|
Vcn = *(PLARGE_INTEGER)Stack->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||||
RetrievalPointers = IrpContext->Irp->UserBuffer;
|
RetrievalPointers = IrpContext->Irp->UserBuffer;
|
||||||
|
|
||||||
MaxExtentCount = ((Stack->Parameters.DeviceIoControl.OutputBufferLength - sizeof(GET_RETRIEVAL_DESCRIPTOR)) / sizeof(MAPPING_PAIR));
|
MaxExtentCount = ((Stack->Parameters.DeviceIoControl.OutputBufferLength - sizeof(RetrievalPointers->ExtentCount) - sizeof(RetrievalPointers->StartingVcn)) / sizeof(RetrievalPointers->Extents[0]));
|
||||||
|
|
||||||
|
|
||||||
if (Vcn.QuadPart >= Fcb->RFCB.AllocationSize.QuadPart / DeviceExt->FatInfo.BytesPerCluster)
|
if (Vcn.QuadPart >= Fcb->RFCB.AllocationSize.QuadPart / DeviceExt->FatInfo.BytesPerCluster)
|
||||||
|
@ -707,11 +706,12 @@ VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
goto ByeBye;
|
goto ByeBye;
|
||||||
}
|
}
|
||||||
|
|
||||||
RetrievalPointers->StartVcn = Vcn.QuadPart;
|
RetrievalPointers->StartingVcn = Vcn;
|
||||||
RetrievalPointers->NumberOfPairs = 0;
|
RetrievalPointers->ExtentCount = 0;
|
||||||
RetrievalPointers->Pair[0].Lcn = CurrentCluster - 2;
|
RetrievalPointers->Extents[0].Lcn.u.HighPart = 0;
|
||||||
|
RetrievalPointers->Extents[0].Lcn.u.LowPart = CurrentCluster - 2;
|
||||||
LastCluster = 0;
|
LastCluster = 0;
|
||||||
while (CurrentCluster != 0xffffffff && RetrievalPointers->NumberOfPairs < MaxExtentCount)
|
while (CurrentCluster != 0xffffffff && RetrievalPointers->ExtentCount < MaxExtentCount)
|
||||||
{
|
{
|
||||||
|
|
||||||
LastCluster = CurrentCluster;
|
LastCluster = CurrentCluster;
|
||||||
|
@ -724,16 +724,17 @@ VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
|
|
||||||
if (LastCluster + 1 != CurrentCluster)
|
if (LastCluster + 1 != CurrentCluster)
|
||||||
{
|
{
|
||||||
RetrievalPointers->Pair[RetrievalPointers->NumberOfPairs].Vcn = Vcn.QuadPart;
|
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].NextVcn = Vcn;
|
||||||
RetrievalPointers->NumberOfPairs++;
|
RetrievalPointers->ExtentCount++;
|
||||||
if (RetrievalPointers->NumberOfPairs < MaxExtentCount)
|
if (RetrievalPointers->ExtentCount < MaxExtentCount)
|
||||||
{
|
{
|
||||||
RetrievalPointers->Pair[RetrievalPointers->NumberOfPairs].Lcn = CurrentCluster - 2;
|
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.HighPart = 0;
|
||||||
|
RetrievalPointers->Extents[RetrievalPointers->ExtentCount].Lcn.u.LowPart = CurrentCluster - 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IrpContext->Irp->IoStatus.Information = sizeof(GET_RETRIEVAL_DESCRIPTOR) + sizeof(MAPPING_PAIR) * RetrievalPointers->NumberOfPairs;
|
IrpContext->Irp->IoStatus.Information = sizeof(RETRIEVAL_POINTERS_BUFFER) + (sizeof(RetrievalPointers->Extents[0]) * (RetrievalPointers->ExtentCount - 1));
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
ByeBye:
|
ByeBye:
|
||||||
|
@ -757,7 +758,7 @@ VfatRosQueryLcnMapping(PVFAT_IRP_CONTEXT IrpContext)
|
||||||
PROS_QUERY_LCN_MAPPING LcnQuery;
|
PROS_QUERY_LCN_MAPPING LcnQuery;
|
||||||
PIO_STACK_LOCATION Stack;
|
PIO_STACK_LOCATION Stack;
|
||||||
|
|
||||||
DPRINT("VfatGetRetrievalPointers(IrpContext %x)\n", IrpContext);
|
DPRINT("VfatRosQueryLcnMapping(IrpContext %x)\n", IrpContext);
|
||||||
|
|
||||||
DeviceExt = IrpContext->DeviceExt;
|
DeviceExt = IrpContext->DeviceExt;
|
||||||
Stack = IrpContext->Stack;
|
Stack = IrpContext->Stack;
|
||||||
|
|
|
@ -38,9 +38,9 @@ TARGET_CLEAN = $(DEP_FILES) *.o *.sys *.sym
|
||||||
include $(PATH_TO_TOP)/config
|
include $(PATH_TO_TOP)/config
|
||||||
|
|
||||||
ifeq ($(DBG), 1)
|
ifeq ($(DBG), 1)
|
||||||
TARGET_CFLAGS = -Wall -Werror -g
|
TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -g
|
||||||
else
|
else
|
||||||
TARGET_CFLAGS = -Wall -Werror -O3 -fno-strict-aliasing
|
TARGET_CFLAGS = -D__USE_W32API -Wall -Werror -O3 -fno-strict-aliasing
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(PATH_TO_TOP)/rules.mak
|
include $(PATH_TO_TOP)/rules.mak
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
/* INCLUDES *****************************************************************/
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <ntos/kefuncs.h>
|
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <ntos/minmax.h>
|
#include <ntos/minmax.h>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,27 @@
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include <ddk/ntifs.h>
|
#include <ddk/ntifs.h>
|
||||||
|
#include <ddk/ntdddisk.h>
|
||||||
|
#undef DeleteFile /* FIXME */
|
||||||
|
|
||||||
|
#define USE_ROS_CC_AND_FS
|
||||||
|
|
||||||
|
/* FIXME */
|
||||||
|
#ifdef __USE_W32API
|
||||||
|
NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING, CONST STRING *, BOOLEAN);
|
||||||
|
NTSTATUS NTAPI RtlDowncaseUnicodeString(PUNICODE_STRING, PCUNICODE_STRING, BOOLEAN);
|
||||||
|
NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING, PCUNICODE_STRING, BOOLEAN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ROS_CC_AND_FS
|
||||||
|
NTSTATUS STDCALL CcRosInitializeFileCache(PFILE_OBJECT, ULONG);
|
||||||
|
NTSTATUS STDCALL CcRosReleaseFileCache(PFILE_OBJECT);
|
||||||
|
#define FSCTL_ROS_QUERY_LCN_MAPPING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
|
typedef struct _ROS_QUERY_LCN_MAPPING { LARGE_INTEGER LcnDiskOffset; } ROS_QUERY_LCN_MAPPING, *PROS_QUERY_LCN_MAPPING;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define KEBUGCHECK(a) DbgPrint("KeBugCheck at %s:%i\n",__FILE__,__LINE__), KeBugCheck(a)
|
||||||
|
#define KEBUGCHECKEX(a,b,c,d,e) DbgPrint("KeBugCheckEx at %s:%i\n",__FILE__,__LINE__), KeBugCheckEx(a,b,c,d,e)
|
||||||
|
|
||||||
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
|
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
|
||||||
#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
|
#define ROUND_DOWN(N, S) ((N) - ((N) % (S)))
|
||||||
|
@ -75,8 +96,10 @@ struct _FsInfoSector
|
||||||
|
|
||||||
typedef struct _BootSector BootSector;
|
typedef struct _BootSector BootSector;
|
||||||
|
|
||||||
#define VFAT_CASE_LOWER_BASE 8 // base is lower case
|
#define VFAT_CASE_LOWER_BASE 8 // base is lower case
|
||||||
#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
|
#define VFAT_CASE_LOWER_EXT 16 // extension is lower case
|
||||||
|
|
||||||
|
#define LONGNAME_MAX_LENGTH 256 // max length for a long filename
|
||||||
|
|
||||||
#define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
|
#define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
|
||||||
#define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
|
#define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
|
||||||
|
@ -284,7 +307,7 @@ typedef struct _VFATFCB
|
||||||
UNICODE_STRING PathNameU;
|
UNICODE_STRING PathNameU;
|
||||||
|
|
||||||
/* buffer for PathNameU */
|
/* buffer for PathNameU */
|
||||||
WCHAR PathNameBuffer[MAX_PATH];
|
PWCHAR PathNameBuffer;
|
||||||
|
|
||||||
/* buffer for ShortNameU */
|
/* buffer for ShortNameU */
|
||||||
WCHAR ShortNameBuffer[13];
|
WCHAR ShortNameBuffer[13];
|
||||||
|
|
Loading…
Reference in a new issue