【HSP3】hsp3ld V2

#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)
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX