diff --git a/reactos/include/ddk/fsfuncs.h b/reactos/include/ddk/fsfuncs.h index d43f51aabb3..51efe5cd94f 100644 --- a/reactos/include/ddk/fsfuncs.h +++ b/reactos/include/ddk/fsfuncs.h @@ -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 ); diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index b4d1cfce25e..d61bfedd29a 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -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 \ diff --git a/reactos/ntoskrnl/fs/context.c b/reactos/ntoskrnl/fs/context.c new file mode 100644 index 00000000000..eedc1ab9a75 --- /dev/null +++ b/reactos/ntoskrnl/fs/context.c @@ -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 (alex@relsoft.net) + */ + +/* INCLUDES *****************************************************************/ + +#include +#include + +/* 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 */ diff --git a/reactos/ntoskrnl/fs/dbcsname.c b/reactos/ntoskrnl/fs/dbcsname.c deleted file mode 100644 index d1af7e2b3ec..00000000000 --- a/reactos/ntoskrnl/fs/dbcsname.c +++ /dev/null @@ -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 - -/* 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 (iLength = (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 */ diff --git a/reactos/ntoskrnl/fs/mdl.c b/reactos/ntoskrnl/fs/fastio.c similarity index 78% rename from reactos/ntoskrnl/fs/mdl.c rename to reactos/ntoskrnl/fs/fastio.c index 3d010ee35a0..bbdae43617a 100644 --- a/reactos/ntoskrnl/fs/mdl.c +++ b/reactos/ntoskrnl/fs/fastio.c @@ -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 */ diff --git a/reactos/ntoskrnl/fs/name.c b/reactos/ntoskrnl/fs/name.c index e6dd25779b8..14538bfd056 100644 --- a/reactos/ntoskrnl/fs/name.c +++ b/reactos/ntoskrnl/fs/name.c @@ -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 (alex@relsoft.net) + * Eric Kohl + * Filip Navara */ + /* INCLUDES ****************************************************************/ + #include +#define NDEBUG +#include -/* 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 (iLength = (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; diff --git a/reactos/ntoskrnl/fs/util.c b/reactos/ntoskrnl/fs/util.c index d034f4bfa89..820c96040e7 100644 --- a/reactos/ntoskrnl/fs/util.c +++ b/reactos/ntoskrnl/fs/util.c @@ -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 (alex@relsoft.net) */ +/* INCLUDES *****************************************************************/ + #include -#define NDEBUG #include -/********************************************************************** - * 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 */ diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 16aa331c0b8..ff38500d129 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.c @@ -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) { diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 95e96a15483..2b5148caad2 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -220,7 +220,7 @@ FsRtlIsFatDbcsLegal@20 FsRtlIsHpfsDbcsLegal@20 FsRtlIsNameInExpression@16 FsRtlIsNtstatusExpected@4 -FsRtlIsPagingFile +FsRtlIsPagingFile@4 FsRtlIsTotalDeviceFailure@4 FsRtlLegalAnsiCharacterArray DATA FsRtlLookupLargeMcbEntry@32