mirror of
https://github.com/momo5502/emulator.git
synced 2026-01-10 16:16:16 +00:00
Fix user_handle_table initialization
This commit is contained in:
@@ -420,7 +420,7 @@ void process_context::setup(x86_64_emulator& emu, memory_manager& memory, regist
|
|||||||
|
|
||||||
this->default_register_set = emu.save_registers();
|
this->default_register_set = emu.save_registers();
|
||||||
|
|
||||||
this->user_handles.setup(memory);
|
this->user_handles.setup();
|
||||||
|
|
||||||
auto [h, monitor_obj] = this->user_handles.allocate_object<USER_MONITOR>(handle_types::monitor);
|
auto [h, monitor_obj] = this->user_handles.allocate_object<USER_MONITOR>(handle_types::monitor);
|
||||||
this->default_monitor_handle = h;
|
this->default_monitor_handle = h;
|
||||||
@@ -464,6 +464,7 @@ void process_context::serialize(utils::buffer_serializer& buffer) const
|
|||||||
buffer.write(this->kusd);
|
buffer.write(this->kusd);
|
||||||
|
|
||||||
buffer.write(this->is_wow64_process);
|
buffer.write(this->is_wow64_process);
|
||||||
|
buffer.write(this->windows_build_number);
|
||||||
buffer.write(this->ntdll_image_base);
|
buffer.write(this->ntdll_image_base);
|
||||||
buffer.write(this->ldr_initialize_thunk);
|
buffer.write(this->ldr_initialize_thunk);
|
||||||
buffer.write(this->rtl_user_thread_start);
|
buffer.write(this->rtl_user_thread_start);
|
||||||
@@ -512,6 +513,7 @@ void process_context::deserialize(utils::buffer_deserializer& buffer)
|
|||||||
buffer.read(this->kusd);
|
buffer.read(this->kusd);
|
||||||
|
|
||||||
buffer.read(this->is_wow64_process);
|
buffer.read(this->is_wow64_process);
|
||||||
|
buffer.read(this->windows_build_number);
|
||||||
buffer.read(this->ntdll_image_base);
|
buffer.read(this->ntdll_image_base);
|
||||||
buffer.read(this->ldr_initialize_thunk);
|
buffer.read(this->ldr_initialize_thunk);
|
||||||
buffer.read(this->rtl_user_thread_start);
|
buffer.read(this->rtl_user_thread_start);
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ struct process_context
|
|||||||
base_allocator(emu),
|
base_allocator(emu),
|
||||||
peb64(emu),
|
peb64(emu),
|
||||||
process_params64(emu),
|
process_params64(emu),
|
||||||
kusd(memory, clock)
|
kusd(memory, clock),
|
||||||
|
user_handles(memory)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +127,7 @@ struct process_context
|
|||||||
std::optional<emulator_object<RTL_USER_PROCESS_PARAMETERS32>> process_params32;
|
std::optional<emulator_object<RTL_USER_PROCESS_PARAMETERS32>> process_params32;
|
||||||
std::optional<uint64_t> rtl_user_thread_start32{};
|
std::optional<uint64_t> rtl_user_thread_start32{};
|
||||||
|
|
||||||
user_handle_table user_handles{};
|
user_handle_table user_handles;
|
||||||
handle default_monitor_handle{};
|
handle default_monitor_handle{};
|
||||||
handle_store<handle_types::event, event> events{};
|
handle_store<handle_types::event, event> events{};
|
||||||
handle_store<handle_types::file, file> files{};
|
handle_store<handle_types::file, file> files{};
|
||||||
|
|||||||
@@ -7,24 +7,28 @@ class user_handle_table
|
|||||||
public:
|
public:
|
||||||
static constexpr uint32_t MAX_HANDLES = 0xFFFF;
|
static constexpr uint32_t MAX_HANDLES = 0xFFFF;
|
||||||
|
|
||||||
void setup(memory_manager& memory)
|
user_handle_table(memory_manager& memory)
|
||||||
|
: memory_(&memory)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
{
|
{
|
||||||
memory_ = &memory;
|
|
||||||
used_indices_.resize(MAX_HANDLES, false);
|
used_indices_.resize(MAX_HANDLES, false);
|
||||||
|
|
||||||
const auto server_info_size = static_cast<size_t>(page_align_up(sizeof(USER_SERVERINFO)));
|
const auto server_info_size = static_cast<size_t>(page_align_up(sizeof(USER_SERVERINFO)));
|
||||||
server_info_addr_ = memory.allocate_memory(server_info_size, memory_permission::read);
|
server_info_addr_ = memory_->allocate_memory(server_info_size, memory_permission::read);
|
||||||
|
|
||||||
const auto display_info_size = static_cast<size_t>(page_align_up(sizeof(USER_DISPINFO)));
|
const auto display_info_size = static_cast<size_t>(page_align_up(sizeof(USER_DISPINFO)));
|
||||||
display_info_addr_ = memory.allocate_memory(display_info_size, memory_permission::read);
|
display_info_addr_ = memory_->allocate_memory(display_info_size, memory_permission::read);
|
||||||
|
|
||||||
const emulator_object<USER_SERVERINFO> srv_obj(memory, server_info_addr_);
|
const emulator_object<USER_SERVERINFO> srv_obj(*memory_, server_info_addr_);
|
||||||
srv_obj.access([&](USER_SERVERINFO& srv) {
|
srv_obj.access([&](USER_SERVERINFO& srv) {
|
||||||
srv.cHandleEntries = MAX_HANDLES - 1; //
|
srv.cHandleEntries = MAX_HANDLES - 1; //
|
||||||
});
|
});
|
||||||
|
|
||||||
const auto handle_table_size = static_cast<size_t>(page_align_up(sizeof(USER_HANDLEENTRY) * MAX_HANDLES));
|
const auto handle_table_size = static_cast<size_t>(page_align_up(sizeof(USER_HANDLEENTRY) * MAX_HANDLES));
|
||||||
handle_table_addr_ = memory.allocate_memory(handle_table_size, memory_permission::read);
|
handle_table_addr_ = memory_->allocate_memory(handle_table_size, memory_permission::read);
|
||||||
}
|
}
|
||||||
|
|
||||||
emulator_object<USER_SHAREDINFO> get_server_info() const
|
emulator_object<USER_SHAREDINFO> get_server_info() const
|
||||||
|
|||||||
Reference in New Issue
Block a user