guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:2174回复:15

如何在中断驱动中访问全局变量?

楼主#
更多 发布于:2002-02-26 14:14
各位好:
  有一个问题,想请教大家:
  我在ring3级的程序中定义了一个字符型全局变量Str[200],我想在我的中断驱动中访问他。但我不知如何将其地址传递给中断驱动,这中间的实现方法和注意事项请各位指点。
  令我有一个疑惑:WIN98的内存管理是可移动的,我分配的Str[200]是否能在中断驱动中访问。内存的可移动管理,是否对此有影响,影响如何解决。
    谢谢。

[编辑 -  2/26/02 作者: guoj]

[编辑 -  2/26/02 作者: guoj]

最新喜欢:

flyfoxflyfox
guoj
Snare
驱动小牛
驱动小牛
  • 注册日期2002-01-31
  • 最后登录2002-08-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-02-26 14:57
参数有ring3传递给驱动时,是经过复制的,所以传递的只是一个拷贝,不是本身,
我就是我,没什么可说的。
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-02-26 15:11
参数有ring3传递给驱动时,是经过复制的,所以传递的只是一个拷贝,不是本身,

   参数传递时,当然是要传递Str[200]的地址啦,你的回答并不能说明原问题如何解决呀。

[编辑 -  2/26/02 作者: guoj]
guoj
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-02-26 18:10
两种方法:
1、通过ReadFile或WriteFile函数,其参数中有InputBuffer和BufferLength;
2、应用程序通过DeviceIoControl()向驱动程序发送IOCTL码,可指定InputBuffer和OutBuffer以及使用Buffer的方式(METHOD_BUFFER或Direct buffer);
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-02-26 18:31
两种方法:
1、通过ReadFile或WriteFile函数,其参数中有InputBuffer和BufferLength;
2、应用程序通过DeviceIoControl()向驱动程序发送IOCTL码,可指定InputBuffer和OutBuffer以及使用Buffer的方式(METHOD_BUFFER或Direct buffer);


  谢谢!
  我想多问的一些:上面参数传递中分配的InputBuffer指向,是在ring3程序中产生的,且它是一个线性地址,当我在ring0中断(注意中断的随机性)访问时,恰巧由于WIN98的分页机制导致此段内存已经移动,即InputBuffer,此事是否会发生分页错误。不知我的猜想是否成立?实际的内在又是什么?

[编辑 -  2/26/02 作者: guoj]
guoj
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-02-26 20:54
你可以把你分配的这个内存锁定在内存里,不让系统换出物理内存
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-02-27 08:22
ring0中断是什么呢?
在应用程序向驱动程序发送irp后,系统会将input buffer映射到系统内存,是非分页的;处理完irp后如果有out buffer,再将系统内存映射到ring3;就是说,在将irp传给驱动程序后到驱动程序返回,buffer在非分页内存。
还有WIN98的内存管理是可移动的,是不对的。我猜想你的意思是指虚拟内存管理机制,它是将分页内存在空闲的时候,通过虚拟内存管理将其写入硬盘的内存map文件,同时会将其相应的选择符的标志位(在内存还是硬盘上)置位。在访问它的时候再将其读入内存。而分页错误就是访问既不在内存中又不在内存map文件中的GDT或LDT,或在高于PASSIVE_LEVEL的Level访问在硬盘内存map文件的分页内存。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-02-27 09:13
  拜读tigerzd的意见后,我的理解是这样的:应用程序的全局变量的指针在传递给驱动程序后,真实的内存环境中自动的就存在两个缓冲区:
  其一是应用程序中的变量;
  其二是由驱动(或者由操作系统本身的提供的接口)在系统内存映像的缓冲区。
  而映射到系统内存中的内容,是严格的保持与应用程序中的变量相同。不管谁(由应用程序或者是驱动程序发起的)的更新都将在对方的访问中反映出来。
  是吗?

  若不是的话,就要像guardee的观点所说:就是要在 RING3 级中锁住内存,以便在中断中访问这个内存变量了。
  请指正。

以上的有些语言措词可能不恰当,但希望所表达的问题能为人理解。另我对WIN的虚拟内存管理实在是知之甚少,在此多谢各位指导。

[编辑 -  2/27/02 作者: guoj]
guoj
yzhgry
驱动牛犊
驱动牛犊
  • 注册日期2001-10-16
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-02-27 09:53
可用共享内存方法
在主程序中开设读写内存
在驱动中调用
同时设读写指针
速度很快
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-02-27 10:03
可用共享内存方法
在主程序中开设读写内存
在驱动中调用
同时设读写指针
速度很快


共享内存是个好主意,我想他不会存在什么让人复杂的理解吧。你能介绍一下共享内存的一些基础特性知识吗?能多点源码级的帮助吗?
有点懒...
[编辑 -  2/27/02 作者: guoj]
考虑了一阵子,发现在中断和应用程序中都要访问此共享,是否现在保证“内存读写访问的同步”就不太容易解决了。

[编辑 -  2/27/02 作者: guoj]
guoj
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-02-27 12:47
\"而映射到系统内存中的内容,是严格的保持与应用程序中的变量相同。不管谁(由应用程序或者是驱动程序发起的)的更新都将在对方的访问中反映出来\"说法不对。
如果使用METHOD_BUFFER的IOCTL IRP,系统会将Input Buffer和Output Buffer中较大的buffer映射到系统内存,指针位于Irp->AssociatedIrp.SystemBuffer,其前Input length字节为Input Buffer内容,如果在处理IRP时没有改变SystemBuffer,而Irp->IoStatus.Status返回状态,Irp->IoStatus.Information 为返回应用程序的字节数n,那么应用程序就会得到n字节没有改变的数据。系统内存与应用程序中是不相干的,它们通过IRP联系。要不你不是轻易的就可以改写系统内存了?
  
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-02-27 15:54
  tigerzd的回答如此百般细致,太谢谢。但是我觉的讨论的还全理解。重新摆正.<说法有些不妥吧?>
  按照以上的理论,假设:我通过“应用程序向驱动程序发送irp后”,即通过DeviceIoControl()把全局变量的地址传给了驱动,就是说驱动接受了我的“全局变量地址”,并且在我的中断程序中对此“全局变量”进行了赋值。现在只要我在一个线程中不断的循环检测此全局变量,就应该能够发现全局变量的变化,是吧。
  好了,我有点疑惑:好像我的线程程序在检测全局变量时并没有向驱动发送所谓的IOCTL IRP呀。(我的观点)

[编辑 -  2/27/02 作者: guoj]
guoj
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-02-27 19:10
又有新用的疑问:  
  我在查阅一些资料的时候发现了这么一句话,其意可能这样吧:就是驱动(中断吧,更为好理解)中不太可能访问应用程序中的变量(是真实的变量而非映射地址),原句如下:
  Memory allocated in a VxD is globally,and can be shared with applications.Memory that an application allocates may be in a process specific region of the memory map.In this case,the VxD cannot access that memory unless the current memory context is that of the process.
  我现在想以上观点可能是对的。
试想有这么一个WIN98程序:该程序存在中断中修改某个全局变量,且恰巧在中断产生前内核将系统切入到一个DOS VM 在运行,由于环境上下文变了,此中断还能找到系统VM中的这个应用程序中的全局变量吗?
  是糊涂了还是明白了?

[编辑 -  2/27/02 作者: guoj]
guoj
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-03-01 10:48
用户被禁言,该主题自动屏蔽!
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-03-01 13:10
  \"DIRECT方式是IO管理器通过建立一个MDL,把分页内存进行锁定并影射成非分页内存,以便驱动程序进行操作,在例程返回时,再解除。\"
  以上意思是说:驱动通过“DIRECT方式”可以直接操作我的全局变量了,对吧!若是,那可太好了。(我的一个疑虑就让你给化解了。加分25分-4分-12分=9分;暂时先给你5分吧,为了是细水长流啊...)
    令问一个另类问题,当然也与本论题有关:
  通过程式语句把内存变量锁定,如guardee所说;和系统自动把“分页内存锁定并影射成非分页内存”是否在实质上是一回事?
  当我们锁定一个变量或者是一个分页内存时,是否他们都将被系统映射至系统内存(肯定是非分页内存)吧。当解锁后,这个内存区又是怎么变化的?(若98没有“解锁”这个概念的话,就不为难英雄了)
  一句话,我锁住内存时,系统内存又发生了那些变化?

  本帖问的太多了,完成此项“啃钻石”任务,咱的“中断-访问-全局变量”就竣工。
guoj
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-03-01 13:18
版主,我的“给分”按钮不见了!
   说明:
   总分25分,在第一次我分发了共16分,现在我想分发余下的???
可以这样:重建新帖--发分。

[编辑 -  3/1/02 作者: guoj]
guoj
游客

返回顶部