| 689 | } |
| 690 | |
| 691 | NTSTATUS BTCpuGetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context) { |
| 692 | if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_GET_CONTEXT)) { |
| 693 | return STATUS_ACCESS_DENIED; |
| 694 | } |
| 695 | |
| 696 | auto ThreadDup = FEX::Windows::DupHandle(Thread, THREAD_QUERY_INFORMATION | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT); |
| 697 | auto [Err, TLS] = GetThreadTLS(*ThreadDup); |
| 698 | if (Err) { |
| 699 | return Err; |
| 700 | } |
| 701 | |
| 702 | if (!(TLS.ControlWord().load(std::memory_order::relaxed) & ControlBits::WOW_CPU_AREA_DIRTY)) { |
| 703 | if (Err = Context::FlushThreadStateContext(*ThreadDup); Err) { |
| 704 | return Err; |
| 705 | } |
| 706 | } |
| 707 | |
| 708 | return RtlWow64GetThreadContext(*ThreadDup, Context); |
| 709 | } |
| 710 | |
| 711 | NTSTATUS BTCpuSetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context) { |
| 712 | if (!FEX::Windows::ValidateHandleAccess(Thread, THREAD_SET_CONTEXT)) { |
nothing calls this directly
no test coverage detected