📄 module.c
字号:
printf ("wine/module: QuickTime.qts patched!!! old entry=%p\n",ptr[0]);#ifdef EMU_QTX_API wrapper_target=ptr[0]; ptr[0]=wrapper;#endif } return wm ? wm->module : 0;}/*********************************************************************** * LoadLibraryA (KERNEL32) */HMODULE WINAPI LoadLibraryA(LPCSTR libname) { return LoadLibraryExA(libname,0,0);}/*********************************************************************** * FreeLibrary */WIN_BOOL WINAPI FreeLibrary(HINSTANCE hLibModule){ WIN_BOOL retv = FALSE; WINE_MODREF *wm; wm=MODULE32_LookupHMODULE(hLibModule); if ( !wm || !hLibModule ) { SetLastError( ERROR_INVALID_HANDLE ); return 0; } else retv = MODULE_FreeLibrary( wm ); MODULE_RemoveFromList(wm); /* garbage... */ if (local_wm == NULL) my_garbagecollection(); return retv;}/*********************************************************************** * MODULE_DecRefCount * * NOTE: Assumes that the process critical section is held! */static void MODULE_DecRefCount( WINE_MODREF *wm ){ int i; if ( wm->flags & WINE_MODREF_MARKER ) return; if ( wm->refCount <= 0 ) return; --wm->refCount; TRACE("(%s) refCount: %d\n", wm->modname, wm->refCount ); if ( wm->refCount == 0 ) { wm->flags |= WINE_MODREF_MARKER; for ( i = 0; i < wm->nDeps; i++ ) if ( wm->deps[i] ) MODULE_DecRefCount( wm->deps[i] ); wm->flags &= ~WINE_MODREF_MARKER; }}/*********************************************************************** * GetProcAddress (KERNEL32.257) */FARPROC WINAPI GetProcAddress( HMODULE hModule, LPCSTR function ){ return MODULE_GetProcAddress( hModule, function, TRUE );}#ifdef DEBUG_QTX_APIstruct ComponentParameters { unsigned char flags; /* call modifiers: sync/async, deferred, immed, etc */ unsigned char paramSize; /* size in bytes of actual parameters passed to this call */ short what; /* routine selector, negative for Component management calls */ long params[1]; /* actual parameters for the indicated routine */};typedef struct ComponentParameters ComponentParameters;static char* component_func(int what){switch(what){case -1: return "kComponentOpenSelect";case -2: return "kComponentCloseSelect";case -3: return "kComponentCanDoSelect";case -4: return "kComponentVersionSelect";case -5: return "kComponentRegisterSelect";case -6: return "kComponentTargetSelect";case -7: return "kComponentUnregisterSelect";}return "???";}static char* component_func_type(int type,int what){if(type==1) switch(what){case 0: return "kImageCodecGetCodecInfoSelect";case 1: return "kImageCodecGetCompressionTimeSelect";case 5: return "kImageCodecPreDecompressSelect";case 6: return "kImageCodecBandDecompressSelect";case 0x12: return "kImageCodecDisposeMemorySelect";case 0x10: return "kImageCodecIsImageDescriptionEquivalentSelect";case 0x14: return "kImageCodecNewImageBufferMemorySelect";case 0x28: return "kImageCodecRequestGammaLevelSelect";}return "???";}static int c_level=0;static int dump_component(char* name,int type,void* _orig, ComponentParameters *params,void** glob){ int ( *orig)(ComponentParameters *params, void** glob) = _orig; int ret,i; if(params->what<0) fprintf(stderr,"%*sComponentCall: %s flags=0x%X size=%d what=%d %s\n",3*c_level,"",name,params->flags, params->paramSize, params->what, component_func(params->what)); else fprintf(stderr,"%*sComponentCall: %s flags=0x%X size=%d what=0x%X %s\n",3*c_level,"",name,params->flags, params->paramSize, params->what, component_func_type(type,params->what)); for(i=0;i<params->paramSize/4;i++) fprintf(stderr,"%*s param[%d] = 0x%X\n",3*c_level,"",i,params->params[i]); ++c_level; ret=orig(params,glob); --c_level; if(ret>=0x1000) fprintf(stderr,"%*s return=0x%X\n",3*c_level,"",ret); else fprintf(stderr,"%*s return=%d\n",3*c_level,"",ret); return ret;}#define DECL_COMPONENT(sname,name,type) \ static void* real_ ## sname = NULL; \ static int fake_ ## sname(ComponentParameters *params,void** glob){ \ return dump_component(name,type,real_ ## sname, params, glob); \ }#include "qt_comp.h"#undef DECL_COMPONENT#include "qt_fv.h"#endif#ifdef EMU_QTX_APIstatic u_int32_t ret_array[4096];static int ret_i=0;int report_func(void *stack_base, int stack_size, reg386_t *reg, u_int32_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",((u_int32_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=((u_int32_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=(u_int32_t)malloc(((u_int32_t *)stack_base)[1]); memset((void *)reg->eax,0,((u_int32_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=(u_int32_t)malloc(((u_int32_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(((u_int32_t *)stack_base)[1]>=0x60000000) printf("WARNING! Invalid Ptr handle!\n"); else free((void *)(((u_int32_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",((u_int32_t *)stack_base)[1],((u_int32_t *)stack_base)[4]);// break; case 0x00010003: printf("FUNC: CountComponents(&desc=%p)\n",((u_int32_t *)stack_base)[1]); break; case 0x00010004: printf("FUNC: FindNextComponent(prev=%p,&desc=%p)\n",((u_int32_t *)stack_base)[1],((u_int32_t *)stack_base)[2]); break; case 0x00010007: printf("FUNC: OpenComponent(prev=%p)\n",((u_int32_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", ((u_int32_t *)stack_base)[1], &(((u_int32_t *)stack_base)[2]), ((u_int32_t *)stack_base)[3], ((u_int32_t *)stack_base)[4], ((u_int32_t *)stack_base)[5], ((u_int32_t *)stack_base)[6], ((u_int32_t *)stack_base)[7], ((u_int32_t *)stack_base)[8]); break; case 0x001c0018: printf("FUNC: GetGWorldPixMap(gworld=%p)\n",((u_int32_t *)stack_base)[1]); break; case 0x00110001: printf("FUNC: Gestalt(fourcc=%.4s, &ret=%p)\n",&(((u_int32_t *)stack_base)[1]),((u_int32_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]=((u_int32_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 ", ((u_int32_t *)stack_base)[i]); } printf("}\n\n");#endif // // mess with function parameters // ((u_int32_t *)stack_base)[1] = 0x66554433;// // mess with return address...// reg->eax = 0x11223344; return 0;}int report_func_ret(void *stack_base, int stack_size, reg386_t *reg, u_int32_t *flags){#ifdef DEBUG_QTX_API int i; short err;#endif // restore ret addr: --ret_i; ((u_int32_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 ", ((u_int32_t *)stack_base)[i]); } printf("}\n\n");#endif#endif // // mess with function parameters // ((u_int32_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 caught -> %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 caught -> %p\n",retproc); wrapper_target=(void *)retproc; retproc=(void *)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 + -