Author: pschweitzer
Date: Mon Jul 21 05:22:06 2008
New Revision: 34631
URL:
http://svn.reactos.org/svn/reactos?rev=34631&view=rev
Log:
- Implemented FsRtlIsHpfsDbcsLegal and updated its comments
- Added its prototype to ntifs.h
- Fixed its kernel export
- Fixed a bug in FsRtlIsFatDbcsLegal, that leads the function to accept names with
multiples dots
- Fixed a bug in FsRtlIsFatDbcsLegal, that leads the function to accept names finished
with a space
- Fixed two other minors bugs in FsRtlIsFatDbcsLegal
- Fixed build...
Modified:
branches/pierre-fsd/include/ddk/ntifs.h
branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c
branches/pierre-fsd/ntoskrnl/ntoskrnl_arm.def
branches/pierre-fsd/ntoskrnl/ntoskrnl_i386.def
Modified: branches/pierre-fsd/include/ddk/ntifs.h
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/include/ddk/ntifs.h?…
==============================================================================
--- branches/pierre-fsd/include/ddk/ntifs.h [iso-8859-1] (original)
+++ branches/pierre-fsd/include/ddk/ntifs.h [iso-8859-1] Mon Jul 21 05:22:06 2008
@@ -2966,6 +2966,16 @@
NTKERNELAPI
BOOLEAN
NTAPI
+FsRtlIsHpfsDbcsLegal (
+ IN ANSI_STRING DbcsName,
+ IN BOOLEAN WildCardsPermissible,
+ IN BOOLEAN PathNamePermissible,
+ IN BOOLEAN LeadingBackslashPermissible)
+);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
FsRtlIsNameInExpression (
IN PUNICODE_STRING Expression,
IN PUNICODE_STRING Name,
Modified: branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/fsrtl/dbcsn…
==============================================================================
--- branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] Mon Jul 21 05:22:06 2008
@@ -61,7 +61,7 @@
for (i = 0; i < Name.Length / sizeof(CHAR); i++)
{
/* First make sure the character it's not the Lead DBCS */
- if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i]))
+ if (FsRtlIsLeadDbcsCharacter(Name.Buffer[i]))
{
i++;
}
@@ -196,7 +196,8 @@
IN BOOLEAN LeadingBackslashPermissible)
{
ANSI_STRING FirstPart, RemainingPart, Name;
- ULONG i, LastDot = 0;
+ BOOLEAN LastDot;
+ ULONG i;
/* Just quit if the string is empty */
if (!DbcsName.Length)
@@ -217,6 +218,9 @@
FsRtlDissectDbcs(DbcsName, &FirstPart, &RemainingPart);
while (FirstPart.Length > 0)
{
+ /* Reset dots count */
+ LastDot = FALSE;
+
/* Accept special filename if wildcards are allowed */
if (WildCardsPermissible && (FirstPart.Length == 1 || FirstPart.Length ==
2) && FirstPart.Buffer[0] == '.')
{
@@ -234,7 +238,7 @@
}
/* Filename must be 8.3 filename */
- if (FirstPart.Length < 3 || FirstPart.Length > 12)
+ if (FirstPart.Length / sizeof(CHAR) < 3 || FirstPart.Length / sizeof(CHAR)
> 12)
return FALSE;
if (!WildCardsPermissible &&
FsRtlDoesDbcsContainWildCards(&FirstPart))
@@ -245,23 +249,27 @@
* 0x00-0x1F, 0x22, 0x2B, 0x2C, 0x2F, 0x3A, 0x3B, 0x3D, 0x5B, 0x5D, 0x7C */
for (i = 0; i < FirstPart.Length / sizeof(CHAR); i++)
{
- if ((FirstPart.Buffer[i] < 0x1F) || (FirstPart.Buffer[i] == 0x22) ||
- (FirstPart.Buffer[i] == 0x2B) || (FirstPart.Buffer[i] == 0x2C) ||
- (FirstPart.Buffer[i] == 0x2F) || (FirstPart.Buffer[i] == 0x3A) ||
- (FirstPart.Buffer[i] == 0x3B) || (FirstPart.Buffer[i] == 0x3D) ||
- (FirstPart.Buffer[i] == 0x5B) || (FirstPart.Buffer[i] == 0x5D) ||
- (FirstPart.Buffer[i] == 0x7C))
+ /* First make sure the character it's not the Lead DBCS */
+ if (FsRtlIsLeadDbcsCharacter(FirstPart.Buffer[i]))
+ {
+ i++;
+ }
+ else if ((FirstPart.Buffer[i] < 0x1F) || (FirstPart.Buffer[i] == 0x22) ||
+ (FirstPart.Buffer[i] == 0x2B) || (FirstPart.Buffer[i] == 0x2C) ||
+ (FirstPart.Buffer[i] == 0x2F) || (FirstPart.Buffer[i] == 0x3A) ||
+ (FirstPart.Buffer[i] == 0x3B) || (FirstPart.Buffer[i] == 0x3D) ||
+ (FirstPart.Buffer[i] == 0x5B) || (FirstPart.Buffer[i] == 0x5D) ||
+ (FirstPart.Buffer[i] == 0x7C))
{
return FALSE;
}
- /* First make sure the character it's not the Lead DBCS */
- if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i]))
- {
- i++;
- }
else if (FirstPart.Buffer[i] == '.')
{
- LastDot = i;
+ /* Filename can only contain one dot */
+ if (LastDot)
+ return FALSE;
+
+ LastDot = TRUE;
/* We mustn't have spaces before dot or at the end of the filename
* and no dot at the beginning of the filename */
@@ -271,11 +279,15 @@
if (i > 0)
if (FirstPart.Buffer[i - 1] == ' ')
return FALSE;
- }
- }
-
- /* Filename must be 8.3 filename and not 3.8 filename */
- if (LastDot && ((FirstPart.Length / sizeof(CHAR) - 1) - LastDot > 3))
+
+ /* Filename must be 8.3 filename and not 3.8 filename */
+ if ((FirstPart.Length / sizeof(CHAR) - 1) - i > 3)
+ return FALSE;
+ }
+ }
+
+ /* Filename mustn't finish with a space */
+ if (FirstPart.Buffer[FirstPart.Length / sizeof(CHAR) - 1] == ' ')
return FALSE;
EndLoop:
@@ -296,21 +308,24 @@
/*++
* @name FsRtlIsHpfsDbcsLegal
- * @unimplemented
- *
- * FILLME
+ * @implemented
+ *
+ * Returns TRUE if the given DbcsName is a valid HPFS filename
*
* @param DbcsName
- * FILLME
+ * The filename to check. It can also contains pathname.
*
* @param WildCardsPermissible
- * FILLME
+ * If this is set to FALSE and if filename contains wildcard, the function
+ * will fail
*
* @param PathNamePermissible
- * FILLME
+ * If this is set to FALSE and if the filename comes with a pathname, the
+ * function will fail
*
* @param LeadingBackslashPermissible
- * FILLME
+ * If this is set to FALSE and if the filename starts with a backslash, the
+ * function will fail
*
* @return TRUE if the DbcsName is legal, FALSE otherwise
*
@@ -318,12 +333,94 @@
*
*--*/
BOOLEAN
-STDCALL
+NTAPI
FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
IN BOOLEAN WildCardsPermissible,
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
- KEBUGCHECK(0);
- return FALSE;
+ ANSI_STRING FirstPart, RemainingPart, Name;
+ ULONG i;
+
+ /* Just quit if the string is empty */
+ if (!DbcsName.Length)
+ return FALSE;
+
+ /* DbcsName wasn't supposed to be started with \ */
+ if (!LeadingBackslashPermissible && DbcsName.Buffer[0] == '\\')
+ return FALSE;
+ /* DbcsName was allowed to be started with \, but now, remove it */
+ else if (LeadingBackslashPermissible && DbcsName.Buffer[0] == '\\')
+ {
+ DbcsName.Buffer = DbcsName.Buffer + 1;
+ DbcsName.Length = DbcsName.Length - 1;
+ DbcsName.MaximumLength = DbcsName.MaximumLength - 1;
+ }
+
+ /* Extract first part of the DbcsName to work on */
+ FsRtlDissectDbcs(DbcsName, &FirstPart, &RemainingPart);
+ while (FirstPart.Length > 0)
+ {
+ /* Accept special filename if wildcards are allowed */
+ if (WildCardsPermissible && (FirstPart.Length == 1 || FirstPart.Length ==
2) && FirstPart.Buffer[0] == '.')
+ {
+ if (FirstPart.Length == 2)
+ {
+ if (FirstPart.Buffer[1] == '.')
+ {
+ goto EndLoop;
+ }
+ }
+ else
+ {
+ goto EndLoop;
+ }
+ }
+
+ /* Filename must be 255 bytes maximum */
+ if (FirstPart.Length > 255)
+ return FALSE;
+
+ if (!WildCardsPermissible &&
FsRtlDoesDbcsContainWildCards(&FirstPart))
+ return FALSE;
+
+ /* Now, we will parse the filename to find everything bad in
+ * It mustn't contain:
+ * 0x00-0x1F, 0x22, 0x2A, 0x2F, 0x3A, 0x3C, 0x3E, 0x3F, 0x7C */
+ for (i = 0; i < FirstPart.Length / sizeof(CHAR); i++)
+ {
+ /* First make sure the character it's not the Lead DBCS */
+ if (FsRtlIsLeadDbcsCharacter(FirstPart.Buffer[i]))
+ {
+ i++;
+ }
+ else if ((FirstPart.Buffer[i] < 0x1F) || (FirstPart.Buffer[i] == 0x22) ||
+ (FirstPart.Buffer[i] == 0x2A) || (FirstPart.Buffer[i] == 0x2F) ||
+ (FirstPart.Buffer[i] == 0x3A) || (FirstPart.Buffer[i] == 0x3C) ||
+ (FirstPart.Buffer[i] == 0x3E) || (FirstPart.Buffer[i] == 0x3F) ||
+ (FirstPart.Buffer[i] == 0x7C))
+ {
+ return FALSE;
+ }
+ }
+
+ /* Filename mustn't finish with a space or a dot */
+ if ((FirstPart.Buffer[FirstPart.Length / sizeof(CHAR) - 1] == ' ') ||
+ (FirstPart.Buffer[FirstPart.Length / sizeof(CHAR) - 1] == '.'))
+ return FALSE;
+
+ EndLoop:
+ /* Preparing next loop */
+ Name.Buffer = RemainingPart.Buffer;
+ Name.Length = RemainingPart.Length;
+ Name.MaximumLength = RemainingPart.MaximumLength;
+
+ /* Call once again our dissect function */
+ FsRtlDissectDbcs(Name, &FirstPart, &RemainingPart);
+
+ /* We found a pathname, it wasn't allowed */
+ if (FirstPart.Length > 0 && !PathNamePermissible)
+ return FALSE;
+ }
+ return TRUE;
}
Modified: branches/pierre-fsd/ntoskrnl/ntoskrnl_arm.def
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/ntoskrnl_ar…
==============================================================================
--- branches/pierre-fsd/ntoskrnl/ntoskrnl_arm.def [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/ntoskrnl_arm.def [iso-8859-1] Mon Jul 21 05:22:06 2008
@@ -217,7 +217,7 @@
FsRtlInsertPerStreamContext
FsRtlIsDbcsInExpression
FsRtlIsFatDbcsLegal@20
-FsRtlIsHpfsDbcsLegal
+FsRtlIsHpfsDbcsLegal@20
FsRtlIsNameInExpression
FsRtlIsNtstatusExpected
FsRtlIsPagingFile
Modified: branches/pierre-fsd/ntoskrnl/ntoskrnl_i386.def
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/ntoskrnl_i3…
==============================================================================
--- branches/pierre-fsd/ntoskrnl/ntoskrnl_i386.def [iso-8859-1] (original)
+++ branches/pierre-fsd/ntoskrnl/ntoskrnl_i386.def [iso-8859-1] Mon Jul 21 05:22:06 2008
@@ -234,7 +234,7 @@
FsRtlInsertPerStreamContext
FsRtlIsDbcsInExpression
FsRtlIsFatDbcsLegal@20
-FsRtlIsHpfsDbcsLegal
+FsRtlIsHpfsDbcsLegal@20
FsRtlIsNameInExpression@16
FsRtlIsNtstatusExpected@4
FsRtlIsPagingFile