Nikolay Sivov : ntdll: Added RtlDosPathNameToNtPathName_U_WithStatus().

Alexandre Julliard julliard at winehq.org
Tue Oct 24 02:40:03 CDT 2017


Module: wine
Branch: master
Commit: 86370cc3452006466e4499443e3b34ba9c0e2d4d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=86370cc3452006466e4499443e3b34ba9c0e2d4d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Oct 23 09:48:21 2017 +0300

ntdll: Added RtlDosPathNameToNtPathName_U_WithStatus().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/ntdll.spec   |  1 +
 dlls/ntdll/path.c       | 43 +++++++++++++++++++++++++++----------------
 dlls/ntdll/tests/path.c | 33 ++++++++++++++++++++++++++++++++-
 include/winternl.h      |  1 +
 4 files changed, 61 insertions(+), 17 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 50f4acf..95581ec 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -560,6 +560,7 @@
 @ stdcall RtlDoesFileExists_U(wstr)
 # @ stub RtlDosApplyFileIsolationRedirection_Ustr
 @ stdcall RtlDosPathNameToNtPathName_U(wstr ptr ptr ptr)
+@ stdcall RtlDosPathNameToNtPathName_U_WithStatus(wstr ptr ptr ptr)
 @ stdcall RtlDosSearchPath_U(wstr wstr wstr long ptr ptr)
 # @ stub RtlDosSearchPath_Ustr
 @ stdcall RtlDowncaseUnicodeChar(long)
diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c
index e76ce3f..f3dc93f 100644
--- a/dlls/ntdll/path.c
+++ b/dlls/ntdll/path.c
@@ -325,9 +325,8 @@ ULONG WINAPI RtlIsDosDeviceName_U( PCWSTR dos_name )
     return 0;
 }
 
-
 /**************************************************************************
- *                 RtlDosPathNameToNtPathName_U		[NTDLL.@]
+ *                 RtlDosPathNameToNtPathName_U_WithStatus    [NTDLL.@]
  *
  * dos_path: a DOS path name (fully qualified or not)
  * ntpath:   pointer to a UNICODE_STRING to hold the converted
@@ -338,18 +337,15 @@ ULONG WINAPI RtlIsDosDeviceName_U( PCWSTR dos_name )
  * FIXME:
  *      + fill the cd structure
  */
-BOOLEAN  WINAPI RtlDosPathNameToNtPathName_U(PCWSTR dos_path,
-                                             PUNICODE_STRING ntpath,
-                                             PWSTR* file_part,
-                                             CURDIR* cd)
+NTSTATUS WINAPI RtlDosPathNameToNtPathName_U_WithStatus(const WCHAR *dos_path, UNICODE_STRING *ntpath,
+    WCHAR **file_part, CURDIR *cd)
 {
     static const WCHAR LongFileNamePfxW[] = {'\\','\\','?','\\'};
     ULONG sz, offset;
     WCHAR local[MAX_PATH];
     LPWSTR ptr;
 
-    TRACE("(%s,%p,%p,%p)\n",
-          debugstr_w(dos_path), ntpath, file_part, cd);
+    TRACE("(%s,%p,%p,%p)\n", debugstr_w(dos_path), ntpath, file_part, cd);
 
     if (cd)
     {
@@ -357,14 +353,15 @@ BOOLEAN  WINAPI RtlDosPathNameToNtPathName_U(PCWSTR dos_path,
         memset(cd, 0, sizeof(*cd));
     }
 
-    if (!dos_path || !*dos_path) return FALSE;
+    if (!dos_path || !*dos_path)
+        return STATUS_OBJECT_NAME_INVALID;
 
     if (!strncmpW(dos_path, LongFileNamePfxW, 4))
     {
         ntpath->Length = strlenW(dos_path) * sizeof(WCHAR);
         ntpath->MaximumLength = ntpath->Length + sizeof(WCHAR);
         ntpath->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, ntpath->MaximumLength);
-        if (!ntpath->Buffer) return FALSE;
+        if (!ntpath->Buffer) return STATUS_NO_MEMORY;
         memcpy( ntpath->Buffer, dos_path, ntpath->MaximumLength );
         ntpath->Buffer[1] = '?';  /* change \\?\ to \??\ */
         if (file_part)
@@ -372,22 +369,23 @@ BOOLEAN  WINAPI RtlDosPathNameToNtPathName_U(PCWSTR dos_path,
             if ((ptr = strrchrW( ntpath->Buffer, '\\' )) && ptr[1]) *file_part = ptr + 1;
             else *file_part = NULL;
         }
-        return TRUE;
+        return STATUS_SUCCESS;
     }
 
     ptr = local;
     sz = RtlGetFullPathName_U(dos_path, sizeof(local), ptr, file_part);
-    if (sz == 0) return FALSE;
+    if (sz == 0) return STATUS_OBJECT_NAME_INVALID;
+
     if (sz > sizeof(local))
     {
-        if (!(ptr = RtlAllocateHeap(GetProcessHeap(), 0, sz))) return FALSE;
+        if (!(ptr = RtlAllocateHeap(GetProcessHeap(), 0, sz))) return STATUS_NO_MEMORY;
         sz = RtlGetFullPathName_U(dos_path, sz, ptr, file_part);
     }
     sz += (1 /* NUL */ + 4 /* unc\ */ + 4 /* \??\ */) * sizeof(WCHAR);
     if (sz > MAXWORD)
     {
         if (ptr != local) RtlFreeHeap(GetProcessHeap(), 0, ptr);
-        return FALSE;
+        return STATUS_OBJECT_NAME_INVALID;
     }
 
     ntpath->MaximumLength = sz;
@@ -395,7 +393,7 @@ BOOLEAN  WINAPI RtlDosPathNameToNtPathName_U(PCWSTR dos_path,
     if (!ntpath->Buffer)
     {
         if (ptr != local) RtlFreeHeap(GetProcessHeap(), 0, ptr);
-        return FALSE;
+        return STATUS_NO_MEMORY;
     }
 
     strcpyW(ntpath->Buffer, NTDosPrefixW);
@@ -422,7 +420,20 @@ BOOLEAN  WINAPI RtlDosPathNameToNtPathName_U(PCWSTR dos_path,
     /* FIXME: cd filling */
 
     if (ptr != local) RtlFreeHeap(GetProcessHeap(), 0, ptr);
-    return TRUE;
+    return STATUS_SUCCESS;
+}
+
+/**************************************************************************
+ *                 RtlDosPathNameToNtPathName_U    [NTDLL.@]
+ *
+ * See RtlDosPathNameToNtPathName_U_WithStatus
+ */
+BOOLEAN  WINAPI RtlDosPathNameToNtPathName_U(PCWSTR dos_path,
+                                             PUNICODE_STRING ntpath,
+                                             PWSTR* file_part,
+                                             CURDIR* cd)
+{
+    return RtlDosPathNameToNtPathName_U_WithStatus(dos_path, ntpath, file_part, cd) == STATUS_SUCCESS;
 }
 
 /******************************************************************
diff --git a/dlls/ntdll/tests/path.c b/dlls/ntdll/tests/path.c
index c19189d..9369e1c 100644
--- a/dlls/ntdll/tests/path.c
+++ b/dlls/ntdll/tests/path.c
@@ -28,7 +28,7 @@ static ULONG (WINAPI *pRtlIsDosDeviceName_U)( PCWSTR dos_name );
 static NTSTATUS (WINAPI *pRtlOemStringToUnicodeString)(UNICODE_STRING *, const STRING *, BOOLEAN );
 static BOOLEAN (WINAPI *pRtlIsNameLegalDOS8Dot3)(const UNICODE_STRING*,POEM_STRING,PBOOLEAN);
 static DWORD (WINAPI *pRtlGetFullPathName_U)(const WCHAR*,ULONG,WCHAR*,WCHAR**);
-
+static NTSTATUS (WINAPI *pRtlDosPathNameToNtPathName_U_WithStatus)(const WCHAR*, UNICODE_STRING*, WCHAR**, CURDIR*);
 
 static void test_RtlDetermineDosPathNameType_U(void)
 {
@@ -343,6 +343,35 @@ static void test_RtlGetFullPathName_U(void)
     }
 }
 
+static void test_RtlDosPathNameToNtPathName_U_WithStatus(void)
+{
+    static const WCHAR emptyW[] = { 0 };
+    WCHAR path[MAX_PATH];
+    UNICODE_STRING nameW;
+    NTSTATUS status;
+
+    if (!pRtlDosPathNameToNtPathName_U_WithStatus)
+    {
+        win_skip("RtlDosPathNameToNtPathName_U_WithStatus() is not supported.\n");
+        return;
+    }
+
+    GetCurrentDirectoryW( MAX_PATH, path );
+
+    status = pRtlDosPathNameToNtPathName_U_WithStatus( path, &nameW, NULL, NULL );
+    ok(!status, "Failed convert to nt path, %#x.\n", status);
+
+    status = pRtlDosPathNameToNtPathName_U_WithStatus( NULL, &nameW, NULL, NULL );
+    ok(status == STATUS_OBJECT_NAME_INVALID || broken(status == STATUS_OBJECT_PATH_NOT_FOUND) /* W2k3 */,
+        "Unexpected status %#x.\n", status);
+
+    status = pRtlDosPathNameToNtPathName_U_WithStatus( emptyW, &nameW, NULL, NULL );
+    ok(status == STATUS_OBJECT_NAME_INVALID || broken(status == STATUS_OBJECT_PATH_NOT_FOUND) /* W2k3 */,
+        "Unexpected status %#x.\n", status);
+
+    RtlFreeUnicodeString( &nameW );
+}
+
 START_TEST(path)
 {
     HMODULE mod = GetModuleHandleA("ntdll.dll");
@@ -359,9 +388,11 @@ START_TEST(path)
     pRtlOemStringToUnicodeString = (void *)GetProcAddress(mod,"RtlOemStringToUnicodeString");
     pRtlIsNameLegalDOS8Dot3 = (void *)GetProcAddress(mod,"RtlIsNameLegalDOS8Dot3");
     pRtlGetFullPathName_U = (void *)GetProcAddress(mod,"RtlGetFullPathName_U");
+    pRtlDosPathNameToNtPathName_U_WithStatus = (void *)GetProcAddress(mod, "RtlDosPathNameToNtPathName_U_WithStatus");
 
     test_RtlDetermineDosPathNameType_U();
     test_RtlIsDosDeviceName_U();
     test_RtlIsNameLegalDOS8Dot3();
     test_RtlGetFullPathName_U();
+    test_RtlDosPathNameToNtPathName_U_WithStatus();
 }
diff --git a/include/winternl.h b/include/winternl.h
index ec8b387..571296f 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -2508,6 +2508,7 @@ NTSYSAPI DOS_PATHNAME_TYPE WINAPI RtlDetermineDosPathNameType_U(PCWSTR);
 NTSYSAPI BOOLEAN   WINAPI RtlDllShutdownInProgress(void);
 NTSYSAPI BOOLEAN   WINAPI RtlDoesFileExists_U(LPCWSTR);
 NTSYSAPI BOOLEAN   WINAPI RtlDosPathNameToNtPathName_U(PCWSTR,PUNICODE_STRING,PWSTR*,CURDIR*);
+NTSYSAPI NTSTATUS  WINAPI RtlDosPathNameToNtPathName_U_WithStatus(PCWSTR,PUNICODE_STRING,PWSTR*,CURDIR*);
 NTSYSAPI ULONG     WINAPI RtlDosSearchPath_U(LPCWSTR, LPCWSTR, LPCWSTR, ULONG, LPWSTR, LPWSTR*);
 NTSYSAPI WCHAR     WINAPI RtlDowncaseUnicodeChar(WCHAR);
 NTSYSAPI NTSTATUS  WINAPI RtlDowncaseUnicodeString(UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN);




More information about the wine-cvs mailing list