nana2046
驱动牛犊
驱动牛犊
  • 注册日期2007-02-28
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分235分
  • 威望64点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:1933回复:4

关于驱动层浮点的问题,一定要进来看看啊~~

楼主#
更多 发布于:2008-12-27 11:18
小弟最近在做一个功能,在驱动层检查数据。数据有浮点类型。小弟用了如下的句子:
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进制数据,全是空(空的意思就是,屏幕上本该出现数据的那个地方是黑的),非常奇怪。到底是数据没有拷进去,还是我处理的问题?
望诸位高手明示!多谢!
eleqi
驱动小牛
驱动小牛
  • 注册日期2005-12-20
  • 最后登录2014-01-03
  • 粉丝4
  • 关注2
  • 积分172分
  • 威望1475点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-12-31 17:02
没看明白你到底是想做什么
假设*point的值为0xffff,而你想输出的结果为000000000000ffff,使用下面这句
DbgPrint("%016x\n",*point);
eleqi
驱动小牛
驱动小牛
  • 注册日期2005-12-20
  • 最后登录2014-01-03
  • 粉丝4
  • 关注2
  • 积分172分
  • 威望1475点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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字节数组,一个字节一个字节地看吧
其实细心点就行了。
nana2046
驱动牛犊
驱动牛犊
  • 注册日期2007-02-28
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分235分
  • 威望64点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-12-30 17:30
谢谢帮助。我把原句改成memcpy(point,(unsigned char* )com->OldBuffer+112,8); 拷贝8个字节,但还是打印不出来。问题依旧,请问如何在驱动层下打印浮点数据??实在是找不到问题原因
eleqi
驱动小牛
驱动小牛
  • 注册日期2005-12-20
  • 最后登录2014-01-03
  • 粉丝4
  • 关注2
  • 积分172分
  • 威望1475点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-12-28 21:11
晕,memcpy(&point,(unsigned char* )com->OldBuffer+112,16);
point已经是地址了,再取它的地址来写数据进去,不该范的错误
再有point指向的空间大小是sizeof(double),无法容纳16字节吧,要想容纳申请时多申请些空间吧
游客

返回顶部