Cleanup handle uses

This commit is contained in:
momo5502
2024-11-06 17:34:14 +01:00
parent 735ca01e7a
commit 300c80c65f
3 changed files with 87 additions and 86 deletions

View File

@@ -54,7 +54,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtOpenKey(const syscall_context& c, const emulator_object<uint64_t> key_handle,
NTSTATUS handle_NtOpenKey(const syscall_context& c, const emulator_object<handle> key_handle,
const ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes)
{
@@ -81,12 +81,12 @@ namespace
}
const auto handle = c.proc.registry_keys.store(std::move(entry.value()));
key_handle.write(handle.bits);
key_handle.write(handle);
return STATUS_SUCCESS;
}
NTSTATUS handle_NtOpenKeyEx(const syscall_context& c, const emulator_object<uint64_t> key_handle,
NTSTATUS handle_NtOpenKeyEx(const syscall_context& c, const emulator_object<handle> key_handle,
const ACCESS_MASK desired_access,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes,
ULONG /*open_options*/)
@@ -285,7 +285,7 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtSetInformationThread(const syscall_context& c, const uint64_t thread_handle,
NTSTATUS handle_NtSetInformationThread(const syscall_context& c, const handle thread_handle,
const THREADINFOCLASS info_class,
const uint64_t thread_information,
const uint32_t thread_information_length)
@@ -343,40 +343,40 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtClose(const syscall_context& c, const uint64_t handle)
NTSTATUS handle_NtClose(const syscall_context& c, const handle h)
{
const auto value = get_handle_value(handle);
const auto value = h.value;
if (value.is_pseudo)
{
return STATUS_SUCCESS;
}
if (value.type == handle_types::thread && c.proc.threads.erase(handle))
if (value.type == handle_types::thread && c.proc.threads.erase(h))
{
return STATUS_SUCCESS;
}
if (value.type == handle_types::event && c.proc.events.erase(handle))
if (value.type == handle_types::event && c.proc.events.erase(h))
{
return STATUS_SUCCESS;
}
if (value.type == handle_types::file && c.proc.files.erase(handle))
if (value.type == handle_types::file && c.proc.files.erase(h))
{
return STATUS_SUCCESS;
}
if (value.type == handle_types::device && c.proc.devices.erase(handle))
if (value.type == handle_types::device && c.proc.devices.erase(h))
{
return STATUS_SUCCESS;
}
if (value.type == handle_types::semaphore && c.proc.semaphores.erase(handle))
if (value.type == handle_types::semaphore && c.proc.semaphores.erase(h))
{
return STATUS_SUCCESS;
}
if (value.type == handle_types::registry && c.proc.registry_keys.erase(handle))
if (value.type == handle_types::registry && c.proc.registry_keys.erase(h))
{
return STATUS_SUCCESS;
}
@@ -394,7 +394,7 @@ namespace
return STATUS_NO_TOKEN;
}
NTSTATUS handle_NtCreateEvent(const syscall_context& c, const emulator_object<uint64_t> event_handle,
NTSTATUS handle_NtCreateEvent(const syscall_context& c, const emulator_object<handle> event_handle,
const ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes,
const EVENT_TYPE event_type, const BOOLEAN initial_state)
@@ -415,7 +415,7 @@ namespace
e.name = std::move(name);
const auto handle = c.proc.events.store(std::move(e));
event_handle.write(handle.bits);
event_handle.write(handle);
static_assert(sizeof(EVENT_TYPE) == sizeof(uint32_t));
static_assert(sizeof(ACCESS_MASK) == sizeof(uint32_t));
@@ -443,10 +443,10 @@ namespace
return STATUS_NOT_FOUND;
}
NTSTATUS handle_NtQueryVolumeInformationFile(const syscall_context& c, uint64_t file_handle,
uint64_t /*io_status_block*/, uint64_t fs_information,
ULONG /*length*/,
FS_INFORMATION_CLASS fs_information_class)
NTSTATUS handle_NtQueryVolumeInformationFile(const syscall_context& c, const handle file_handle,
const uint64_t /*io_status_block*/, const uint64_t fs_information,
const ULONG /*length*/,
const FS_INFORMATION_CLASS fs_information_class)
{
if (fs_information_class != FileFsDeviceInformation)
{
@@ -473,7 +473,7 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtOpenSection(const syscall_context& c, const emulator_object<uint64_t> section_handle,
NTSTATUS handle_NtOpenSection(const syscall_context& c, const emulator_object<handle> section_handle,
const ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes)
{
@@ -484,7 +484,7 @@ namespace
if (filename == L"\\Windows\\SharedSection")
{
section_handle.write(SHARED_SECTION.bits);
section_handle.write(SHARED_SECTION);
return STATUS_SUCCESS;
}
@@ -505,17 +505,18 @@ namespace
f.name = std::move(filename);
const auto handle = c.proc.files.store(std::move(f));
section_handle.write(handle.bits);
section_handle.write(handle);
return STATUS_SUCCESS;
}
NTSTATUS handle_NtMapViewOfSection(const syscall_context& c, uint64_t section_handle, uint64_t process_handle,
emulator_object<uint64_t> base_address, ULONG_PTR /*zero_bits*/,
SIZE_T /*commit_size*/,
NTSTATUS handle_NtMapViewOfSection(const syscall_context& c, const handle section_handle,
const handle process_handle, const emulator_object<uint64_t> base_address,
const ULONG_PTR /*zero_bits*/, const SIZE_T /*commit_size*/,
const emulator_object<LARGE_INTEGER> /*section_offset*/,
const emulator_object<SIZE_T> view_size, SECTION_INHERIT /*inherit_disposition*/,
ULONG /*allocation_type*/, ULONG /*win32_protect*/)
const emulator_object<SIZE_T> view_size,
const SECTION_INHERIT /*inherit_disposition*/, const ULONG /*allocation_type*/,
const ULONG /*win32_protect*/)
{
if (process_handle != ~0ULL)
{
@@ -591,22 +592,22 @@ namespace
}
NTSTATUS handle_NtCreateIoCompletion(const syscall_context& c, const emulator_object<uint64_t> event_handle,
NTSTATUS handle_NtCreateIoCompletion(const syscall_context& c, const emulator_object<handle> event_handle,
const ACCESS_MASK desired_access,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes,
uint32_t /*number_of_concurrent_threads*/)
const uint32_t /*number_of_concurrent_threads*/)
{
return handle_NtCreateEvent(c, event_handle, desired_access, object_attributes, NotificationEvent, FALSE);
}
NTSTATUS handle_NtCreateWaitCompletionPacket(const syscall_context& c, const emulator_object<uint64_t> event_handle,
NTSTATUS handle_NtCreateWaitCompletionPacket(const syscall_context& c, const emulator_object<handle> event_handle,
const ACCESS_MASK desired_access,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes)
{
return handle_NtCreateEvent(c, event_handle, desired_access, object_attributes, NotificationEvent, FALSE);
}
NTSTATUS handle_NtQueryVirtualMemory(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtQueryVirtualMemory(const syscall_context& c, const handle process_handle,
const uint64_t base_address, const uint32_t info_class,
const uint64_t memory_information, const uint32_t memory_information_length,
const emulator_object<uint32_t> return_length)
@@ -893,23 +894,19 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtDuplicateObject(const syscall_context& /*c*/, uint64_t source_process_handle,
uint64_t source_handle, uint64_t target_process_handle,
const emulator_object<handle> target_handle,
const ACCESS_MASK /*desired_access*/, const ULONG /*handle_attributes*/,
const ULONG /*options*/)
NTSTATUS handle_NtDuplicateObject(const syscall_context& /*c*/, const handle source_process_handle,
const handle source_handle, const handle target_process_handle,
const emulator_object<handle> target_handle, const ACCESS_MASK /*desired_access*/,
const ULONG /*handle_attributes*/, const ULONG /*options*/)
{
if (source_process_handle != ~0ULL || target_process_handle != ~0ULL)
{
return STATUS_NOT_SUPPORTED;
}
handle source{};
source.bits = source_handle;
if (source.value.is_pseudo)
if (source_handle.value.is_pseudo)
{
target_handle.write(source);
target_handle.write(source_handle);
return STATUS_SUCCESS;
}
@@ -996,7 +993,7 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtQueryInformationProcess(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtQueryInformationProcess(const syscall_context& c, const handle process_handle,
const uint32_t info_class, const uint64_t process_information,
const uint32_t process_information_length,
const emulator_object<uint32_t> return_length)
@@ -1172,7 +1169,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtQueryInformationThread(const syscall_context& c, const uint64_t thread_handle,
NTSTATUS handle_NtQueryInformationThread(const syscall_context& c, const handle thread_handle,
const uint32_t info_class, const uint64_t thread_information,
const uint32_t thread_information_length,
const emulator_object<uint32_t> return_length)
@@ -1228,7 +1225,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtSetInformationFile(const syscall_context& c, const uint64_t file_handle,
NTSTATUS handle_NtSetInformationFile(const syscall_context& c, const handle file_handle,
const emulator_object<IO_STATUS_BLOCK> io_status_block,
const uint64_t file_information,
const ULONG length, const FILE_INFORMATION_CLASS info_class)
@@ -1275,10 +1272,9 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtQueryInformationFile(const syscall_context& c, uint64_t file_handle,
NTSTATUS handle_NtQueryInformationFile(const syscall_context& c, const handle file_handle,
const emulator_object<IO_STATUS_BLOCK> io_status_block,
const uint64_t file_information,
const uint32_t length,
const uint64_t file_information, const uint32_t length,
const uint32_t info_class)
{
const auto* f = c.proc.files.get(file_handle);
@@ -1350,7 +1346,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtSetInformationProcess(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtSetInformationProcess(const syscall_context& c, const handle process_handle,
const uint32_t info_class, const uint64_t /*process_information*/,
const uint32_t /*process_information_length*/)
{
@@ -1380,7 +1376,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtProtectVirtualMemory(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtProtectVirtualMemory(const syscall_context& c, const handle process_handle,
const emulator_object<uint64_t> base_address,
const emulator_object<uint32_t> bytes_to_protect,
const uint32_t protection,
@@ -1423,7 +1419,7 @@ namespace
}
NTSTATUS handle_NtOpenDirectoryObject(const syscall_context& c,
const emulator_object<uint64_t> directory_handle,
const emulator_object<handle> directory_handle,
const ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes)
{
@@ -1432,14 +1428,14 @@ namespace
if (object_name == L"\\KnownDlls")
{
directory_handle.write(KNOWN_DLLS_DIRECTORY.bits);
directory_handle.write(KNOWN_DLLS_DIRECTORY);
return STATUS_SUCCESS;
}
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtOpenSymbolicLinkObject(const syscall_context& c, const emulator_object<uint64_t> link_handle,
NTSTATUS handle_NtOpenSymbolicLinkObject(const syscall_context& c, const emulator_object<handle> link_handle,
ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes)
{
@@ -1448,14 +1444,14 @@ namespace
if (object_name == L"KnownDllPath")
{
link_handle.write(KNOWN_DLLS_SYMLINK.bits);
link_handle.write(KNOWN_DLLS_SYMLINK);
return STATUS_SUCCESS;
}
return STATUS_NOT_SUPPORTED;
}
NTSTATUS WINAPI handle_NtQuerySymbolicLinkObject(const syscall_context& c, const uint64_t link_handle,
NTSTATUS WINAPI handle_NtQuerySymbolicLinkObject(const syscall_context& c, const handle link_handle,
const emulator_object<UNICODE_STRING> link_target,
const emulator_object<ULONG> returned_length)
{
@@ -1488,7 +1484,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtAllocateVirtualMemoryEx(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtAllocateVirtualMemoryEx(const syscall_context& c, const handle process_handle,
const emulator_object<uint64_t> base_address,
const emulator_object<uint64_t> bytes_to_allocate,
const uint32_t allocation_type,
@@ -1536,9 +1532,8 @@ namespace
: STATUS_MEMORY_NOT_ALLOCATED;
}
NTSTATUS handle_NtAllocateVirtualMemory(const syscall_context& c, const uint64_t process_handle,
const emulator_object<uint64_t> base_address,
uint64_t /*zero_bits*/,
NTSTATUS handle_NtAllocateVirtualMemory(const syscall_context& c, const handle process_handle,
const emulator_object<uint64_t> base_address, const uint64_t /*zero_bits*/,
const emulator_object<uint64_t> bytes_to_allocate,
const uint32_t allocation_type, const uint32_t page_protection)
{
@@ -1546,9 +1541,9 @@ namespace
page_protection);
}
NTSTATUS handle_NtFreeVirtualMemory(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtFreeVirtualMemory(const syscall_context& c, const handle process_handle,
const emulator_object<uint64_t> base_address,
const emulator_object<uint64_t> bytes_to_allocate, uint32_t free_type)
const emulator_object<uint64_t> bytes_to_allocate, const uint32_t free_type)
{
if (process_handle != ~0ULL)
{
@@ -1705,7 +1700,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtQueryInformationToken(const syscall_context& c, const uint64_t token_handle,
NTSTATUS handle_NtQueryInformationToken(const syscall_context& c, const handle token_handle,
const TOKEN_INFORMATION_CLASS token_information_class,
const uint64_t token_information, const ULONG token_information_length,
const emulator_object<ULONG> return_length)
@@ -1824,7 +1819,7 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtAlpcSendWaitReceivePort(const syscall_context& c, const uint64_t port_handle,
NTSTATUS handle_NtAlpcSendWaitReceivePort(const syscall_context& c, const handle port_handle,
const ULONG /*flags*/,
const emulator_object<PORT_MESSAGE> /*send_message*/,
const emulator_object<ALPC_MESSAGE_ATTRIBUTES>
@@ -1889,16 +1884,16 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtTerminateProcess(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtTerminateProcess(const syscall_context& c, const handle process_handle,
NTSTATUS exit_status)
{
if (process_handle == 0)
{
for (auto& t : c.proc.threads)
for (auto& thread : c.proc.threads | std::views::values)
{
if (&t.second != c.proc.active_thread)
if (&thread != c.proc.active_thread)
{
t.second.exit_status = exit_status;
thread.exit_status = exit_status;
}
}
@@ -2037,7 +2032,7 @@ namespace
return mode;
}
NTSTATUS handle_NtCreateFile(const syscall_context& c, const emulator_object<uint64_t> file_handle,
NTSTATUS handle_NtCreateFile(const syscall_context& c, const emulator_object<handle> file_handle,
ACCESS_MASK desired_access,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes,
const emulator_object<IO_STATUS_BLOCK> /*io_status_block*/,
@@ -2061,7 +2056,7 @@ namespace
io_device_container container{std::move(device_name)};
const auto handle = c.proc.devices.store(std::move(container));
file_handle.write(handle.bits);
file_handle.write(handle);
return STATUS_SUCCESS;
}
@@ -2070,7 +2065,7 @@ namespace
root_handle.bits = reinterpret_cast<uint64_t>(attributes.RootDirectory);
if (root_handle.value.is_pseudo && (filename == L"\\Reference" || filename == L"\\Connect"))
{
file_handle.write(root_handle.bits);
file_handle.write(root_handle);
return STATUS_SUCCESS;
}
@@ -2110,7 +2105,7 @@ namespace
}
const auto handle = c.proc.files.store(std::move(f));
file_handle.write(handle.bits);
file_handle.write(handle);
return STATUS_SUCCESS;
}
@@ -2145,13 +2140,13 @@ namespace
f.handle = file;
const auto handle = c.proc.files.store(std::move(f));
file_handle.write(handle.bits);
file_handle.write(handle);
return STATUS_SUCCESS;
}
NTSTATUS handle_NtOpenFile(const syscall_context& c,
const emulator_object<uint64_t> file_handle,
const emulator_object<handle> file_handle,
const ACCESS_MASK desired_access,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes,
const emulator_object<IO_STATUS_BLOCK> io_status_block,
@@ -2165,7 +2160,8 @@ namespace
NTSTATUS handle_NtQueryObject(const syscall_context&, const handle /*handle*/,
const OBJECT_INFORMATION_CLASS /*object_information_class*/,
const emulator_pointer /*object_information*/,
const ULONG /*object_information_length*/, const emulator_object<ULONG> /*return_length*/)
const ULONG /*object_information_length*/,
const emulator_object<ULONG> /*return_length*/)
{
return STATUS_NOT_SUPPORTED;
}
@@ -2221,7 +2217,7 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtCreateSemaphore(const syscall_context& c, const emulator_object<uint64_t> semaphore_handle,
NTSTATUS handle_NtCreateSemaphore(const syscall_context& c, const emulator_object<handle> semaphore_handle,
const ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> object_attributes,
const ULONG initial_count, const ULONG maximum_count)
@@ -2240,7 +2236,7 @@ namespace
}
const auto handle = c.proc.semaphores.store(std::move(s));
semaphore_handle.write(handle.bits);
semaphore_handle.write(handle);
return STATUS_SUCCESS;
}
@@ -2297,7 +2293,7 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtUnmapViewOfSection(const syscall_context& c, const uint64_t process_handle,
NTSTATUS handle_NtUnmapViewOfSection(const syscall_context& c, const handle process_handle,
const uint64_t base_address)
{
if (process_handle != ~0ULL)
@@ -2319,10 +2315,10 @@ namespace
return STATUS_NOT_SUPPORTED;
}
NTSTATUS handle_NtCreateThreadEx(const syscall_context& c, const emulator_object<uint64_t> thread_handle,
NTSTATUS handle_NtCreateThreadEx(const syscall_context& c, const emulator_object<handle> thread_handle,
const ACCESS_MASK /*desired_access*/,
const emulator_object<OBJECT_ATTRIBUTES> /*object_attributes*/,
const uint64_t process_handle, const uint64_t start_routine,
const handle process_handle, const uint64_t start_routine,
const uint64_t argument, const ULONG /*create_flags*/, const SIZE_T /*zero_bits*/,
const SIZE_T stack_size, const SIZE_T /*maximum_stack_size*/,
const emulator_object<PS_ATTRIBUTE_LIST> attribute_list)
@@ -2333,7 +2329,7 @@ namespace
}
const auto h = c.proc.create_thread(c.emu, start_routine, argument, stack_size);
thread_handle.write(h.bits);
thread_handle.write(h);
if (!attribute_list)
{
@@ -2382,7 +2378,7 @@ namespace
return FALSE;
}
NTSTATUS handle_NtWaitForSingleObject(const syscall_context& c, const uint64_t handle_value,
NTSTATUS handle_NtWaitForSingleObject(const syscall_context& c, const handle h,
const BOOLEAN alertable,
const emulator_object<LARGE_INTEGER> timeout)
{
@@ -2393,9 +2389,6 @@ namespace
return STATUS_NOT_SUPPORTED;
}
handle h{};
h.bits = handle_value;
if (h.value.type != handle_types::thread && h.value.type != handle_types::event)
{
puts("Unsupported handle type for NtWaitForSingleObject!");
@@ -2417,10 +2410,10 @@ namespace
return STATUS_SUCCESS;
}
NTSTATUS handle_NtTerminateThread(const syscall_context& c, const uint64_t thread_handle,
NTSTATUS handle_NtTerminateThread(const syscall_context& c, const handle thread_handle,
const NTSTATUS exit_status)
{
auto* thread = !thread_handle
auto* thread = !thread_handle.bits
? c.proc.active_thread
: c.proc.threads.get(thread_handle);