Implement FsRtlAllocateResource, FsRtlIsPagingFile, FsRtlBalanceReads. Fix some incorrect function prototypes, rename mdl.c to fastio.c and add some more functions to it. Implement FsRtlGetfileSize to use fastio, combine dbcsname.c and name.c and pretty-fy the array, clean up some ugly formatting. Create context.c and move stream/file context routines there.

svn path=/trunk/; revision=15084
This commit is contained in:
Alex Ionescu
2005-05-07 17:44:54 +00:00
parent 534059e50f
commit cd5450f6f9
9 changed files with 799 additions and 732 deletions
+2 -2
View File
@@ -84,7 +84,7 @@ FsRtlAllocatePoolWithTag (
IN ULONG NumberOfBytes,
IN ULONG Tag
);
DWORD
PERESOURCE
STDCALL
FsRtlAllocateResource (
VOID
@@ -351,7 +351,7 @@ FsRtlIsNameInExpression (
BOOLEAN STDCALL
FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus);
ULONG
BOOLEAN STDCALL
FsRtlIsPagingFile (
IN PFILE_OBJECT FileObject
);
+2 -2
View File
@@ -239,10 +239,10 @@ OBJECTS_EX = \
# Installable File System Run-Time Library (FsRtl)
OBJECTS_FS = \
fs/dbcsname.o \
fs/context.o \
fs/fastio.o \
fs/filelock.o \
fs/mcb.o \
fs/mdl.o \
fs/name.o \
fs/notify.o \
fs/oplock.o \
+81
View File
@@ -0,0 +1,81 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/fs/context.c
* PURPOSE: File and Stream Context Functions
*
* PROGRAMMERS: Alex Ionescu ([email protected])
*/
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
#include <internal/debug.h>
/* GLOBALS *******************************************************************/
/* PRIVATE FUNCTIONS**********************************************************/
/* FUNCTIONS *****************************************************************/
/*
* @unimplemented
*/
NTSTATUS
STDCALL
FsRtlInsertPerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
IN PFSRTL_PER_STREAM_CONTEXT Ptr)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/*
* @unimplemented
*/
PFSRTL_PER_STREAM_CONTEXT
STDCALL
FsRtlRemovePerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
IN PVOID OwnerId OPTIONAL,
IN PVOID InstanceId OPTIONAL)
{
UNIMPLEMENTED;
return NULL;
}
/*
* @unimplemented
*/
NTSTATUS
STDCALL
FsRtlInsertPerFileObjectContext(IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/*
* @unimplemented
*/
PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/
STDCALL
FsRtlRemovePerFileObjectContext(IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
IN PVOID OwnerId OPTIONAL,
IN PVOID InstanceId OPTIONAL)
{
UNIMPLEMENTED;
return NULL;
}
/*
* @unimplemented
*/
VOID
STDCALL
FsRtlTeardownPerStreamContexts(IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader)
{
UNIMPLEMENTED;
}
/* EOF */
-322
View File
@@ -1,322 +0,0 @@
/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/fs/dbcsname.c
* PURPOSE: No purpose listed.
*
* PROGRAMMERS: No programmer listed.
*/
#include <ntoskrnl.h>
/* DATA ********************************************************************/
static UCHAR LegalAnsiCharacterArray[] =
{
0, /* CTRL+@, 0x00 */
0, /* CTRL+A, 0x01 */
0, /* CTRL+B, 0x02 */
0, /* CTRL+C, 0x03 */
0, /* CTRL+D, 0x04 */
0, /* CTRL+E, 0x05 */
0, /* CTRL+F, 0x06 */
0, /* CTRL+G, 0x07 */
0, /* CTRL+H, 0x08 */
0, /* CTRL+I, 0x09 */
0, /* CTRL+J, 0x0a */
0, /* CTRL+K, 0x0b */
0, /* CTRL+L, 0x0c */
0, /* CTRL+M, 0x0d */
0, /* CTRL+N, 0x0e */
0, /* CTRL+O, 0x0f */
0, /* CTRL+P, 0x10 */
0, /* CTRL+Q, 0x11 */
0, /* CTRL+R, 0x12 */
0, /* CTRL+S, 0x13 */
0, /* CTRL+T, 0x14 */
0, /* CTRL+U, 0x15 */
0, /* CTRL+V, 0x16 */
0, /* CTRL+W, 0x17 */
0, /* CTRL+X, 0x18 */
0, /* CTRL+Y, 0x19 */
0, /* CTRL+Z, 0x1a */
0, /* CTRL+[, 0x1b */
0, /* CTRL+\, 0x1c */
0, /* CTRL+], 0x1d */
0, /* CTRL+^, 0x1e */
0, /* CTRL+_, 0x1f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* ` ', 0x20 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `!', 0x21 */
FSRTL_WILD_CHARACTER, /* `"', 0x22 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `#', 0x23 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `$', 0x24 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `%', 0x25 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `&', 0x26 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `'', 0x27 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `(', 0x28 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `)', 0x29 */
FSRTL_WILD_CHARACTER, /* `*', 0x2a */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `+', 0x2b */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `,', 0x2c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `-', 0x2d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `.', 0x2e */
0, /* `/', 0x2f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `0', 0x30 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `1', 0x31 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `2', 0x32 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `3', 0x33 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `4', 0x34 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `5', 0x35 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `6', 0x36 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `7', 0x37 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `8', 0x38 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `9', 0x39 */
FSRTL_NTFS_LEGAL, /* `:', 0x3a */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `;', 0x3b */
FSRTL_WILD_CHARACTER, /* `<', 0x3c */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `=', 0x3d */
FSRTL_WILD_CHARACTER, /* `>', 0x3e */
FSRTL_WILD_CHARACTER, /* `?', 0x3f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `@', 0x40 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `A', 0x41 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `B', 0x42 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `C', 0x43 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `D', 0x44 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `E', 0x45 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `F', 0x46 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `G', 0x47 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `H', 0x48 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `I', 0x49 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `J', 0x4a */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `K', 0x4b */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `L', 0x4c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `M', 0x4d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `N', 0x4e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `O', 0x4f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `P', 0x50 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `Q', 0x51 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `R', 0x52 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `S', 0x53 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `T', 0x54 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `U', 0x55 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `V', 0x56 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `W', 0x57 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `X', 0x58 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `Y', 0x59 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `Z', 0x5a */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `[', 0x5b */
0, /* `\', 0x5c */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `]', 0x5d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `^', 0x5e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `_', 0x5f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* ``', 0x60 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `a', 0x61 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `b', 0x62 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `c', 0x63 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `d', 0x64 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `e', 0x65 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `f', 0x66 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `g', 0x67 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `h', 0x68 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `i', 0x69 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `j', 0x6a */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `k', 0x6b */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `l', 0x6c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `m', 0x6d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `n', 0x6e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `o', 0x6f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `p', 0x70 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `q', 0x71 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `r', 0x72 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `s', 0x73 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `t', 0x74 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `u', 0x75 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `v', 0x76 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `w', 0x77 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `x', 0x78 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `y', 0x79 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `z', 0x7a */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `{', 0x7b */
0, /* `|', 0x7c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `}', 0x7d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `~', 0x7e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL /* 0x7f */
};
PUCHAR EXPORTED FsRtlLegalAnsiCharacterArray = LegalAnsiCharacterArray;
/* FUNCTIONS ***************************************************************/
/**********************************************************************
* NAME EXPORTED
* FsRtlDissectDbcs@16
*
* Dissects a given path name into first and remaining part.
*
* ARGUMENTS
* Name
* ANSI string to dissect.
*
* FirstPart
* Pointer to user supplied ANSI_STRING, that will
* later point to the first part of the original name.
*
* RemainingPart
* Pointer to user supplied ANSI_STRING, that will
* later point to the remaining part of the original name.
*
* RETURN VALUE
* None
*
* EXAMPLE
* Name: \test1\test2\test3
* FirstPart: test1
* RemainingPart: test2\test3
*
* @implemented
*/
VOID STDCALL
FsRtlDissectDbcs(IN ANSI_STRING Name,
OUT PANSI_STRING FirstPart,
OUT PANSI_STRING RemainingPart)
{
ULONG i;
ULONG FirstLoop;
/* Initialize the Outputs */
RtlZeroMemory(&FirstPart, sizeof(ANSI_STRING));
RtlZeroMemory(&RemainingPart, sizeof(ANSI_STRING));
/* Bail out if empty */
if (!Name.Length) return;
/* Ignore backslash */
if (Name.Buffer[0] == '\\') {
i = 1;
} else {
i = 0;
}
/* Loop until we find a backslash */
for (FirstLoop = i;i < Name.Length;i++) {
if (Name.Buffer[i] != '\\') break;
if (FsRtlIsLeadDbcsCharacter(Name.Buffer[i])) i++;
}
/* Now we have the First Part */
FirstPart->Length = (i-FirstLoop);
FirstPart->MaximumLength = FirstPart->Length; /* +2?? */
FirstPart->Buffer = &Name.Buffer[FirstLoop];
/* Make the second part if something is still left */
if (i<Name.Length) {
RemainingPart->Length = (Name.Length - (i+1));
RemainingPart->MaximumLength = RemainingPart->Length; /* +2?? */
RemainingPart->Buffer = &Name.Buffer[i+1];
}
return;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlDoesDbcsContainWildCards@4
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @implemented
*/
BOOLEAN STDCALL
FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name)
{
ULONG i;
/* Check every character */
for (i=0;i < Name->Length;i++) {
/* First make sure it's not the Lead DBCS */
if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i])) {
i++;
} else if (FsRtlIsAnsiCharacterWild(Name->Buffer[i])) {
/* Now return if it has a Wilcard */
return TRUE;
}
}
/* We didn't return above...so none found */
return FALSE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlIsDbcsInExpression@8
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @unimplemented
*/
BOOLEAN STDCALL
FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
IN PANSI_STRING Name)
{
return FALSE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlIsFatDbcsLegal@20
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName,
IN BOOLEAN WildCardsPermissible,
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
return FALSE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlIsHpfsDbcsLegal@20
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @unimplemented
*/
BOOLEAN STDCALL
FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
IN BOOLEAN WildCardsPermissible,
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
return FALSE;
}
/* EOF */
@@ -1,8 +1,8 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Kernel
* FILE: ntoskrnl/fs/mdl.c
* PURPOSE: Cached MDL Access Helper Routines for File System Drivers
* FILE: ntoskrnl/fs/fastio.c
* PURPOSE: File System Routines which support Fast I/O or Cc Access.
*
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
*/
@@ -60,6 +60,125 @@ FsRtlIncrementCcFastReadNoWait( VOID )
CcFastReadNoWait++;
}
/*
* NAME EXPORTED
* FsRtlCopyRead@32
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v12.
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlCopyRead(IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
UNIMPLEMENTED;
return FALSE;
}
/*
* NAME EXPORTED
* FsRtlCopyWrite@32
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v12.
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlCopyWrite(IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject)
{
UNIMPLEMENTED;
return FALSE;
}
/*
* NAME EXPORTED
* FsRtlGetFileSize@8
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @implemented
*/
NTSTATUS
STDCALL
FsRtlGetFileSize(IN PFILE_OBJECT FileObject,
IN OUT PLARGE_INTEGER FileSize)
{
FILE_STANDARD_INFORMATION Info;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
ULONG Length;
PDEVICE_OBJECT DeviceObject;
PFAST_IO_DISPATCH FastDispatch;
/* Get Device Object and Fast Calls */
DeviceObject = IoGetRelatedDeviceObject(FileObject);
FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
/* Check if we support Fast Calls, and check this one */
if (FastDispatch && FastDispatch->FastIoQueryStandardInfo)
{
/* Fast Path */
FastDispatch->FastIoQueryStandardInfo(FileObject,
TRUE,
&Info,
&IoStatusBlock,
DeviceObject);
Status = IoStatusBlock.Status;
}
else
{
/* Slow Path */
Status = IoQueryFileInformation(FileObject,
FileStandardInformation,
sizeof(Info),
&Info,
&Length);
}
/* Check success */
if (NT_SUCCESS(Status))
{
*FileSize = Info.EndOfFile;
}
/* Return status */
return Status;
}
/*
* NAME EXPORTED
* FsRtlMdlRead@24
@@ -391,5 +510,4 @@ FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject,
return FALSE;
}
/* EOF */
+364 -53
View File
@@ -1,39 +1,180 @@
/* $Id$
*
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/fs/name.c
* PURPOSE: No purpose listed.
* PURPOSE: Name and DBCS Name Validation and Dissection Functions.
*
* PROGRAMMERS: No programmer listed.
* PROGRAMMERS: Alex Ionescu ([email protected])
* Eric Kohl
* Filip Navara
*/
/* INCLUDES ****************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
/* FUNCTIONS ***************************************************************/
/* GLOBALS *******************************************************************/
/**********************************************************************
* NAME EXPORTED
* FsRtlAreNamesEqual@16
static UCHAR LegalAnsiCharacterArray[] =
{
0, /* CTRL+@, 0x00 */
0, /* CTRL+A, 0x01 */
0, /* CTRL+B, 0x02 */
0, /* CTRL+C, 0x03 */
0, /* CTRL+D, 0x04 */
0, /* CTRL+E, 0x05 */
0, /* CTRL+F, 0x06 */
0, /* CTRL+G, 0x07 */
0, /* CTRL+H, 0x08 */
0, /* CTRL+I, 0x09 */
0, /* CTRL+J, 0x0a */
0, /* CTRL+K, 0x0b */
0, /* CTRL+L, 0x0c */
0, /* CTRL+M, 0x0d */
0, /* CTRL+N, 0x0e */
0, /* CTRL+O, 0x0f */
0, /* CTRL+P, 0x10 */
0, /* CTRL+Q, 0x11 */
0, /* CTRL+R, 0x12 */
0, /* CTRL+S, 0x13 */
0, /* CTRL+T, 0x14 */
0, /* CTRL+U, 0x15 */
0, /* CTRL+V, 0x16 */
0, /* CTRL+W, 0x17 */
0, /* CTRL+X, 0x18 */
0, /* CTRL+Y, 0x19 */
0, /* CTRL+Z, 0x1a */
0, /* CTRL+[, 0x1b */
0, /* CTRL+\, 0x1c */
0, /* CTRL+], 0x1d */
0, /* CTRL+^, 0x1e */
0, /* CTRL+_, 0x1f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* ` ', 0x20 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `!', 0x21 */
FSRTL_WILD_CHARACTER, /* `"', 0x22 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `#', 0x23 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `$', 0x24 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `%', 0x25 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `&', 0x26 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `'', 0x27 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `(', 0x28 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `)', 0x29 */
FSRTL_WILD_CHARACTER, /* `*', 0x2a */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `+', 0x2b */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `,', 0x2c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `-', 0x2d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `.', 0x2e */
0, /* `/', 0x2f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `0', 0x30 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `1', 0x31 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `2', 0x32 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `3', 0x33 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `4', 0x34 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `5', 0x35 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `6', 0x36 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `7', 0x37 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `8', 0x38 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `9', 0x39 */
FSRTL_NTFS_LEGAL, /* `:', 0x3a */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `;', 0x3b */
FSRTL_WILD_CHARACTER, /* `<', 0x3c */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `=', 0x3d */
FSRTL_WILD_CHARACTER, /* `>', 0x3e */
FSRTL_WILD_CHARACTER, /* `?', 0x3f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `@', 0x40 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `A', 0x41 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `B', 0x42 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `C', 0x43 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `D', 0x44 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `E', 0x45 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `F', 0x46 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `G', 0x47 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `H', 0x48 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `I', 0x49 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `J', 0x4a */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `K', 0x4b */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `L', 0x4c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `M', 0x4d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `N', 0x4e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `O', 0x4f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `P', 0x50 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `Q', 0x51 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `R', 0x52 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `S', 0x53 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `T', 0x54 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `U', 0x55 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `V', 0x56 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `W', 0x57 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `X', 0x58 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `Y', 0x59 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `Z', 0x5a */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `[', 0x5b */
0, /* `\', 0x5c */
FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `]', 0x5d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `^', 0x5e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `_', 0x5f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* ``', 0x60 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `a', 0x61 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `b', 0x62 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `c', 0x63 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `d', 0x64 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `e', 0x65 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `f', 0x66 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `g', 0x67 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `h', 0x68 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `i', 0x69 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `j', 0x6a */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `k', 0x6b */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `l', 0x6c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `m', 0x6d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `n', 0x6e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `o', 0x6f */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `p', 0x70 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `q', 0x71 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `r', 0x72 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `s', 0x73 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `t', 0x74 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `u', 0x75 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `v', 0x76 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `w', 0x77 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `x', 0x78 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `y', 0x79 */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `z', 0x7a */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `{', 0x7b */
0, /* `|', 0x7c */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `}', 0x7d */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL, /* `~', 0x7e */
FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL /* 0x7f */
};
PUCHAR EXPORTED FsRtlLegalAnsiCharacterArray = LegalAnsiCharacterArray;
/* FUNCTIONS *****************************************************************/
/*
* NAME EXPORTED
* FsRtlAreNamesEqual@16
*
* DESCRIPTION
*
*
* ARGUMENTS
*
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v25.
* From Bo Branten's ntifs.h v25.
*
* @implemented
*/
BOOLEAN STDCALL
FsRtlAreNamesEqual (IN PUNICODE_STRING Name1,
IN PUNICODE_STRING Name2,
IN BOOLEAN IgnoreCase,
IN PWCHAR UpcaseTable OPTIONAL)
BOOLEAN
STDCALL
FsRtlAreNamesEqual(IN PUNICODE_STRING Name1,
IN PUNICODE_STRING Name2,
IN BOOLEAN IgnoreCase,
IN PWCHAR UpcaseTable OPTIONAL)
{
UNICODE_STRING UpcaseName1;
UNICODE_STRING UpcaseName2;
BOOLEAN StringsAreEqual;
@@ -92,40 +233,112 @@ ManualCase:
}
}
/**********************************************************************
* NAME EXPORTED
* FsRtlDissectName@16
/*
* NAME EXPORTED
* FsRtlDissectDbcs@16
*
* DESCRIPTION
* Dissects a given path name into first and remaining part.
* Dissects a given path name into first and remaining part.
*
* ARGUMENTS
* Name
* Unicode string to dissect.
* Name
* ANSI string to dissect.
*
* FirstPart
* Pointer to user supplied UNICODE_STRING, that will
* later point to the first part of the original name.
* FirstPart
* Pointer to user supplied ANSI_STRING, that will
* later point to the first part of the original name.
*
* RemainingPart
* Pointer to user supplied UNICODE_STRING, that will
* later point to the remaining part of the original name.
* RemainingPart
* Pointer to user supplied ANSI_STRING, that will
* later point to the remaining part of the original name.
*
* RETURN VALUE
* None
* None
*
* EXAMPLE
* Name: \test1\test2\test3
* FirstPart: test1
* RemainingPart: test2\test3
* Name: \test1\test2\test3
* FirstPart: test1
* RemainingPart: test2\test3
*
* @implemented
*/
VOID STDCALL
FsRtlDissectName (IN UNICODE_STRING Name,
OUT PUNICODE_STRING FirstPart,
OUT PUNICODE_STRING RemainingPart)
VOID
STDCALL
FsRtlDissectDbcs(IN ANSI_STRING Name,
OUT PANSI_STRING FirstPart,
OUT PANSI_STRING RemainingPart)
{
ULONG i;
ULONG FirstLoop;
/* Initialize the Outputs */
RtlZeroMemory(&FirstPart, sizeof(ANSI_STRING));
RtlZeroMemory(&RemainingPart, sizeof(ANSI_STRING));
/* Bail out if empty */
if (!Name.Length) return;
/* Ignore backslash */
if (Name.Buffer[0] == '\\') {
i = 1;
} else {
i = 0;
}
/* Loop until we find a backslash */
for (FirstLoop = i;i < Name.Length;i++) {
if (Name.Buffer[i] != '\\') break;
if (FsRtlIsLeadDbcsCharacter(Name.Buffer[i])) i++;
}
/* Now we have the First Part */
FirstPart->Length = (i-FirstLoop);
FirstPart->MaximumLength = FirstPart->Length; /* +2?? */
FirstPart->Buffer = &Name.Buffer[FirstLoop];
/* Make the second part if something is still left */
if (i<Name.Length) {
RemainingPart->Length = (Name.Length - (i+1));
RemainingPart->MaximumLength = RemainingPart->Length; /* +2?? */
RemainingPart->Buffer = &Name.Buffer[i+1];
}
return;
}
/*
* NAME EXPORTED
* FsRtlDissectName@16
*
* DESCRIPTION
* Dissects a given path name into first and remaining part.
*
* ARGUMENTS
* Name
* Unicode string to dissect.
*
* FirstPart
* Pointer to user supplied UNICODE_STRING, that will
* later point to the first part of the original name.
*
* RemainingPart
* Pointer to user supplied UNICODE_STRING, that will
* later point to the remaining part of the original name.
*
* RETURN VALUE
* None
*
* EXAMPLE
* Name: \test1\test2\test3
* FirstPart: test1
* RemainingPart: test2\test3
*
* @implemented
*/
VOID
STDCALL
FsRtlDissectName(IN UNICODE_STRING Name,
OUT PUNICODE_STRING FirstPart,
OUT PUNICODE_STRING RemainingPart)
{
USHORT NameOffset = 0;
USHORT NameLength = 0;
@@ -168,10 +381,43 @@ FsRtlDissectName (IN UNICODE_STRING Name,
}
}
/*
* NAME EXPORTED
* FsRtlDoesDbcsContainWildCards@4
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @implemented
*/
BOOLEAN
STDCALL
FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name)
{
ULONG i;
/* Check every character */
for (i=0;i < Name->Length;i++) {
/* First make sure it's not the Lead DBCS */
if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i])) {
i++;
} else if (FsRtlIsAnsiCharacterWild(Name->Buffer[i])) {
/* Now return if it has a Wilcard */
return TRUE;
}
}
/* We didn't return above...so none found */
return FALSE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlDoesNameContainWildCards@4
/*
* NAME EXPORTED
* FsRtlDoesNameContainWildCards@4
*
* DESCRIPTION
*
@@ -180,12 +426,13 @@ FsRtlDissectName (IN UNICODE_STRING Name,
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v12.
* From Bo Branten's ntifs.h v12.
*
* @implemented
*/
BOOLEAN STDCALL
FsRtlDoesNameContainWildCards (IN PUNICODE_STRING Name)
BOOLEAN
STDCALL
FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
{
PWCHAR Ptr;
@@ -205,10 +452,73 @@ FsRtlDoesNameContainWildCards (IN PUNICODE_STRING Name)
return FALSE;
}
/*
* NAME EXPORTED
* FsRtlIsDbcsInExpression@8
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
IN PANSI_STRING Name)
{
return FALSE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlIsNameInExpression@16
/*
* NAME EXPORTED
* FsRtlIsFatDbcsLegal@20
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName,
IN BOOLEAN WildCardsPermissible,
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
return FALSE;
}
/*
* NAME EXPORTED
* FsRtlIsHpfsDbcsLegal@20
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
IN BOOLEAN WildCardsPermissible,
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
return FALSE;
}
/*
* NAME EXPORTED
* FsRtlIsNameInExpression@16
*
* DESCRIPTION
*
@@ -217,17 +527,18 @@ FsRtlDoesNameContainWildCards (IN PUNICODE_STRING Name)
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v12. This function should be rewritten
* From Bo Branten's ntifs.h v12. This function should be rewritten
* to avoid recursion and better wildcard handling should be
* implemented (see FsRtlDoesNameContainWildCards).
*
* @implemented
*/
BOOLEAN STDCALL
FsRtlIsNameInExpression (IN PUNICODE_STRING Expression,
IN PUNICODE_STRING Name,
IN BOOLEAN IgnoreCase,
IN PWCHAR UpcaseTable OPTIONAL)
BOOLEAN
STDCALL
FsRtlIsNameInExpression(IN PUNICODE_STRING Expression,
IN PUNICODE_STRING Name,
IN BOOLEAN IgnoreCase,
IN PWCHAR UpcaseTable OPTIONAL)
{
USHORT ExpressionPosition, NamePosition;
UNICODE_STRING TempExpression, TempName;
+211 -349
View File
@@ -1,350 +1,242 @@
/* $Id$
*
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/fs/util.c
* PURPOSE: No purpose listed.
* PURPOSE: Misc Utility Functions for File System Drivers
*
* PROGRAMMERS: No programmer listed.
* PROGRAMMERS: Alex Ionescu ([email protected])
*/
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
/**********************************************************************
* NAME EXPORTED
* FsRtlIsTotalDeviceFailure@4
#define FSRTL_MAX_RESOURCES 16
#define FTTYPE ((ULONG)'f')
#define FT_BALANCED_READ_MODE \
CTL_CODE(FTTYPE, 6, METHOD_NEITHER, FILE_ANY_ACCESS)
/* GLOBALS *******************************************************************/
BOOLEAN STDCALL MmIsFileAPagingFile(PFILE_OBJECT FileObject);
static ULONG FsRtlpAllocatedResources = 0;
static PERESOURCE FsRtlpResources;
/* PRIVATE FUNCTIONS**********************************************************/
VOID
STDCALL
INIT_FUNCTION
RtlpInitializeResources(VOID)
{
ULONG i;
/* Allocate the Resource Buffer */
FsRtlpResources = FsRtlAllocatePool(NonPagedPool,
FSRTL_MAX_RESOURCES*sizeof(ERESOURCE));
/* Initialize the Resources */
for (i = 0; i < FSRTL_MAX_RESOURCES; i++)
{
ExInitializeResource(&FsRtlpResources[i]);
}
}
/* FUNCTIONS *****************************************************************/
/*++
* @name FsRtlIsTotalDeviceFailure
* @implemented NT 4.0
*
* DESCRIPTION
* Check if an NTSTATUS error code represents a
* disk hardware failure.
*
* ARGUMENTS
* NtStatus
* NTSTATUS to test.
* The FsRtlIsTotalDeviceFailure routine checks if an NTSTATUS error code
* represents a disk hardware failure.
*
* RETURN VALUE
* FALSE if either (NtStatus >= STATUS_SUCCESS),
* STATUS_CRC_ERROR, STATUS_DEVICE_DATA_ERROR;
* TRUE otherwise.
* @param NtStatus
* The NTSTATUS Code to Test
*
* @implemented
*/
* @return TRUE in case of Hardware Failure, FALSE otherwise.
*
* @remarks None.
*
*--*/
BOOLEAN
STDCALL
FsRtlIsTotalDeviceFailure (
IN NTSTATUS NtStatus
)
FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus)
{
return (
(NT_SUCCESS(NtStatus))
|| (STATUS_CRC_ERROR == NtStatus)
|| (STATUS_DEVICE_DATA_ERROR == NtStatus)
? FALSE
: TRUE
);
return((NT_SUCCESS(NtStatus)) ||
(STATUS_CRC_ERROR == NtStatus) ||
(STATUS_DEVICE_DATA_ERROR == NtStatus) ? FALSE : TRUE);
}
/**********************************************************************
* NAME EXPORTED
* FsRtlIsNtstatusExpected/1
* stack32 = 4
/*++
* @name FsRtlIsNtstatusExpected
* @implemented NT 4.0
*
* DESCRIPTION
* Check an NTSTATUS value is expected by the FS kernel
* subsystem.
* The FsRtlIsNtstatusExpected routine checks if an NTSTATUS error code
* is expected by the File System Support Library.
*
* ARGUMENTS
* NtStatus
* NTSTATUS to test.
* @param NtStatus
* The NTSTATUS Code to Test
*
* RETURN VALUE
* TRUE if NtStatus is NOT one out of:
* - STATUS_ACCESS_VIOLATION
* - STATUS_ILLEGAL_INSTRUCTION
* - STATUS_DATATYPE_MISALIGNMENT
* - STATUS_INSTRUCTION_MISALIGNMENT
* which are the forbidden return stati in the FsRtl
* subsystem; FALSE otherwise.
* @return TRUE if the Value is Expected, FALSE otherwise.
*
* REVISIONS
* 2002-01-17 Fixed a bad bug reported by Bo Brantén.
* Up to version 1.8, this function's semantics was
* exactly the opposite! Thank you Bo.
* @remarks None.
*
* @implemented
*/
*--*/
BOOLEAN
STDCALL
FsRtlIsNtstatusExpected (
IN NTSTATUS NtStatus
)
FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)
{
return (
(STATUS_DATATYPE_MISALIGNMENT == NtStatus)
|| (STATUS_ACCESS_VIOLATION == NtStatus)
|| (STATUS_ILLEGAL_INSTRUCTION == NtStatus)
|| (STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)
)
? FALSE
: TRUE;
}
/*
* @unimplemented
*/
ULONG
FsRtlIsPagingFile (
IN PFILE_OBJECT FileObject
)
{
UNIMPLEMENTED;
return 0;
return((STATUS_DATATYPE_MISALIGNMENT == NtStatus) ||
(STATUS_ACCESS_VIOLATION == NtStatus) ||
(STATUS_ILLEGAL_INSTRUCTION == NtStatus) ||
(STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)) ? FALSE : TRUE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlNormalizeNtstatus@8
/*++
* @name FsRtlIsPagingFile
* @implemented NT 4.0
*
* DESCRIPTION
* Normalize an NTSTATUS value for using in the FS subsystem.
* The FsRtlIsPagingFile routine checks if the FileObject is a Paging File.
*
* ARGUMENTS
* NtStatusToNormalize
* NTSTATUS to normalize.
* NormalizedNtStatus
* NTSTATUS to return if the NtStatusToNormalize
* value is unexpected by the FS kernel subsystem.
* @param FileObject
* A pointer to the File Object to be tested.
*
* RETURN VALUE
* NtStatusToNormalize if it is an expected value,
* otherwise NormalizedNtStatus.
* @return TRUE if the File is a Paging File, FALSE otherwise.
*
* @implemented
*/
NTSTATUS
STDCALL
FsRtlNormalizeNtstatus (
IN NTSTATUS NtStatusToNormalize,
IN NTSTATUS NormalizedNtStatus
)
{
return
(TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize))
? NtStatusToNormalize
: NormalizedNtStatus;
}
/**********************************************************************
* Miscellanea (they may fit somewhere else)
*********************************************************************/
/**********************************************************************
* NAME EXPORTED
* FsRtlAllocateResource@0
* @remarks None.
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
*
* @unimplemented
*/
DWORD
STDCALL
FsRtlAllocateResource (VOID)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlBalanceReads@4
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
*
* @unimplemented
*/
NTSTATUS
STDCALL
FsRtlBalanceReads (PDEVICE_OBJECT TargetDevice)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlCopyRead@32
*
* DESCRIPTION
*
* ARGUMENTS
*
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v12.
*
* @unimplemented
*/
*--*/
BOOLEAN
STDCALL
FsRtlCopyRead (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
)
FsRtlIsPagingFile(IN PFILE_OBJECT FileObject)
{
UNIMPLEMENTED;
return FALSE;
return MmIsFileAPagingFile(FileObject);
}
/**********************************************************************
* NAME EXPORTED
* FsRtlCopyWrite@32
/*++
* @name FsRtlNormalizeNtstatus
* @implemented NT 4.0
*
* DESCRIPTION
* The FsRtlNormalizeNtstatus routine normalizes an NTSTATUS error code.
*
* ARGUMENTS
* @param NtStatusToNormalize
* The NTSTATUS error code to Normalize.
*
* RETURN VALUE
*
* NOTE
* From Bo Branten's ntifs.h v12.
* @param NormalizedNtStatus
* The NTSTATUS error code to return if the NtStatusToNormalize is not
* a proper expected error code by the File System Library.
*
* @unimplemented
*/
BOOLEAN
STDCALL
FsRtlCopyWrite (
IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
IN PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject
)
{
UNIMPLEMENTED;
return FALSE;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlGetFileSize@8
* @return NtStatusToNormalize if it is an expected value, otherwise
* NormalizedNtStatus.
*
* DESCRIPTION
* @remarks None.
*
* ARGUMENTS
*
* RETURN VALUE
*
* @implemented
*/
*--*/
NTSTATUS
STDCALL
FsRtlGetFileSize (
IN PFILE_OBJECT FileObject,
IN OUT PLARGE_INTEGER FileSize
)
FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize,
IN NTSTATUS NormalizedNtStatus)
{
FILE_STANDARD_INFORMATION Info;
NTSTATUS Status;
ULONG Length;
Status = IoQueryFileInformation(FileObject,
FileStandardInformation,
sizeof(Info),
&Info,
&Length);
if (NT_SUCCESS(Status))
{
FileSize->QuadPart = Info.EndOfFile.QuadPart;
}
return Status;
return(TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize)) ?
NtStatusToNormalize : NormalizedNtStatus;
}
/*
* @unimplemented
*/
/*++
* @name FsRtlAllocateResource
* @implemented NT 4.0
*
* The FsRtlAllocateResource routine returns a pre-initialized ERESOURCE
* for use by a File System Driver.
*
* @return A Pointer to a pre-initialized ERESOURCE.
*
* @remarks The File System Library only provides up to 16 Resources.
*
*--*/
PERESOURCE
STDCALL
FsRtlAllocateResource(VOID)
{
/* Return a pre-allocated ERESOURCE */
return &FsRtlpResources[FsRtlpAllocatedResources++ & FSRTL_MAX_RESOURCES];
}
/*++
* @name FsRtlBalanceReads
* @implemented NT 4.0
*
* The FsRtlBalanceReads routine sends an IRP to an FTDISK Driver
* requesting the driver to balance read requests across a mirror set.
*
* @param TargetDevice
* A pointer to an FTDISK Device Object.
*
* @return The NTSTATUS error code returned by the FTDISK Driver.
*
* @remarks FTDISK is a Software RAID Implementation.
*
*--*/
NTSTATUS
STDCALL
FsRtlInsertPerStreamContext (
IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
IN PFSRTL_PER_STREAM_CONTEXT Ptr
)
FsRtlBalanceReads(PDEVICE_OBJECT TargetDevice)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
PIRP Irp;
KEVENT Event;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
/* Initialize the Local Event */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
/* Build the special IOCTL */
Irp = IoBuildDeviceIoControlRequest(FT_BALANCED_READ_MODE,
TargetDevice,
NULL,
0,
NULL,
0,
FALSE,
&Event,
&IoStatusBlock);
/* Send it */
Status = IoCallDriver(TargetDevice, Irp);
/* Wait if needed */
if (Status == STATUS_PENDING)
{
Status = KeWaitForSingleObject(&Event,
Executive,
KernelMode,
FALSE,
NULL);
/* Return Status */
Status = IoStatusBlock.Status;
}
return Status;
}
/*
* @unimplemented
*/
PFSRTL_PER_STREAM_CONTEXT
STDCALL
FsRtlRemovePerStreamContext (
IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
IN PVOID OwnerId OPTIONAL,
IN PVOID InstanceId OPTIONAL
)
{
UNIMPLEMENTED;
return NULL;
}
/*
* @unimplemented
*/
NTSTATUS
STDCALL
FsRtlInsertPerFileObjectContext (
IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr
)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlPostPagingFileStackOverflow@12
/*++
* @name FsRtlPostPagingFileStackOverflow
* @unimplemented NT 4.0
*
* DESCRIPTION
* The FsRtlPostPagingFileStackOverflow routine
*
* ARGUMENTS
* @param Context
*
* RETURN VALUE
*
* @unimplemented
*/
* @param Event
*
* @param StackOverflowRoutine
*
* @return
*
* @remarks None.
*
*--*/
VOID
STDCALL
FsRtlPostPagingFileStackOverflow(IN PVOID Context,
@@ -354,80 +246,50 @@ FsRtlPostPagingFileStackOverflow(IN PVOID Context,
UNIMPLEMENTED;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlPostStackOverflow@12
/*++
* @name FsRtlPostStackOverflow
* @unimplemented NT 4.0
*
* DESCRIPTION
* The FsRtlPostStackOverflow routine
*
* ARGUMENTS
* @param Context
*
* RETURN VALUE
*
* @unimplemented
*/
* @param Event
*
* @param StackOverflowRoutine
*
* @return
*
* @remarks None.
*
*--*/
VOID
STDCALL
FsRtlPostStackOverflow (IN PVOID Context,
IN PKEVENT Event,
IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
FsRtlPostStackOverflow(IN PVOID Context,
IN PKEVENT Event,
IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
{
UNIMPLEMENTED;
}
/*
* @unimplemented
*/
PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/
STDCALL
FsRtlRemovePerFileObjectContext (
IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
IN PVOID OwnerId OPTIONAL,
IN PVOID InstanceId OPTIONAL
)
{
UNIMPLEMENTED;
return NULL;
}
/**********************************************************************
* NAME EXPORTED
* FsRtlSyncVolumes@12
/*++
* @name FsRtlSyncVolumes
* @implemented NT 4.0
*
* DESCRIPTION
* Obsolete function.
* The FsRtlSyncVolumes routine is deprecated.
*
* ARGUMENTS
* @return Always returns STATUS_SUCCESS.
*
* RETURN VALUE
* It always returns STATUS_SUCCESS.
* @remarks Deprecated.
*
* @implemented
*/
*--*/
NTSTATUS
STDCALL
FsRtlSyncVolumes (
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2
)
FsRtlSyncVolumes(DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2)
{
return STATUS_SUCCESS;
}
/*
* @unimplemented
*/
VOID
STDCALL
FsRtlTeardownPerStreamContexts (
IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader
)
{
UNIMPLEMENTED;
return STATUS_SUCCESS;
}
/* EOF */
+17
View File
@@ -117,6 +117,23 @@ static BOOLEAN MmSwapSpaceMessage = FALSE;
/* FUNCTIONS *****************************************************************/
BOOLEAN
STDCALL
MmIsFileAPagingFile(PFILE_OBJECT FileObject)
{
ULONG i;
/* Loop through all the paging files */
for (i = 0; i < MiPagingFileCount; i++)
{
/* Check if this is one of them */
if (PagingFileList[i]->FileObject == FileObject) return TRUE;
}
/* Nothing found */
return FALSE;
}
VOID
MmShowOutOfSpaceMessagePagingFile(VOID)
{
+1 -1
View File
@@ -220,7 +220,7 @@ FsRtlIsFatDbcsLegal@20
FsRtlIsHpfsDbcsLegal@20
FsRtlIsNameInExpression@16
FsRtlIsNtstatusExpected@4
FsRtlIsPagingFile
FsRtlIsPagingFile@4
FsRtlIsTotalDeviceFailure@4
FsRtlLegalAnsiCharacterArray DATA
FsRtlLookupLargeMcbEntry@32