mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 23:22:59 +00:00
[fastfat_new]
- Search FCBs with unicode name too, besides of OEM. - Create an infrastructure for opening existing FCB/DCBs. svn path=/trunk/; revision=43527
This commit is contained in:
parent
efa205834d
commit
fdaf0acd73
4 changed files with 200 additions and 5 deletions
|
@ -353,10 +353,11 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
PIO_STACK_LOCATION IrpSp;
|
PIO_STACK_LOCATION IrpSp;
|
||||||
BOOLEAN EndBackslash = FALSE, OpenedAsDos;
|
BOOLEAN EndBackslash = FALSE, OpenedAsDos;
|
||||||
UNICODE_STRING RemainingPart, FirstName, NextName;
|
UNICODE_STRING RemainingPart, FirstName, NextName, FileNameUpcased;
|
||||||
OEM_STRING AnsiFirstName;
|
OEM_STRING AnsiFirstName;
|
||||||
FF_ERROR FfError;
|
FF_ERROR FfError;
|
||||||
TYPE_OF_OPEN TypeOfOpen;
|
TYPE_OF_OPEN TypeOfOpen;
|
||||||
|
BOOLEAN OplockPostIrp = FALSE;
|
||||||
|
|
||||||
Iosb.Status = STATUS_SUCCESS;
|
Iosb.Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
@ -684,10 +685,22 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
&OpenedAsDos);
|
&OpenedAsDos);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we found anything */
|
/* If nothing found - try with unicode */
|
||||||
if (!NextFcb && Fcb->Dcb.SplayLinksUnicode)
|
if (!NextFcb && Fcb->Dcb.SplayLinksUnicode)
|
||||||
{
|
{
|
||||||
ASSERT(FALSE);
|
FileNameUpcased.Buffer = FsRtlAllocatePool(PagedPool, FirstName.Length);
|
||||||
|
FileNameUpcased.Length = 0;
|
||||||
|
FileNameUpcased.MaximumLength = FirstName.Length;
|
||||||
|
|
||||||
|
/* Downcase and then upcase to normalize it */
|
||||||
|
Status = RtlDowncaseUnicodeString(&FileNameUpcased, &FirstName, FALSE);
|
||||||
|
Status = RtlUpcaseUnicodeString(&FileNameUpcased, &FileNameUpcased, FALSE);
|
||||||
|
|
||||||
|
/* Try to find FCB again using unicode name */
|
||||||
|
NextFcb = FatFindFcb(IrpContext,
|
||||||
|
&Fcb->Dcb.SplayLinksUnicode,
|
||||||
|
(PSTRING)&FileNameUpcased,
|
||||||
|
&OpenedAsDos);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move to the next FCB */
|
/* Move to the next FCB */
|
||||||
|
@ -729,8 +742,116 @@ FatiCreate(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
/* We have a valid FCB now */
|
/* We have a valid FCB now */
|
||||||
if (!RemainingPart.Length)
|
if (!RemainingPart.Length)
|
||||||
{
|
{
|
||||||
DPRINT1("It's possible to open an existing FCB\n");
|
/* Check for target dir open */
|
||||||
ASSERT(FALSE);
|
if (OpenTargetDirectory)
|
||||||
|
{
|
||||||
|
DPRINT1("Opening target dir is missing\n");
|
||||||
|
ASSERT(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check this FCB's type */
|
||||||
|
if (FatNodeType(Fcb) == FAT_NTC_ROOT_DCB ||
|
||||||
|
FatNodeType(Fcb) == FAT_NTC_DCB)
|
||||||
|
{
|
||||||
|
/* Open a directory */
|
||||||
|
if (NonDirectoryFile)
|
||||||
|
{
|
||||||
|
/* Forbidden */
|
||||||
|
Iosb.Status = STATUS_FILE_IS_A_DIRECTORY;
|
||||||
|
ASSERT(FALSE);
|
||||||
|
return Iosb.Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open existing DCB */
|
||||||
|
Iosb = FatiOpenExistingDcb(IrpContext,
|
||||||
|
FileObject,
|
||||||
|
Vcb,
|
||||||
|
Fcb,
|
||||||
|
DesiredAccess,
|
||||||
|
ShareAccess,
|
||||||
|
CreateDisposition,
|
||||||
|
NoEaKnowledge,
|
||||||
|
DeleteOnClose);
|
||||||
|
|
||||||
|
/* Save information */
|
||||||
|
Irp->IoStatus.Information = Iosb.Information;
|
||||||
|
|
||||||
|
/* Unlock VCB */
|
||||||
|
FatReleaseVcb(IrpContext, Vcb);
|
||||||
|
|
||||||
|
/* Complete the request */
|
||||||
|
FatCompleteRequest(IrpContext, Irp, Iosb.Status);
|
||||||
|
|
||||||
|
return Iosb.Status;
|
||||||
|
}
|
||||||
|
else if (FatNodeType(Fcb) == FAT_NTC_FCB)
|
||||||
|
{
|
||||||
|
/* Open a file */
|
||||||
|
if (OpenDirectory)
|
||||||
|
{
|
||||||
|
/* Forbidden */
|
||||||
|
Iosb.Status = STATUS_NOT_A_DIRECTORY;
|
||||||
|
ASSERT(FALSE);
|
||||||
|
return Iosb.Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for trailing backslash */
|
||||||
|
if (EndBackslash)
|
||||||
|
{
|
||||||
|
/* Forbidden */
|
||||||
|
Iosb.Status = STATUS_OBJECT_NAME_INVALID;
|
||||||
|
ASSERT(FALSE);
|
||||||
|
return Iosb.Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iosb = FatiOpenExistingFcb(IrpContext,
|
||||||
|
FileObject,
|
||||||
|
Vcb,
|
||||||
|
Fcb,
|
||||||
|
DesiredAccess,
|
||||||
|
ShareAccess,
|
||||||
|
AllocationSize,
|
||||||
|
EaBuffer,
|
||||||
|
EaLength,
|
||||||
|
FileAttributes,
|
||||||
|
CreateDisposition,
|
||||||
|
NoEaKnowledge,
|
||||||
|
DeleteOnClose,
|
||||||
|
OpenedAsDos,
|
||||||
|
&OplockPostIrp);
|
||||||
|
|
||||||
|
/* Check if it's pending */
|
||||||
|
if (Iosb.Status != STATUS_PENDING)
|
||||||
|
{
|
||||||
|
/* In case of success set cache supported flag */
|
||||||
|
if (NT_SUCCESS(Iosb.Status) && !NoIntermediateBuffering)
|
||||||
|
{
|
||||||
|
SetFlag(FileObject->Flags, FO_CACHE_SUPPORTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save information */
|
||||||
|
Irp->IoStatus.Information = Iosb.Information;
|
||||||
|
|
||||||
|
/* Unlock VCB */
|
||||||
|
FatReleaseVcb(IrpContext, Vcb);
|
||||||
|
|
||||||
|
/* Complete the request */
|
||||||
|
FatCompleteRequest(IrpContext, Irp, Iosb.Status);
|
||||||
|
|
||||||
|
return Iosb.Status;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Queue this IRP */
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
ASSERT(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Unexpected FCB type */
|
||||||
|
KeBugCheckEx(/*FAT_FILE_SYSTEM*/0x23, __LINE__, (ULONG_PTR)Fcb, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* During parsing we encountered a part which has no attached FCB/DCB.
|
/* During parsing we encountered a part which has no attached FCB/DCB.
|
||||||
|
|
|
@ -173,4 +173,24 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
return Fcb;
|
return Fcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IO_STATUS_BLOCK
|
||||||
|
NTAPI
|
||||||
|
FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PVCB Vcb,
|
||||||
|
IN PFCB Dcb,
|
||||||
|
IN PACCESS_MASK DesiredAccess,
|
||||||
|
IN USHORT ShareAccess,
|
||||||
|
IN ULONG CreateDisposition,
|
||||||
|
IN BOOLEAN NoEaKnowledge,
|
||||||
|
IN BOOLEAN DeleteOnClose)
|
||||||
|
{
|
||||||
|
IO_STATUS_BLOCK Iosb = {{0}};
|
||||||
|
|
||||||
|
Iosb.Status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
return Iosb;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -87,6 +87,17 @@ FatCreateDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
IN PFCB ParentDcb,
|
IN PFCB ParentDcb,
|
||||||
IN FF_FILE *FileHandle);
|
IN FF_FILE *FileHandle);
|
||||||
|
|
||||||
|
IO_STATUS_BLOCK NTAPI
|
||||||
|
FatiOpenExistingDcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PVCB Vcb,
|
||||||
|
IN PFCB Dcb,
|
||||||
|
IN PACCESS_MASK DesiredAccess,
|
||||||
|
IN USHORT ShareAccess,
|
||||||
|
IN ULONG CreateDisposition,
|
||||||
|
IN BOOLEAN NoEaKnowledge,
|
||||||
|
IN BOOLEAN DeleteOnClose);
|
||||||
|
|
||||||
/* -------------------------------------------------------- create.c */
|
/* -------------------------------------------------------- create.c */
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
|
@ -296,6 +307,23 @@ FatCreateFcb(
|
||||||
IN PFCB ParentDcb,
|
IN PFCB ParentDcb,
|
||||||
IN FF_FILE *FileHandle);
|
IN FF_FILE *FileHandle);
|
||||||
|
|
||||||
|
IO_STATUS_BLOCK NTAPI
|
||||||
|
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PVCB Vcb,
|
||||||
|
IN PFCB Fcb,
|
||||||
|
IN PACCESS_MASK DesiredAccess,
|
||||||
|
IN USHORT ShareAccess,
|
||||||
|
IN ULONG AllocationSize,
|
||||||
|
IN PFILE_FULL_EA_INFORMATION EaBuffer,
|
||||||
|
IN ULONG EaLength,
|
||||||
|
IN UCHAR FileAttributes,
|
||||||
|
IN ULONG CreateDisposition,
|
||||||
|
IN BOOLEAN NoEaKnowledge,
|
||||||
|
IN BOOLEAN DeleteOnClose,
|
||||||
|
IN BOOLEAN OpenedAsDos,
|
||||||
|
OUT PBOOLEAN OplockPostIrp);
|
||||||
|
|
||||||
PFCB NTAPI
|
PFCB NTAPI
|
||||||
FatFindFcb(PFAT_IRP_CONTEXT IrpContext,
|
FatFindFcb(PFAT_IRP_CONTEXT IrpContext,
|
||||||
PRTL_SPLAY_LINKS *RootNode,
|
PRTL_SPLAY_LINKS *RootNode,
|
||||||
|
|
|
@ -172,6 +172,32 @@ FatCreateCcb()
|
||||||
return Ccb;
|
return Ccb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IO_STATUS_BLOCK
|
||||||
|
NTAPI
|
||||||
|
FatiOpenExistingFcb(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PVCB Vcb,
|
||||||
|
IN PFCB Fcb,
|
||||||
|
IN PACCESS_MASK DesiredAccess,
|
||||||
|
IN USHORT ShareAccess,
|
||||||
|
IN ULONG AllocationSize,
|
||||||
|
IN PFILE_FULL_EA_INFORMATION EaBuffer,
|
||||||
|
IN ULONG EaLength,
|
||||||
|
IN UCHAR FileAttributes,
|
||||||
|
IN ULONG CreateDisposition,
|
||||||
|
IN BOOLEAN NoEaKnowledge,
|
||||||
|
IN BOOLEAN DeleteOnClose,
|
||||||
|
IN BOOLEAN OpenedAsDos,
|
||||||
|
OUT PBOOLEAN OplockPostIrp)
|
||||||
|
{
|
||||||
|
IO_STATUS_BLOCK Iosb = {{0}};
|
||||||
|
|
||||||
|
Iosb.Status = STATUS_NOT_IMPLEMENTED;
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
return Iosb;
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
FatGetFcbUnicodeName(IN PFAT_IRP_CONTEXT IrpContext,
|
FatGetFcbUnicodeName(IN PFAT_IRP_CONTEXT IrpContext,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue