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