[PATCH v2 1/2] ntdll: Add tests for \Device\NamedPipe\ root directory.
Jinoh Kang
jinoh.kang.kr at gmail.com
Thu Nov 25 07:59:32 CST 2021
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
dlls/ntdll/tests/om.c | 109 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 109 insertions(+)
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index 77eb58a23b5..681f3784974 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -22,6 +22,7 @@
#include "ntdll_test.h"
#include "winternl.h"
#include "winuser.h"
+#include "winioctl.h"
#include "ddk/wdm.h"
#include "stdio.h"
#include "winnt.h"
@@ -197,6 +198,104 @@ static void test_namespace_pipe(void)
pNtClose(pipe);
}
+static NTSTATUS fsctl(HANDLE handle, ULONG code, void *inbuf, ULONG insize, void *outbuf, ULONG outsize)
+{
+ HANDLE event;
+ NTSTATUS status;
+ OBJECT_ATTRIBUTES attr;
+ IO_STATUS_BLOCK iosb;
+
+ InitializeObjectAttributes(&attr, NULL, 0, 0, NULL);
+ status = pNtCreateEvent(&event, GENERIC_ALL, &attr, NotificationEvent, FALSE);
+ ok(status == STATUS_SUCCESS, "NtCreateEvent failure: %08x\n", status);
+
+ memset(&iosb, 0, sizeof(iosb));
+ iosb.Status = STATUS_PENDING;
+ status = NtFsControlFile(handle, event, NULL, NULL, &iosb, FSCTL_PIPE_WAIT,
+ inbuf, insize, outbuf, outsize);
+ if (status == STATUS_PENDING)
+ {
+ while ((status = iosb.Status) == STATUS_PENDING)
+ {
+ WaitForSingleObject(event, INFINITE);
+ }
+ }
+ else if (status == STATUS_SUCCESS)
+ {
+ status = iosb.Status;
+ }
+
+ pNtClose(event);
+ return status;
+}
+
+static void test_pipe_device_file_as_root(void)
+{
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING str;
+ IO_STATUS_BLOCK iosb;
+ NTSTATUS status;
+ LARGE_INTEGER timeout;
+ HANDLE pipe, root, h;
+ union {
+ FILE_PIPE_WAIT_FOR_BUFFER d;
+ unsigned char buf[offsetof(FILE_PIPE_WAIT_FOR_BUFFER, Name[32])];
+ } pipe_wait;
+
+ timeout.QuadPart = -10000;
+
+ pRtlInitUnicodeString(&str, L"\\Device\\NamedPipe");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtOpenFile(&root, GENERIC_READ, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE, 0);
+ ok(status == STATUS_SUCCESS, "NtOpenFile should have succeeded, but got %08x\n", status);
+
+ memset( &pipe_wait.d, 0, sizeof(pipe_wait.d) );
+ pipe_wait.d.Timeout.QuadPart = 0;
+ pipe_wait.d.TimeoutSpecified = TRUE;
+ wcscpy( pipe_wait.d.Name, L"nonexistent" );
+ pipe_wait.d.NameLength = wcslen(pipe_wait.d.Name);
+
+ status = fsctl(root, FSCTL_PIPE_WAIT, &pipe_wait, sizeof(pipe_wait), NULL, 0);
+ todo_wine ok(status == STATUS_ILLEGAL_FUNCTION, "unexpected status for FSCTL_PIPE_WAIT on \\Device\\NamedPipe: %08x\n", status);
+
+ pRtlInitUnicodeString(&str, L"test3\\pipe");
+ InitializeObjectAttributes(&attr, &str, 0, root, NULL);
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX, 0, 0, 0, 1, 256, 256, &timeout);
+ ok(status == STATUS_OBJECT_NAME_INVALID, "unexpected status from NtCreateNamedPipeFile: %08x\n", status);
+
+ if (SUCCEEDED(status)) pNtClose(pipe);
+ pNtClose(root);
+
+ pRtlInitUnicodeString(&str, L"\\Device\\NamedPipe\\");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtOpenFile(&root, GENERIC_READ, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE, 0);
+ ok(status == STATUS_SUCCESS, "NtOpenFile should have succeeded, but got %08x\n", status);
+
+ memset( &pipe_wait.d, 0, sizeof(pipe_wait.d) );
+ pipe_wait.d.Timeout.QuadPart = 0;
+ pipe_wait.d.TimeoutSpecified = TRUE;
+ wcscpy( pipe_wait.d.Name, L"nonexistent_pipe" );
+ pipe_wait.d.NameLength = wcslen(pipe_wait.d.Name);
+
+ status = fsctl(root, FSCTL_PIPE_WAIT, &pipe_wait, sizeof(pipe_wait), NULL, 0);
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "unexpected status for FSCTL_PIPE_WAIT on \\Device\\NamedPipe\\: %08x\n", status);
+
+ pRtlInitUnicodeString(&str, L"test3\\pipe");
+ InitializeObjectAttributes(&attr, &str, 0, root, NULL);
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE, &attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX, 0, 0, 0, 1, 256, 256, &timeout);
+ todo_wine ok(status == STATUS_SUCCESS, "unexpected failure from NtCreateNamedPipeFile: %08x\n", status);
+
+ h = CreateFileA("\\\\.\\pipe\\test3\\pipe", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, 0 );
+ todo_wine ok(h != INVALID_HANDLE_VALUE, "Failed to open NamedPipe (%u)\n", GetLastError());
+
+ pNtClose(h);
+ pNtClose(pipe);
+ pNtClose(root);
+}
+
#define check_create_open_dir(parent, name, status) check_create_open_dir_(__LINE__, parent, name, status)
static void check_create_open_dir_( int line, HANDLE parent, const WCHAR *name, NTSTATUS expect )
{
@@ -1870,6 +1969,15 @@ static void test_query_object(void)
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( handle, L"File" );
+ test_file_info( handle );
+
+ pNtClose( handle );
+
RtlInitUnicodeString( &path, L"\\REGISTRY\\Machine" );
status = pNtCreateKey( &handle, KEY_READ, &attr, 0, 0, 0, 0 );
ok( status == STATUS_SUCCESS, "NtCreateKey failed status %x\n", status );
@@ -2434,6 +2542,7 @@ START_TEST(om)
test_case_sensitive();
test_namespace_pipe();
+ test_pipe_device_file_as_root();
test_name_collisions();
test_name_limits();
test_directory();
--
2.31.1
More information about the wine-devel
mailing list