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

时间:2012-09-20 17:05:25

标签: wdk

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

1 个答案:

答案 0 :(得分:7)

不知道是否仍然适用于当前的WDK,但Walter Oney不再使用驱动程序here中的浮点内容。

  

问题比找到合适的图书馆更糟糕,   不幸。 C编译器的浮点支持假定它   将在您可以的应用程序环境中运行   初始化协处理器,安装一些异常处理程序,然后   爆走了。它还假设操作系统会照顾   根据需要保存和恢复每个线程的协处理器上下文   通过从那时起发生的所有线程上下文切换。

     

这些假设在驾驶员中通常不正确。而且,   运行时库对协处理器异常的支持无法工作,因为   有一大堆缺失的基础设施。

     

您基本上需要做的是以这样的方式编写代码   每次要使用它时都要初始化协处理器(不要   忘记KeSaveFloatingPointState和KeRestoreFloatingPointState)。组   事情,以便协处理器永远不会产生异常,   太。然后你可以简单地在某处定义符号__fltused   满足链接器。 (所有这个符号通常都是拖拽的   运行时支持。你不想要那种支持,就像我说的那样   将无法在内核模式下工作。)毫无疑问,你需要一些程序集   初始化步骤的语言代码。

     

如果您的系统线程将执行所有浮点运算   数学,你可以在开始时初始化coprocesor   线。系统将根据需要保存和恢复您的状态   然后。

     

不要忘记你只能在IRQL上做浮点数<   DISPATCH_LEVEL。

     

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

     

说真的,如果你不熟悉FINIT和其他数学协处理器   说明,这可能不是你应该做的   融入你的司机。

微软还有一篇有趣的读物:C++ for Kernel Mode Drivers: Pros and Cons

  

在x86系统上,浮点和多媒体单元不是   除非特别要求,否则以内核模式提供试着用   它们不正确可能会或可能不会引起浮点故障   IRQL(会使系统崩溃),但它可能会导致静默数据   随机过程中的腐败。使用不当也会导致数据   其他过程中的腐败;这些问题往往很难   调试。