阅读:1489回复:9
我写的驱动程序运行结果真奇怪???
我是个驱动程序开发新手,写了一个虚拟设备程序,在读设备数据时有如下运算:
//测试数据 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, 不知为何这样? 是不是我忘料保护什么环境? 请各位大侠帮我指点指点。 谢谢先。 |
|
沙发#
发布于: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] |
|
|
板凳#
发布于:2002-05-24 23:17
我是在驱动程序中出现这个问题的。
不好意思,上面在写的时候写错聊: LARGE_INTEGER Len = 8096 不过经过我的观察,好像是由于SoftICE的DriverMoniter造成的。如果我将Auto save message count 设的很小,如2,这样驱动程序运行DriverMonitor将频繁地保存Log文件, 这个时候出现上述情况的情况比较多,其他时候好像不会出现。 matt 大侠,你写过Ext2fsd,应该对这其中的原理比较熟悉,能不能给我分析一下这使是否就是造成这个现象的原因呢, 谢谢。 |
|
地板#
发布于: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. |
|
地下室#
发布于:2002-05-27 10:21
我是个驱动程序开发新手,写了一个虚拟设备程序,在读设备数据时有如下运算: 要有\"%I64u\"格式来输出LONGLONG型数据。 |
|
|
5楼#
发布于:2002-05-27 10:33
LARGE_INTEGER 为8字节,你也就是说需要8字节的堆栈,因此错误现形发生了,可使用强制类型转换(但要丢失精度),因此你需要使用象matt老兄说的那样。
|
|
|
6楼#
发布于:2002-05-27 10:38
C 重复定义了,编译能通过?
|
|
7楼#
发布于:2002-05-27 10:40
learn alot . thanks. |
|
8楼#
发布于:2002-05-27 12:46
hi, 各位,我在程序中是这样处理的:
KdPrint((\" %d \\n\", aaa)); // 对于ULONG KdPrint((\" %I64d \\n\", aaa.QuadPart)); //对于LARGE_INTEGER 这个错误好像是在满住一定条件才发生, 而我现在还没有确切的办法重现它,他总有10%的几率出现, 真糟糕!!! |
|
9楼#
发布于:2002-05-28 08:55
经过跟踪,发现我的数组最后一项被莫名奇妙地变成0, 但我程序没有对这块内存进行付值。看来好要仔细跟踪。 谢谢各位的帮助。 先分分了。
|
|