#func #cfunc に対応したんじゃなイカ?
#func #cfunc に対応したんじゃなイカ?
#runtime "hsp3ld"#include "user32.as"#include "kernel32.as"#module load_dll#deffunc load_dll_initsdim name, 261GetModuleFileNameA 0, varptr(name), 260LoadLibraryA getpath(name, 8)hEXE = statGetProcAddress hEXE, "InitializeDLLLoad"pInitializeDLLLoad = statif pInitializeDLLLoad == 0{dialog "hsp3ldランタイムが使用されていません。終了します。" : end}prm = 0ret = callfunc(prm, pInitializeDLLLoad, 0)return ret#deffunc LoadDLL str fnamename = getpath(fname, 8) + "_DLLIMAGE"exist fnameif strsize == -1 : return -1size = strsizesdim buf, sizebload fname, buf// DLLイメージを書き込む// PAGE_READWRITECreateFileMapping -1, 0, 0x04, 0, size, varptr(name)hMapObj = stat// FILE_MAP_WRITEMapViewOfFile hMapObj, 0x02, 0, 0, sizesharedMemPtr = statif sharedMemPtr == 0 {CloseHandle hMapObjreturn -2}dupptr sharedMemVal, sharedMemPtr, size, 2// DLLイメージをコピーするmemcpy sharedMemVal, buf, size, 0, 0UnmapViewOfFile sharedMemPtr // 一度閉じておく// FILE_MAP_READMapViewOfFile hMapObj, 0x04, 0, 0, 0pBaseAddr = statif pBaseAddr == 0{CloseHandle hMapObjreturn -3}// 実行name = getpath(fname, 8)GetProcAddress hEXE, "LoadDLLFromImage"pLoadDLLFromImage = statprm.0 = pBaseAddr, varptr(name), 0ret = callfunc(prm, pLoadDLLFromImage, 3)UnmapViewOfFile pBaseAddrCloseHandle hMapObjreturn ret#defcfunc GetDLLProcAddress int handle, str fn_fn = fnGetProcAddress hEXE, "GetDLLProcAddress"pGetDLLProcAddress = statprm = handle, varptr(_fn)ret = callfunc(prm, pGetDLLProcAddress, 2)return ret#deffunc LoadPackDLL str _fname// 小文字に変換fname = getpath(_fname, 16)// すでに読み込み済みな場合はDLLをデタッチするGetModuleHandle fnameif stat != 0{FreeLibrary stat}// パックファイルからDLLを読み取りアタッチするLoadDLL fnamehDLL = statif hDLL <= 0 : return -1 // 失敗// Func info から 関数を検索して差し替え登録するmref hspctx, 68dupptr hsphed, hspctx.0, 96 // hspctx.hsphed / sizeof HSPHEDds_ptr = lpeek( hspctx, 12 ) // hspctx.mem_mdsfinfo_ptr = lpeek( hspctx, 840 ) // hspctx.mem_finfomax_finfo = lpeek( hsphed, 60 ) // hsphed.max_finfolinfo_ptr = lpeek( hspctx, 840 - 8 )max_linfo = lpeek( hsphed, 60 - 8 )dupptr linfo, linfo_ptr, max_linfosdim dlllist, 260 : dllnum = 0 // 使用中のDLL名のリストですのfor i, 0, max_linfo, 16 // LIBDAT sizenameidx = lpeek( linfo, i + 4 )dupptr dllname, ds_ptr + nameidx, 260, 2dlllist.dllnum = getpath(dllname, 16) // 小文字にdllnum++next// 関数名の一覧ですのdupptr finfo, finfo_ptr, max_finfofor i, 0, max_finfo, 28 // sizeof STRUCTDAT == 28libindex = wpeek( finfo, i)nameidx = lpeek( finfo, i + 12 )proc = lpeek( finfo, i + 24 )dupptr name, ds_ptr + nameidx, 260, 2if dllnum > libindex {// DLL名の一致if dlllist(libindex) == fname{// 関数名からアドレスを取得pFunc = GetDLLProcAddress(hDLL, name)// 書き換えlpoke finfo, i + 24, pFunc};logmes name + ":"+proc+":"+dlllist(libindex)}nextreturn#globalload_dll_init#pack "hspdsc.dll"#uselib "hspdsc.dll"#func dsc_Version "dsc_Version"LoadPackDLL "hspdsc.dll"dsc_Version/*LoadDLL "hspdsc.dll"hDLL = statfunc = GetDLLProcAddress(hDLL, "dsc_Version")prm = 0mes callfunc(prm, func, 0)*/