Wineserver的初始化過程就在thread_init函數中進行的。
具體分析thread_init函數(在ntdll/thread.c中)
1. 創建了TEB,PEB等數據結構。
2. 通過server_init_process()與服務進程建立socket連接。在此過程中,如果連接失敗就說明服務進程尚不存在,此時要通過start_server()先fork()一個子進程,讓其執行wine_exec_wine_binary(),以裝入並運行wineserver,再試圖與其建立連接。
thread_init部分函數代碼如下圖所示:
start_server函數如下圖所示:
除了啓動wineserver創建通信的socket外,還創建了一對管道,分別將寫端發送到要通信的進程中,來實現後面的函數調用。
在wineserver中的實現也類似,在收到client端 socket的連接後也會創建管道,將寫端發送回來。
並且在wineserver中將socket client fd以及的管道讀端放入一個poll中監聽。來實現dll中的函數調用等請求。這裏就不多贅述了。