阅读:1842回复:11
贴出代码!请指教!
PVOID
CreateAndMapMemory() { PVOID buffer; PMDL mdl; PVOID userVAToReturn; buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 'MpaM'); if(!buffer) { return(NULL); } mdl = IoAllocateMdl(buffer, PAGE_SIZE, FALSE, FALSE, NULL); if(!mdl) { ExFreePool(buffer); return(NULL); } MmBuildMdlForNonPagedPool(mdl); userVAToReturn = MmMapLockedPages(mdl, UserMode); if(!userVAToReturn) { IoFreeMdl(mdl); ExFreePool(buffer); return(NULL); } StoredPointer = userVAToReturn; StoredMdl = mdl; DbgPrint("UserVA = 0x%0x\n", userVAToReturn); return(userVAToReturn); } 请问在应用程序中,如何用共享内存?请大哥们帮忙呀! :( |
|
最新喜欢:![]()
|
沙发#
发布于:2004-03-13 13:49
不好意思,这张帖就只有20分,都给你了。
|
|
|
板凳#
发布于:2004-03-13 13:43
大哥哥!
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress; *((PVOID *)xxxxxx) 为什么要这样写?什么意思? |
|
|
地板#
发布于:2004-03-13 13:05
例子,文章都说得那么详细了,你就不能尝试探索一下,一定要吃现成的?
|
|
|
地下室#
发布于:2004-03-13 13:02
驱动和应用共享内存和驱动与应用程序的通信是分不开的,驱动在共享内存中存放了数据,要用某种方式通知应用程序去取数据。其实这跟两个应用程序共享缓冲区没有区别,驱动既然得到了应用程序内存的指针,就可以象使用自己分配的(ExAllocatePool)内存一样存储数据,然后通知(通常是通过共享事件的方式)应用程序来取数据。
通知的方式在《专栏文章》里也有多篇文章,自己找找看。 |
|
|
5楼#
发布于:2004-03-13 12:47
版主大人,我就用最简单的第一种吧.(Sharing Buffers Using IOCTLs---METHOD_DIRECT).
在应用程序中是不是这样: typedef struct _MyBuffer { int x; int y; char data[100]; }BUFFER; BUFFER mBuffer; bResult = DeviceIoControl( hDevice, IOCTL_GET_MYBUFFER, NULL, 0, mBuffer, sizeof(BUFFER), &junk, NULL); 驱动程序中: case IOCTL_GET_MYBUFFER: { MmGetSystemAddressForMdlSafe(); } 然后怎么搞呢? 是不是这样呢?能有个简单的例子吗? 还是要谢谢版主大哥~! |
|
|
6楼#
发布于:2004-03-13 12:31
当前位置:首页->文档阅读->专栏文章->Inside Share memory between application and kernel 在应用程序和驱动程序间共享内存的综合研究
[编辑 - 3/13/04 by Tom_lyd] |
|
|
7楼#
发布于:2004-03-13 12:20
应用程序中:
假如我定义一个结构 typedef struct _MyBuffer { int x; int y; char data[100]; }BUFFER; BUFFER mBuffer; bResult = DeviceIoControl( hDevice, IOCTL_GET_MYBUFFER, NULL, 0, mBuffer, sizeof(BUFFER), &junk, NULL); 这里就对mBuffer中的值处理! 驱动程序中: case IOCTL_GET_MYBUFFER: { userVAToReturn = MmMapLockedPages(mdl, UserMode); } 然后怎么搞呢? 是不是这样呢? |
|
|
8楼#
发布于:2004-03-13 12:03
你能用几句话写个简单的列子吗? 拜托!
|
|
|
9楼#
发布于:2004-03-13 11:49
MmMapLockedPages函数应该是在用户进程的上下文环境中调用的,就是在你的deviceIOcontrol 的dispatch routine中进行。
你应该自己定义一个iocontro,在他的处理过程中调用MmMapLockedPages。然后把返回的地址传给用户空间就可以拉。 |
|
|
10楼#
发布于:2004-03-13 10:47
请大哥帮忙呀,应用程序然后怎么调用呀,哪怕就写两句简单代码也行呀,谢谢各位大哥,在线等呀,急!
|
|
|
11楼#
发布于:2004-03-13 10:36
到专栏文章里去查找相关主题,都有n个人提交过这种文章了。
|
|
|