From cae1cf5c1f8d568bc89e466eb5d17f4c59dfd8f4 Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Tue, 5 Aug 2025 15:35:31 +0100 Subject: [PATCH 1/8] Added stubs for NtCreateNamedPipeFile NtReleaseWorkerFactoryWorker --- src/windows-emulator/devices/named_pipe.hpp | 21 ++++++ src/windows-emulator/io_device.cpp | 6 ++ src/windows-emulator/syscalls.cpp | 6 ++ src/windows-emulator/syscalls/file.cpp | 75 ++++++++++++++++++--- 4 files changed, 97 insertions(+), 11 deletions(-) create mode 100644 src/windows-emulator/devices/named_pipe.hpp diff --git a/src/windows-emulator/devices/named_pipe.hpp b/src/windows-emulator/devices/named_pipe.hpp new file mode 100644 index 00000000..ef295342 --- /dev/null +++ b/src/windows-emulator/devices/named_pipe.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "../io_device.hpp" + +class named_pipe : public io_device_container { +public: + std::u16string name; + ULONG pipe_type; + ULONG read_mode; + ULONG completion_mode; + ULONG max_instances; + ULONG inbound_quota; + ULONG outbound_quota; + LARGE_INTEGER default_timeout; + + void create(windows_emulator&, const io_device_creation_data&) override {} + void work(windows_emulator&) override {} + NTSTATUS io_control(windows_emulator&, const io_device_context&) override { return STATUS_NOT_SUPPORTED; } + + void serialize_object(utils::buffer_serializer&) const override {} + void deserialize_object(utils::buffer_deserializer&) override {} +}; \ No newline at end of file diff --git a/src/windows-emulator/io_device.cpp b/src/windows-emulator/io_device.cpp index ef6da159..9f34954d 100644 --- a/src/windows-emulator/io_device.cpp +++ b/src/windows-emulator/io_device.cpp @@ -4,6 +4,7 @@ #include "devices/afd_endpoint.hpp" #include "devices/mount_point_manager.hpp" #include "devices/security_support_provider.hpp" +#include "devices/named_pipe.hpp" namespace { @@ -49,6 +50,11 @@ std::unique_ptr create_device(const std::u16string_view device) return create_security_support_provider(); } + if (device == u"NamedPipe") + { + return std::make_unique(); + } + throw std::runtime_error("Unsupported device: " + u16_to_u8(device)); } diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index abba7931..c04e0d32 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -436,6 +436,11 @@ namespace syscalls return STATUS_SUCCESS; } + NTSTATUS handle_NtReleaseWorkerFactoryWorker() + { + return STATUS_SUCCESS; + } + NTSTATUS handle_NtCreateIoCompletion( const syscall_context& c, const emulator_object event_handle, const ACCESS_MASK desired_access, const emulator_object>> object_attributes, @@ -1185,6 +1190,7 @@ void syscall_dispatcher::add_handlers(std::map& ha add_handler(NtQueryEvent); add_handler(NtRemoveIoCompletionEx); add_handler(NtCreateDebugObject); + add_handler(NtReleaseWorkerFactoryWorker); #undef add_handler } diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 55773b7d..149929b6 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -9,6 +9,8 @@ #include +#include "../devices/named_pipe.hpp" + #if defined(OS_WINDOWS) #define fstat64 _fstat64 #elif defined(OS_MAC) @@ -1067,21 +1069,72 @@ namespace syscalls return STATUS_NOT_SUPPORTED; } - NTSTATUS handle_NtCreateNamedPipeFile( - const syscall_context& c, const emulator_object /*file_handle*/, const ULONG /*desired_access*/, - const emulator_object>> /*object_attributes*/, - const emulator_object>> /*io_status_block*/, const ULONG /*share_access*/, - const ULONG /*create_disposition*/, const ULONG /*create_options*/, const ULONG /*named_pipe_type*/, - const ULONG /*read_mode*/, const ULONG /*completion_mode*/, const ULONG /*maximum_instances*/, - const ULONG /*inbound_quota*/, const ULONG /*outbound_quota*/, - const emulator_object /*default_timeout*/) + NTSTATUS handle_NtCreateNamedPipeFile(const syscall_context& c, emulator_object file_handle, + ULONG desired_access, + emulator_object>> object_attributes, + emulator_object>> io_status_block, + ULONG share_access, ULONG create_disposition, ULONG create_options, + ULONG named_pipe_type, ULONG read_mode, ULONG completion_mode, + ULONG maximum_instances, ULONG inbound_quota, ULONG outbound_quota, + emulator_object default_timeout) { - c.win_emu.log.error("Unimplemented syscall NtCreateNamedPipeFile!"); - c.emu.stop(); + UNREFERENCED_PARAMETER(desired_access); + UNREFERENCED_PARAMETER(share_access); + UNREFERENCED_PARAMETER(create_disposition); + UNREFERENCED_PARAMETER(create_options); + UNREFERENCED_PARAMETER(object_attributes); - return STATUS_NOT_SUPPORTED; + std::u16string file_name; + + object_attributes.access([&](const auto& attrs) { + emulator_object>> unicode_string( + c.emu, static_cast(attrs.ObjectName)); + + unicode_string.access([&](const auto& unicode) { + if (unicode.Length > 0 && unicode.Buffer != 0) + { + const uint64_t buffer_addr = static_cast(unicode.Buffer); + std::vector buffer(unicode.Length / sizeof(char16_t)); + c.emu.read_memory(buffer_addr, buffer.data(), unicode.Length); + file_name.assign(buffer.begin(), buffer.end()); + } + }); + }); + + io_device_creation_data data{}; + + io_device_container container{u"NamedPipe", c.win_emu, data}; + if (auto* pipe_device = container.get_internal_device()) + { + pipe_device->name = file_name; + } + + // Create pipe and fill details + auto* pipe_device = container.get_internal_device(); + pipe_device->name = u"StubPipe"; + pipe_device->pipe_type = named_pipe_type; + pipe_device->read_mode = read_mode; + pipe_device->completion_mode = completion_mode; + pipe_device->max_instances = maximum_instances; + pipe_device->inbound_quota = inbound_quota; + pipe_device->outbound_quota = outbound_quota; + pipe_device->default_timeout = default_timeout.read(); // <--- FIXED + + // Store in device handle table + handle pipe_handle = c.proc.devices.store(std::move(container)); + file_handle.write(pipe_handle); + + // Return status via IOSB + IO_STATUS_BLOCK> iosb{}; + iosb.Status = STATUS_SUCCESS; + iosb.Information = 0; + io_status_block.write(iosb); // <--- FIXED + + return STATUS_SUCCESS; } + + NTSTATUS handle_NtFsControlFile(const syscall_context& c, const handle /*event_handle*/, const uint64_t /*apc_routine*/, const uint64_t /*app_context*/, const emulator_object>> /*io_status_block*/, From 5f9bfd469497ae98d9ff6fa06a1f544374911890 Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Tue, 5 Aug 2025 15:44:19 +0100 Subject: [PATCH 2/8] Added stubs for NtCreateNamedPipeFile NtReleaseWorkerFactoryWorker --- src/windows-emulator/syscalls/file.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 149929b6..86fcb7e9 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -1086,6 +1086,7 @@ namespace syscalls std::u16string file_name; + // Get file name object_attributes.access([&](const auto& attrs) { emulator_object>> unicode_string( c.emu, static_cast(attrs.ObjectName)); @@ -1101,6 +1102,7 @@ namespace syscalls }); }); + //Build IO device io_device_creation_data data{}; io_device_container container{u"NamedPipe", c.win_emu, data}; @@ -1118,7 +1120,7 @@ namespace syscalls pipe_device->max_instances = maximum_instances; pipe_device->inbound_quota = inbound_quota; pipe_device->outbound_quota = outbound_quota; - pipe_device->default_timeout = default_timeout.read(); // <--- FIXED + pipe_device->default_timeout = default_timeout.read(); // Store in device handle table handle pipe_handle = c.proc.devices.store(std::move(container)); @@ -1128,7 +1130,7 @@ namespace syscalls IO_STATUS_BLOCK> iosb{}; iosb.Status = STATUS_SUCCESS; iosb.Information = 0; - io_status_block.write(iosb); // <--- FIXED + io_status_block.write(iosb); return STATUS_SUCCESS; } From 85843ff5c91f0d94eeab765253aa1831fc833cf9 Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Tue, 5 Aug 2025 15:55:36 +0100 Subject: [PATCH 3/8] Fixed cross-platform: removed MS-specific macro --- src/windows-emulator/syscalls/file.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 86fcb7e9..ace40c1d 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -1078,11 +1078,11 @@ namespace syscalls ULONG maximum_instances, ULONG inbound_quota, ULONG outbound_quota, emulator_object default_timeout) { - UNREFERENCED_PARAMETER(desired_access); - UNREFERENCED_PARAMETER(share_access); - UNREFERENCED_PARAMETER(create_disposition); - UNREFERENCED_PARAMETER(create_options); - UNREFERENCED_PARAMETER(object_attributes); + (void)desired_access; + (void)share_access; + (void)create_disposition; + (void)create_options; + (void)object_attributes; std::u16string file_name; From 100638d8ea2061b9d2c9a2a13cbffd3264e0b028 Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Tue, 5 Aug 2025 16:26:13 +0100 Subject: [PATCH 4/8] Fixed clang-tidy issue --- src/windows-emulator/syscalls/file.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index ace40c1d..ad03773f 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -1094,7 +1094,7 @@ namespace syscalls unicode_string.access([&](const auto& unicode) { if (unicode.Length > 0 && unicode.Buffer != 0) { - const uint64_t buffer_addr = static_cast(unicode.Buffer); + auto buffer_addr = static_cast(unicode.Buffer); std::vector buffer(unicode.Length / sizeof(char16_t)); c.emu.read_memory(buffer_addr, buffer.data(), unicode.Length); file_name.assign(buffer.begin(), buffer.end()); From ffea72d48a773180fdae63afe26d158b68b347dd Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Wed, 6 Aug 2025 10:30:40 +0100 Subject: [PATCH 5/8] Added basic pipe support to NtRead/WriteFile --- src/common/platform/status.hpp | 10 ++ src/windows-emulator/devices/named_pipe.hpp | 2 + src/windows-emulator/io_device.cpp | 1 + src/windows-emulator/syscall_utils.hpp | 6 + src/windows-emulator/syscalls/file.cpp | 136 ++++++++++++++------ 5 files changed, 119 insertions(+), 36 deletions(-) diff --git a/src/common/platform/status.hpp b/src/common/platform/status.hpp index 583f258a..a9ea9625 100644 --- a/src/common/platform/status.hpp +++ b/src/common/platform/status.hpp @@ -52,6 +52,16 @@ using NTSTATUS = std::uint32_t; #define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS)0xC0000328L) #define STATUS_PORT_NOT_SET ((NTSTATUS)0xC0000353L) #define STATUS_DEBUGGER_INACTIVE ((NTSTATUS)0xC0000354L) +#define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014BL) +#define STATUS_PIPE_EMPTY ((NTSTATUS)0xC00000D9L) +#define STATUS_PIPE_BUSY ((NTSTATUS)0xC00000AAL) +#define STATUS_PIPE_DISCONNECTED ((NTSTATUS)0xC00000B0L) +#define STATUS_PIPE_LISTENING ((NTSTATUS)0x00000105L) +#define STATUS_PIPE_CONNECTED ((NTSTATUS)0x00000106L) +#define STATUS_PIPE_CLOSING ((NTSTATUS)0xC00000B1L) +#define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS)0xC00000ACL) +#define STATUS_INVALID_PIPE_STATE ((NTSTATUS)0xC00000ADL) +#define STATUS_PIPE_NOT_CONNECTED ((NTSTATUS)0xC00000BEL) #define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L) diff --git a/src/windows-emulator/devices/named_pipe.hpp b/src/windows-emulator/devices/named_pipe.hpp index ef295342..c550e539 100644 --- a/src/windows-emulator/devices/named_pipe.hpp +++ b/src/windows-emulator/devices/named_pipe.hpp @@ -4,6 +4,8 @@ class named_pipe : public io_device_container { public: std::u16string name; + std::deque write_queue; + ACCESS_MASK access = 0; ULONG pipe_type; ULONG read_mode; ULONG completion_mode; diff --git a/src/windows-emulator/io_device.cpp b/src/windows-emulator/io_device.cpp index 9f34954d..da7ad8a8 100644 --- a/src/windows-emulator/io_device.cpp +++ b/src/windows-emulator/io_device.cpp @@ -5,6 +5,7 @@ #include "devices/mount_point_manager.hpp" #include "devices/security_support_provider.hpp" #include "devices/named_pipe.hpp" +#include namespace { diff --git a/src/windows-emulator/syscall_utils.hpp b/src/windows-emulator/syscall_utils.hpp index 14395c59..58062f0d 100644 --- a/src/windows-emulator/syscall_utils.hpp +++ b/src/windows-emulator/syscall_utils.hpp @@ -3,6 +3,7 @@ #include "windows_emulator.hpp" #include #include +#include "windows-emulator/devices/named_pipe.hpp" struct syscall_context { @@ -28,6 +29,11 @@ inline bool is_syscall(const std::string_view name) return name.starts_with("Nt") && name.size() > 3 && is_uppercase(name[2]); } +inline bool is_named_pipe_path(const std::u16string_view& filename) +{ + return filename == u"\\Device\\NamedPipe\\" || filename.starts_with(u"\\Device\\NamedPipe\\"); +} + inline std::optional extract_syscall_id(const exported_symbol& symbol, std::span data) { if (!is_syscall(symbol.name)) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index ad03773f..666a2a5d 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -648,6 +648,34 @@ namespace syscalls return STATUS_SUCCESS; } + const auto* container = c.proc.devices.get(file_handle); + if (container) + { + if (auto* pipe = container->get_internal_device()) + { + if (!pipe->write_queue.empty()) + { + std::string_view data = pipe->write_queue.front(); + const size_t to_copy = std::min(data.size(), length); + + commit_file_data(data.substr(0, to_copy), c.emu, io_status_block, buffer); + + if (to_copy == data.size()) + { + pipe->write_queue.pop_front(); + } + else + { + pipe->write_queue.front().erase(0, to_copy); + } + + return STATUS_SUCCESS; + } + + return STATUS_PIPE_EMPTY; + } + } + const auto* f = c.proc.files.get(file_handle); if (!f) { @@ -685,6 +713,26 @@ namespace syscalls return STATUS_SUCCESS; } + const auto* container = c.proc.devices.get(file_handle); + if (container) + { + if (auto* pipe = container->get_internal_device()) + { + // TODO c.win_emu.callbacks.on_named_pipe_write(pipe->name, temp_buffer); + + // TODO pipe->write_queue.push_back(temp_buffer); + + if (io_status_block) + { + IO_STATUS_BLOCK> block{}; + block.Information = static_cast(temp_buffer.size()); + io_status_block.write(block); + } + + return STATUS_SUCCESS; + } + } + const auto* f = c.proc.files.get(file_handle); if (!f) { @@ -779,6 +827,33 @@ namespace syscalls return std::nullopt; } + NTSTATUS handle_named_pipe_create(const syscall_context& c, const emulator_object& out_handle, + const std::u16string_view filename, + const OBJECT_ATTRIBUTES>& attributes, + ACCESS_MASK desired_access) + { + (void)attributes; // This isn't being consumed atm, suppressing errors + + c.win_emu.callbacks.on_generic_access("Creating/opening named pipe", filename); + + io_device_creation_data data{}; + + std::u16string device_name = u"NamedPipe"; + + io_device_container container{device_name, c.win_emu, data}; + + if (auto* pipe_device = container.get_internal_device()) + { + pipe_device->name = std::u16string(filename); + pipe_device->access = desired_access; + } + + const auto handle = c.proc.devices.store(std::move(container)); + out_handle.write(handle); + + return STATUS_SUCCESS; + } + NTSTATUS handle_NtCreateFile(const syscall_context& c, const emulator_object file_handle, ACCESS_MASK desired_access, const emulator_object>> object_attributes, @@ -790,6 +865,11 @@ namespace syscalls const auto attributes = object_attributes.read(); auto filename = read_unicode_string(c.emu, attributes.ObjectName); + if (is_named_pipe_path(filename)) + { + return handle_named_pipe_create(c, file_handle, filename, attributes, desired_access); + } + auto printer = utils::finally([&] { c.win_emu.callbacks.on_generic_access("Opening file", filename); // }); @@ -1082,51 +1162,37 @@ namespace syscalls (void)share_access; (void)create_disposition; (void)create_options; - (void)object_attributes; - std::u16string file_name; + const auto attributes = object_attributes.read(); + const auto filename = read_unicode_string(c.emu, attributes.ObjectName); - // Get file name - object_attributes.access([&](const auto& attrs) { - emulator_object>> unicode_string( - c.emu, static_cast(attrs.ObjectName)); + if (!filename.starts_with(u"\\Device\\NamedPipe")) + return STATUS_NOT_SUPPORTED; + + c.win_emu.callbacks.on_generic_access("Creating named pipe", filename); - unicode_string.access([&](const auto& unicode) { - if (unicode.Length > 0 && unicode.Buffer != 0) - { - auto buffer_addr = static_cast(unicode.Buffer); - std::vector buffer(unicode.Length / sizeof(char16_t)); - c.emu.read_memory(buffer_addr, buffer.data(), unicode.Length); - file_name.assign(buffer.begin(), buffer.end()); - } - }); - }); - - //Build IO device io_device_creation_data data{}; - io_device_container container{u"NamedPipe", c.win_emu, data}; + if (auto* pipe_device = container.get_internal_device()) { - pipe_device->name = file_name; + pipe_device->name = filename; + pipe_device->pipe_type = named_pipe_type; + pipe_device->read_mode = read_mode; + pipe_device->completion_mode = completion_mode; + pipe_device->max_instances = maximum_instances; + pipe_device->inbound_quota = inbound_quota; + pipe_device->outbound_quota = outbound_quota; + pipe_device->default_timeout = default_timeout.read(); + } + else + { + return STATUS_NOT_SUPPORTED; } - // Create pipe and fill details - auto* pipe_device = container.get_internal_device(); - pipe_device->name = u"StubPipe"; - pipe_device->pipe_type = named_pipe_type; - pipe_device->read_mode = read_mode; - pipe_device->completion_mode = completion_mode; - pipe_device->max_instances = maximum_instances; - pipe_device->inbound_quota = inbound_quota; - pipe_device->outbound_quota = outbound_quota; - pipe_device->default_timeout = default_timeout.read(); - - // Store in device handle table handle pipe_handle = c.proc.devices.store(std::move(container)); file_handle.write(pipe_handle); - - // Return status via IOSB + IO_STATUS_BLOCK> iosb{}; iosb.Status = STATUS_SUCCESS; iosb.Information = 0; @@ -1135,8 +1201,6 @@ namespace syscalls return STATUS_SUCCESS; } - - NTSTATUS handle_NtFsControlFile(const syscall_context& c, const handle /*event_handle*/, const uint64_t /*apc_routine*/, const uint64_t /*app_context*/, const emulator_object>> /*io_status_block*/, From 8b2c17023626c4b99fb0c362161ce5c8fb645829 Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Wed, 6 Aug 2025 11:01:42 +0100 Subject: [PATCH 6/8] Fixed clang exception. Again. --- src/windows-emulator/syscalls/file.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 666a2a5d..56d0ed27 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -1167,8 +1167,10 @@ namespace syscalls const auto filename = read_unicode_string(c.emu, attributes.ObjectName); if (!filename.starts_with(u"\\Device\\NamedPipe")) + { return STATUS_NOT_SUPPORTED; - + } + c.win_emu.callbacks.on_generic_access("Creating named pipe", filename); io_device_creation_data data{}; From 210ab2930c32711ef9eb85c7e34f5f54008c69c4 Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Wed, 6 Aug 2025 11:12:44 +0100 Subject: [PATCH 7/8] Fixed platform portability issues --- src/windows-emulator/syscalls/file.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 56d0ed27..79928acb 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -717,7 +717,8 @@ namespace syscalls if (container) { if (auto* pipe = container->get_internal_device()) - { + { + (void)pipe; // For future use: suppressing compiler issues // TODO c.win_emu.callbacks.on_named_pipe_write(pipe->name, temp_buffer); // TODO pipe->write_queue.push_back(temp_buffer); From 0aea1f538547c624b0c8920da7c21cf9c01c930f Mon Sep 17 00:00:00 2001 From: CarlTSpeak Date: Fri, 8 Aug 2025 11:22:56 +0100 Subject: [PATCH 8/8] I just learned how clang-format works. Fail. --- src/windows-emulator/devices/named_pipe.hpp | 28 +++++++++++++++------ src/windows-emulator/syscalls/file.cpp | 4 +-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/windows-emulator/devices/named_pipe.hpp b/src/windows-emulator/devices/named_pipe.hpp index c550e539..542248aa 100644 --- a/src/windows-emulator/devices/named_pipe.hpp +++ b/src/windows-emulator/devices/named_pipe.hpp @@ -1,11 +1,12 @@ #pragma once #include "../io_device.hpp" -class named_pipe : public io_device_container { -public: +class named_pipe : public io_device_container +{ + public: std::u16string name; std::deque write_queue; - ACCESS_MASK access = 0; + ACCESS_MASK access = 0; ULONG pipe_type; ULONG read_mode; ULONG completion_mode; @@ -14,10 +15,21 @@ public: ULONG outbound_quota; LARGE_INTEGER default_timeout; - void create(windows_emulator&, const io_device_creation_data&) override {} - void work(windows_emulator&) override {} - NTSTATUS io_control(windows_emulator&, const io_device_context&) override { return STATUS_NOT_SUPPORTED; } + void create(windows_emulator&, const io_device_creation_data&) override + { + } + void work(windows_emulator&) override + { + } + NTSTATUS io_control(windows_emulator&, const io_device_context&) override + { + return STATUS_NOT_SUPPORTED; + } - void serialize_object(utils::buffer_serializer&) const override {} - void deserialize_object(utils::buffer_deserializer&) override {} + void serialize_object(utils::buffer_serializer&) const override + { + } + void deserialize_object(utils::buffer_deserializer&) override + { + } }; \ No newline at end of file diff --git a/src/windows-emulator/syscalls/file.cpp b/src/windows-emulator/syscalls/file.cpp index 79928acb..719c41d3 100644 --- a/src/windows-emulator/syscalls/file.cpp +++ b/src/windows-emulator/syscalls/file.cpp @@ -717,10 +717,10 @@ namespace syscalls if (container) { if (auto* pipe = container->get_internal_device()) - { + { (void)pipe; // For future use: suppressing compiler issues // TODO c.win_emu.callbacks.on_named_pipe_write(pipe->name, temp_buffer); - + // TODO pipe->write_queue.push_back(temp_buffer); if (io_status_block)