http://bugs.winehq.org/show_bug.cgi?id=29168
Carsten Juttner carjay@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |carjay@gmx.net
--- Comment #110 from Carsten Juttner carjay@gmx.net 2012-03-05 15:42:42 CST --- Hi, I've been looking for the cause for some weeks now, too, and found the answer.
SWTOR seemingly reads part of its timing information directly from the KUSER_SHARED_DATA mapping. This is a special virtual address mapping which is present in all processes and used internally by Windows user space libraries. Basically a system stat page exported by the NT kernel to user space.
It can be found at virtual address 0x7ffe0000. In Wine this page is initialized once (it holds a lot more information than just timing) but after that there do not seem to be any more updates. Also the InterruptTime field (time since boot) is never set up at all.
SWTOR seems to base its send timers on exactly this source. Now, obviously a timing source that never progresses leads to timers never elapsing which is a good explanation why things do not work properly.
For demonstration purposes I've attached a small proof of concept which makes things work by simply updating the fields whenever the process enters an "EnterCriticalSection"-API call.
Before you get all excited, this is of course not a proper way to do things. On Windows this information is set from within the kernel which cannot be done for wine in a similar way.
Hopefully someone more familiar with Wine internals has an idea where and how to set this up properly.