http://bugs.winehq.org/show_bug.cgi?id=26016
--- Comment #6 from Nikolay Sivov bunglehead@gmail.com 2013-07-24 03:12:43 CDT --- Actually I was wrong. It was a way heap allocation works that confused me, actually table are allocated on heap and are plain pointers, not handles of any kind. I was able to figure out basic structure of it:
--- struct stringtable { void *data; /* pointer to actual string data */ DWORD offset; /* offset where data actually starts */ DWORD allocated; /* allocated byte size 'data' points to */ DWORD unk[3]; LCID lcid; /* thread LCID, it's store on allocation and probably used to compare */ } ---
Returned string ids are offsets from 'data' pointer to actual string data. I didn't try to see what happens with extra data.
So unless there's an indication that installer uses internal structure for something it looks like a general heap corruption.