SIGSEGV in IDirectDrawImpl_EnumDisplayModes
Lionel Ulmer
lionel.ulmer at free.fr
Fri Nov 1 08:54:14 CST 2002
> Okay, if it'll help you although my knowledge of x86 calling conventions and
> post-286 instructions etc. (last x86 I wrote was in a BIOS five years ago) is
> pretty hopeless :-)
Well, I am not very good at X86 ASM either, but well, the problem lies here :
> 2fe0: 8b 57 08 mov 0x8(%edi),%edx
%edx is the address of the COM object (IDirectDraw)
> 2fe3: 8b 0a mov (%edx),%ecx
%ecx is the address of the VTable
> 2fe5: 6a 00 push $0x0
> 2fe7: 8d 47 10 lea 0x10(%edi),%eax
> 2fea: 50 push %eax
> 2feb: 53 push %ebx
> 2fec: 52 push %edx
All arguments are pushed on the stack (with the last being the
pointer to the COM object itself).
> 2fed: 8b 41 20 mov 0x20(%ecx),%eax
%eax is the address of the method
> 2ff0: ff d0 call *%eax
Which is called here.
The problem being that the method at the offset '0x20' in the VTable is NOT
CreateSurface (as you want to use in the code) but 'EnumDisplayModes' and
thus the crash.
I will now look at how the VTable is built for COM objects in the case of
C++ (you are building with g++, no ?) and try to understand why this
particular code is generated.
Lionel
--
Lionel Ulmer - http://www.bbrox.org/
More information about the wine-devel
mailing list