Wine中PE格式文件的加載(二):Wineserver初始化過程

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中的函數調用等請求。這裏就不多贅述了。


發佈了28 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章