DLLをパックファイルしたまま、実行できるようなるサンプル(実験途中)
DLLをパックファイルしたまま、実行できるようなるサンプル(実験途中)
#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#global#pack "hspdsc.dll"load_dll_initLoadDLL "hspdsc.dll"hDLL = statfunc = GetDLLProcAddress(hDLL, "dsc_Version")prm = 0mes callfunc(prm, func, 0)