Alexandre Julliard : ntdll/tests: Add some file system redirection tests.

Alexandre Julliard julliard at winehq.org
Thu Apr 15 16:57:44 CDT 2021


Module: wine
Branch: master
Commit: a0b77d71513dd0bb007545d517d874654b57e54b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a0b77d71513dd0bb007545d517d874654b57e54b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Apr 15 12:58:48 2021 +0200

ntdll/tests: Add some file system redirection tests.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/directory.c | 105 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 100 insertions(+), 5 deletions(-)

diff --git a/dlls/ntdll/tests/directory.c b/dlls/ntdll/tests/directory.c
index d21a2e64f8e..6a423174664 100644
--- a/dlls/ntdll/tests/directory.c
+++ b/dlls/ntdll/tests/directory.c
@@ -841,6 +841,40 @@ done:
     pRtlFreeUnicodeString(&ntdirname);
 }
 
+static NTSTATUS get_file_id( FILE_INTERNAL_INFORMATION *info, const WCHAR *root, const WCHAR *name )
+{
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    IO_STATUS_BLOCK io;
+    NTSTATUS status;
+    HANDLE handle;
+
+    InitializeObjectAttributes( &attr, &nameW, OBJ_CASE_INSENSITIVE, 0, NULL );
+    if (root)
+    {
+        RtlInitUnicodeString( &nameW, root );
+        status = pNtOpenFile( &attr.RootDirectory, SYNCHRONIZE | FILE_LIST_DIRECTORY, &attr, &io,
+                              FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT |
+                              FILE_OPEN_FOR_BACKUP_INTENT | FILE_DIRECTORY_FILE );
+        if (status) return status;
+    }
+    if (name)
+    {
+        RtlInitUnicodeString( &nameW, name );
+        status = pNtOpenFile( &handle, FILE_GENERIC_READ, &attr, &io, FILE_SHARE_READ,
+                              FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE );
+        if (attr.RootDirectory) NtClose( attr.RootDirectory );
+    }
+    else handle = attr.RootDirectory;
+
+    if (!status)
+    {
+        status = pNtQueryInformationFile( handle, &io, info, sizeof(*info), FileInternalInformation );
+        NtClose( handle );
+    }
+    return status;
+}
+
 static void test_redirection(void)
 {
     ULONG old, cur;
@@ -908,6 +942,72 @@ static void test_redirection(void)
     ok( cur == 1, "RtlWow64EnableFsRedirectionEx got %u\n", cur );
     if (tls64) ok( *tls64 == FALSE, "wrong tls %s\n", wine_dbgstr_longlong(*tls64) );
 
+    if (tls64)
+    {
+        static const struct
+        {
+            const WCHAR *root, *name;
+            NTSTATUS expect;
+            BOOL redirected;
+            NTSTATUS alt;
+        } tests[] =
+        {
+            { NULL, L"\\??\\C:\\windows\\system32\\kernel32.dll", STATUS_SUCCESS, TRUE },
+            { NULL, L"\\??\\C:\\\\windows\\system32\\kernel32.dll", STATUS_SUCCESS, FALSE, STATUS_OBJECT_NAME_INVALID },
+            { L"\\??\\C:\\", L"windows\\system32\\kernel32.dll", STATUS_SUCCESS, FALSE },
+            { L"\\??\\C:\\windows", L"system32\\kernel32.dll", STATUS_SUCCESS, TRUE },
+            { L"\\??\\C:\\\\windows", L"system32\\kernel32.dll", STATUS_SUCCESS, TRUE, STATUS_OBJECT_NAME_INVALID },
+            { L"\\??\\C:\\windows\\system32", L"kernel32.dll", STATUS_SUCCESS, TRUE },
+            { L"\\??\\C:\\windows\\system32", NULL, STATUS_SUCCESS, TRUE },
+            { L"\\??\\C:\\windows\\system32", L"drivers\\ndis.sys", STATUS_OBJECT_NAME_NOT_FOUND, FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
+            { L"\\??\\C:\\windows\\system32", L"drivers\\etc\\hosts", STATUS_OBJECT_PATH_NOT_FOUND },
+            { L"\\??\\C:\\windows\\system32\\drivers", NULL, STATUS_SUCCESS, TRUE, STATUS_OBJECT_NAME_NOT_FOUND },
+            { L"\\??\\C:\\windows\\system32\\drivers\\etc", L"hosts", STATUS_SUCCESS, FALSE },
+            { NULL, L"\\DosDevices\\C:\\windows\\system32\\kernel32.dll", STATUS_SUCCESS, FALSE },
+            { L"\\DosDevices\\C:\\", L"windows\\system32\\kernel32.dll", STATUS_SUCCESS, FALSE },
+            { L"\\DosDevices\\C:\\windows", L"system32\\kernel32.dll", STATUS_SUCCESS, TRUE },
+            { L"\\DosDevices\\C:\\windows\\system32", L"kernel32.dll", STATUS_SUCCESS, TRUE },
+            { L"\\DosDevices\\C:\\windows\\system32", NULL, STATUS_SUCCESS, FALSE },
+            { L"\\DosDevices\\C:\\windows\\system32", L"drivers\\ndis.sys", STATUS_OBJECT_NAME_NOT_FOUND, FALSE, STATUS_OBJECT_PATH_NOT_FOUND },
+            { L"\\DosDevices\\C:\\windows\\system32", L"drivers\\etc\\hosts", STATUS_SUCCESS, FALSE },
+            { L"\\DosDevices\\C:\\windows\\system32\\drivers", NULL, STATUS_SUCCESS, FALSE },
+            { L"\\DosDevices\\C:\\windows\\system32\\drivers\\etc", NULL, STATUS_SUCCESS, FALSE },
+            { NULL, L"\\??\\C:\\windows\\sysnative\\kernel32.dll", STATUS_SUCCESS, FALSE },
+            { L"\\??\\C:\\", L"windows\\sysnative\\kernel32.dll", STATUS_OBJECT_PATH_NOT_FOUND },
+            { L"\\??\\C:\\windows", L"sysnative\\kernel32.dll", STATUS_SUCCESS, FALSE },
+            { L"\\??\\C:\\windows\\sysnative", L"kernel32.dll" , STATUS_SUCCESS, TRUE },
+            { L"\\??\\C:\\windows\\sysnative", NULL, STATUS_SUCCESS, FALSE },
+            { NULL, L"\\DosDevices\\C:\\windows\\sysnative\\kernel32.dll", STATUS_OBJECT_PATH_NOT_FOUND },
+            { L"\\DosDevices\\C:\\", L"windows\\sysnative\\kernel32.dll", STATUS_OBJECT_PATH_NOT_FOUND },
+            { L"\\DosDevices\\C:\\windows", L"sysnative\\kernel32.dll", STATUS_SUCCESS, FALSE },
+            { L"\\DosDevices\\C:\\windows\\sysnative", L"kernel32.dll" , STATUS_OBJECT_NAME_NOT_FOUND },
+            { L"\\DosDevices\\C:\\windows\\sysnative", NULL, STATUS_OBJECT_NAME_NOT_FOUND },
+        };
+        FILE_INTERNAL_INFORMATION info, info_redir;
+        unsigned int i;
+
+        for (i = 0; i < ARRAY_SIZE(tests); i++)
+        {
+            pRtlWow64EnableFsRedirection( FALSE );
+            status = get_file_id( &info, tests[i].root, tests[i].name );
+            ok( !status || status == tests[i].expect || (tests[i].alt && status == tests[i].alt),
+                "%u: got %x / %x for %s + %s without redirect\n", i, status, tests[i].expect,
+                debugstr_w( tests[i].root ), debugstr_w( tests[i].name ));
+            if (status) memset( &info, 0xcc, sizeof(info) );
+            pRtlWow64EnableFsRedirection( TRUE );
+            status = get_file_id( &info_redir, tests[i].root, tests[i].name );
+            ok( status == tests[i].expect || (tests[i].alt && status == tests[i].alt),
+                "%u: got %x / %x for %s + %s\n", i, status, tests[i].expect,
+                debugstr_w( tests[i].root ), debugstr_w( tests[i].name ));
+            if (!status)
+            {
+                BOOL redirected = memcmp( &info_redir, &info, sizeof(info) );
+                ok( !redirected == !tests[i].redirected,
+                    "%u: was %sredirected for %s + %s\n", i, redirected ? "" : "not ",
+                    debugstr_w( tests[i].root ), debugstr_w( tests[i].name ));
+            }
+        }
+    }
     pRtlWow64EnableFsRedirectionEx( old, &cur );
 }
 
@@ -915,11 +1015,6 @@ START_TEST(directory)
 {
     WCHAR sysdir[MAX_PATH];
     HMODULE hntdll = GetModuleHandleA("ntdll.dll");
-    if (!hntdll)
-    {
-        skip("not running on NT, skipping test\n");
-        return;
-    }
 
     pNtClose                = (void *)GetProcAddress(hntdll, "NtClose");
     pNtOpenFile             = (void *)GetProcAddress(hntdll, "NtOpenFile");




More information about the wine-cvs mailing list