所以,我一直在阅读这篇文章:
http://msdn.microsoft.com/en-us/library/aa290051%28VS.71%29.aspx
我想定义我的自定义处理程序。但是,我不确定我是否理解机制。调用用户定义的函数(例如 _set_security_error_handler() 的参数)后会发生什么?程序还会终止吗?如果是这种情况,是否可以仅终止当前线程(假设它不是应用程序的主线程)。AFAIK,每个线程都有自己的堆栈,所以如果一个线程的堆栈被破坏,其余的应用程序不应受到影响。
最后,如果确实可以只终止当前执行的线程,这样的操作会导致哪些潜在问题?
我正在尝试在我想在我的 C# 代码中使用的非托管 C++ dll 中执行所有这些操作。
最佳答案
文档指出:
“处理缓冲区溢出后,您应该终止线程或退出进程,因为线程的堆栈已损坏”
鉴于此声明,您似乎确实可以简单地终止线程。但是,您问这可能会导致什么问题是正确的。 TerminateThread 的文档讨论了终止线程可能引起的以下问题:
- 如果目标线程拥有临界区,则临界区不会被释放。
- 如果目标线程正在从堆中分配内存,则不会释放堆锁。
- 如果目标线程在终止时正在执行某些 kernel32 调用,则线程进程的 kernel32 状态可能不一致。
- 如果目标线程正在操纵共享 DLL 的全局状态,则 DLL 的状态可能会被破坏,从而影响 DLL 的其他用户
参见此处:http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx
在这种情况下唯一“安全”的做法是退出进程。
关于c# - 需要帮助理解 _set_security_error_handler(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2388625/