[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