2010-03-05 152 views
2

所以,我一直在閱讀這篇文章:需要幫助理解_set_security_error_handler()

http://msdn.microsoft.com/en-us/library/aa290051%28VS.71%29.aspx

而且我想定義我的自定義handler.However,我不知道我理解的力學以及。在對用戶定義函數(例如_set_security_error_handler()的參數)進行調用之後會發生什麼?之後程序是否仍然終止?如果是這樣的話,是否有可能只終止當前線程(假設它不是應用程序的主線程).AFAIK,每個線程都有自己的堆棧,所以如果一個線程的堆棧被破壞,剩下的的應用程序不應該受到影響。

最後,如果確實有可能只是終止當前的執行線程,那麼這樣的動作會導致什麼樣的潛在問題呢?

我正試圖在一個非託管的C++ dll中做所有這些,我想在我的C#代碼中使用它。

回答

1

的文檔狀態:

「處理緩衝區溢出後,你應該終止線程或因爲線程的堆棧損壞退出進程」

鑑於這一說法,它似乎是你確實可以簡單地殺死線程。但是,您可以正確地詢問可能導致的問題。 TerminateThread的文檔討論了可能因殺死線程而出現的以下問題:

  • 如果目標線程擁有臨界區,臨界區將不會被釋放。
  • 如果目標線程正在從堆中分配內存,堆鎖將不會被釋放。
  • 如果目標線程在終止時正在執行某些kernel32調用,則線程進程的kernel32狀態可能不一致。
  • 如果目標線程操作的共享DLL的全局狀態,DLL的狀態可能會被破壞,影響了DLL

的其他用戶在這裏看到:http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx

唯一的「安全「在這種情況下要做的就是退出這個過程。