mirror of
https://github.com/momo5502/emulator.git
synced 2026-01-21 20:53:56 +00:00
Implement NtQueueApcThreadEx2
This commit is contained in:
@@ -8,6 +8,33 @@
|
||||
|
||||
struct process_context;
|
||||
|
||||
struct pending_apc
|
||||
{
|
||||
ULONG flags{};
|
||||
uint64_t apc_routine{};
|
||||
uint64_t apc_argument1{};
|
||||
uint64_t apc_argument2{};
|
||||
uint64_t apc_argument3{};
|
||||
|
||||
void serialize(utils::buffer_serializer& buffer) const
|
||||
{
|
||||
buffer.write(this->flags);
|
||||
buffer.write(this->apc_routine);
|
||||
buffer.write(this->apc_argument1);
|
||||
buffer.write(this->apc_argument2);
|
||||
buffer.write(this->apc_argument3);
|
||||
}
|
||||
|
||||
void deserialize(utils::buffer_deserializer& buffer)
|
||||
{
|
||||
buffer.read(this->flags);
|
||||
buffer.read(this->apc_routine);
|
||||
buffer.read(this->apc_argument1);
|
||||
buffer.read(this->apc_argument2);
|
||||
buffer.read(this->apc_argument3);
|
||||
}
|
||||
};
|
||||
|
||||
class emulator_thread : public ref_counted_object
|
||||
{
|
||||
public:
|
||||
@@ -54,10 +81,12 @@ class emulator_thread : public ref_counted_object
|
||||
bool await_any{false};
|
||||
bool waiting_for_alert{false};
|
||||
bool alerted{false};
|
||||
bool apc_alertable{false};
|
||||
uint32_t suspended{0};
|
||||
std::optional<std::chrono::steady_clock::time_point> await_time{};
|
||||
|
||||
bool apc_alertable{false};
|
||||
std::vector<pending_apc> pending_apcs{};
|
||||
|
||||
std::optional<NTSTATUS> pending_status{};
|
||||
|
||||
std::optional<emulator_allocator> gs_segment;
|
||||
@@ -124,11 +153,13 @@ class emulator_thread : public ref_counted_object
|
||||
|
||||
buffer.write(this->waiting_for_alert);
|
||||
buffer.write(this->alerted);
|
||||
buffer.write(this->apc_alertable);
|
||||
|
||||
buffer.write(this->suspended);
|
||||
|
||||
buffer.write_optional(this->await_time);
|
||||
|
||||
buffer.write(this->apc_alertable);
|
||||
buffer.write_vector(this->pending_apcs);
|
||||
|
||||
buffer.write_optional(this->pending_status);
|
||||
buffer.write_optional(this->gs_segment);
|
||||
buffer.write_optional(this->teb);
|
||||
@@ -160,11 +191,13 @@ class emulator_thread : public ref_counted_object
|
||||
|
||||
buffer.read(this->waiting_for_alert);
|
||||
buffer.read(this->alerted);
|
||||
buffer.read(this->apc_alertable);
|
||||
|
||||
buffer.read(this->suspended);
|
||||
|
||||
buffer.read_optional(this->await_time);
|
||||
|
||||
buffer.read(this->apc_alertable);
|
||||
buffer.read_vector(this->pending_apcs);
|
||||
|
||||
buffer.read_optional(this->pending_status);
|
||||
buffer.read_optional(this->gs_segment, [this] { return emulator_allocator(*this->memory_ptr); });
|
||||
buffer.read_optional(this->teb, [this] { return emulator_object<TEB64>(*this->memory_ptr); });
|
||||
|
||||
@@ -565,10 +565,25 @@ namespace syscalls
|
||||
}
|
||||
|
||||
NTSTATUS handle_NtQueueApcThreadEx2(const syscall_context& c, const handle thread_handle,
|
||||
const handle reserve_handle, const ULONG apc_flags, const uint64_t apc_routine,
|
||||
const uint64_t apc_argument1, const uint64_t apc_argument2,
|
||||
const uint64_t apc_argument3)
|
||||
const handle /*reserve_handle*/, const ULONG apc_flags,
|
||||
const uint64_t apc_routine, const uint64_t apc_argument1,
|
||||
const uint64_t apc_argument2, const uint64_t apc_argument3)
|
||||
{
|
||||
auto* thread = thread_handle == CURRENT_THREAD ? c.proc.active_thread : c.proc.threads.get(thread_handle);
|
||||
|
||||
if (!thread)
|
||||
{
|
||||
return STATUS_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
thread->pending_apcs.push_back({
|
||||
.flags = apc_flags,
|
||||
.apc_routine = apc_routine,
|
||||
.apc_argument1 = apc_argument1,
|
||||
.apc_argument2 = apc_argument2,
|
||||
.apc_argument3 = apc_argument3,
|
||||
});
|
||||
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user