DeltaSoft
驱动牛犊
驱动牛犊
  • 注册日期2002-04-29
  • 最后登录2009-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1489回复:9

我写的驱动程序运行结果真奇怪???

楼主#
更多 发布于:2002-05-24 16:26
我是个驱动程序开发新手,写了一个虚拟设备程序,在读设备数据时有如下运算:

//测试数据
ULONG A  = 16;  
ULONG B  = 2048;
LARGE_INTEGER C;
LARGE_INTEGER Len = 8096;
PUCHAR  Buffer;   //内存已申请
ULONG C  = 8096;

ULONG i;

C.QuadPart = Len.QuadPart + A * B + A % B;

for(i=0; i<(ULONG) Len.QuadPart / B; i++)
{
  C.QuadPart += B;
  ZwReadFile(.....);

}

...IoStatus.Information = ...
....


通过用KdPrint输出察看结果, 奇怪的是程序 70%时间运行正确, 而有时C.QuadPart 在整个过程始终为0, 不知为何这样? 是不是我忘料保护什么环境?

请各位大侠帮我指点指点。   谢谢先。
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-24 17:43
1, \"LARGE_INTEGER Len = 8096;\" 行得通吗?没试过这样?

2,运行下面的code,看看结果

#include \"stdafx.h\"
#include \"stdio.h\"
#include \"windows.h\"

int main(int argc, char* argv[])
{
ULONG lba, lbb, lbc, a;
LONGLONG lbd, lbe, lbf, lbg, lbh;

a = 0x3fffffff;

lbg = lbh = 1;

printf(\"a=%xh a*2=%xh\\n\", a, a*2);

lba = (ULONG) ((LONGLONG) (a * 1024) / 512);
lbb = a * 1024 / 512;
lbc = a / 512 * 1024;

lbd = a * 1024 / 512;
lbe = (LONGLONG)(a * 1024 / 512);
lbf = (LONGLONG)a * 1024 / 512;

lbg *=a * 1024 / 512;
lbh = lbh * a * 1024 / 512;


printf(\"lba = %8.8xh\\n\", lba);
printf(\"lbb = %8.8xh\\n\", lbb);
printf(\"lbc = %8.8xh\\n\", lbc);
printf(\"lbd = %8.8xh\\n\", (ULONG)lbd);
printf(\"lbe = %8.8xh\\n\", (ULONG)lbe);
printf(\"lbf = %8.8xh\\n\", (ULONG)lbf);
printf(\"lbg = %8.8xh\\n\", (ULONG)lbg);
printf(\"lbh = %8.8xh\\n\", (ULONG)lbh);
return 0;
}



[编辑 -  5/24/02 by  matt]
System Internals http://sys.xiloo.com
DeltaSoft
驱动牛犊
驱动牛犊
  • 注册日期2002-04-29
  • 最后登录2009-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-24 23:17
我是在驱动程序中出现这个问题的。

不好意思,上面在写的时候写错聊:  LARGE_INTEGER Len = 8096


 不过经过我的观察,好像是由于SoftICE的DriverMoniter造成的。如果我将Auto save message count 设的很小,如2,这样驱动程序运行DriverMonitor将频繁地保存Log文件, 这个时候出现上述情况的情况比较多,其他时候好像不会出现。  matt 大侠,你写过Ext2fsd,应该对这其中的原理比较熟悉,能不能给我分析一下这使是否就是造成这个现象的原因呢, 谢谢。

zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-25 22:11
你的代码有问题。是在没有贴出来的那部分(猜)

估计是这样打印的吧。
XXXprint(\"%d,0x%08x\", C.QuarPart, C.QuatPart)

because C.quatpart is 8 bytes, but %d, or %ld or %x only use 4 bytes of data.
then what you seen is low part of C.QuatPart.

when print , print low and high in seperately.
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-27 10:21
我是个驱动程序开发新手,写了一个虚拟设备程序,在读设备数据时有如下运算:

//测试数据
ULONG A  = 16;  
ULONG B  = 2048;
LARGE_INTEGER C;
LARGE_INTEGER Len = 8096;
PUCHAR  Buffer;   //内存已申请
ULONG C  = 8096;

ULONG i;

C.QuadPart = Len.QuadPart + A * B + A % B;

for(i=0; i<(ULONG) Len.QuadPart / B; i++)
{
  C.QuadPart += B;
  ZwReadFile(.....);

}

...IoStatus.Information = ...
....


通过用KdPrint输出察看结果, 奇怪的是程序 70%时间运行正确, 而有时C.QuadPart 在整个过程始终为0, 不知为何这样? 是不是我忘料保护什么环境?

请各位大侠帮我指点指点。   谢谢先。
 



要有\"%I64u\"格式来输出LONGLONG型数据。
System Internals http://sys.xiloo.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-27 10:33
LARGE_INTEGER 为8字节,你也就是说需要8字节的堆栈,因此错误现形发生了,可使用强制类型转换(但要丢失精度),因此你需要使用象matt老兄说的那样。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
jinfei
驱动牛犊
驱动牛犊
  • 注册日期2002-03-11
  • 最后登录2012-07-03
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-27 10:38
C 重复定义了,编译能通过?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-05-27 10:40

要有\"%I64u\"格式来输出LONGLONG型数据。


learn alot .  thanks.
DeltaSoft
驱动牛犊
驱动牛犊
  • 注册日期2002-04-29
  • 最后登录2009-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-27 12:46
hi, 各位,我在程序中是这样处理的:

KdPrint((\" %d \\n\", aaa));              //  对于ULONG
KdPrint((\" %I64d \\n\", aaa.QuadPart));  //对于LARGE_INTEGER



这个错误好像是在满住一定条件才发生, 而我现在还没有确切的办法重现它,他总有10%的几率出现, 真糟糕!!!
DeltaSoft
驱动牛犊
驱动牛犊
  • 注册日期2002-04-29
  • 最后登录2009-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-28 08:55
经过跟踪,发现我的数组最后一项被莫名奇妙地变成0, 但我程序没有对这块内存进行付值。看来好要仔细跟踪。 谢谢各位的帮助。 先分分了。
游客

返回顶部