http://bugs.winehq.org/show_bug.cgi?id=7705
andrey.turkin@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |andrey.turkin@gmail.com
------- Additional Comments From wine@kapila.force9.co.uk 2007-15-03 05:55 ------- Additional Information:
Crash is occurring in the Everquest2.exe process. Before the crash, SymInitializeW is called with a process handle 0xffffffff. process_find_by_handle finds an existing process with this handle. For some reason, another process structure is allocated after this, so the next call to process_find_by_handle finds TWO processes with the handle 0xffffffff and returns the second one (Though changing the code to return the first one makes no difference).
SymInitializeW returns successfully.
Then SymFromAddr is called a few times, and each time symt_find_nearest returns FALSE, because the following lines
symt_get_info(&module->addr_sorttab[0]->symt, TI_GET_ADDRESS, &ref_addr); if (addr < ref_addr) return NULL;
This is as far as I have been able to trace it. I cannot run with +relay enabled as this causes things to slow down so much that the game times out before the crash. Is there anyway I can enable the + relay from the code? (eg when the above lines of code are called?
------- Additional Comments From andrey.turkin@gmail.com 2007-18-04 17:19 ------- Native dbghelp.dll use some sort of reference counting for process structure, so it can recover from multiply SymInitialize/SymCleanup calls with identical hProcess (native increments refcount, returns TRUE and, strangely enough, sets last error to ERROR_INVALID_HANDLE). You can try hacky approach - to return from SymInitialize immediately when process_find_by_handle finds record (just put return TRUE; instead of FIXME("What to do?"). Proper way is probably to implement refcounter.