【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)
	*/