HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0318
Seal関数のパラメータの数の取得16未解決


Seal

リンク

2018/3/18(Sun) 08:37:01|NO.82767

関数のパラメータの数の取得はどうすればいいでしょうか?
昔、そのスクリプトを持っていたのですが消えたので...
よろしくお願いします



この記事に返信する


いののて

リンク

2018/3/19(Mon) 14:51:03|NO.82769

libptr関数を使って、チェックする関数が持っているSTRUCTDAT構造体を取得すればできます。
#uselib ""
#func TestFunc1 "" int, int, int #func TestFunc2 "" int #module #deffunc TestUserFunc1 int p1, int p2, str p3, str p4 return #global dupptr sd, libptr(TestFunc1), 28 mes "TestFunc1 のパラメーターの数 : "+sd(2) dupptr sd, libptr(TestFunc2), 28 mes "TestFunc2 のパラメーターの数 : "+sd(2) dupptr sd, libptr(TestUserFunc1), 28 mes "TestUserFunc1 のパラメーターの数 : "+sd(2)



Seal

リンク

2018/3/19(Mon) 20:00:47|NO.82774

すいません
説明不足でした

dll内で定義されている関数のパラメータの数を取得したいです

例えば MessageBox は 4つパラメータが指定できるのを
HSPで取得したいです



さか

リンク

2018/3/19(Mon) 22:56:12|NO.82775

普通には出来ないんじゃないですかね。

hspのcommonディレクトリにあるuser32.asとかのファイルから数えるとか?

ちなみに何のために取得したいのですか?



Seal

リンク

2018/3/20(Tue) 07:14:25|NO.82776

>ちなみに何のために取得したいのですか?
dllファイル から HSPのasファイルに変換するミニツールを関数している為です。

方法としては

指定したdllファイルの内で定義されている関数を全て取得 (←既に出来ている)
取得した全ての関数の指定できる最大パラメータ数を取得して sptr を付ける
mesbox なので表示させる (←既に出来ている)

です



waw

リンク

2018/3/20(Tue) 10:04:27|NO.82778

dllのインポートライブラリ(libファイル)からasファイルに変換するツールなら既にありますが
dllから直接asファイルに変換するのは無理じゃないですか



Seal

リンク

2018/3/20(Tue) 12:51:05|NO.82779

>dllから直接asファイルに変換するのは無理じゃないですか
すいません、説明不足ですね。
指定したDLLファイルを読み込んでから、DLLファイル内の関数を全て取得します。
そしたら、取得した一つ一つの関数の指定できるパラメータの数を取得し、
指定できるパラメータの数分 sptr を付けて asファイル を保存する。
というミニツールを開発しています。

前にも言いましたが、
例えば 「MessageBoxA は4つのパラメータを指定できるよ」を取得したいのです



waw

リンク

2018/3/20(Tue) 13:46:25|NO.82780

いや分かってますよ
>例えば 「MessageBoxA は4つのパラメータを指定できるよ」を取得したいのです
dllファイルを調べてもこの情報を取るのは無理だと思いますよということです。
Cなんかでもこういう情報はヘッダファイルからとりますし
dllからではなくヘッダファイルやインポートライブラリからとってくればいいんじゃないでしょうか。
前にも書きましたがそういうツールならすでにあったと思います。



Seal

リンク

2018/3/20(Tue) 15:29:48|NO.82781

>dllからではなくヘッダファイルやインポートライブラリからとってくればいいんじゃないでしょうか。
まぁ、dllファイルじゃなくてもいいのです^^



さか

リンク

2018/3/21(Wed) 00:31:33|NO.82786

プログラムを作る上での便利ツールみたいな感じでしょうか。

やはり、hspのcommonフォルダ内の〜.asから関数毎の引数を数えてファイルへ
出力するプログラムを作り、そのファイルを使用するのが確実ではないでしょうか。

user32.as
#func global MessageBoxA "MessageBoxA" sptr,sptr,sptr,sptr

「#func global 」の次が関数名でその後ろのsptrを数えたらどうですか?
割と簡単に出来そうに思います。



Seal

リンク

2018/3/21(Wed) 07:39:43|NO.82789

そうすると、全部の関数のsptrの数が取得できません...(T_T
asを頼りにした↓のスクリプト(自分では実行できない)

#include "user32.as" SetProcessDPIAware

#uselibを頼りにした↓のスクリプト
これは実行できる

#uselib "user32.dll" #func SetProcessDPIAware "SetProcessDPIAware" SetProcessDPIAware

結果、asファイルを使って全ての関数のsptrの数を取得をするのは難しいです...



さか

リンク

2018/3/21(Wed) 11:09:34|NO.82790

前スレをちゃんと読んでなくてずれた回答しちゃいました。すみません。

DLLを解析して引数まで取得したいということですね。

ちょっとネットを調べてみましたが関数名の解析は出てきますが引数までは
見つからないので、それでこのスレなんですね。

関数名は取得出来てるとのことなので、こんな感じで引数についても取得し
たいですとソースを載せれば誰か回答してくれるのではと思います。(^^;



あほ

リンク

2018/3/22(Thu) 21:19:54|NO.82796

まず、dllのヘッダには関数の名前しかありません。シグネチャはありません。
(IMAGE_EXPORT_DIRECTORYを参照)
よって、ImageDirectoryEntryToData とかのAPI呼び出しても無理です。
***
ご存知かと思いますが、dll内の関数は(もとはCとかで書かれますが)機械語で書かれています。
機械語には関数というものがありません。
Cコードがコンパイルされると、「引数」をスタックに積んで(ラベル)に飛んで、その先でスタックから「引数」
を取り出し、処理が終わるともとに戻る、という処理に置き換えられます。
HSPで書くとこんな感じですかね

引数リスト = 1, 2, 3 gosub *和を求める mes 戻り値 *和を求める 引数1 = 引数リスト(0) 引数2 = 引数リスト(1) 引数3 = 引数リスト(2) 戻り値 = 引数1 + 引数2 + 引数3 return
(HSPにはスタックが標準でないのでそこら辺は目をつぶってください)
つまり、機械語にコンパイルされると(少なくとも86系では)Cにおける関数シグネチャのようなものは
全て失われます。引数を取り出す処理に置き換えられるわけです。
***
ただ、引数の数を取り出す方法が全く無いかと言われると、そういうこともない?かもしれません。
引数に関する情報がなくなって、引数を取り出す処理に置き換えられると言いましたが、それはつまり
「引数を取り出す処理」を解析すれば引数の数がわかる、ということです。
上の例における

引数1 = 引数リスト(0) 引数2 = 引数リスト(1) 引数3 = 引数リスト(2)
の部分ですね。
やったことないからわかりませんが、retまたはpushが出てくるまでpopの数を数えれば行けるんじゃないかな?
機械語を逆アセンブリする必要がありますが、FLOSSの逆アセンブリライブラリなんて探せばいくらでもあるので、
例: https://www.capstone-engine.org
頑張ればできると思いますよ。
まあ、だいぶ頑張ることになると思いますが。
そうかんたんにできるものなら誰かが作ってるだろうしね。



あほ

リンク

2018/3/22(Thu) 21:27:26|NO.82798

あ、でももとがC++で関数名がマングリングされてたらシグネチャわかるね。
実際そういうツールはある
http://www.dependencywalker.com
画像見ると[C++]のとこの関数は戻り地も引数も表示されてる。



さくら

リンク

2018/4/4(Wed) 19:56:26|NO.83887

※少し前に投稿したのですが、荒らしのため、過去ログにいったため再投稿しました。

Sealさん

>前にも書きましたがそういうツールならすでにあったと思います。
>そのツールは何処にあるのでしょうか?
>是非、教えてください。

上記のツールは、たぶん私が昨年まで公開していたものと思います。
現在、サイト引っ越しのため、HPを閉鎖しています。

さきほど、一時的にアップしました。

●Windows32 API 関数検索 (古いもののまんまですが動きます (^^; )
http://hspnext.sakura.ne.jp/download/apifunc.zip

※少し、改訂を予定していて、サイトの改修が終わったら公開予定です?
 APIのヘルプ機能は、古いので使い物になりません。廃止の予定です。

初版は、10年ほど前に作成したものです。
dllのインポートライブラリ(libファイル)からコンバータを作成して作ったと記憶しています。
関数のパラメータ数は、やはり、コンバータを作成してカウントした記憶があります。

こうして作成したものをSQLite3のデータベースへインポートして検索・抽出できるようにしています。
ちなみに、HSPのcommonディレクトリにあるAPIモジュール(as)は、上記の方法で作成した派生物
として、私が提供したものです。



waw

リンク

2018/4/5(Thu) 14:03:47|NO.83902

私が言ってたのはこれです。

http://hp.vector.co.jp/authors/VA034288/index.html
にあるib2as for HSP3β ver0.1というやつです。



あほ

リンク

2018/4/6(Fri) 19:18:15|NO.83909

ごめんなさい。
インポートライブラリがあるならいけますね。
フォーマットはCOFFらしいです。



ONION software Copyright 1997-2021(c) All rights reserved.