错误LNK2001:wdk中未解析的外部符号_fltused

ran*_*dy7 4 wdk

我试图在C代码中定义一个双数据类型变量,它将在Windows内核中使用.代码编译但链接时出错.我尝试在源文件中使用libcntpr.lib,并在代码中定义__fltused变量,但无济于事.如果有人可以帮助我如何使用它,我将非常感激.

huy*_*itw 7

不知道是否仍适用于当前WDK但沃尔特Oney失去动力使用浮点东西在驱动程序的位置.

遗憾的是,问题不仅仅是找到合适的图书馆.C编译器的浮点支持假定它将在一个应用程序环境中运行,您可以在其中初始化协处理器,安装一些异常处理程序,然后爆炸.它还假设操作系统将负责保存和恢复每个线程的协处理器上下文,这是从那时起发生的所有线程上下文切换所要求的.

这些假设在驾驶员中通常不正确.此外,对协处理器异常的运行时库支持无法工作,因为存在大量缺少的基础结构.

你基本上需要做的是编写你的代码,每次你想要使用它时都要初始化协处理器(不要忘记KeSaveFloatingPointState和KeRestoreFloatingPointState).进行设置,以便协处理器永远不会产生异常.然后,您可以简单地在某处定义符号__fltused以满足链接器.(所有这些符号通常都是在运行时支持中拖动.你不希望这种支持,因为我说,它不会在内核模式下工作.)毫无疑问,你需要一些汇编语言代码来进行初始化步骤.

如果您的系统线程将执行所有浮点数学运算,则可以在线程开始时初始化协处理器一次.从那时起,系统将根据需要保存和恢复您的状态.

不要忘记您只能在IRQL <DISPATCH_LEVEL处执行浮点运算.

除了其他方面,还有FINIT.如果你在协处理器编程上生气,我的建议是告诉管理层这是一个需要大量研究才能解决的专业问题.然后飞到马提尼克岛一个星期左右(在飓风季节之后),在适当的环境中进行研究.

说真的,如果你不熟悉FINIT和其他数学协处理器指令,这可能不是你应该融入你的驱动程序的东西.

微软还有一个有趣的读物:C++ for Kernel Mode Drivers:优点和缺点

在x86系统上,除非特别要求,否则浮点和多媒体单元在内核模式下不可用.尝试不正确地使用它们可能会或可能不会在引发的IRQL上引起浮点故障(这会使系统崩溃),但它可能会导致随机进程中的静默数据损坏.使用不当也可能导致其他进程中的数据损坏; 这些问题通常很难调试.