Prepare I/O control support

This commit is contained in:
momo5502
2024-11-06 19:55:28 +01:00
parent 300c80c65f
commit e80b3e588c
4 changed files with 61 additions and 28 deletions

View File

@@ -4,12 +4,9 @@ namespace
{
struct dummy_device : stateless_device
{
void read() override
{
}
void write() override
NTSTATUS io_control(const io_device_context&) override
{
return STATUS_SUCCESS;
}
};
}

View File

@@ -1,8 +1,32 @@
#pragma once
#include <memory>
#include <x64_emulator.hpp>
#include <serialization.hpp>
#include "emulator_utils.hpp"
#include "handles.hpp"
class windows_emulator;
struct process_context;
struct io_device_context
{
windows_emulator& win_emu;
x64_emulator& emu;
process_context& proc;
handle event;
emulator_pointer /*PIO_APC_ROUTINE*/ apc_routine;
emulator_pointer apc_context;
emulator_object<IO_STATUS_BLOCK> io_status_block;
ULONG io_control_code;
emulator_pointer input_buffer;
ULONG input_buffer_length;
emulator_pointer output_buffer;
ULONG output_buffer_length;
};
struct io_device
{
io_device() = default;
@@ -14,9 +38,7 @@ struct io_device
io_device(const io_device&) = delete;
io_device& operator=(const io_device&) = delete;
// TODO
virtual void read() = 0;
virtual void write() = 0;
virtual NTSTATUS io_control(const io_device_context& context) = 0;
virtual void serialize(utils::buffer_serializer& buffer) const = 0;
virtual void deserialize(utils::buffer_deserializer& buffer) = 0;
@@ -46,16 +68,10 @@ public:
this->setup();
}
void read() override
NTSTATUS io_control(const io_device_context& context) override
{
this->assert_validity();
this->device_->read();
}
void write() override
{
this->assert_validity();
this->device_->write();
return this->device_->io_control(context);
}
void serialize(utils::buffer_serializer& buffer) const override

View File

@@ -34,6 +34,6 @@ public:
private:
std::map<uint64_t, syscall_handler_entry> handlers_{};
void add_handlers(std::map<std::string, syscall_handler>& handler_mapping);
static void add_handlers(std::map<std::string, syscall_handler>& handler_mapping);
void add_handlers();
};

View File

@@ -1649,18 +1649,38 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtDeviceIoControlFile(const syscall_context&, const handle /*file_handle*/,
const handle /*event*/,
const emulator_pointer /*PIO_APC_ROUTINE*/ /*apc_routine*/,
const emulator_pointer /*apc_context*/,
const emulator_object<IO_STATUS_BLOCK> /*io_status_block*/,
const ULONG /*io_control_code*/,
const emulator_pointer /*input_buffer*/,
const ULONG /*input_buffer_length*/, const emulator_pointer /*output_buffer*/,
const ULONG /*output_buffer_length*/)
NTSTATUS handle_NtDeviceIoControlFile(const syscall_context& c, const handle file_handle,
const handle event,
const emulator_pointer /*PIO_APC_ROUTINE*/ apc_routine,
const emulator_pointer apc_context,
const emulator_object<IO_STATUS_BLOCK> io_status_block,
const ULONG io_control_code,
const emulator_pointer input_buffer,
const ULONG input_buffer_length, const emulator_pointer output_buffer,
const ULONG output_buffer_length)
{
//puts("NtDeviceIoControlFile not supported");
return STATUS_SUCCESS;
auto* device = c.proc.devices.get(file_handle);
if (!device)
{
return STATUS_INVALID_HANDLE;
}
const io_device_context context{
.win_emu = c.win_emu,
.emu = c.emu,
.proc = c.proc,
.event = event,
.apc_routine = apc_routine,
.apc_context = apc_context,
.io_status_block = io_status_block,
.io_control_code = io_control_code,
.input_buffer = input_buffer,
.input_buffer_length = input_buffer_length,
.output_buffer = output_buffer,
.output_buffer_length = output_buffer_length,
};
return device->io_control(context);
}
NTSTATUS handle_NtQueryWnfStateData()