2010-03-05 154 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

唯一的“安全“在这种情况下要做的就是退出这个过程。