📄 module.c
字号:
#include "qt_comp.h"#undef DECL_COMPONENT#include "qt_fv.h"#endif#ifdef EMU_QTX_APIstatic 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){#ifdef DEBUG_QTX_API int i; int* dptr; void* pwrapper=NULL; void* pptr=NULL; char* pname=NULL; int plen=-1; // find the code: dptr=0x62b67ae0;dptr+=2*((reg->eax>>16)&255);// printf("FUNC: flag=%d ptr=%p\n",dptr[0],dptr[1]); if(dptr[0]&255){ dptr=dptr[1];dptr+=4*(reg->eax&65535);// printf("FUNC: ptr2=%p eax=%p edx=%p\n",dptr[1],dptr[0],dptr[2]); pwrapper=dptr[1]; pptr=dptr[0]; plen=dptr[2]; } else { pwrapper=0x62924910; switch(dptr[1]){ case 0x629248d0: dptr=0x62b672c0;dptr+=2*(reg->eax&65535);// printf("FUNC: ptr2=%p eax=%p edx=%p\n",0x62924910,dptr[0],dptr[1]); pptr=dptr[0]; plen=dptr[1]; break; case 0x62924e40: dptr=0x62b67c70;dptr+=2*(reg->eax&65535);// printf("FUNC: ptr2=%p eax=%p edx=%p\n",0x62924910,dptr[0],dptr[1]); pptr=dptr[0]; plen=dptr[1]; break; case 0x62924e60: dptr=0x62b68108;if(reg->eax&0x8000) dptr+=2*(reg->eax|0xffff0000); else dptr+=2*(reg->eax&65535);// printf("FUNC: ptr2=%p eax=%p edx=%p\n",0x62924910,dptr[0],dptr[1]); pptr=dptr[0]; plen=dptr[1]; break; case 0x62924e80: dptr=0x62b68108;if(reg->eax&0x8000) dptr+=2*(reg->eax|0xffff0000); else dptr+=2*(reg->eax&65535);// printf("FUNC: ptr2=%p eax=%p edx=%p\n",0x62924910,dptr[0],dptr[1]); pptr=dptr[0]; plen=dptr[1]; break; default: printf("FUNC: unknown ptr & psize!\n"); pwrapper=dptr[1]; } } for(i=0;qt_fv_list[i].name;i++){ if(qt_fv_list[i].id==reg->eax){ pname=qt_fv_list[i].name; break; } } printf("FUNC[%X/%s]: wrapper=%p func=%p len=%d\n",reg->eax, pname?pname:"???",pwrapper,pptr,plen); printf("FUNC: caller=%p ebx=%p\n",((uint32_t *)stack_base)[0],reg->ebx); if(pname) printf("%*sENTER(%d): %s(",ret_i*2,"",ret_i,pname); else printf("%*sENTER(%d): %X(",ret_i*2,"",ret_i,reg->eax); for (i=0;i<plen/4;i++){ unsigned int val=((uint32_t *)stack_base)[1+i]; unsigned char* fcc=&val; printf("%s0x%X", i?", ":"",val); if(fcc[0]>=0x20 && fcc[0]<128 && fcc[1]>=0x20 && fcc[1]<128 && fcc[2]>=0x20 && fcc[2]<128 && fcc[3]>=0x20 && fcc[3]<128) printf("='%c%c%c%c'",fcc[3],fcc[2],fcc[1],fcc[0]); else if(val>=8 && val<65536) printf("=%d",val); } printf(")\n"); fflush(stdout);#endif #if 1 // emulate some functions: switch(reg->eax){ // memory management: case 0x150011: //NewPtrClear case 0x150012: //NewPtrSysClear reg->eax=(uint32_t)malloc(((uint32_t *)stack_base)[1]); memset((void *)reg->eax,0,((uint32_t *)stack_base)[1]);#ifdef DEBUG_QTX_API printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax);#endif return 1; case 0x15000F: //NewPtr case 0x150010: //NewPtrSys reg->eax=(uint32_t)malloc(((uint32_t *)stack_base)[1]);#ifdef DEBUG_QTX_API printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax);#endif return 1; case 0x15002f: //DisposePtr if(((uint32_t *)stack_base)[1]>=0x60000000) printf("WARNING! Invalid Ptr handle!\n"); else free((void *)((uint32_t *)stack_base)[1]); reg->eax=0;#ifdef DEBUG_QTX_API printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax);#endif return 1; // mutexes: case 0x1d0033: //QTMLCreateMutex reg->eax=0xdeadbabe;#ifdef DEBUG_QTX_API printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax);#endif return 1; case 0x1d0034: //QTMLDestroyMutex case 0x1d0035: //QTMLGrabMutex case 0x1d0036: //QTMLReturnMutex case 0x1d003d: //QTMLTryGrabMutex reg->eax=0;#ifdef DEBUG_QTX_API printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax);#endif return 1; }#endif#if 0 switch(reg->eax){// case 0x00010000:// printf("FUNC: ImageCodecInitialize/ImageCodecGetCodecInfo(ci=%p,&icap=%p)\n",((uint32_t *)stack_base)[1],((uint32_t *)stack_base)[4]);// break; case 0x00010003: printf("FUNC: CountComponents(&desc=%p)\n",((uint32_t *)stack_base)[1]); break; case 0x00010004: printf("FUNC: FindNextComponent(prev=%p,&desc=%p)\n",((uint32_t *)stack_base)[1],((uint32_t *)stack_base)[2]); break; case 0x00010007: printf("FUNC: OpenComponent(prev=%p)\n",((uint32_t *)stack_base)[1]); break; case 0x0003008b: printf("FUNC: QTNewGWorldFromPtr(&pts=%p,fourcc=%.4s,&rect=%p,x1=%p,x2=%p,x3=%p,plane=%p,stride=%d)\n", ((uint32_t *)stack_base)[1], &(((uint32_t *)stack_base)[2]), ((uint32_t *)stack_base)[3], ((uint32_t *)stack_base)[4], ((uint32_t *)stack_base)[5], ((uint32_t *)stack_base)[6], ((uint32_t *)stack_base)[7], ((uint32_t *)stack_base)[8]); break; case 0x001c0018: printf("FUNC: GetGWorldPixMap(gworld=%p)\n",((uint32_t *)stack_base)[1]); break; case 0x00110001: printf("FUNC: Gestalt(fourcc=%.4s, &ret=%p)\n",&(((uint32_t *)stack_base)[1]),((uint32_t *)stack_base)[2]); break; default: { int i; for(i=0;qt_fv_list[i].name;i++){ if(qt_fv_list[i].id==reg->eax){ printf("FUNC: %s\n",qt_fv_list[i].name); break; } } } } // print stack/reg information printf("ENTER(%d) stack = %d bytes @ %p\n" "eax = 0x%08x edx = 0x%08x ebx = 0x%08x ecx = 0x%08x\n" "esp = 0x%08x ebp = 0x%08x esi = 0x%08x edi = 0x%08x\n" "flags = 0x%08x\n", ret_i, stack_size, stack_base, reg->eax, reg->edx, reg->ebx, reg->ecx, reg->esp, reg->ebp, reg->esi, reg->edi, *flags);#endif // save ret addr: ret_array[ret_i]=((uint32_t *)stack_base)[0]; ++ret_i;#if 0 // print first 7 longs in the stack (return address, arg[1], arg[2] ... ) printf("stack[] = { "); for (i=0;i<7;i++) { printf("%08x ", ((uint32_t *)stack_base)[i]); } printf("}\n\n");#endif // // mess with function parameters // ((uint32_t *)stack_base)[1] = 0x66554433;// // mess with return address...// reg->eax = 0x11223344; return 0;}static int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, uint32_t *flags){ //int i; short err; // restore ret addr: --ret_i; ((uint32_t *)stack_base)[0]=ret_array[ret_i];#ifdef DEBUG_QTX_API#if 1 printf("%*sLEAVE(%d): 0x%X",ret_i*2,"",ret_i, reg->eax); err=reg->eax; if(err && (reg->eax>>16)==0) printf(" = %d",err); printf("\n"); fflush(stdout);#else // print stack/reg information printf("LEAVE(%d) stack = %d bytes @ %p\n" "eax = 0x%08x edx = 0x%08x ebx = 0x%08x ecx = 0x%08x\n" "esp = 0x%08x ebp = 0x%08x esi = 0x%08x edi = 0x%08x\n" "flags = 0x%08x\n", ret_i, stack_size, stack_base, reg->eax, reg->edx, reg->ebx, reg->ecx, reg->esp, reg->ebp, reg->esi, reg->edi, *flags);#endif#if 0 // print first 7 longs in the stack (return address, arg[1], arg[2] ... ) printf("stack[] = { "); for (i=0;i<7;i++) { printf("%08x ", ((uint32_t *)stack_base)[i]); } printf("}\n\n");#endif#endif // // mess with function parameters // ((uint32_t *)stack_base)[1] = 0x66554433;// // mess with return address...// reg->eax = 0x11223344; return 0;}#endif/*********************************************************************** * MODULE_GetProcAddress (internal) */FARPROC MODULE_GetProcAddress( HMODULE hModule, /* [in] current module handle */ LPCSTR function, /* [in] function to be looked up */ WIN_BOOL snoop ){ WINE_MODREF *wm = MODULE32_LookupHMODULE( hModule );// WINE_MODREF *wm=local_wm; FARPROC retproc;#ifdef DEBUG_QTX_API if (HIWORD(function)) fprintf(stderr,"XXX GetProcAddress(%08lx,%s)\n",(DWORD)hModule,function); else fprintf(stderr,"XXX GetProcAddress(%08lx,%p)\n",(DWORD)hModule,function);#endif// TRACE_(win32)("(%08lx,%s)\n",(DWORD)hModule,function);// else// TRACE_(win32)("(%08lx,%p)\n",(DWORD)hModule,function); if (!wm) { SetLastError(ERROR_INVALID_HANDLE); return (FARPROC)0; } switch (wm->type) { case MODULE32_PE: retproc = PE_FindExportedFunction( wm, function, snoop ); if (!retproc) SetLastError(ERROR_PROC_NOT_FOUND); break;#ifdef HAVE_LIBDL case MODULE32_ELF: retproc = (FARPROC) dlsym( (void*) wm->module, function); if (!retproc) SetLastError(ERROR_PROC_NOT_FOUND); return retproc;#endif default: ERR("wine_modref type %d not handled.\n",wm->type); SetLastError(ERROR_INVALID_HANDLE); return (FARPROC)0; }#ifdef EMU_QTX_API if (HIWORD(function) && retproc){#ifdef DEBUG_QTX_API#define DECL_COMPONENT(sname,name,type) \ if(!strcmp(function,name)){ \ fprintf(stderr,name "dispatcher catched -> %p\n",retproc); \ real_ ## sname = retproc; retproc = fake_ ## sname; \ }#include "qt_comp.h"#undef DECL_COMPONENT#endif if(!strcmp(function,"theQuickTimeDispatcher")// || !strcmp(function,"_CallComponentFunctionWithStorage")// || !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; } }#endif return retproc;}static int acounter = 0;void CodecAlloc(void){ acounter++; //printf("**************CODEC ALLOC %d\n", acounter);}void CodecRelease(void){ acounter--; //printf("**************CODEC RELEASE %d\n", acounter); if (acounter == 0) { for (;;) { modref_list* list = local_wm; if (!local_wm) break; //printf("CODECRELEASE %p\n", list); MODULE_FreeLibrary(list->wm); MODULE_RemoveFromList(list->wm); if (local_wm == NULL) my_garbagecollection(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -