我正在尝试在C代码中定义一个双数据类型变量,该代码将在Windows内核中使用。代码编译但链接时出错。我尝试在源文件中使用libcntpr.lib,并在代码中定义__fltused变量,但无济于事。如果有人能帮助我如何使用它,我将非常感激。
答案 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(会使系统崩溃),但它可能会导致静默数据 随机过程中的腐败。使用不当也会导致数据 其他过程中的腐败;这些问题往往很难 调试。