Author: hbelusca Date: Fri Jun 7 01:25:57 2013 New Revision: 59183 URL: http://svn.reactos.org/svn/reactos?rev=59183&view=rev Log: [KERNEL32-RTL] Fix return type and usage of RtlDetermineDosPathNameType_U, and use the declaration of RTL_PATH_TYPE in winternl.h instead of the wineism DOS_PATHNAME_TYPE.
[RTL:PATH] - Make usage of the IS_PATH_SEPARATOR(...) macro instead of automatically checking for L'\\' or L'/', and of OBJ_NAME_PATH_SEPARATOR when checking for L'\\' only or setting the character L'\\' (just code consistency only). <Test fixes:> - Fix a search loop and a check in RtlpWin32NTNameToNtPathName_U (a problem of setting the pointer *PartName via the variable p existed (always 1 character shift wrt. the expected result, and now *PartName is set to NULL even if p == NewBuffer). - Zero out an optional parameter (if present) in RtlDosSearchPath_Ustr. - Zero out the return buffer in RtlGetFullPathName_U (function from Wine). Those fixes ^ correct the following tests: * ntdll:RtlDosPathNameToNtPathName_U (58 errors to 4 errors remaining due to UNC path handling). * ntdll:RtlDosSearchPath_U (9 errors to 6 errors remaining due to the fact that our RtlDosSearchPath_U doesn't throw exception on bad arguments because it checks the validity of its arguments (pointers especially), whereas on Windows it seems it doesn't happen to be the case). * ntdll:RtlDosSearchPath_Ustr (4 errors to full success). * ntdll:RtlGetFullPathName_U (31 errors to 8 errors). * ntdll:RtlGetFullPathName_UstrEx (29 errors to 6 errors). Modified: trunk/reactos/dll/win32/kernel32/wine/profile.c trunk/reactos/include/ndk/rtlfuncs.h trunk/reactos/include/psdk/winternl.h trunk/reactos/lib/rtl/path.c Modified: trunk/reactos/dll/win32/kernel32/wine/profile.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/wine/profile.c?rev=59183&r1=59182&r2=59183&view=diff ============================================================================== --- trunk/reactos/dll/win32/kernel32/wine/profile.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/wine/profile.c [iso-8859-1] Fri Jun 7 01:25:57 2013 @@ -762,7 +762,7 @@ if (!filename) filename = wininiW; - if ((RtlDetermineDosPathNameType_U(filename) == RELATIVE_PATH) && + if ((RtlDetermineDosPathNameType_U(filename) == RtlPathTypeRelative) && !strchrW(filename, '\\') && !strchrW(filename, '/')) { static const WCHAR wszSeparator[] = {'\\', 0}; Modified: trunk/reactos/include/ndk/rtlfuncs.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/rtlfuncs.h?rev=59183&r1=59182&r2=59183&view=diff ============================================================================== --- trunk/reactos/include/ndk/rtlfuncs.h [iso-8859-1] (original) +++ trunk/reactos/include/ndk/rtlfuncs.h [iso-8859-1] Fri Jun 7 01:25:57 2013 @@ -2617,7 +2617,7 @@ ); NTSYSAPI -ULONG +RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U( _In_ PCWSTR Path Modified: trunk/reactos/include/psdk/winternl.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/winternl.h?rev=59183&r1=59182&r2=59183&view=diff ============================================================================== --- trunk/reactos/include/psdk/winternl.h [iso-8859-1] (original) +++ trunk/reactos/include/psdk/winternl.h [iso-8859-1] Fri Jun 7 01:25:57 2013 @@ -861,18 +861,18 @@ } TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION; -/* return type of RtlDetermineDosPathNameType_U (FIXME: not the correct names) */ -typedef enum -{ - INVALID_PATH = 0, - UNC_PATH, /* "//foo" */ - ABSOLUTE_DRIVE_PATH, /* "c:/foo" */ - RELATIVE_DRIVE_PATH, /* "c:foo" */ - ABSOLUTE_PATH, /* "/foo" */ - RELATIVE_PATH, /* "foo" */ - DEVICE_PATH, /* "//./foo" */ - UNC_DOT_PATH /* "//." */ -} DOS_PATHNAME_TYPE; +/* Return type of RtlDetermineDosPathNameType_U */ +typedef enum _RTL_PATH_TYPE +{ + RtlPathTypeUnknown, + RtlPathTypeUncAbsolute, + RtlPathTypeDriveAbsolute, + RtlPathTypeDriveRelative, + RtlPathTypeRooted, + RtlPathTypeRelative, + RtlPathTypeLocalDevice, + RtlPathTypeRootLocalDevice, +} RTL_PATH_TYPE; /*********************************************************************** * IA64 specific types and data structures @@ -2130,7 +2130,7 @@ HANDLE WINAPI RtlDestroyHeap(HANDLE); void WINAPI RtlDestroyProcessParameters(RTL_USER_PROCESS_PARAMETERS*); NTSTATUS WINAPI RtlDestroyQueryDebugBuffer(PDEBUG_BUFFER); -DOS_PATHNAME_TYPE WINAPI RtlDetermineDosPathNameType_U(PCWSTR); +RTL_PATH_TYPE WINAPI RtlDetermineDosPathNameType_U(PCWSTR); BOOLEAN WINAPI RtlDoesFileExists_U(LPCWSTR); BOOLEAN WINAPI RtlDosPathNameToNtPathName_U(PCWSTR,PUNICODE_STRING,PCWSTR*,CURDIR*); ULONG WINAPI RtlDosSearchPath_U(LPCWSTR, LPCWSTR, LPCWSTR, ULONG, LPWSTR, LPWSTR*); Modified: trunk/reactos/lib/rtl/path.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/path.c?rev=59183&r1=59182&r2=59183&view=diff ============================================================================== --- trunk/reactos/lib/rtl/path.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/path.c [iso-8859-1] Fri Jun 7 01:25:57 2013 @@ -160,7 +160,7 @@ { /* Check if the character is a path or drive separator */ c = *End; - if ((c == '\\') || (c == '/') || ((c == ':') && (End == PathCopy.Buffer + 1))) + if (IS_PATH_SEPARATOR(c) || ((c == ':') && (End == PathCopy.Buffer + 1))) { /* Get the next lower case character */ End++; @@ -422,30 +422,33 @@ if (PartName) { /* Loop from the back until we find a path separator */ - p = &NewBuffer[(DosLength - 1) / sizeof (WCHAR)]; - while (p > NewBuffer) if (*p-- == '\\') break; - - /* Was one found? */ - if (p > NewBuffer) - { - /* Move past it -- anything left? */ - p++; - if (!*p) + p = &NewBuffer[DosLength / sizeof (WCHAR)]; + while (--p > NewBuffer) + { + /* We found a path separator, move past it */ + if (*p == OBJ_NAME_PATH_SEPARATOR) { - /* The path ends with a path separator, no part name */ - *PartName = NULL; + ++p; + break; } - else - { - /* What follows the path separator is the part name */ - *PartName = p; - } + } + + /* Check whether a separator was found and if something remains */ + if ((p > NewBuffer) && *p) + { + /* What follows the path separator is the partial name */ + *PartName = p; + } + else + { + /* The path ends with a path separator, no partial name */ + *PartName = NULL; } } /* Build the final NT path string */ + NtPath->Buffer = NewBuffer; NtPath->Length = (USHORT)DosLength; - NtPath->Buffer = NewBuffer; NtPath->MaximumLength = (USHORT)DosLength + sizeof(UNICODE_NULL); return STATUS_SUCCESS; } @@ -574,7 +577,6 @@ /* Nothing else is expected */ default: ASSERT(FALSE); - } /* Now copy the prefix and the buffer */ @@ -592,7 +594,7 @@ NtName->Length = (USHORT)Length; NtName->MaximumLength = (USHORT)MaxLength; NewBuffer[LengthChars] = UNICODE_NULL; - DPRINT("new buffer: %S\n", NewBuffer); + DPRINT("New buffer: %S\n", NewBuffer); DPRINT("NT Name: %wZ\n", NtName); /* Check if a partial name was requested */ @@ -651,7 +653,7 @@ RelativeName->RelativeName.Buffer = (PWSTR)((ULONG_PTR)NewBuffer + PrefixLength + FullPath.Length - PrefixCut * sizeof(WCHAR)); RelativeName->RelativeName.Length = (USHORT)(PathLength - FullPath.Length); /* If relative name starts with \, skip it */ - if (RelativeName->RelativeName.Buffer[0] == L'\\') + if (RelativeName->RelativeName.Buffer[0] == OBJ_NAME_PATH_SEPARATOR) { RelativeName->RelativeName.Buffer++; RelativeName->RelativeName.Length -= sizeof(WCHAR); @@ -867,7 +869,7 @@ /* * @implemented */ -ULONG +RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U(IN PCWSTR Path) { @@ -1121,7 +1123,7 @@ FullPath.Length = (USHORT)FullPathLength; /* If full path isn't \ terminated, do it */ - if (FullPath.Buffer[CharLength - 1] != L'\\') + if (FullPath.Buffer[CharLength - 1] != OBJ_NAME_PATH_SEPARATOR) { if ((CharLength + 1) * sizeof(WCHAR) > SavedLength) { @@ -1129,7 +1131,7 @@ goto Leave; } - FullPath.Buffer[CharLength] = L'\\'; + FullPath.Buffer[CharLength] = OBJ_NAME_PATH_SEPARATOR; FullPath.Buffer[CharLength + 1] = UNICODE_NULL; FullPath.Length += sizeof(WCHAR); } @@ -1500,6 +1502,8 @@ if (!name || !*name) return 0; + RtlZeroMemory(buffer, size); + if (file_part) *file_part = NULL; /* check for DOS device name */ @@ -1733,9 +1737,9 @@ } /* Add a terminating slash if needed */ - if ((BufferStart != NewBuffer) && (BufferStart[-1] != '\\')) - { - *BufferStart++ = '\\'; + if ((BufferStart != NewBuffer) && (BufferStart[-1] != OBJ_NAME_PATH_SEPARATOR)) + { + *BufferStart++ = OBJ_NAME_PATH_SEPARATOR; } /* Bail out if we reached the end */ @@ -2051,6 +2055,7 @@ /* Initialize optional arguments */ if (FullNameOut) *FullNameOut = NULL; if (FilePartSize) *FilePartSize = 0; + if (LengthNeeded) *LengthNeeded = 0; if (DynamicString) { DynamicString->Length = DynamicString->MaximumLength = 0; @@ -2322,7 +2327,7 @@ &StaticCandidateString, Status); } - DPRINT("STatus: %lx BUFFER: %S\n", Status, CallerBuffer->Buffer); + DPRINT("Status: %lx BUFFER: %S\n", Status, CallerBuffer->Buffer); goto Quickie; } else