阅读:1960回复:18
W2K下驱动程序调试的问题
我的程序在与驱动程序通迅是通过检查一个内存块的数据是否改变来进行的(在我的程序中必须采用这种方式,否则会有问题)。
但在程序中检查内存块状态的线程不时会遇到因FS被修改而导致的访问违例。 请问这是为什么? 另:在WINDOWS中FS主要用来做什么用? |
|
最新喜欢:chili
|
沙发#
发布于:2002-10-28 16:10
FS主要储存线程信息,比如结构化异常啊,TEB啊,等等。
你是怎么检查内存的? |
|
|
板凳#
发布于:2002-10-28 16:14
FS是系统用的,你不能随便修改!!! :mad: :mad: :mad:
|
|
|
地板#
发布于:2002-10-28 16:36
我建了一块内存与驱动程序共享,如果驱动程序中有信息则将消息写到内存块中并在内存块的第一个双字置1,应用层则不断检查该双字是否为1,为1则取消息
|
|
|
地下室#
发布于:2002-10-28 16:44
我建了一块内存与驱动程序共享,如果驱动程序中有信息则将消息写到内存块中并在内存块的第一个双字置1,应用层则不断检查该双字是否为1,为1则取消息 那样是不是效率太低了? 去看看WMI!在驱动里直接给应用发事件 你那20分不放?不庆祝一下? |
|
|
5楼#
发布于:2002-10-28 17:54
呵呵呵,别这么急着要分嘛,我说过我这样做是没办法的!
因为必须实现50K以上的频率,所以我直接修改了8254并绕过系统接管IRQ0,所以不能使用事件来通知(我苦啊)。因此只能用这种方法来通迅。 出错的情况是FS被不明的代码从正确的38H改为0,这样一来就会访问违例:( |
|
|
6楼#
发布于:2002-10-28 18:10
我的程序在与驱动程序通迅是通过检查一个内存块的数据是否改变来进行的(在我的程序中必须采用这种方式,否则会有问题)。 你的共享内存在什么地方建立的?又是怎样建立的? |
|
|
7楼#
发布于:2002-10-28 18:37
呵呵呵,别这么急着要分嘛,我说过我这样做是没办法的! 悄悄告诉你一个小秘密:你看看能不能用Debug register?在你那个共享内存头设一个内存断点,然后驱动往里写时触发了断点……………… 嘘……………………别告诉别人 :D :D :D |
|
|
8楼#
发布于:2002-10-28 21:11
to Tom_lyd:
就是在应用层中分配一块内存然后在驱动中锁定啦。 to Koms Bomb: 好办法!我试试先 |
|
|
9楼#
发布于:2002-10-29 08:59
to Tom_lyd: 那么你是用什么函数分配的内存? 我建议你在驱动层分配内存,然后将内存映射给应用程序,这样,一方面可以保证绝不会造成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 |
|
|
10楼#
发布于:2002-10-29 10:22
to Tom_lyd:
我在应用层用malloc分配然后将指针传到驱动程序中再用ioallocatemdl()/mmbuildmdlfornonpagedpages()/mmmaplockedpages()锁定代驱动程序使用。 to Koms Bomb: 有没有什么机制可以监视段寄存器的值? |
|
|
11楼#
发布于:2002-10-30 09:01
操!是我在中断处理程序中没有保存FS的值,难道有哪个API会修改FS吗?
|
|
|
12楼#
发布于:2002-10-30 09:06
to Tom_lyd: 如果是在应用层分配内存,建立不要用new,malloc之类的函数,建议用HeapAllocate函数来分配。 |
|
|
13楼#
发布于:2002-10-30 11:46
用malloc分配会有什么问题咧?
|
|
|
14楼#
发布于:2002-10-30 14:34
呵呵呵,别这么急着要分嘛,我说过我这样做是没办法的! 你真厉害,能不能告诉是怎样实现的? |
|
15楼#
发布于:2002-10-31 09:03
to lrx666:
我说得很清楚了啊。 我直接修改了8254并绕过系统接管IRQ0 to Tom_lyd: 你别说了一半就不管了啊!!! |
|
|
16楼#
发布于:2002-10-31 22:02
有没有什么机制可以监视段寄存器的值? 用softice看 |
|
17楼#
发布于:2002-11-01 08:45
我是指能够在段寄存器被改变时发出通知
用softice看 [/quote] |
|
|
18楼#
发布于:2002-11-01 09:01
应该也是softice之类的东东
|
|