2013-11-28 34 views
0

我創建了一個SSH代理(類似於PuTTY的pageant.exe),它具有預定義的協議,並通過WM_COPYDATA將驗證請求發送到代理窗口。Windows API:查找郵件發件人的進程(WM_COPYDATA)

我現在想要顯示哪個進程請求認證。 爲此,我需要知道哪個進程發送了WM_COPYDATA。

如前所述,我可以而不是更改協議(例如發送進程ID與消息本身),因爲它是預定義的。

回答

4

您收到的wParam意圖爲發送消息的窗口的窗口句柄。 (但請參閱下面的註釋。)

從那裏,您可以使用GetWindowThreadProcessID獲取進程ID,然後您可以使用該進程ID作爲GetProcessImageFileName的輸入來檢索進程的名稱。

注意:由於@RemyLeBeau在下面的註釋中指出,這當然是基於wParam,它實際上是提供發送WM_COPYDATA消息的窗口的提供。發送WM_COPYDATA本身並不強制將其作爲要求。

如果不是這樣,那麼你運氣不好;我不知道要追溯到實際發送消息的過程,而沒有這樣做。您最多可以確認它是使用IsWindow的實際窗口句柄,但它不能確認它實際上是發送該消息的窗口。

+2

假設發送者符合在'wParam'字段中指定自己的'HWND'的要求。 'SendMessage(WM_COPYDATA)'不強制執行。儘管你可以通過使用IsWindow()來確定'wParam'是否包含有效的'HWND',但是沒有任何東西可以阻止惡意發送者指定其他人的'HWND'。 –

+1

@Remy:當然它假設傳入的HWND是發送該消息的那個人,這就是問題所在。我沒有其他方式來檢索所要求的信息,但這並不是真的。無法追溯到使用WM_COPYDATA消息作爲wParam調度欺詐性HWND值的應用程序,是嗎?不過,這是一個很好的觀點。我已經在我的回答中加上了這一點,並給予了適當的信貸給你。 –

+0

謝謝你。這很傷心。我已經看過wParam了,它總是0。這真的是我第一次聽到有些東西不起作用... – divB

相關問題