我創建了一個SSH代理(類似於PuTTY的pageant.exe),它具有預定義的協議,並通過WM_COPYDATA將驗證請求發送到代理窗口。Windows API:查找郵件發件人的進程(WM_COPYDATA)
我現在想要顯示哪個進程請求認證。 爲此,我需要知道哪個進程發送了WM_COPYDATA。
如前所述,我可以而不是更改協議(例如發送進程ID與消息本身),因爲它是預定義的。
我創建了一個SSH代理(類似於PuTTY的pageant.exe),它具有預定義的協議,並通過WM_COPYDATA將驗證請求發送到代理窗口。Windows API:查找郵件發件人的進程(WM_COPYDATA)
我現在想要顯示哪個進程請求認證。 爲此,我需要知道哪個進程發送了WM_COPYDATA。
如前所述,我可以而不是更改協議(例如發送進程ID與消息本身),因爲它是預定義的。
您收到的wParam
是意圖爲發送消息的窗口的窗口句柄。 (但請參閱下面的註釋。)
從那裏,您可以使用GetWindowThreadProcessID
獲取進程ID,然後您可以使用該進程ID作爲GetProcessImageFileName
的輸入來檢索進程的名稱。
注意:由於@RemyLeBeau在下面的註釋中指出,這當然是基於wParam
,它實際上是提供發送WM_COPYDATA
消息的窗口的提供。發送WM_COPYDATA
本身並不強制將其作爲要求。
如果不是這樣,那麼你運氣不好;我不知道要追溯到實際發送消息的過程,而沒有這樣做。您最多可以確認它是使用IsWindow
的實際窗口句柄,但它不能確認它實際上是發送該消息的窗口。
假設發送者符合在'wParam'字段中指定自己的'HWND'的要求。 'SendMessage(WM_COPYDATA)'不強制執行。儘管你可以通過使用IsWindow()來確定'wParam'是否包含有效的'HWND',但是沒有任何東西可以阻止惡意發送者指定其他人的'HWND'。 –
@Remy:當然它假設傳入的HWND是發送該消息的那個人,這就是問題所在。我沒有其他方式來檢索所要求的信息,但這並不是真的。無法追溯到使用WM_COPYDATA消息作爲wParam調度欺詐性HWND值的應用程序,是嗎?不過,這是一個很好的觀點。我已經在我的回答中加上了這一點,並給予了適當的信貸給你。 –
謝謝你。這很傷心。我已經看過wParam了,它總是0。這真的是我第一次聽到有些東西不起作用... – divB