[目次] (https://qiita.com/Yutaka_Aoki/items/9d38ea98406f4096435b)
Inside Wine; 関数名など
Win32 API で最初に呼び出される関数
Xxxx という名前の Win32 API について、WINE で最初に実行が開始される関数は、
~/wine/dlls/yyyy.c
の中に、
ZZZZ WINAPI Xxxx(・・・)
{
・・・
return zzzz;
}
のような形式で関数定義されている。この関数の中から、以下に述べるような「server 関数」が呼び出されることがある。「server 関数」の名称や、リクエストの名前は、Xxxx と似ていることが多い。
server 関数
server 関数の本当の関数名は、req_xxxx() である。しかし、これで grep 検索しても見つからない。それはマクロが用いられているためで、実際は、/wine/server/ フォルダの中の *.c 内に、DECL_HANDLER(xxxx) を最初の行として、実際の関数定義がある。
【server 関数の呼び出し】
SERVER_START_REQ(xxxx)
・・・
SERVER_END_REQ;
・・・の中には、以下のいずれかが来る :
- wine_server_call( req )
- wine_server_call_err( req )
【server 関数の実装】
/wine/server/yyyy.c
の中の :
DECL_HANDLER(xxxx)
【server 関数の呼び出し例】
static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name,
関数の中からの例 :
SERVER_START_REQ( create_window )
{
req->parent = wine_server_user_handle( parent );
req->owner = wine_server_user_handle( owner );
req->instance = wine_server_client_ptr( instance );
if (!(req->atom = get_int_atom_value( name )) && name)
wine_server_add_data( req, name, strlenW(name)*sizeof(WCHAR) );
if (!wine_server_call_err( req ))
{
handle = wine_server_ptr_handle( reply->handle );
full_parent = wine_server_ptr_handle( reply->parent );
full_owner = wine_server_ptr_handle( reply->owner );
extra_bytes = reply->extra;
class = wine_server_get_ptr( reply->class_ptr );
}
}
SERVER_END_REQ;
効率的な grep 検索
以下のようにすると効率よく検索できる。
Win32 API で最初に呼び出される関数を検索したい時
Xxxx という名前の Win32 API について、WINE で最初に実行が開始される関数の関数定義を検索したい場合、
探す場所: /wine/dlls/
探すファイル: *.c
検索文字列: WINAPI Xxxx
とすると良い。
SERVER_START_REQ(xxx_yyy) のリクエストを処理する関数を検索したい時
関数名は、req_xxx_yyy で、関数定義は、/wine/server フォルダの *.c ファイルに、DECL_HANDLER(xxx_yyy) を先頭の行として存在している。このことを知ってないと、検索するのは難しいが、次のようにすると楽に検索できる。
探す場所: /wine/server/
探すファイル: *.c
検索文字列: (xxx_yyy)
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ
aaa
あああ