【HSP3】hsp3ld V3

もちょっと直した

もちょっと直した

  • タグ:
  • タグはありません
#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 0
	size = strsize
	sdim buf, size
	bload fname, buf
	// DLLイメージを書き込む
	// PAGE_READWRITE
	CreateFileMapping -1, 0, 0x04, 0, size, 0; varptr(name)
	hMapObj = stat
	// FILE_MAP_WRITE
	MapViewOfFile hMapObj, 0x02, 0, 0, size
	sharedMemPtr = stat
	if sharedMemPtr == 0 {
		CloseHandle hMapObj
		return 0
	}
	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 0
	}	
	// 実行
	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++
		sdim dllname
	next
	sdim linfo
	// 関数名の一覧ですの
	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)
				if pFunc == 0 : _continue
				// 書き換え
				lpoke finfo, i + 24, pFunc
			}
			;logmes name + ":"+proc+":"+dlllist(libindex)
		}
		sdim name
	next
	sdim finfo
	sdim hsphed
return 0
#deffunc LoadPackHPI str _fname
	// 小文字に変換
	fname = getpath(_fname, 16)
	
	// すでに読み込み済みな場合はDLLをデタッチする
	GetModuleHandle fname
	if stat != 0{
		FreeLibrary stat
	}
	// パックファイルからDLLを読み取りアタッチする
	LoadDLL fname
	hDLL = stat
	if hDLL == 0 : return -1	// 失敗 
	
	mref hspctx, 68
	dupptr hsphed, hspctx.0, 96 // hspctx.hsphed / sizeof HSPHED
	ds_ptr = lpeek( hspctx, 12 ) // hspctx.mem_mds
	;dupptr ds, ds_ptr, 1024
	;bsave "ds.txt", ds, 1024
	
	pt_hpidat = lpeek( hsphed, 80 )
	max_hpi = wpeek( hsphed, 84 )
	max_varhpi = wpeek( hsphed, 86 )
	ptr = hspctx.0 + pt_hpidat
	
	dupptr hpidat, ptr, max_hpi
	for i, 0, max_hpi, 16	// HPIDAT size
		nameidx = lpeek( hpidat, i + 4 )
		funcidx = lpeek( hpidat, i + 8 )
		;_libptr = lpeek( hpidat, i + 12 )
		dupptr funcname, ds_ptr + funcidx, 260, 2
		dupptr name, ds_ptr + nameidx, 260, 2
		dllname = getpath(name, 16)
		// DLL名の一致
		if dllname == fname{
			pFunc = GetDLLProcAddress(hDLL, funcname)
			if pFunc == 0 : _continue
			lpoke hpidat, i + 12, pFunc
		}
		sdim name
		sdim funcname
	next
	sdim hpidat
	;sdim ds
	sdim hsphed
return 0
#deffunc KillDLLLoad onexit
	GetProcAddress hEXE, "KillDLLLoad"
	pKillDLLLoad = stat
	prm = 0
	ret = callfunc(prm, pKillDLLLoad, 0)
return
#global
load_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 の読み込みに失敗しました" : end
	LoadPackDLL "hspogg.dll"	// #func #cfunc のみ
	if stat : dialog "hspogg.dll の読み込みに失敗しました" : end
	LoadPackDLL "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)"
	ipget
	mes "IP: "+refstr
	
	dialog "hspinet.dll を使用してBASE64エンコードを行います(b64encode)"
	src = "test"
	b64encode dst, src, strlen(src)
	mes "SRC: "+src+" -> DST:" +dst
	
	dialog "hspogg.dll を使用して音楽を再生します。音量に注意してください。"
	dmmini
	
	exist "theme.wav"
	size = strsize
	sdim oggdata, size
	bload "theme.wav", oggdata
	memfile oggdata, 0, size
	dmmload "MEM:theme.wav", 0		; wavファイル読み込み
	dmmplay 0
	
	dialog "終了します"
	
	end