You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
6.0 KiB
210 lines
6.0 KiB
Index: vlc-0.9.0-svn/libs/loader/Makefile.am
|
|
===================================================================
|
|
--- vlc-0.9.0-svn.orig/libs/loader/Makefile.am
|
|
+++ vlc-0.9.0-svn/libs/loader/Makefile.am
|
|
@@ -16,7 +16,7 @@ endif
|
|
# TODO: real check for vsscanf() and <sys/mmap.h>
|
|
AM_CPPFLAGS = -D__WINE__ -DHAVE_SYS_MMAN_H=1 -DHAVE_VSSCANF=1 \
|
|
-DWIN32_PATH=\"\" -DTRACE\(...\)=\(void\)0
|
|
-AM_CFLAGS = -fno-PIC `$(top_builddir)/vlc-config --cflags` -U_FILE_OFFSET_BITS \
|
|
+AM_CFLAGS = -fPIC `$(top_builddir)/vlc-config --cflags` -U_FILE_OFFSET_BITS \
|
|
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
|
|
|
|
noinst_HEADERS = com.h driver.h ext.h ldt_keeper.h loader.h registry.h \
|
|
Index: vlc-0.9.0-svn/libs/loader/module.c
|
|
===================================================================
|
|
--- vlc-0.9.0-svn.orig/libs/loader/module.c
|
|
+++ vlc-0.9.0-svn/libs/loader/module.c
|
|
@@ -63,8 +63,8 @@
|
|
|
|
#ifdef EMU_QTX_API
|
|
#include "wrapper.h"
|
|
-static int report_func(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags);
|
|
-static int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags);
|
|
+int report_func(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags);
|
|
+int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags);
|
|
#endif
|
|
|
|
//#undef TRACE
|
|
@@ -572,8 +572,6 @@ HMODULE WINAPI LoadLibraryExA(LPCSTR lib
|
|
fprintf(stderr,"QuickTime.qts patched!!! old entry=%p\n",ptr[0]);
|
|
|
|
#ifdef EMU_QTX_API
|
|
- report_entry = report_func;
|
|
- report_ret = report_func_ret;
|
|
wrapper_target=ptr[0];
|
|
ptr[0]=wrapper;
|
|
#endif
|
|
@@ -754,7 +752,7 @@ static int dump_component(char* name,int
|
|
static uint32_t ret_array[4096];
|
|
static int ret_i=0;
|
|
|
|
-static int report_func(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags)
|
|
+int report_func(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags)
|
|
{
|
|
#ifdef DEBUG_QTX_API
|
|
int i;
|
|
@@ -953,7 +951,7 @@ static int report_func(void *stack_base,
|
|
return 0;
|
|
}
|
|
|
|
-static int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags)
|
|
+int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags)
|
|
{
|
|
int i;
|
|
short err;
|
|
@@ -1066,8 +1064,6 @@ FARPROC MODULE_GetProcAddress(
|
|
// || !strcmp(function,"_CallComponent")
|
|
){
|
|
fprintf(stderr,"theQuickTimeDispatcher catched -> %p\n",retproc);
|
|
- report_entry = report_func;
|
|
- report_ret = report_func_ret;
|
|
wrapper_target=(void(*)(void))retproc;
|
|
retproc=(FARPROC)wrapper;
|
|
}
|
|
Index: vlc-0.9.0-svn/libs/loader/stubs.s
|
|
===================================================================
|
|
--- vlc-0.9.0-svn.orig/libs/loader/stubs.s
|
|
+++ vlc-0.9.0-svn/libs/loader/stubs.s
|
|
@@ -33,3 +33,6 @@ exp_EH_prolog:
|
|
leal 12(%esp), %ebp
|
|
pushl %eax
|
|
ret
|
|
+
|
|
+.section .note.GNU-stack,"",@progbits
|
|
+
|
|
Index: vlc-0.9.0-svn/libs/loader/wrapper.S
|
|
===================================================================
|
|
--- vlc-0.9.0-svn.orig/libs/loader/wrapper.S
|
|
+++ vlc-0.9.0-svn/libs/loader/wrapper.S
|
|
@@ -1,17 +1,19 @@
|
|
.section .data
|
|
-.globl caller_return
|
|
caller_return:
|
|
.long 0
|
|
-.globl report_entry
|
|
-report_entry:
|
|
- .long null_call
|
|
-.globl report_ret
|
|
-report_ret:
|
|
- .long null_call
|
|
.global wrapper_target
|
|
wrapper_target:
|
|
.long null_call
|
|
|
|
+#undef __i686 /* gcc define gets in our way */
|
|
+ .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits
|
|
+.globl __i686.get_pc_thunk.bx
|
|
+ .hidden __i686.get_pc_thunk.bx
|
|
+ .type __i686.get_pc_thunk.bx,@function
|
|
+__i686.get_pc_thunk.bx:
|
|
+ movl (%esp), %ebx
|
|
+ ret
|
|
+
|
|
.section .text
|
|
.globl null_call
|
|
.type null_call, @function
|
|
@@ -22,46 +24,60 @@ null_call:
|
|
.type wrapper, @function
|
|
.balign 16,0x90
|
|
wrapper:
|
|
+ pushl $0
|
|
pusha # store registers (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)
|
|
pushf # store flags
|
|
|
|
push %ebp # set up a stack frame
|
|
movl %esp, %ebp
|
|
|
|
+ call __i686.get_pc_thunk.bx
|
|
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
|
+
|
|
leal 4(%ebp), %eax # push flags addr
|
|
push %eax
|
|
leal 8(%ebp), %eax # push registers addr
|
|
push %eax
|
|
-
|
|
- leal 40(%ebp), %edx
|
|
+
|
|
+ leal 44(%ebp), %edx
|
|
movl (%ebp), %eax
|
|
subl %edx, %eax
|
|
push %eax
|
|
push %edx
|
|
-
|
|
- call *report_entry # report entry
|
|
-
|
|
+
|
|
+ call report_func@PLT # report entry
|
|
+
|
|
test %eax, %eax
|
|
jnz .Ldone
|
|
|
|
+ movl 44(%ebp), %eax # switch return addresses
|
|
+ movl %eax, caller_return@GOTOFF(%ebx)
|
|
+ leal .Lwrapper_return@GOTOFF(%ebx), %eax
|
|
+ movl %eax, 40(%ebp)
|
|
+
|
|
+ movl wrapper_target@GOTOFF(%ebx), %eax
|
|
+ mov %eax, 40(%ebp) # wrapper_target should return at .Lwrapper_return
|
|
+
|
|
leave # restore %esp, %ebp
|
|
popf # restore flags
|
|
popa # restore registers
|
|
-
|
|
- popl caller_return # switch return addresses
|
|
- pushl $.Lwrapper_return
|
|
-
|
|
- jmp *wrapper_target # wrapper_target should return at .Lwrapper_return
|
|
+
|
|
+ ret
|
|
|
|
.balign 16, 0x90
|
|
.Lwrapper_return:
|
|
- pushl caller_return # restore the original return address
|
|
+ pushl $0 # restore the original return address
|
|
pusha # more for reference sake here
|
|
pushf
|
|
|
|
push %ebp # set up a stack frame
|
|
movl %esp, %ebp
|
|
|
|
+ call __i686.get_pc_thunk.bx
|
|
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
|
|
+ movl caller_return@GOTOFF(%ebx), %eax
|
|
+ movl %eax, 40(%ebp) # restore the original return address
|
|
+
|
|
leal 4(%ebp), %eax # push flags addr
|
|
push %eax
|
|
leal 8(%ebp), %eax # push registers addr
|
|
@@ -73,11 +89,13 @@ wrapper:
|
|
push %eax
|
|
push %edx
|
|
|
|
- call *report_ret # report the return information (same args)
|
|
+ call report_func_ret@PLT# report the return information (same args)
|
|
.Ldone:
|
|
|
|
leave
|
|
popf
|
|
popa
|
|
ret
|
|
-
|
|
+
|
|
+.section .note.GNU-stack,"",@progbits
|
|
+
|
|
Index: vlc-0.9.0-svn/libs/loader/wrapper.h
|
|
===================================================================
|
|
--- vlc-0.9.0-svn.orig/libs/loader/wrapper.h
|
|
+++ vlc-0.9.0-svn/libs/loader/wrapper.h
|
|
@@ -7,10 +7,6 @@ typedef struct {
|
|
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
|
|
} reg386_t;
|
|
|
|
-typedef int (*wrapper_func_t)(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags);
|
|
-
|
|
-extern wrapper_func_t report_entry, report_ret;
|
|
-
|
|
extern void (*wrapper_target)(void);
|
|
|
|
extern int wrapper(void);
|