From 1dac3daaa18c584a53be5ce591e2a6be8c13736b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 8 Aug 2010 08:24:19 +0000 Subject: [PATCH] Pierre Schweitzer - Implemented CdfsIsNameLegalDOS8Dot3 and use it to check filenames. It avoids calling Rtl* functions that need NLS. (Modified merge of 35501). See issue #2404 for more details. svn path=/trunk/; revision=48486 --- reactos/drivers/filesystems/cdfs/misc.c | 38 +++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/filesystems/cdfs/misc.c b/reactos/drivers/filesystems/cdfs/misc.c index 4e7128b981a..0288c62c28c 100644 --- a/reactos/drivers/filesystems/cdfs/misc.c +++ b/reactos/drivers/filesystems/cdfs/misc.c @@ -95,6 +95,40 @@ CdfsFileFlagsToAttributes(PFCB Fcb, ((Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0); } +BOOLEAN +CdfsIsNameLegalDOS8Dot3(IN PUNICODE_STRING FileName + ) +{ + ULONG i; + STRING DbcsName; + CHAR DbcsNameBuffer[12]; + + for (i = 0; i < FileName->Length / sizeof(WCHAR) ; i++) + { + /* Don't allow spaces in FileName */ + if (FileName->Buffer[i] == L' ') + return FALSE; + } +#if 0 + /* If FileName is finishing with a dot, remove it */ + if (FileName->Buffer[FileName->Length / sizeof(WCHAR) - 1] == '.') + { + FileName->Length -= sizeof(WCHAR); + } +#endif + /* Finally, convert the string to call the FsRtl function */ + DbcsName.MaximumLength = 12; + DbcsName.Buffer = DbcsNameBuffer; + if (!NT_SUCCESS(RtlUnicodeStringToCountedOemString(&DbcsName, + FileName, + FALSE ))) + { + + return FALSE; + } + return FsRtlIsFatDbcsLegal(DbcsName, FALSE, FALSE, FALSE); +} + VOID CdfsShortNameCacheGet (PFCB DirectoryFcb, @@ -102,7 +136,6 @@ CdfsShortNameCacheGet PUNICODE_STRING LongName, PUNICODE_STRING ShortName) { - BOOLEAN HasSpaces; PLIST_ENTRY Entry; PCDFS_SHORT_NAME ShortNameEntry; GENERATE_NAME_CONTEXT Context = { 0 }; @@ -132,8 +165,7 @@ CdfsShortNameCacheGet } /* Cache miss */ - if ((RtlIsNameLegalDOS8Dot3(LongName, NULL, &HasSpaces) == FALSE) || - (HasSpaces == TRUE)) + if (!CdfsIsNameLegalDOS8Dot3(LongName)) { RtlGenerate8dot3Name(LongName, FALSE, &Context, ShortName); }