return CONTAINING_RECORD(iface, StdProxyImpl, PVtbl); } #ifdef __i386__ extern void call_stubless_func(void); __ASM_GLOBAL_FUNC(call_stubless_func, "movl 4(%esp),%ecx\n\t" /* This pointer */ "movl (%ecx),%ecx\n\t" /* This->lpVtbl */ "movl -8(%ecx),%ecx\n\t" /* MIDL_STUBLESS_PROXY_INFO */ "movl 8(%ecx),%edx\n\t" /* info->FormatStringOffset */ "movzwl (%edx,%eax,2),%edx\n\t" /* FormatStringOffset[index] */ "addl 4(%ecx),%edx\n\t" /* info->ProcFormatString + offset */ "movzwl 8(%edx),%eax\n\t" /* arguments size */ "pushl %eax\n\t" __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "leal 8(%esp),%eax\n\t" /* &This */ "pushl %eax\n\t" __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl %edx\n\t" /* format string */ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "pushl (%ecx)\n\t" /* info->pStubDesc */ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") "call " __ASM_NAME("ndr_client_call") "\n\t" "leal 12(%esp),%esp\n\t" __ASM_CFI(".cfi_adjust_cfa_offset -12\n\t") "popl %edx\n\t" /* arguments size */ __ASM_CFI(".cfi_adjust_cfa_offset -4\n\t") "movl (%esp),%ecx\n\t" /* return address */ "addl %edx,%esp\n\t" "jmp *%ecx" );
#ifdef __i386__ /* Some apps pass a non-stdcall callback to EnumDisplayMonitors, * so we need a small assembly wrapper to call it. * MJ's Help Diagnostic expects that %ecx contains the address to the rect. */ struct enumdisplaymonitors_lparam { MONITORENUMPROC proc; LPARAM lparam; }; extern BOOL CALLBACK enumdisplaymonitors_callback_wrapper(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM lparam); __ASM_STDCALL_FUNC( enumdisplaymonitors_callback_wrapper, 16, "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") "subl $8,%esp\n\t" "movl 20(%ebp),%eax\n\t" /* struct enumdisplaymonitors_lparam *orig = (struct enumdisplaymonitors_lparam*)lparam */ "pushl 4(%eax)\n\t" /* push orig->lparam */ "pushl 16(%ebp)\n\t" "pushl 12(%ebp)\n\t" "pushl 8(%ebp)\n\t" "movl 16(%ebp),%ecx\n\t" "call *(%eax)\n\t" /* call orig->proc */ "leave\n\t" __ASM_CFI(".cfi_def_cfa %esp,4\n\t") __ASM_CFI(".cfi_same_value %ebp\n\t") "ret $16" )
} SERVER_END_REQ; TRACE( "%s %p %x -> %p\n", hook_names[id-WH_MINHOOK], proc, tid, handle ); return handle; } #ifdef __i386__ /* Some apps pass a non-stdcall proc to SetWindowsHookExA, * so we need a small assembly wrapper to call the proc. */ extern LRESULT HOOKPROC_wrapper( HOOKPROC proc, INT code, WPARAM wParam, LPARAM lParam ); __ASM_GLOBAL_FUNC( HOOKPROC_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 20(%ebp)\n\t" "pushl 16(%ebp)\n\t" "pushl 12(%ebp)\n\t" "movl 8(%ebp),%eax\n\t" "call *%eax\n\t" "leal -12(%ebp),%esp\n\t"