Visual c++ 如何获取在我的软件中发生的DLL加载通知(仅在我自己的进程中)

Visual c++ 如何获取在我的软件中发生的DLL加载通知(仅在我自己的进程中),visual-c++,exception,dll,floating-point,hook,Visual C++,Exception,Dll,Floating Point,Hook,首先,一些背景: 我的软件是用VC++编写的,它依赖于与我的应用程序一起加载的一些大型第三方DLL。这些LIB通常在其正常操作过程中引发浮点异常,但由于浮点控制字的默认配置掩盖了这些异常,因此程序不会因此而崩溃,因此它们不会作为硬件异常发出信号 现在的问题是,当一些第三方程序如ZealSuffSuper ScortPask注入自己在Borland C++中写的DLL时,他们设置FP控制字,使浮点异常和我的应用程序崩溃。 虽然主要的问题可能是第三方库和第三方软件注入了自己的Dll,但我仍然希望保护

首先,一些背景:

我的软件是用VC++编写的,它依赖于与我的应用程序一起加载的一些大型第三方DLL。这些LIB通常在其正常操作过程中引发浮点异常,但由于浮点控制字的默认配置掩盖了这些异常,因此程序不会因此而崩溃,因此它们不会作为硬件异常发出信号

现在的问题是,当一些第三方程序如ZealSuffSuper ScortPask<强>注入自己在Borland C++中写的DLL时,他们设置FP控制字,使浮点异常和我的应用程序崩溃。 虽然主要的问题可能是第三方库和第三方软件注入了自己的Dll,但我仍然希望保护我的软件不因为这样的问题而崩溃

我能想到的解决方案是如何获得进程内发生Dll加载的通知,并确保在Dll加载发生后将FP控制字重置为默认值

因此,我正在寻找简单有效的方法来实现这一目标。在我的进程中,是否有方法获得Dll加载的通知?有没有其他方法可以实现我想做的事情?我唯一需要注意的是,该方法应适用于Win 2k和WinXP及更高版本,其次,所使用的方法不应具有可能触发反病毒/间谍软件扫描程序的恶意软件试探的性质。

您可以检测FPU状态问题n和,但dll在此之后可能无法正常工作(,并且启用它是有原因的)。您可以通知用户将不兼容的dll注入到您的进程中,这将导致不可预知的行为


您还可以扫描program files文件夹()并警告用户存在已知的兼容性问题

您可以在windows上执行此操作,特别是要监视调试事件。需要注意的是,自己调试是危险的,因为这可能导致应用程序锁定,也意味着你不能正常调试它

另一种方法是在
LoadLibraryEx
LoadLibraryA
LoadLibraryW
上做一个进程范围的()钩子,并检查dll是否通过那里


这方面的主要问题是,您需要确保在加载进程中的任何其他内容(您关心的)之前安装挂钩/监视器,这可能需要更多的“黑魔法”…

是的,我同意DLL应该恢复FP标志的状态。但问题是,Borland C++被默认为启用这些FP标志,人们不需要经常在不需要它们时禁用它们。当这些DLL被注入到禁用它们的进程中时,问题就变得特别严重。虽然我们确实安装了一个异常处理程序,但在异常发生后处理这种情况就太晚了。我尝试过的一件事是挂接LoadLibraryEx并从那里重置FP标志,它工作了感谢您的回复,我确实通过IAT补丁成功挂接LoadLibrary调用并解决了问题,但我担心的是,这种补丁是否会触发恶意软件/病毒扫描程序的启发。