阅读:1933回复:4
关于驱动层浮点的问题,一定要进来看看啊~~
小弟最近在做一个功能,在驱动层检查数据。数据有浮点类型。小弟用了如下的句子:
double是8字节没错吧? KFLOATING_SAVE savedata; double *point; status=keSaveFloatingPointState(&savedata); ...... if(NT_SUCCESS(status){ ...... point=(double *)ExAllocatePool(NonpagedPool,sizeof(double)); memcpy(&point,(unsigned char* )com->OldBuffer+112,16); //这里的com->OldBuffer里存放着文件里的数据,112是偏移 DbgPrint(("***%16x***",point,"\n")); KeRestorFloatingPointState(&savedata); 结果打印出来只有4个字节," 3FFFFFEA" 前面空的部分它就是空的,不是我想的8字节。不知道是何原因。 另,DbgPrint(("%f**",point,"\n")); DbgPrint(("%e",point,"\n")); DbgPrint(("%lf",point,"\n")); DbgPrint(("%le",point,"\n")); 一概打印不出10进制数据,全是空(空的意思就是,屏幕上本该出现数据的那个地方是黑的),非常奇怪。到底是数据没有拷进去,还是我处理的问题? 望诸位高手明示!多谢! |
|
沙发#
发布于:2008-12-31 17:02
没看明白你到底是想做什么
假设*point的值为0xffff,而你想输出的结果为000000000000ffff,使用下面这句 DbgPrint("%016x\n",*point); |
|
板凳#
发布于:2008-12-31 16:54
你是想输出1.234这样的值?
![]() DbgPrint("%f\n",*point); point是指针啊,老大! 另外DbgPrint(("%f**",point,"\n")); 后面加一个新行符做什么,它是不会被格式化输出的,要想输出则DbgPrint("%f%s",*point,"\n");才行吧;再有dbgprint不要加两层括号对 要想看8字节使用windbg d命名查看吧,或者将其内容复制到8字节数组,一个字节一个字节地看吧 其实细心点就行了。 |
|
地板#
发布于:2008-12-30 17:30
谢谢帮助。我把原句改成memcpy(point,(unsigned char* )com->OldBuffer+112,8); 拷贝8个字节,但还是打印不出来。问题依旧,请问如何在驱动层下打印浮点数据??实在是找不到问题原因
|
|
地下室#
发布于:2008-12-28 21:11
晕,memcpy(&point,(unsigned char* )com->OldBuffer+112,16);
point已经是地址了,再取它的地址来写数据进去,不该范的错误 再有point指向的空间大小是sizeof(double),无法容纳16字节吧,要想容纳申请时多申请些空间吧 |
|