[PATCH 3/4] ntdll/tests: Add more tests for RtlDosPathNameToNtPathName_U().

Zebediah Figura z.figura12 at gmail.com
Thu Aug 23 22:50:06 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ntdll/tests/path.c | 147 +++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 127 insertions(+), 20 deletions(-)

diff --git a/dlls/ntdll/tests/path.c b/dlls/ntdll/tests/path.c
index b2a6955..a032092 100644
--- a/dlls/ntdll/tests/path.c
+++ b/dlls/ntdll/tests/path.c
@@ -19,6 +19,7 @@
  */
 
 #include "ntdll_test.h"
+#include "winnls.h"
 
 static NTSTATUS (WINAPI *pRtlMultiByteToUnicodeN)( LPWSTR dst, DWORD dstlen, LPDWORD reslen,
                                                    LPCSTR src, DWORD srclen );
@@ -28,6 +29,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 BOOLEAN (WINAPI *pRtlDosPathNameToNtPathName_U)(const WCHAR*, UNICODE_STRING*, WCHAR**, CURDIR*);
 static NTSTATUS (WINAPI *pRtlDosPathNameToNtPathName_U_WithStatus)(const WCHAR*, UNICODE_STRING*, WCHAR**, CURDIR*);
 
 static void test_RtlDetermineDosPathNameType_U(void)
@@ -392,33 +394,137 @@ static void test_RtlGetFullPathName_U(void)
     SetCurrentDirectoryA(curdir);
 }
 
-static void test_RtlDosPathNameToNtPathName_U_WithStatus(void)
+static void test_RtlDosPathNameToNtPathName_U(void)
 {
-    static const WCHAR emptyW[] = { 0 };
+    char curdir[MAX_PATH];
     WCHAR path[MAX_PATH];
     UNICODE_STRING nameW;
+    WCHAR *file_part;
     NTSTATUS status;
+    BOOL ret, expect;
+    int i;
 
-    if (!pRtlDosPathNameToNtPathName_U_WithStatus)
+    static const struct
     {
-        win_skip("RtlDosPathNameToNtPathName_U_WithStatus() is not supported.\n");
-        return;
+        const char *dos;
+        const char *nt;
+        int file_offset;    /* offset to file part */
+        NTSTATUS status;
+        NTSTATUS alt_status;
+        int broken;
+    }
+    tests[] =
+    {
+        { "c:\\",           "\\??\\c:\\",                  -1, STATUS_SUCCESS },
+        { "c:/",            "\\??\\c:\\",                  -1, STATUS_SUCCESS },
+        { "c:/foo",         "\\??\\c:\\foo",                7, STATUS_SUCCESS },
+        { "c:/foo.",        "\\??\\c:\\foo",                7, STATUS_SUCCESS },
+        { "c:/foo/",        "\\??\\c:\\foo\\",             -1, STATUS_SUCCESS },
+        { "c:/foo//",       "\\??\\c:\\foo\\",             -1, STATUS_SUCCESS },
+        { "C:/foo",         "\\??\\C:\\foo",                7, STATUS_SUCCESS },
+        { "C:/foo/bar",     "\\??\\C:\\foo\\bar",          11, STATUS_SUCCESS },
+        { "C:/foo/bar",     "\\??\\C:\\foo\\bar",          11, STATUS_SUCCESS },
+        { "c:.",            "\\??\\C:\\windows",            7, STATUS_SUCCESS },
+        { "c:foo",          "\\??\\C:\\windows\\foo",      15, STATUS_SUCCESS },
+        { "c:foo/bar",      "\\??\\C:\\windows\\foo\\bar", 19, STATUS_SUCCESS },
+        { "c:./foo",        "\\??\\C:\\windows\\foo",      15, STATUS_SUCCESS },
+        { "c:/./foo",       "\\??\\c:\\foo",                7, STATUS_SUCCESS },
+        { "c:/foo/.",       "\\??\\c:\\foo",                7, STATUS_SUCCESS },
+        { "c:/foo/./bar",   "\\??\\c:\\foo\\bar",          11, STATUS_SUCCESS },
+        { "c:/foo/../bar",  "\\??\\c:\\bar",                7, STATUS_SUCCESS },
+        { "\\foo",          "\\??\\C:\\foo",                7, STATUS_SUCCESS },
+        { "foo",            "\\??\\C:\\windows\\foo",      15, STATUS_SUCCESS },
+        { ".",              "\\??\\C:\\windows",            7, STATUS_SUCCESS },
+        { "./",             "\\??\\C:\\windows\\",         -1, STATUS_SUCCESS },
+        { "..",             "\\??\\C:\\",                  -1, STATUS_SUCCESS },
+        { "...",            "\\??\\C:\\windows\\",         -1, STATUS_SUCCESS },
+        { "./foo",          "\\??\\C:\\windows\\foo",      15, STATUS_SUCCESS },
+        { "foo/..",         "\\??\\C:\\windows",            7, STATUS_SUCCESS },
+        { "AUX" ,           "\\??\\AUX",                   -1, STATUS_SUCCESS },
+        { "COM1" ,          "\\??\\COM1",                  -1, STATUS_SUCCESS },
+        { "?<>*\"|:",       "\\??\\C:\\windows\\?<>*\"|:", 15, STATUS_SUCCESS },
+
+        { "",   NULL, -1, STATUS_OBJECT_NAME_INVALID, STATUS_OBJECT_PATH_NOT_FOUND },
+        { NULL, NULL, -1, STATUS_OBJECT_NAME_INVALID, STATUS_OBJECT_PATH_NOT_FOUND },
+        { " ",  NULL, -1, STATUS_OBJECT_NAME_INVALID, STATUS_OBJECT_PATH_NOT_FOUND },
+
+        { "\\\\foo",        "\\??\\UNC\\foo",              -1, STATUS_SUCCESS },
+        { "//foo",          "\\??\\UNC\\foo",              -1, STATUS_SUCCESS },
+        { "\\/foo",         "\\??\\UNC\\foo",              -1, STATUS_SUCCESS },
+        { "//",             "\\??\\UNC\\",                 -1, STATUS_SUCCESS },
+        { "//foo/",         "\\??\\UNC\\foo\\",            -1, STATUS_SUCCESS },
+
+        { "//.",            "\\??\\",                      -1, STATUS_SUCCESS },
+        { "//./",           "\\??\\",                      -1, STATUS_SUCCESS },
+        { "//.//",          "\\??\\",                      -1, STATUS_SUCCESS },
+        { "//./foo",        "\\??\\foo",                    4, STATUS_SUCCESS },
+        { "//./foo/",       "\\??\\foo\\",                 -1, STATUS_SUCCESS },
+        { "//./foo/bar",    "\\??\\foo\\bar",               8, STATUS_SUCCESS },
+        { "//./foo/.",      "\\??\\foo",                    4, STATUS_SUCCESS },
+        { "//./foo/..",     "\\??\\",                      -1, STATUS_SUCCESS },
+
+        { "//?",            "\\??\\",                      -1, STATUS_SUCCESS },
+        { "//?/",           "\\??\\",                      -1, STATUS_SUCCESS },
+        { "//?//",          "\\??\\",                      -1, STATUS_SUCCESS },
+        { "//?/foo",        "\\??\\foo",                    4, STATUS_SUCCESS },
+        { "//?/foo/",       "\\??\\foo\\",                 -1, STATUS_SUCCESS },
+        { "//?/foo/bar",    "\\??\\foo\\bar",               8, STATUS_SUCCESS },
+        { "//?/foo/.",      "\\??\\foo",                    4, STATUS_SUCCESS },
+        { "//?/foo/..",     "\\??\\",                      -1, STATUS_SUCCESS },
+
+        { "\\\\?",           "\\??\\",                     -1, STATUS_SUCCESS },
+        { "\\\\?\\",         "\\??\\",                     -1, STATUS_SUCCESS },
+
+        { "\\\\?\\/",        "\\??\\/",                     4, STATUS_SUCCESS },
+        { "\\\\?\\foo",      "\\??\\foo",                   4, STATUS_SUCCESS },
+        { "\\\\?\\foo/",     "\\??\\foo/",                  4, STATUS_SUCCESS },
+        { "\\\\?\\foo/bar",  "\\??\\foo/bar",               4, STATUS_SUCCESS },
+        { "\\\\?\\foo/.",    "\\??\\foo/.",                 4, STATUS_SUCCESS },
+        { "\\\\?\\foo/..",   "\\??\\foo/..",                4, STATUS_SUCCESS },
+        { "\\\\?\\\\",       "\\??\\\\",                   -1, STATUS_SUCCESS },
+        { "\\\\?\\\\\\",     "\\??\\\\\\",                 -1, STATUS_SUCCESS },
+        { "\\\\?\\foo\\",    "\\??\\foo\\",                -1, STATUS_SUCCESS },
+        { "\\\\?\\foo\\bar", "\\??\\foo\\bar",              8, STATUS_SUCCESS },
+        { "\\\\?\\foo\\.",   "\\??\\foo\\.",                8, STATUS_SUCCESS },
+        { "\\\\?\\foo\\..",  "\\??\\foo\\..",               8, STATUS_SUCCESS },
+    };
+
+    GetCurrentDirectoryA(sizeof(curdir), curdir);
+    SetCurrentDirectoryA("C:\\windows\\");
+
+    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    {
+        MultiByteToWideChar(CP_ACP, 0, tests[i].dos, -1, path, sizeof(path));
+        ret = pRtlDosPathNameToNtPathName_U(path, &nameW, &file_part, NULL);
+
+        if (pRtlDosPathNameToNtPathName_U_WithStatus)
+        {
+            status = pRtlDosPathNameToNtPathName_U_WithStatus(path, &nameW, &file_part, NULL);
+            ok(status == tests[i].status || status == tests[i].alt_status,
+                "%s: Expected status %#x, got %#x.\n", tests[i].dos, tests[i].status, status);
+        }
+
+        expect = (tests[i].status == STATUS_SUCCESS);
+        ok(ret == expect, "%s: Expected %#x, got %#x.\n", tests[i].dos, expect, ret);
+
+        if (ret != TRUE) continue;
+
+        MultiByteToWideChar(CP_ACP, 0, tests[i].nt, -1, path, sizeof(path));
+        ok(!lstrcmpW(nameW.Buffer, path), "%s: Expected %s, got %s.\n",
+            tests[i].dos, tests[i].nt, wine_dbgstr_w(nameW.Buffer));
+
+        if (tests[i].file_offset > 0)
+            ok(file_part == nameW.Buffer + tests[i].file_offset,
+                "%s: Expected file part %s, got %s.\n", tests[i].dos,
+                wine_dbgstr_w(nameW.Buffer + tests[i].file_offset), wine_dbgstr_w(file_part));
+        else
+            ok(file_part == NULL, "%s: Expected NULL file part, got %s.\n",
+                tests[i].dos, wine_dbgstr_w(file_part));
+
+        RtlFreeUnicodeString(&nameW);
     }
 
-    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 );
+    SetCurrentDirectoryA(curdir);
 }
 
 START_TEST(path)
@@ -437,11 +543,12 @@ START_TEST(path)
     pRtlOemStringToUnicodeString = (void *)GetProcAddress(mod,"RtlOemStringToUnicodeString");
     pRtlIsNameLegalDOS8Dot3 = (void *)GetProcAddress(mod,"RtlIsNameLegalDOS8Dot3");
     pRtlGetFullPathName_U = (void *)GetProcAddress(mod,"RtlGetFullPathName_U");
+    pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(mod, "RtlDosPathNameToNtPathName_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();
+    test_RtlDosPathNameToNtPathName_U();
 }
-- 
2.7.4




More information about the wine-devel mailing list