⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -