diff --git a/src/windows-emulator/syscalls.cpp b/src/windows-emulator/syscalls.cpp index b739123a..d382b340 100644 --- a/src/windows-emulator/syscalls.cpp +++ b/src/windows-emulator/syscalls.cpp @@ -352,11 +352,22 @@ namespace return STATUS_BUFFER_OVERFLOW; } - const auto tls_index = c.emu.read_memory(thread_information); - const auto teb = thread->teb->read(); + const auto tls_cell = c.emu.read_memory(thread_information); - auto* tls_vector = teb.ThreadLocalStoragePointer; - c.emu.write_memory(tls_vector + tls_index, nullptr); + for (const auto& t : c.proc.threads | std::views::values) + { + t.teb->access([&](TEB64& teb) { + if (tls_cell < TLS_MINIMUM_AVAILABLE) + { + teb.TlsSlots.arr[tls_cell] = nullptr; + } + else if (teb.TlsExpansionSlots) + { + const emulator_object expansion_slots(c.emu, teb.TlsExpansionSlots); + expansion_slots.write(0, tls_cell - TLS_MINIMUM_AVAILABLE); + } + }); + } return STATUS_SUCCESS; }