2015-06-13 109 views
-1

我有一個HANDLE的過程中,這可能會,也可能不會,是當前運行的進程的句柄。以下是關於手柄對象的已知信息:如何確定進程句柄是否是當前進程?

  1. 手柄僅具有PROCESS_TERMINATE訪問權限。
  2. 手柄不是僞句柄,即不的GetCurrentProcess返回值。

有沒有辦法知道句柄是否是當前進程的?

我曾考慮過使用GetProcessId,但不幸的是,由於該句柄沒有PROCESS_QUERY_LIMITED_INFORMATION訪問權限,因此無法訪問被拒絕的錯誤。

+0

不是一個確切的重複;句柄只能終止訪問的事實是相關的。投票重新開放。 –

+0

嘗試使用'DuplicateHandle'來創建一個具有'PROCESS_QUERY_LIMITED_INFORMATION'權限的新句柄。 (如果訪問被拒絕,這是不太可能的句柄,你的過程 - 但如果你想成爲安全的,你可以檢查在運行過程中的ACL,並在必要時改變它) –

+0

@HarryJohnston感謝,我會嘗試它。有沒有關於'DuplicateHandle'何時允許添加額外訪問權限的文檔?該函數的文檔聲明如下,這不是很有用:「在某些情況下,新的句柄可以擁有比原始句柄更多的訪問權限,但是在其他情況下,'DuplicateHandle'不能創建具有更多訪問權限的句柄比原來的「。 – Paul

回答

1

如果您有足夠的權限訪問目標進程,可以使用DuplicateHandle()通過PROCESS_QUERY_LIMITED_INFORMATION訪問權限爲其創建新的句柄。然後您可以使用此句柄來獲取進程ID。

除非您的進程修改了自己的安全權限,否則它應該始終具有(至少)PROCESS_QUERY_LIMITED_INFORMATION自身訪問權限,因此如果重複該句柄失敗並出現訪問被拒絕錯誤,則該句柄不太可能指向您的進程。

如果你想絕對肯定,你可以嘗試通過進程ID打開的句柄,你的進程 - 如果失敗則有人與ACL搞亂,所有的賭注都關閉。 :-)

相關問題