[ros-diffs] [weiden] 27673: Finally get the fake (and broken by design) DOS device check to work

weiden at svn.reactos.org weiden at svn.reactos.org
Sun Jul 15 10:33:50 CEST 2007


Author: weiden
Date: Sun Jul 15 12:33:49 2007
New Revision: 27673

URL: http://svn.reactos.org/svn/reactos?rev=27673&view=rev
Log:
Finally get the fake (and broken by design) DOS device check to work

Modified:
    trunk/reactos/dll/win32/kernel32/file/find.c

Modified: trunk/reactos/dll/win32/kernel32/file/find.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/file/find.c?rev=27673&r1=27672&r2=27673&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/file/find.c (original)
+++ trunk/reactos/dll/win32/kernel32/file/find.c Sun Jul 15 12:33:49 2007
@@ -350,7 +350,7 @@
 	UNICODE_STRING NtPathU, FileName, PathFileName;
 	NTSTATUS Status;
 	PWSTR NtPathBuffer;
-	BOOLEAN RemovedSlash = FALSE;
+	BOOLEAN RemovedLastChar = FALSE;
 	BOOL bResult;
 	CURDIR DirInfo;
 	ULONG DeviceNameInfo;
@@ -406,13 +406,20 @@
 	    }
 	}
 
-	/* Remove a trailing backslash from the path, unless it's a DOS drive directly */
-	if (NtPathU.Length > 3 * sizeof(WCHAR) &&
-	    NtPathU.Buffer[(NtPathU.Length / sizeof(WCHAR)) - 1] == L'\\' &&
+	/* Remove the last character of the path (Unless the path is a drive and
+	   ends with ":\"). If the caller however supplies a path to a device, such
+	   as "C:\NUL" then the last character gets cut off, which later results in
+	   NtOpenFile to return STATUS_OBJECT_NAME_NOT_FOUND, which in turn triggers
+	   a fake DOS device check with RtlIsDosDeviceName_U. However, if there is a
+	   real device with a name eg. "NU" in the system, FindFirstFile will succeed,
+	   rendering the fake DOS device check useless... Why would they invent such a
+	   stupid and broken behavior?! */
+	if (NtPathU.Length >= 2 * sizeof(WCHAR) &&
+	    NtPathU.Buffer[(NtPathU.Length / sizeof(WCHAR)) - 1] != L'\\' &&
 	    NtPathU.Buffer[(NtPathU.Length / sizeof(WCHAR)) - 2] != L':')
 	{
 	    NtPathU.Length -= sizeof(WCHAR);
-	    RemovedSlash = TRUE;
+	    RemovedLastChar = TRUE;
 	}
 
 	DPRINT("lpFileName: \"%ws\"\n", lpFileName);
@@ -433,10 +440,10 @@
 	                     FILE_SHARE_READ|FILE_SHARE_WRITE,
 	                     FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
 
-	if (!NT_SUCCESS(Status) && RemovedSlash)
-	{
-	    /* Try again, this time with the trailing slash... */
-	    NtPathU.Length -= sizeof(WCHAR);
+	if (Status == STATUS_NOT_A_DIRECTORY && RemovedLastChar)
+	{
+	    /* Try again, this time with the last character ... */
+	    NtPathU.Length += sizeof(WCHAR);
 
 	    Status = NtOpenFile (&hDirectory,
 	                         FILE_LIST_DIRECTORY | SYNCHRONIZE,
@@ -444,6 +451,8 @@
 	                         &IoStatusBlock,
 	                         FILE_SHARE_READ|FILE_SHARE_WRITE,
 	                         FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
+
+	    NtPathU.Length += sizeof(WCHAR);
 	}
 
 	if (!NT_SUCCESS(Status))




More information about the Ros-diffs mailing list