#define ARG1 data_ptr[0] #define ARG2 data_ptr[1] #define ARG3 data_ptr[2] #define ARG4 data_ptr[3] #define ARG5 data_ptr[4] #define ARG6 data_ptr[5] #define ARG7 data_ptr[6] #define ARG8 data_ptr[7] #define RETURN data_ptr[8]= #define ANSWER data_ptr[8] #define FC_LIST data_ptr[9] #define EXECHDL2 data_ptr[10] #define COPIEHDL2 data_ptr[11] typedef void (*Func_Ptr)(void); Func_Ptr *fc_ptr; void close_lib_(long *data_ptr) { if(EXECHDL2) HeapUnlock(EXECHDL2); if(COPIEHDL2) HeapFree(COPIEHDL2); if(data_ptr) free(data_ptr); } char add_lib_ref(char *file_str,long lib_ref) //loadasm (1) { char buff[20]; sprintf(buff,"anpptemp\\%s",file_str); FolderAdd(SYMSTR("anpptemp")); unarchiv(buff); return toos(buff,lib_ref); } long load_lib_ref(char *file_str) { char buff[20]; sprintf(buff,"anpptemp\\%s",file_str); return osvar2_2(buff); } void del_file_with_lib_ref(long lib_ref) { SYM_ENTRY *SymPtr; char buff[20],c; c=0; SymPtr=SymFindFirst(SYMSTR("anpptemp"),FO_SINGLE_FOLDER); while (SymPtr) { c++; sprintf(buff,"anpptemp\\%s",SymPtr->name); if(osvar2_2(buff)==lib_ref) { unarchiv(buff); SymDel(SYMSTR(buff)); } SymPtr=SymFindNext (); } if(c==1) FolderDel(SYMSTR("anpptemp")); } long *loadlib(unsigned char *buff_name) { unsigned char *exe_name_str ; char *pOriginalExec, *pCopiedExec, isarchived; HARDWARE_PARM_BLOCK *hpb; short hardwareVersion; long ghost_offset,loaded_ref; unsigned short ExecLength; SYM_ENTRY *SymPtr; unsigned char nbargs_bin; //ie execasm HANDLE CopieHdl2,ExecHdl2; long temp,*data_ptr; unsigned char *fptr; //strcpy(buff_name,getpuc); exe_name_str=buff_name; isarchived=0; if(!(loaded_ref=load_lib_ref(exe_name_str))) //si la librairie n'est pas déjà chargée { SymPtr=DerefSym(SymFind(SYMSTR (exe_name_str))); ExecHdl2=SymPtr->handle; isarchived=SymPtr->flags.bits.archived; if (HeapGetLock(ExecHdl2)) { pCopiedExec= pOriginalExec= HeapDeref(ExecHdl2); ExecHdl2= 0; } else { HeapMoveHigh(ExecHdl2); pCopiedExec= pOriginalExec= HLock(ExecHdl2); } ExecLength= *(unsigned short *)pCopiedExec + 3; if (isarchived) { CopieHdl2= HeapAllocHigh(ExecLength); if (CopieHdl2 == H_NULL) { if (ExecHdl2) HeapUnlock(ExecHdl2); printf("\nError : unable to open %s.89z.",buff_name); ngetchx(); return 0; } pCopiedExec= HeapDeref(CopieHdl2); memcpy(pCopiedExec, pOriginalExec, ExecLength); } else CopieHdl2= H_NULL; hpb= (HARDWARE_PARM_BLOCK *)FL_getHardwareParmBlock(); if (hpb->len+2-4 < offsetof(HARDWARE_PARM_BLOCK,gateArray)) hardwareVersion= 1; else hardwareVersion= hpb->gateArray; ghost_offset= hardwareVersion == 2 ? 0x40000 : 0; EX_patch(pCopiedExec + 2 + ghost_offset, pCopiedExec + ExecLength + ghost_offset - 2); fptr=pCopiedExec + 2 + ghost_offset; //*((unsigned long*)((unsigned char*)(0x4c00)+104*30))=19283746; //pour premier lancement temp=*(long*)0x5B04; *(long*)0x5B04=123456; //expected key ASM_call(/*asm_ptr_list[asm_index]*/fptr); data_ptr=*(long*)0x5B04; //args_input_ptr[0]==0; if(data_ptr==0) {printf("\nError loading LIB:%s",buff_name); ngetchx(); return 0;} EXECHDL2=ExecHdl2; COPIEHDL2=CopieHdl2; *(long*)0x5B04=(long)temp; add_lib_ref(exe_name_str,(long)data_ptr); return data_ptr; } else { return loaded_ref; } } long exelib0(long *data_ptr,unsigned char f_num) { long temp; fc_ptr=FC_LIST; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=temp; return ANSWER; } long exelib1(long *data_ptr,unsigned char f_num,long ar1) { long temp; fc_ptr=FC_LIST; ARG1=ar1; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=temp; return ANSWER; } long exelib2(long *data_ptr,unsigned char f_num,long ar1,long ar2) { long temp; fc_ptr=FC_LIST; ARG1=ar1; ARG2=ar2; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=temp; return ANSWER; } long exelib3(long *data_ptr,unsigned char f_num,long ar1,long ar2,long ar3) { long temp; fc_ptr=FC_LIST; ARG1=ar1; ARG2=ar2; ARG3=ar3; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=temp; return ANSWER; } long exelib4(long *data_ptr,unsigned char f_num,long ar1,long ar2,long ar3,long ar4) { long temp; fc_ptr=FC_LIST; ARG1=ar1; ARG2=ar2; ARG3=ar3; ARG4=ar4; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=temp; return ANSWER; } long exelib5(long *data_ptr,unsigned char f_num,long ar1,long ar2,long ar3,long ar4,long ar5) { long temp; fc_ptr=FC_LIST; ARG1=ar1; ARG2=ar2; ARG3=ar3; ARG4=ar4; ARG5=ar5; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=temp; return ANSWER; } long exelib6(long *data_ptr,unsigned char f_num,long ar1,long ar2,long ar3,long ar4,long ar5,long ar6) { long temp; fc_ptr=FC_LIST; ARG1=ar1; ARG2=ar2; ARG3=ar3; ARG4=ar4; ARG5=ar5; ARG6=ar6; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=(long)temp; return ANSWER; } long exelib7(long *data_ptr,unsigned char f_num,long ar1,long ar2,long ar3,long ar4,long ar5,long ar6,long ar7) { long temp; fc_ptr=FC_LIST; ARG1=ar1; ARG2=ar2; ARG3=ar3; ARG4=ar4; ARG5=ar5; ARG6=ar6; ARG7=ar7; temp=*(long*)0x5B04; *(long*)0x5B04=(long)data_ptr; ASM_call(fc_ptr[f_num]); *(long*)0x5B04=(long)temp; return ANSWER; } void closelib(long *data_ptr) { /*if(EXECHDL2) HeapUnlock(EXECHDL2); if(COPIEHDL2) HeapFree(COPIEHDL2); if(data_ptr) free(data_ptr); */ close_lib_(data_ptr); del_file_with_lib_ref((long)data_ptr); }