易语言驱动加减运算用的浮点,容易蓝屏(只是转载,作者不赞同)

摘要:
转载彝族语言论坛文章。文章说,彝文的加法、减法、乘法和除法运算都是浮点运算。作者拆解后,确实是浮点运算。然而,作者所写的司机并没有发现这个问题。它总是稳定的,但有备份。可以说,作者自己的代码导致的蓝屏并不严谨,与浮点运算无关。众所周知,Easy Language中90%的加法、减法、乘法和除法运算都使用浮点运算。经过测试发现,在驱动程序功能中,一旦使用浮点操作,90%的概率是屏幕直接变蓝。尤其是暴露的接口,如HookZwOpenPr

转载易语言论坛文章,文章说易语言的加减乘除运算全部是浮点运算,经过笔者反汇编查看,确实是浮点运算,但是说浮点运算蓝屏,作者写的驱动没发现此问题,一直很稳定,只是备份下,说不定只是那篇文章作者自己代码不严谨造成的蓝屏,跟浮点无关.

众所周知易语言的加减乘除运算,90%都是使用浮点运算,经过测试发现在驱动函数中,一旦使用浮点运算,90%的几率直接蓝屏.
特别是暴露的接口,,比如,你Hook  ZwOpenProcess  ,那么,你那个替换的函数,就是一个接口, 经过测试,发现接口如果使用了浮点运算
100%蓝屏(蓝屏的钙,好喝~).(即使加载时没蓝屏,不出3分钟也会蓝.)
分析:
查阅资料,原来是这样,浮点运算,只要cpu运行浮点运算,就会检查fpu寄存器里面的数值,检查是否为无效啊,什么的.如果发现无效数(亲,每条指令都会检查哦),就检查
浮点标志寄存器,查看是否允许抛出异常.如果允许,就抛出异常,直接蓝屏

解决方案:
1:不使用易语言来做运算,构建自己的汇编运算库,(代价太大.)
2:微软还是很多精英的,专门为了咱们易语言提供了2个函数
KeSaveFloatingPointState  和  KeRestoreFloatingPointState 来保存浮点寄存器,且把浮点异常标志位全部禁用.
最后吐槽 论坛99%的驱动代码都有这个隐患,只有几个大牛知道这一回事.

顺带贴个代码,下面的类,专门解决这个问题.

.版本 2

.程序集 浮点运算, , 公开, 利用类来巧妙的保存FPU寄存器
.程序集变量 浮点缓冲区, 整数型


.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用
浮点缓冲区 = 申请内存 (256)
.如果真 (取反 (NT_SUCCESS (KeSaveFloatingPointState (浮点缓冲区))))
    释放内存 (浮点缓冲区)
    浮点缓冲区 = 0  ' 清空
.如果真结束

 
.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用
.如果真 (浮点缓冲区 ≠ 0)
    KeRestoreFloatingPointState (浮点缓冲区)
    释放内存 (浮点缓冲区)
.如果真结束
.子程序 初始化, 逻辑型, 公开, 初始化成功则返回真
返回 (浮点缓冲区 ≠ 0)

 
调用的话,先声明一个局部变量,然后,调用初始化,就good了~~~

免责声明:文章转载自《易语言驱动加减运算用的浮点,容易蓝屏(只是转载,作者不赞同)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Revit 二次开发 交互及UIAPI之TaskDialog仿苹果电脑任务栏菜单&&拼图小游戏&&模拟表单控件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

深入理解php底层:php生命周期

1、PHP的运行模式: PHP两种运行模式是WEB模式、CLI模式。无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行。 1、当我们在终端敲入php这个命令的时候,它使用的是CLI。 它就像一个web服务器一样来支持php完成这个请求,请求完成后再重新把控制权交给终端。 2、当使用Apache或者别web服务器作为宿主时,当一个请求到来时,P...

SpringApplication类-1

SpringApplication类提供了一种方便的方法来引导从main()方法启动的Spring应用程序。在许多情况下,可以委托给静态SpringApplication.run方法,如下例所示: public static voidmain(String[] args) { SpringApplication.run(MySpringConfig...

eigen Matrix详解

Eigen Matrix 详解 在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,Vectors 只是一种特殊的矩阵,行或者列为1. Matrix的前三个模板参数 Matrix 类有6个模板参数,现在我们了解前三个足够。剩下的三个参数都有默认值,后面会探讨,现在不管他。Matrix 的三个强制的模板参数: Matri...

Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析

        在前文中,我们分析了SurfaceFlinger服务的启动过程。SurfaceFlinger服务在启动的过程中,会对系统的硬件帧缓冲区进行初始化。由于系统的硬件帧缓冲区一般只有一个,并且不是谁都可以随便访问的,因此,它就需要由一个服务来统一管理。在Android系统中,这个服务便是SurfaceFlinger。在本文中,我们就详细分析Sur...

聚合初始化

摘自时习之 C++标准库中提供两个容器表示数组这个概念:array表示静态数组,vector表示动态数组 。这两个类型都可以使用列表初始化(list initilization)来初始化。 std::array<int, 5> = {1, 2, 3, 4, 5}; std::vector<int> = {1, 2, 3, 4,...

[Java] SpringMVC工作原理之一:DispatcherServlet

一、DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作。在看 DispatcherServlet 类之前,我们先来看一下请求处理的大致流程: Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用...