0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Inside Wine; 関数名など

Last updated at Posted at 2018-02-27

[目次] (https://qiita.com/Yutaka_Aoki/items/9d38ea98406f4096435b)

Inside Wine; 関数名など

Win32 API で最初に呼び出される関数

Xxxx という名前の Win32 API について、WINE で最初に実行が開始される関数は、

~/wine/dlls/yyyy.c

の中に、

~/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;

・・・の中には、以下のいずれかが来る :

  1. wine_server_call( req )
  2. wine_server_call_err( req )

【server 関数の実装】

/wine/server/yyyy.c

の中の :

~/wine/server/yyyy.c
DECL_HANDLER(xxxx)

【server 関数の呼び出し例】

~/wine/dlls//user32/win.c
static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name,

関数の中からの例 :

~/wine/dlls//user32/win.c
 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

あああ

end

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?