user32: Call the EnumChildWindows callback using a wrapper.
Dmitry Timoshkov
dmitry at baikal.ru
Tue Dec 8 05:35:51 CST 2015
Sebastian Lackner <sebastian at fds-team.de> wrote:
> > +extern LRESULT WNDENUMPROC_wrapper( WNDENUMPROC proc, HWND hwnd, LPARAM lparam );
> > +__ASM_GLOBAL_FUNC( WNDENUMPROC_wrapper,
> > + "pushl %ebp\n\t"
> > + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
> > + __ASM_CFI(".cfi_rel_offset %ebp,0\n\t")
> > + "movl %esp,%ebp\n\t"
> > + __ASM_CFI(".cfi_def_cfa_register %ebp\n\t")
> > + "pushl %edi\n\t"
> > + __ASM_CFI(".cfi_rel_offset %edi,-4\n\t")
> > + "pushl %esi\n\t"
> > + __ASM_CFI(".cfi_rel_offset %esi,-8\n\t")
> > + "pushl %ebx\n\t"
> > + __ASM_CFI(".cfi_rel_offset %ebx,-12\n\t")
> > + "pushl 16(%ebp)\n\t"
> > + "pushl 12(%ebp)\n\t"
> > + "movl 8(%ebp),%eax\n\t"
> > + "call *%eax\n\t"
>
> There is no need to safe edi/esi/ebx when the purpose is just to be compatible with cdecl
> calling conventions. Also, you should try to keep the stack aligned, like most other
> assembler wrappers do.
I just copied the wrapper code from hook.c and adapted number of parameters,
winproc.c uses a similar wrapper.
> Does it also work with something like:
> http://source.winehq.org/git/wine.git/blob/HEAD:/dlls/dinput/dinput_main.c#l357 ?
I was never able to reproduce the problem myself under Linux, just guessed what
happened from the backtrace and the suggested patch worked under MacOSX, so I
won't be able to test, but yes, this wrapper looks a lot simpler.
--
Dmitry.
More information about the wine-devel
mailing list