阅读:2257回复:16
共享内存的分配问题?
小弟现在想在vxd和win32程序之间共享一块内存(1M),这块内存想用来作数据采集板的数据转存,因此要在vxd的中断处理程序中进行存取,同时win32程序也要能将其读取并存储到硬盘。
请问高手,这块内存在哪分配较好(vxd or win32),可以分别用什么函数分配?这块内存在vxd中是否要锁定,才能保证该内存中的数据在采集过程中不会被侵占? |
|
最新喜欢:aasa2 |
沙发#
发布于:2002-04-20 14:34
各位高手,还有斑竹,快帮帮我阿!是不是我的问题太简单了!! :( :( :( :(
|
|
板凳#
发布于:2002-04-21 15:11
怎么没人理我!我好伤心。。。。。 :(
|
|
地板#
发布于:2002-04-21 15:23
有分吗?------吝啬!!!!哈哈 ;) ;) ;) ;) ;) ;)
等我一下,我会了就告诉你!!!! [编辑 - 4/21/02 作者: yangyang] |
|
|
地下室#
发布于:2002-04-22 21:05
可以用MDL完成!我也是下载的www.safe123.com
一般的ring0的virtualaddress不能直接使用. 如果需要ring0和ring3共享这部分缓冲,可以通过 以下的操作完成. SystemVirtualAddress = MmAllocateContiguousMemory(NumberOfBytes, HighestAcceptableAddress); 或者: SystemVirtualAddress = ExAllocatePool(PoolType, NumberOfBytes); 然后 Mdl = IoAllocateMdl(SystemVirtualAddress, NumberOfBytes, FALSE, FALSE, NULL); 然后: 如果缓冲区是非分页内存 MmBuildMdlForNonPagedPool(Mdl); 如果十分页内存: MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess); ring3可以使用的virtual Address: UserVirtualAddress = MmMapLockedPages(Mdl, UserMode); 然后应用程序就可以使用这部分的缓冲区了. 给点分行吗??别太抠了!! :) :) |
|
|
5楼#
发布于:2002-04-23 19:18
monkeyy:
我是菜鸟,MDL是什么,我没听说过。能介绍一下吗? :P :P :P |
|
6楼#
发布于:2002-04-25 20:30
monkeyy
我还是先给你分吧! 十分感谢你的帮助!!!! |
|
7楼#
发布于:2002-04-25 20:45
不知道你做没做过win32共享内存!MDL就是内存映射文件对象。用于两个win32之间共享内存的。然而在98中由于3G-4G之间没有限制;所以也能用MDL,实质就是把高端地址映射到win32中!反正一句话,他能用就行了!
|
|
|
8楼#
发布于:2002-04-25 21:06
vxd中也能使用mdl吗,第一次听说,下次试试。
不用那么麻烦的,你在应用程序中分配一段缓冲区,然后锁定后用deviceiocontrol将缓冲区地址传给vxd,vxd中好像也要锁定一下吧,然后就可以直接用了。 |
|
|
9楼#
发布于:2002-04-27 20:18
zydcat
谢谢你的帮助!可是我找不到给分的钮了!! 另外在vxd中的锁定是不是用PageLock? [编辑 - 4/27/02 作者: dongjun] |
|
10楼#
发布于:2002-04-28 08:48
不对,是用linepagelock。
|
|
11楼#
发布于:2002-04-28 11:31
没错,是linepagelock,
|
|
|
12楼#
发布于:2002-04-29 09:27
zydcat:
厚着脸皮问一下,如果我在vxd中开一个1M的数组,再将其地址传给win32程序,这样使用可以吗? 另外,上次你所说的方法是不是直接在win32程序中new一块内存,(在win32中,用什么函数锁定,还想请问高手?) vxd中得到内存地址,之后锁定就可以在中断中安全访问了,对吗?能否贴一段例子给俺参考一下,先谢了!!! |
|
13楼#
发布于:2002-04-29 09:47
其实不用共享内存就能实现你的要求,你就在VXD中定义一个数组存储数据采集板的数据,也不必用什么锁定,直接用deviceiocontrol在VXD和应用程序之间互相传输就行了,这就相当于VXD就是你的采集板,你的应用程序随时随地从它身上取数。
|
|
14楼#
发布于:2002-04-29 11:51
1m的数组,好大呀,试试吧。
应用层锁定用GlobalLock() |
|
|
15楼#
发布于:2002-04-29 13:27
1M的数组!我一定会在app层申请空间的。
建议象yanghaoyun同志说的那样做。 |
|
16楼#
发布于:2002-05-03 09:33
谢谢!楼上众位兄弟的热心帮助,没有给分,只是因为无法找到给分的键了,请大家到隔壁签名取分!!!!!
|
|