https://bugs.winehq.org/show_bug.cgi?id=39874
Bug ID: 39874 Summary: Alien Shooter crashes often with access violation Product: Wine Version: 1.8 Hardware: x86 OS: Linux Status: UNCONFIRMED Severity: major Priority: P2 Component: directx-d3d Assignee: wine-bugs@winehq.org Reporter: zakarjor@yahoo.com Distribution: ---
Alien shooter (1.2 Gog version) crashes often, usually when lots of actions occur (like massive number of aliens and explosions happening all at the same time.) The error log saved by the game inside Logs directory shows the following at the end:
!!!ERROR 09:28:10!!!SOUND: 0x6A Invalid nsfx !!!ERROR 09:28:43!!!TEXTURE: 0x8876086C Couldn't lock !!!ERROR EXCEPTION 0x41B57C!!!: Access violation write to 0x0
Looking at the wine source, it looks like LockRect() in d3d8/surface.c is returning D3DERR_INVALIDCALL after checking for invalid rect.
By patching the file to comment out the checking logic, the game seems to play flawlessly (currently played to level 10 without any crash.)
The checking logic seems to have been added in 2006: http://source.winehq.org/git/?p=wine.git;a=commit;h=77448f588b888ecc724c7ead...
I'm not sure if this is the right way to fix it, but at least it works, and I haven't seen any effect with other games I have. Looking at d3d9/surface.c, I can see that the checking logic doesn't exist in d3d9 LockRect(), and I've seen Internet examples of LockRect() passing invalid rectangles with impunity (like zero width rectangles).