[PATCH 2/2] ntdll/tests: Add more tests for object names.

Zebediah Figura z.figura12 at gmail.com
Thu Jul 30 11:20:18 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
Similarly, these tests do not replicate the behaviour of any application that I
know of.

 dlls/ntdll/tests/file.c |  60 +++++++++++++++++++++++
 dlls/ntdll/tests/om.c   | 104 +++++++++++++++++++++++-----------------
 dlls/ntdll/tests/pipe.c |  23 ++++++---
 3 files changed, 137 insertions(+), 50 deletions(-)

diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 2fa12410c93..fb6c520dbb7 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -4997,6 +4997,65 @@ static void test_file_readonly_access(void)
     DeleteFileW(path);
 }
 
+static void test_mailslot_name(void)
+{
+    char buffer[1024] = {0};
+    const FILE_NAME_INFORMATION *name = (const FILE_NAME_INFORMATION *)buffer;
+    HANDLE server, client, device;
+    IO_STATUS_BLOCK io;
+    NTSTATUS ret;
+
+    server = CreateMailslotA( "\\\\.\\mailslot\\winetest", 100, 1000, NULL );
+    ok(server != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
+
+    ret = NtQueryInformationFile( server, &io, buffer, 0, FileNameInformation );
+    ok(ret == STATUS_INFO_LENGTH_MISMATCH, "got %#x\n", ret);
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    ret = NtQueryInformationFile( server, &io, buffer,
+            offsetof(FILE_NAME_INFORMATION, FileName[5]), FileNameInformation );
+    todo_wine ok(ret == STATUS_BUFFER_OVERFLOW, "got %#x\n", ret);
+    if (ret == STATUS_BUFFER_OVERFLOW)
+    {
+        ok(name->FileNameLength == 18, "got length %u\n", name->FileNameLength);
+        ok(!memcmp(name->FileName, L"\\wine", 10), "got %s\n",
+                debugstr_wn(name->FileName, name->FileNameLength * sizeof(WCHAR)));
+    }
+
+    memset(buffer, 0xcc, sizeof(buffer));
+    ret = NtQueryInformationFile( server, &io, buffer, sizeof(buffer), FileNameInformation );
+    todo_wine ok(!ret, "got %#x\n", ret);
+    if (!ret)
+    {
+        ok(name->FileNameLength == 18, "got length %u\n", name->FileNameLength);
+        ok(!memcmp(name->FileName, L"\\winetest", 18), "got %s\n",
+                debugstr_wn(name->FileName, name->FileNameLength * sizeof(WCHAR)));
+    }
+
+    client = CreateFileA( "\\\\.\\mailslot\\winetest", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
+    ok(client != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
+
+    ret = NtQueryInformationFile( client, &io, buffer, 0, FileNameInformation );
+    ok(ret == STATUS_INFO_LENGTH_MISMATCH, "got %#x\n", ret);
+
+    ret = NtQueryInformationFile( client, &io, buffer, sizeof(buffer), FileNameInformation );
+    todo_wine ok(ret == STATUS_INVALID_PARAMETER, "got %#x\n", ret);
+
+    CloseHandle( server );
+    CloseHandle( client );
+
+    device = CreateFileA("\\\\.\\mailslot", 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+    ok(device != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
+
+    ret = NtQueryInformationFile( device, &io, buffer, 0, FileNameInformation );
+    ok(ret == STATUS_INFO_LENGTH_MISMATCH, "got %#x\n", ret);
+
+    ret = NtQueryInformationFile( device, &io, buffer, sizeof(buffer), FileNameInformation );
+    todo_wine ok(ret == STATUS_INVALID_PARAMETER, "got %#x\n", ret);
+
+    CloseHandle( device );
+}
+
 START_TEST(file)
 {
     HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
@@ -5067,4 +5126,5 @@ START_TEST(file)
     test_query_attribute_information_file();
     test_ioctl();
     test_flush_buffers_file();
+    test_mailslot_name();
 }
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index 06dd1bd95b6..6630c539b92 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -1231,8 +1231,9 @@ static void _test_no_file_info(unsigned line, HANDLE handle)
                        "FileIoCompletionNotificationInformation returned %x\n", status);
 }
 
-#define test_object_type(a,b) _test_object_type(__LINE__,a,b)
-static void _test_object_type( unsigned line, HANDLE handle, const WCHAR *expected_name )
+#define test_object_type(a,b) _test_object_type(__LINE__,a,b,FALSE)
+#define test_object_type_todo(a,b) _test_object_type(__LINE__,a,b,TRUE)
+static void _test_object_type( unsigned line, HANDLE handle, const WCHAR *expected_name, BOOL todo )
 {
     char buffer[1024];
     UNICODE_STRING *str = (UNICODE_STRING *)buffer, expect;
@@ -1245,9 +1246,29 @@ static void _test_object_type( unsigned line, HANDLE handle, const WCHAR *expect
     status = pNtQueryObject( handle, ObjectTypeInformation, buffer, sizeof(buffer), &len );
     ok_(__FILE__,line)( status == STATUS_SUCCESS, "NtQueryObject failed %x\n", status );
     ok_(__FILE__,line)( len > sizeof(UNICODE_STRING), "unexpected len %u\n", len );
-    ok_(__FILE__,line)( len >= sizeof(OBJECT_TYPE_INFORMATION) + str->Length + sizeof(WCHAR), "unexpected len %u\n", len );
-    ok_(__FILE__,line)( str->Length == expect.Length && !memcmp( str->Buffer, expect.Buffer, expect.Length ),
-                        "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str->Buffer), str->Buffer );
+    ok_(__FILE__,line)( len >= sizeof(OBJECT_TYPE_INFORMATION) + str->Length, "unexpected len %u\n", len );
+    todo_wine_if (todo)
+        ok_(__FILE__,line)( str->Length == expect.Length && !memcmp( str->Buffer, expect.Buffer, expect.Length ),
+                            "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str->Buffer), str->Buffer );
+}
+
+#define test_object_name(a,b,c) _test_object_name(__LINE__,a,b,c)
+static void _test_object_name( unsigned line, HANDLE handle, const WCHAR *expected_name, BOOL todo )
+{
+    char buffer[1024];
+    UNICODE_STRING *str = (UNICODE_STRING *)buffer, expect;
+    ULONG len = 0;
+    NTSTATUS status;
+
+    RtlInitUnicodeString( &expect, expected_name );
+
+    memset( buffer, 0, sizeof(buffer) );
+    status = pNtQueryObject( handle, ObjectNameInformation, buffer, sizeof(buffer), &len );
+    ok_(__FILE__,line)( status == STATUS_SUCCESS, "NtQueryObject failed %x\n", status );
+    ok_(__FILE__,line)( len >= sizeof(OBJECT_NAME_INFORMATION) + str->Length, "unexpected len %u\n", len );
+    todo_wine_if (todo) ok_(__FILE__,line)( str->Length == expect.Length &&
+                        !wcsnicmp( str->Buffer, expect.Buffer, expect.Length / sizeof(WCHAR) ),
+                        "wrong/bad object name %s (%p)\n", wine_dbgstr_w(str->Buffer), str->Buffer );
 }
 
 static void test_query_object(void)
@@ -1393,41 +1414,35 @@ static void test_query_object(void)
 
     handle = CreateMailslotA( "\\\\.\\mailslot\\test_mailslot", 100, 1000, NULL );
     ok( handle != INVALID_HANDLE_VALUE, "CreateMailslot failed err %u\n", GetLastError() );
-    len = 0;
-    status = pNtQueryObject( handle, ObjectNameInformation, buffer, sizeof(buffer), &len );
-    ok( status == STATUS_SUCCESS , "NtQueryObject returned %x\n", status );
-    str = (UNICODE_STRING *)buffer;
-    ok( len > sizeof(UNICODE_STRING), "unexpected len %u\n", len );
-    str = (UNICODE_STRING *)buffer;
-    expected_len = sizeof(UNICODE_STRING) + str->Length + sizeof(WCHAR);
-    ok( len == expected_len, "unexpected len %u\n", len );
-    ok( len > sizeof(UNICODE_STRING) + sizeof("\\test_mailslot") * sizeof(WCHAR),
-        "name too short %s\n", wine_dbgstr_w(str->Buffer) );
-    trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len );
 
+    test_object_name( handle, L"\\Device\\Mailslot\\test_mailslot", FALSE );
     test_object_type( handle, L"File" );
     test_file_info( handle );
 
+    client = CreateFileA( "\\\\.\\mailslot\\test_mailslot", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
+    ok( client != INVALID_HANDLE_VALUE, "CreateFile failed (%d)\n", GetLastError() );
+
+    test_object_name( client, L"\\Device\\Mailslot", TRUE );
+    test_object_type( client, L"File" );
+    test_file_info( client );
+
+    pNtClose( client );
+    pNtClose( handle );
+
+    handle = CreateFileA( "\\\\.\\mailslot", 0, 0, NULL, OPEN_EXISTING, 0, 0 );
+    ok( handle != INVALID_HANDLE_VALUE, "CreateFile failed (%d)\n", GetLastError() );
+
+    test_object_name( handle, L"\\Device\\Mailslot", FALSE );
+    test_object_type_todo( handle, L"File" );
+    test_file_info( handle );
+
     pNtClose( handle );
 
     handle = CreateNamedPipeA( "\\\\.\\pipe\\test_pipe", PIPE_ACCESS_DUPLEX, PIPE_READMODE_BYTE,
                                1, 1000, 1000, 1000, NULL );
     ok( handle != INVALID_HANDLE_VALUE, "CreateNamedPipe failed err %u\n", GetLastError() );
-    len = 0;
-    status = pNtQueryObject( handle, ObjectNameInformation, buffer, sizeof(buffer), &len );
-    ok( status == STATUS_SUCCESS , "NtQueryObject returned %x\n", status );
-    str = (UNICODE_STRING *)buffer;
-    todo_wine
-    ok( len > sizeof(UNICODE_STRING), "unexpected len %u\n", len );
-    str = (UNICODE_STRING *)buffer;
-    expected_len = sizeof(UNICODE_STRING) + str->Length + sizeof(WCHAR);
-    todo_wine
-    ok( len == expected_len, "unexpected len %u\n", len );
-    todo_wine
-    ok( len > sizeof(UNICODE_STRING) + sizeof("\\test_pipe") * sizeof(WCHAR),
-        "name too short %s\n", wine_dbgstr_w(str->Buffer) );
-    trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len );
 
+    test_object_name( handle, L"\\Device\\NamedPipe\\test_pipe", TRUE );
     test_object_type( handle, L"File" );
     test_file_info( handle );
 
@@ -1441,39 +1456,40 @@ static void test_query_object(void)
     pNtClose( client );
     pNtClose( handle );
 
+    handle = CreateFileA( "\\\\.\\pipe", 0, 0, NULL, OPEN_EXISTING, 0, 0 );
+    ok( handle != INVALID_HANDLE_VALUE, "CreateFile failed (%d)\n", GetLastError() );
+
+    test_object_name( handle, L"\\Device\\NamedPipe", TRUE );
+    test_object_type_todo( handle, L"File" );
+    test_file_info( handle );
+
+    pNtClose( handle );
+
     RtlInitUnicodeString( &path, L"\\REGISTRY\\Machine\\Software\\Classes" );
     status = pNtCreateKey( &handle, KEY_READ, &attr, 0, 0, 0, 0 );
     ok( status == STATUS_SUCCESS, "NtCreateKey failed status %x\n", status );
 
-    len = 0;
-    status = pNtQueryObject( handle, ObjectNameInformation, buffer, sizeof(buffer), &len );
-    ok( status == STATUS_SUCCESS , "NtQueryObject returned %x\n", status );
-    str = (UNICODE_STRING *)buffer;
-    todo_wine
-    ok( len > sizeof(UNICODE_STRING), "unexpected len %u\n", len );
-    str = (UNICODE_STRING *)buffer;
-    expected_len = sizeof(UNICODE_STRING) + str->Length + sizeof(WCHAR);
-    ok( len == expected_len || len == expected_len - sizeof(WCHAR) /* wow64 */, "unexpected len %u\n", len );
-    todo_wine
-    ok( len > sizeof(UNICODE_STRING) + sizeof("\\Classes") * sizeof(WCHAR),
-        "name too short %s\n", wine_dbgstr_w(str->Buffer) );
-    trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len );
+    test_object_name( handle, L"\\REGISTRY\\MACHINE\\SOFTWARE\\Classes", TRUE );
+    test_object_type( handle, L"Key" );
+
     pNtClose( handle );
 
+    test_object_name( GetCurrentProcess(), L"", FALSE );
     test_object_type( GetCurrentProcess(), L"Process" );
     test_no_file_info( GetCurrentProcess() );
 
+    test_object_name( GetCurrentThread(), L"", FALSE );
     test_object_type( GetCurrentThread(), L"Thread" );
     test_no_file_info( GetCurrentThread() );
 
     ret = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &handle);
     ok(ret, "OpenProcessToken failed: %u\n", GetLastError());
 
+    test_object_name( handle, L"", FALSE );
     test_object_type( handle, L"Token" );
     test_no_file_info( handle );
 
     pNtClose(handle);
-
 }
 
 static void test_type_mismatch(void)
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index a70f19b0563..4eb957b1c2a 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -1679,16 +1679,20 @@ static void test_volume_info(void)
     CloseHandle( write );
 }
 
-#define test_file_name_fail(a,b) _test_file_name_fail(__LINE__,a,b)
-static void _test_file_name_fail(unsigned line, HANDLE pipe, NTSTATUS expected_status)
+#define test_file_name_fail(a,b,c) _test_file_name_fail(__LINE__,a,b,c)
+static void _test_file_name_fail(unsigned line, HANDLE pipe, NTSTATUS expected_status, BOOL todo)
 {
     char buffer[512];
     IO_STATUS_BLOCK iosb;
     NTSTATUS status;
 
+    status = NtQueryInformationFile( pipe, &iosb, buffer, 0, FileNameInformation );
+    ok_(__FILE__,line)( status == STATUS_INFO_LENGTH_MISMATCH,
+            "expected STATUS_INFO_LENGTH_MISMATCH, got %#x\n", status );
+
     status = NtQueryInformationFile( pipe, &iosb, buffer, sizeof(buffer), FileNameInformation );
-    ok_(__FILE__,line)( status == expected_status, "NtQueryInformationFile failed: %x, expected %x\n",
-                        status, expected_status );
+    todo_wine_if (todo)
+        ok_(__FILE__,line)( status == expected_status, "expected %#x, got %#x\n", expected_status, status );
 }
 
 #define test_file_name(a) _test_file_name(__LINE__,a)
@@ -2163,7 +2167,7 @@ static void test_pipe_local_info(HANDLE pipe, BOOL is_server, DWORD state)
 
 static void test_file_info(void)
 {
-    HANDLE server, client;
+    HANDLE server, client, device;
 
     if (!create_pipe_pair( &server, &client, FILE_FLAG_OVERLAPPED | PIPE_ACCESS_INBOUND,
                            PIPE_TYPE_MESSAGE, 4096 )) return;
@@ -2172,10 +2176,17 @@ static void test_file_info(void)
     test_file_name( server );
 
     DisconnectNamedPipe( server );
-    test_file_name_fail( client, STATUS_PIPE_DISCONNECTED );
+    test_file_name_fail( client, STATUS_PIPE_DISCONNECTED, FALSE );
 
     CloseHandle( server );
     CloseHandle( client );
+
+    device = CreateFileA("\\\\.\\pipe", 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+    ok(device != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
+
+    test_file_name_fail( device, STATUS_INVALID_PARAMETER, TRUE );
+
+    CloseHandle( device );
 }
 
 static PSECURITY_DESCRIPTOR get_security_descriptor(HANDLE handle, BOOL todo)
-- 
2.27.0




More information about the wine-devel mailing list