http://bugs.winehq.org/show_bug.cgi?id=30745
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW CC| |focht@gmx.net Component|-unknown |kernel32 Summary|Soulbringer, GOG version, |GOG.com version of |crashes at start, no splash |Soulbringer crashes on |screen even. |startup (GetModuleHandleExW | |needs to support | |GET_MODULE_HANDLE_EX_FLAG_P | |IN) Ever Confirmed|0 |1
--- Comment #7 from Anastasius Focht focht@gmx.net 2013-10-12 07:31:27 CDT --- Hello folks,
confirming. Bought the game for a few bucks just for analysis.
In short: There is an in-process patcher dll that requires to stay in memory until the process exits (makes use of GET_MODULE_HANDLE_EX_FLAG_PIN flag which Wine doesn't implement).
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/GOG.com/Soulbringer ... $ WINEDEBUG=+tid,+seh,wine ./Soulbringer.exe ... 0009:trace:loaddll:load_native_dll Loaded L"C:\Program Files\GOG.com\Soulbringer\PATCH.dll" at 0x3c0000: native 0009:trace:loaddll:load_native_dll Loaded L"C:\Program Files\GOG.com\Soulbringer\data\Stealth\Render\D3d6Lib.dll" at 0x10000000: native ... 0009:fixme:module:GetModuleHandleExW should pin refcount for 0x3c0000 ... 0009:trace:loaddll:free_modref Unloaded module L"C:\Program Files\GOG.com\Soulbringer\data\Stealth\Render\D3d6Lib.dll" : native 0009:trace:loaddll:free_modref Unloaded module L"C:\Program Files\GOG.com\Soulbringer\PATCH.dll" : native ... 0009:trace:loaddll:load_native_dll Loaded L"C:\Program Files\GOG.com\Soulbringer\PATCH.dll" at 0x3c0000: native 0009:trace:loaddll:load_native_dll Loaded L"C:\Program Files\GOG.com\Soulbringer\D3d7Lib.dll" at 0x10000000: native ... 0009:fixme:module:GetModuleHandleExW should pin refcount for 0x3c0000 ... 0009:trace:loaddll:free_modref Unloaded module L"C:\Program Files\GOG.com\Soulbringer\D3d7Lib.dll" : native 0009:trace:loaddll:free_modref Unloaded module L"C:\Program Files\GOG.com\Soulbringer\PATCH.dll" : native 0009:trace:loaddll:free_modref Unloaded module L"C:\windows\system32\dinput.dll" : builtin 0009:trace:loaddll:free_modref Unloaded module L"C:\windows\system32\winmm.dll" : builtin 0009:trace:loaddll:free_modref Unloaded module L"C:\windows\system32\msacm32.dll" : builtin 0009:trace:seh:raise_exception code=c0000005 flags=0 addr=0x3c2320 ip=003c2320 tid=0009 0009:trace:seh:raise_exception info[0]=00000000 0009:trace:seh:raise_exception info[1]=003c2320 0009:trace:seh:raise_exception eax=00000000 ebx=7ea69ec2 ecx=0033f8f8 edx=0016ed6d esi=0033f8f8 edi=00000000 0009:trace:seh:raise_exception ebp=0033ea68 esp=0033ea24 cs=0023 ds=002b es=002b fs=0063 gs=006b flags=00010206 0009:trace:seh:call_stack_handlers calling handler at 0x5f492e0a code=c0000005 flags=0 ... --- snip ---
When being loaded, "PATCH.dll" inserts hooks at several locations in main executable. The game code eventually hits such a hook while the dll was already unloaded (not pinned in memory).
MSDN for GetModuleHandleEx(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms683200%28v=vs.85%2...
Source: http://source.winehq.org/git/wine.git/blob/c0e72bb3626a7ba8090ee07cc0aa88cd5...
--- snip --- 505 BOOL WINAPI GetModuleHandleExW( DWORD flags, LPCWSTR name, HMODULE *module ) 506 { ... 538 if (status == STATUS_SUCCESS) 539 { 540 if (flags & GET_MODULE_HANDLE_EX_FLAG_PIN) 541 FIXME( "should pin refcount for %p\n", ret ); 542 else if (!(flags & GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT)) 543 LdrAddRefDll( 0, ret ); 544 } ... 554 return (status == STATUS_SUCCESS); 555 } --- snip ---
$ du -sh setup_soulbringer.exe 828M setup_soulbringer.exe
$ sha1sum setup_soulbringer.exe 5be1a70a24e37212bfeaa02a29d8d86af9cf2fca setup_soulbringer.exe
$ wine --version wine-1.7.4
Regards