Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1960回复:18

W2K下驱动程序调试的问题

楼主#
更多 发布于:2002-10-28 15:53
我的程序在与驱动程序通迅是通过检查一个内存块的数据是否改变来进行的(在我的程序中必须采用这种方式,否则会有问题)。
但在程序中检查内存块状态的线程不时会遇到因FS被修改而导致的访问违例。
请问这是为什么?
另:在WINDOWS中FS主要用来做什么用?

最新喜欢:

chilichili
易水
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-28 16:10
FS主要储存线程信息,比如结构化异常啊,TEB啊,等等。
你是怎么检查内存的?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-28 16:14
FS是系统用的,你不能随便修改!!! :mad: :mad: :mad:
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-10-28 16:36
我建了一块内存与驱动程序共享,如果驱动程序中有信息则将消息写到内存块中并在内存块的第一个双字置1,应用层则不断检查该双字是否为1,为1则取消息
易水
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-28 16:44
我建了一块内存与驱动程序共享,如果驱动程序中有信息则将消息写到内存块中并在内存块的第一个双字置1,应用层则不断检查该双字是否为1,为1则取消息

那样是不是效率太低了?
去看看WMI!在驱动里直接给应用发事件
你那20分不放?不庆祝一下?
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-10-28 17:54
呵呵呵,别这么急着要分嘛,我说过我这样做是没办法的!
因为必须实现50K以上的频率,所以我直接修改了8254并绕过系统接管IRQ0,所以不能使用事件来通知(我苦啊)。因此只能用这种方法来通迅。

出错的情况是FS被不明的代码从正确的38H改为0,这样一来就会访问违例:(
易水
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-28 18:10
我的程序在与驱动程序通迅是通过检查一个内存块的数据是否改变来进行的(在我的程序中必须采用这种方式,否则会有问题)。
但在程序中检查内存块状态的线程不时会遇到因FS被修改而导致的访问违例。
请问这是为什么?
另:在WINDOWS中FS主要用来做什么用?

你的共享内存在什么地方建立的?又是怎样建立的?
Tom_lyd
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-28 18:37
呵呵呵,别这么急着要分嘛,我说过我这样做是没办法的!
因为必须实现50K以上的频率,所以我直接修改了8254并绕过系统接管IRQ0,所以不能使用事件来通知(我苦啊)。因此只能用这种方法来通迅。

出错的情况是FS被不明的代码从正确的38H改为0,这样一来就会访问违例:(

悄悄告诉你一个小秘密:你看看能不能用Debug register?在你那个共享内存头设一个内存断点,然后驱动往里写时触发了断点………………
嘘……………………别告诉别人 :D :D :D
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-10-28 21:11
to Tom_lyd:
   就是在应用层中分配一块内存然后在驱动中锁定啦。

to Koms Bomb:
   好办法!我试试先
易水
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-29 08:59
to Tom_lyd:
   就是在应用层中分配一块内存然后在驱动中锁定啦。

to Koms Bomb:
   好办法!我试试先

那么你是用什么函数分配的内存?
我建议你在驱动层分配内存,然后将内存映射给应用程序,这样,一方面可以保证绝不会造成Page Fault,另一方面,方便驱动层的编程。

const ULONG memsize = 64*1024;//大小视你的需要而定

LPVOID lpSharedBuffer = ExAllcoatePool( NonPagedPool, memsize );
然后,为这块内存分配一个MDL来描述它
PMDL pMdl;
pMdl = IoAllocateMdl( lpSharedBuffer, memsize,FALSE, FALSE,NULL );
//Build the MDL
MmBuildMdlForNonPagedPool( pMdl );

//以上部分,需要在DriverEntry例程中执行,也可以在DISPATCH例程中执行
//将内核共享内存映射给应用程序,这一句必须在DISPATCH例程中执行。
LPVOID lpUserAddress=MmMapLockedPages( pMdl, UserMode );
然后,在应用层就可以直接使用lpUserAddress指针了,访问时,注意同步即可。
参考http://www.osr.com/ntinsider/2000/sharing_memory.htm
Tom_lyd
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-10-29 10:22
to Tom_lyd:
我在应用层用malloc分配然后将指针传到驱动程序中再用ioallocatemdl()/mmbuildmdlfornonpagedpages()/mmmaplockedpages()锁定代驱动程序使用。

to Koms Bomb:
  有没有什么机制可以监视段寄存器的值?
易水
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-10-30 09:01
操!是我在中断处理程序中没有保存FS的值,难道有哪个API会修改FS吗?
易水
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-10-30 09:06
to Tom_lyd:
我在应用层用malloc分配然后将指针传到驱动程序中再用ioallocatemdl()/mmbuildmdlfornonpagedpages()/mmmaplockedpages()锁定代驱动程序使用。

to Koms Bomb:
  有没有什么机制可以监视段寄存器的值?

如果是在应用层分配内存,建立不要用new,malloc之类的函数,建议用HeapAllocate函数来分配。
Tom_lyd
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-10-30 11:46
用malloc分配会有什么问题咧?
易水
lrx666
驱动太牛
驱动太牛
  • 注册日期2001-08-17
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望47点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-10-30 14:34
呵呵呵,别这么急着要分嘛,我说过我这样做是没办法的!
因为必须实现50K以上的频率,所以我直接修改了8254并绕过系统接管IRQ0,所以不能使用事件来通知(我苦啊)。因此只能用这种方法来通迅。

出错的情况是FS被不明的代码从正确的38H改为0,这样一来就会访问违例:(

你真厉害,能不能告诉是怎样实现的?
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-10-31 09:03
to lrx666:
   我说得很清楚了啊。
我直接修改了8254并绕过系统接管IRQ0

to Tom_lyd:
   你别说了一半就不管了啊!!!
易水
creek
驱动牛犊
驱动牛犊
  • 注册日期2002-03-12
  • 最后登录2002-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-10-31 22:02
 
有没有什么机制可以监视段寄存器的值?

 用softice看
Ares
驱动小牛
驱动小牛
  • 注册日期2001-03-28
  • 最后登录2020-04-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望114点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2002-11-01 08:45
我是指能够在段寄存器被改变时发出通知
 

 [quote] 有没有什么机制可以监视段寄存器的值?
 


用softice看

[/quote]
易水
zuowei999
驱动牛犊
驱动牛犊
  • 注册日期2002-03-21
  • 最后登录2018-02-05
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望53点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-11-01 09:01
应该也是softice之类的东东
游客

返回顶部