alan2u
驱动巨牛
驱动巨牛
  • 注册日期2001-12-11
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分5926分
  • 威望43813点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
20楼#
发布于:2003-04-04 11:50
不好意思,没有解决问题,所以不好给分呀。

问题其实是这样的,APP通过DeviceIoControl传进一个结构,
如 typedef struct _parm {
 char c;
 ...
} PARM, *PPARM;
如果通过如下代码,可以得到结构c的值
PPARM p;
p = (PPARM)Irp->Associate->SystemBuffer;

但是我现在想直接读到一个变量,所以
char ch;
ch= *(char*)Irp->Associate->SystemBuffer;
但是发现不行,反而发现ch老是变来变去,于是有了问题一和三。

至于问题二,绝对是在那个变量的作用域中的,难道除了wilton外没别的朋友碰到过!???

 


你的结构问题我认为是这样的:
编译器默认的边界对齐好像是8字节,也就是说尽管你只要求分配一个char,一个字节,系统还是给你分配了8个字节,请尝试在定义该结构之前使用
#pragma pack(1)
在该结构定义之后
#pragma pack
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2003-04-11 17:30
探讨:
question 1:寄存器原因,楼上已经说明
question 2:watch 局部变量有时候正常有时候不行,就算是前后定义的2个变量也不一样,想不通!基本上我会在调试的时候把需要看的东西设置成全局的或者赋给一个全局的指针/变元。由于SoftICE一次最多支持8个表达式watch,,难道是给优化掉了?
question 3:应该是不能直接存取系统分配的 NonPagedPool 类型的内存,应该先把Irp->AssociateIrp->SystemBuffer里面的数据copy到本地的一个NonPagedPool的类型缓冲区才可以。

举例:
pNPBuffer=ExAllocatePoolWithTag(NonPagedPool,200,TAG);
NdisAllocateMemoryWithTag(&pBuffer,200,TAG);
执行以下操作pNPBuffer和pBuffer的 内容是不一样
RtlCopyMemory(pNPBuffer,Irp->AssociateIrp->SystemBuffer,200);

RtlCopyMemory(pBuffer,Irp->AssociateIrp->SystemBuffer,200);

同理。在softice里面用命令 d Irp->AssociateIrp->SystemBuffer看到的数据 并非真实数据


question 2:似乎watch一个局部结构总是可以的,简单变量好像都不行(或者显示并非实际值)
 



[编辑 -  4/24/03 by  kaput]
天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2003-04-18 21:09
目前还没有遇到这种问题,不过受益不少,可以在以后的工作中避免了
早起早睡 精神百倍
stower
驱动牛犊
驱动牛犊
  • 注册日期2001-06-08
  • 最后登录2010-05-19
  • 粉丝0
  • 关注0
  • 积分102分
  • 威望32点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2003-05-13 18:33
 内存越界
wildmoon
驱动牛犊
驱动牛犊
  • 注册日期2003-02-09
  • 最后登录2005-02-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2003-05-15 12:29
问题一:
使用DELPHI曾遇到过类似问题,可能对你有帮助.
var
CommBuff:array 1..10 of char;
ByteNumber:integer;
.....
ByteNumber值经常发生离奇变化,后来发现在运行过程中CommBuff经常越界,内存分配时可能ByteNumber紧跟CommBuff之后,导致ByteNumber出现异常.
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2003-05-18 14:36
我用的softice调试过程中(注:我用的是ds2.6带的)发现也有变量在单步调试中不能观察他的变量值,说这个类型没有定义,而我确实在这个函数内调试,应该在这个函数的生命周期内,这个问题一直困扰我,不知那位大侠指点一下,在softice中如何正确的查看变量值?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2003-05-26 11:51
问题一:
使用DELPHI曾遇到过类似问题,可能对你有帮助.
var
CommBuff:array 1..10 of char;
ByteNumber:integer;
.....
ByteNumber值经常发生离奇变化,后来发现在运行过程中CommBuff经常越界,内存分配时可能ByteNumber紧跟CommBuff之后,导致ByteNumber出现异常.
 

Delphi我没有用过,但是丛VC编译器来看,本地变量使用堆栈来管理的,当然如果你越界肯定要破坏堆栈,还有在VC中,你没有进行初始化,则系统会所用0xCDCDCDCD来初始化(Debug版中,发行版好像是随即数),不知这对你有没有帮助
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wolfwoo22
禁止发言
禁止发言
  • 注册日期2003-03-11
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分930分
  • 威望8970点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2003-06-16 13:24
用户被禁言,该主题自动屏蔽!
lihuiming_sx
驱动牛犊
驱动牛犊
  • 注册日期2002-12-02
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2003-07-09 17:16
ch是临时变量,当程序跑出此函数时,此临时变量所占存储单元,可能被其他变量使用,softice监视的只是临时变量所占的固定地址的存储单元,当使用这个存储单元的变量有一个被重新赋值,他就被改变了。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2003-07-09 17:27
ch是临时变量,当程序跑出此函数时,此临时变量所占存储单元,可能被其他变量使用,softice监视的只是临时变量所占的固定地址的存储单元,当使用这个存储单元的变量有一个被重新赋值,他就被改变了。

为什么不看看前面讨论的内容再作结论?
Tom_lyd
Adebu
驱动牛犊
驱动牛犊
  • 注册日期2003-07-14
  • 最后登录2003-07-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2003-07-14 14:41
你定义的变量如果不再使用, 他的内存可能被占用.
melodylux
驱动牛犊
驱动牛犊
  • 注册日期2003-07-09
  • 最后登录2010-07-19
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2003-07-14 22:08
学了些,^_^
luowei74
驱动小牛
驱动小牛
  • 注册日期2003-07-21
  • 最后登录2007-04-16
  • 粉丝0
  • 关注0
  • 积分162分
  • 威望21点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2003-07-23 17:52
不行就看看那个地址,直接监控地址肯定没错
hsdjl
驱动小牛
驱动小牛
  • 注册日期2002-09-29
  • 最后登录2009-01-19
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2003-07-29 07:36
经常来,还是有收获的啊!
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
34楼#
发布于:2003-08-11 20:16
rem set up an NT checked build environment

set BUILD_ALT_DIR=chk
set NTDBGFILES=1
set NTDEBUG=ntsd
set NTDEBUGTYPE=windbg
set MSC_OPTIMIZATION= /Od /Oi
theseus
驱动牛犊
驱动牛犊
  • 注册日期2003-03-30
  • 最后登录2003-11-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
35楼#
发布于:2003-08-21 16:15
象这样的讨论越多越好。
------------------------------------------------------------ 痛并快乐
tzhou66
驱动牛犊
驱动牛犊
  • 注册日期2003-10-04
  • 最后登录2009-01-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
36楼#
发布于:2003-10-04 04:41
Because array can not be displayed in Watch, you will see it.
liudong
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2005-12-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
37楼#
发布于:2003-10-08 23:27
我发现用WATCH m_Kstrabc
这种有下划线的变量都不能查看,不知道为什么??
jhome
驱动牛犊
驱动牛犊
  • 注册日期2002-07-04
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2003-10-10 15:47
提的问题真好
jhome
驱动牛犊
驱动牛犊
  • 注册日期2002-07-04
  • 最后登录2005-01-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2003-10-10 15:49
it\'s very good for this question
游客

返回顶部