需要帮助理解 _set_security_error_handler()
Posted
技术标签:
【中文标题】需要帮助理解 _set_security_error_handler()【英文标题】:Need help understanding _set_security_error_handler() 【发布时间】:2010-03-05 17:25:06 【问题描述】:所以,我一直在阅读这篇文章:
http://msdn.microsoft.com/en-us/library/aa290051%28VS.71%29.aspx
我想定义我的自定义处理程序。但是,我不确定我是否理解机制。调用用户定义的函数后会发生什么(例如 _set_security_error_handler() 的参数)?程序之后是否仍然终止?如果是这种情况,是否可以仅终止当前线程(假设它不是应用程序的主线程)。AFAIK,每个线程都有自己的堆栈,所以如果线程的堆栈被破坏,其余的的应用程序不应受到影响。
最后,如果确实可以只终止当前的执行线程,那么这样的操作会导致哪些潜在问题?
我正在尝试在我想在我的 C# 代码中使用的非托管 C++ dll 中完成所有这些操作。
【问题讨论】:
【参考方案1】:文档说明:
“处理完缓冲区溢出后,您应该终止线程或退出进程,因为线程的堆栈已损坏”
鉴于此声明,您似乎确实可以简单地终止线程。但是,您问这可能导致什么问题是正确的。 TerminateThread 的文档讨论了终止线程可能引起的以下问题:
如果目标线程拥有临界区,则不会释放临界区。 如果目标线程正在从堆中分配内存,则不会释放堆锁。 如果目标线程在终止时正在执行某些 kernel32 调用,则线程进程的 kernel32 状态可能不一致。 如果目标线程正在操作共享 DLL 的全局状态,则 DLL 的状态可能会被破坏,从而影响 DLL 的其他用户请看这里:http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx
在这种情况下唯一“安全”的做法是退出进程。
【讨论】:
以上是关于需要帮助理解 _set_security_error_handler()的主要内容,如果未能解决你的问题,请参考以下文章