もちょっと直した
もちょっと直した
#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 0size = strsizesdim buf, sizebload fname, buf// DLLイメージを書き込む// PAGE_READWRITECreateFileMapping -1, 0, 0x04, 0, size, 0; varptr(name)hMapObj = stat// FILE_MAP_WRITEMapViewOfFile hMapObj, 0x02, 0, 0, sizesharedMemPtr = statif sharedMemPtr == 0 {CloseHandle hMapObjreturn 0}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 0}// 実行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++sdim dllnamenextsdim linfo// 関数名の一覧ですの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)if pFunc == 0 : _continue// 書き換えlpoke finfo, i + 24, pFunc};logmes name + ":"+proc+":"+dlllist(libindex)}sdim namenextsdim finfosdim hsphedreturn 0#deffunc LoadPackHPI str _fname// 小文字に変換fname = getpath(_fname, 16)// すでに読み込み済みな場合はDLLをデタッチするGetModuleHandle fnameif stat != 0{FreeLibrary stat}// パックファイルからDLLを読み取りアタッチするLoadDLL fnamehDLL = statif hDLL == 0 : return -1 // 失敗mref hspctx, 68dupptr hsphed, hspctx.0, 96 // hspctx.hsphed / sizeof HSPHEDds_ptr = lpeek( hspctx, 12 ) // hspctx.mem_mds;dupptr ds, ds_ptr, 1024;bsave "ds.txt", ds, 1024pt_hpidat = lpeek( hsphed, 80 )max_hpi = wpeek( hsphed, 84 )max_varhpi = wpeek( hsphed, 86 )ptr = hspctx.0 + pt_hpidatdupptr hpidat, ptr, max_hpifor i, 0, max_hpi, 16 // HPIDAT sizenameidx = lpeek( hpidat, i + 4 )funcidx = lpeek( hpidat, i + 8 );_libptr = lpeek( hpidat, i + 12 )dupptr funcname, ds_ptr + funcidx, 260, 2dupptr name, ds_ptr + nameidx, 260, 2dllname = getpath(name, 16)// DLL名の一致if dllname == fname{pFunc = GetDLLProcAddress(hDLL, funcname)if pFunc == 0 : _continuelpoke hpidat, i + 12, pFunc}sdim namesdim funcnamenextsdim hpidat;sdim dssdim hsphedreturn 0#deffunc KillDLLLoad onexitGetProcAddress hEXE, "KillDLLLoad"pKillDLLLoad = statprm = 0ret = callfunc(prm, pKillDLLLoad, 0)return#globalload_dll_init#pack "hspogg.dll"#pack "hspsock.dll"#pack "hspinet.dll"#pack "theme.wav"// パックファイルからDLLを読み込む(実行ファイルにしたとき)LoadPackDLL "hspsock.dll" // #func #cfunc のみif stat : dialog "hspsock.dll の読み込みに失敗しました" : endLoadPackDLL "hspogg.dll" // #func #cfunc のみif stat : dialog "hspogg.dll の読み込みに失敗しました" : endLoadPackDLL "hspinet.dll" // #func #cfunc のみif stat : dialog "hspinet.dll の読み込みに失敗しました" : end// #regcmd形式のプラグインには非対応です;LoadPackHPI "e3dhsp3.dll" // #regcmd;mes stat#include "hspsock.as"#include "hspogg.as"#include "hspinet.as"dialog "hspsock.dll を使用してIPアドレスを取得します(ipget)"ipgetmes "IP: "+refstrdialog "hspinet.dll を使用してBASE64エンコードを行います(b64encode)"src = "test"b64encode dst, src, strlen(src)mes "SRC: "+src+" -> DST:" +dstdialog "hspogg.dll を使用して音楽を再生します。音量に注意してください。"dmminiexist "theme.wav"size = strsizesdim oggdata, sizebload "theme.wav", oggdatamemfile oggdata, 0, sizedmmload "MEM:theme.wav", 0 ; wavファイル読み込みdmmplay 0dialog "終了します"end