阅读:1697回复:11
如何从VXD中实时给Ring3程序传递数据?
我在做一个脉冲检测程序中,需要VXD给Ring3的程序同步发送数据,但一直没有做通.目前暂时用DeviceIoControl()传送数据,不知哪位同仁有更好的方法,可以说说,共同探讨一下.
|
|
最新喜欢:hongsi... |
沙发#
发布于:2002-10-13 17:30
问题已经解决了,欢迎大家讨论!
|
|
板凳#
发布于:2002-10-24 09:03
板主怎样解决的?频率多高?
|
|
地板#
发布于:2002-10-31 19:58
目前在win9x下是0.5ms,可以比这更高的,但我只需要这么高。
|
|
地下室#
发布于:2002-10-31 19:59
您有更好的方法吗?说说看。
|
|
5楼#
发布于:2002-11-05 22:27
是用事件的方法吗??? :)
|
|
6楼#
发布于:2002-11-07 20:48
不是用事件方法,用DeviceIoControl()函数做的。我曾经尝试用全局事件的方法处理,可是在硬件中断中,WIN9X系统好象不让用系统服务函数VWIN32_VM_EVent(),如果用该函数,系统总是死机,而且死的很难堪,你有好主意吗?
|
|
7楼#
发布于:2002-11-09 08:26
:)我用的就是事件,只是在传给驱动程序事件号时做了些手脚:),因其他的实时性都不是很好,后来就舍弃了。
|
|
8楼#
发布于:2002-11-09 12:24
能详细告诉我您是如何做的手脚吗?谢谢!可以发邮件给我:
qiaozongli@vip.sina.com |
|
9楼#
发布于:2002-11-11 19:25
楼上的朋友怎么没有下文了?俺们都等着呢。
|
|
10楼#
发布于:2002-11-12 11:20
:( 因整个程序已经整合到了软件中,因此可能没得赠送源代码了,
我就摘一段了,我是delphi+c,上层用的是Delphi,底层就大家一个样了。 function TInterruptHook.SetIntrrupt(const IRQSet1:TIRQSet1;DesMemAddr:Dword; SrcMemAddr:Dword;LengCpy:Dword;Destrant:DWORD; MAXIFCHG:DWORD;CHGIFSET:dword):boolean; var Kernel32:THandle; OpenVxDHandle:TOpenVxDHandle; VxDEvent:THandle; tmpflag:boolean; irqset0:Tirqset0; begin tmpflag:=false; Eventhandle:=TEvent.Create(nil,True,False,\'\'); threadhandle:=CreateThread(Nil,0, @OnThreadExec, pointer(self), CREATE_SUSPENDED,threadid); if threadhandle<>0 then begin ResumeThread(threadhandle); Kernel32:=LoadLibrary(\'KERNEL32.DLL\'); if Kernel32<>0 then begin SetThreadPriority(threadhandle,THREAD_PRIORITY_TIME_CRITICAL ); OpenVxDHandle:=GetProcAddress(Kernel32,\'OpenVxDHandle\');//主要就这了,有了这后事件就可在驱动层用了 VxDEvent:=OpenVxDHandle(Eventhandle.Handle); IRQRETURN.IntrStuAddr:=PDWORD(dword(IRQSET1.BaseLineAddr)+$100); IRQRETURN.IntrMaskAddr:=PDWORD(dword(IRQSET1.BaseLineAddr)+$104); CallBackApc:=irqset1.CallBackApc; //设置线程回调地址 irqset0.VxdEvent:=VxDEvent; //设置服务包地址为事件句柄 irqset0.maskset:=IRQSet1.MaskSet; irqset0.IRQNUM:=IRQSet1.IRQNUM; irqset0.ServNum:=IRQSet1.ServNum; IRQRETURN.servnum:=IRQSET1.ServNum; irqset0.BaseLineAddr:=IRQSET1.BaseLineAddr; irqset0.SrcMemAddr:=SrcMemAddr; irqset0.DesMemAddr:=DesMemAddr; irqset0.LengCpy:=LengCpy; irqset0.Destrant:=Destrant; irqset0.CHGIFSET:=CHGIFSET; irqset0.MAXIFCHG:=MAXIFCHG; tmpflag:=OpenDevice(IRQSet0,2228291); FreeLibrary(Kernel32); //} end; if not (tmpflag)then begin Eventhandle.Free; end; end; result:=tmpflag; end; |
|
11楼#
发布于:2002-11-12 11:22
啊,跑了好多 :D在里面啊。。。晕
那是 :D,都是表情码搞的鬼 :mad: |
|