https://bugs.winehq.org/show_bug.cgi?id=38269
Alexandre Julliard julliard@winehq.org changed:
What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |NOTOURBUG Status|NEW |RESOLVED
--- Comment #10 from Alexandre Julliard julliard@winehq.org --- The app is loading the Jabo_DInput.dll plugin and calling its GetDllInfo entry point. It then checks the returned structure for Type == 4 (controller) and Version == 0x100, which matches. It then checks that offset 0x6c in that structure contains non-zero:
0x00449532: call *0x46007c -> 0x7b457f80 LoadLibraryA in kernel32 0x00449538: testl %eax,%eax 0x0044953a: movl %eax,0x0048de90 0x0044953f: jz 0x00449592 0x00449541: movl 0x00460078,%esi 0x00449547: pushl $0x469594 0x0044954c: pushl %eax 0x0044954d: call *%esi -> GetProcAddress 0x0044954f: testl %eax,%eax 0x00449551: movl %eax,0x00493e48 0x00449556: jz 0x00449592 0x00449558: leal 0xc(%esp),%ecx 0x0044955c: pushl %ecx 0x0044955d: call *%eax -> GetDllInfo 0x0044955f: movl 0x12(%esp),%edx 0x00449563: andl $0xffff,%edx 0x00449569: leal 0xffffffff(%edx),%eax 0x0044956c: addl $4,%esp 0x0044956f: cmpl $3,%eax 0x00449572: jnbe 0x00449592 0x00449574: jmp *0x4496e8(,%eax,4) [...] 0x004495c6: movw 0xc(%esp),%ax 0x004495cb: cmpw $256,%ax 0x004495cf: jnz 0x00449592 0x004495d1: movl 0x78(%esp),%ecx 0x004495d5: testl %ecx,%ecx 0x004495d7: jz 0x00449592 (jump in failure case)
The structure is apparently:
typedef struct { WORD Version; WORD Type; char Name[100]; BOOL NormalMemory; BOOL MemoryBswaped; } PLUGIN_INFO;
So it wants MemoryBswaped to be non-zero. But the plugin never puts anything in there:
0x011f2e10 GetDllInfo in jabo_dinput: movl 0x4(%esp),%eax 0x011f2e14: pushl $0x11f7aa4 0x011f2e19: pushl $0x11f7b3c 0x011f2e1e: movw $0x100,0x0(%eax) 0x011f2e23: movw $0x4,0x2(%eax) 0x011f2e29: addl $4,%eax 0x011f2e2c: pushl %eax 0x011f2e2d: call *0x11f6068 -> 0x7bdc2240 MSVCRT_sprintf 0x011f2e33: addl $12,%esp 0x011f2e36: ret
As expected, it's checking uninitialized stack data, and will fail randomly if that stack address happens to contain 0. It's a plugin bug, and I don't see a good way of working around it in Wine.