Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1842回复:11

贴出代码!请指教!

楼主#
更多 发布于:2004-03-13 09:32
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);
}

请问在应用程序中,如何用共享内存?请大哥们帮忙呀! :(

最新喜欢:

rhpengrhpeng
*学*
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-13 13:49
不好意思,这张帖就只有20分,都给你了。
*学*
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-13 13:43
大哥哥!
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;

*((PVOID *)xxxxxx) 为什么要这样写?什么意思?
*学*
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-13 13:05
例子,文章都说得那么详细了,你就不能尝试探索一下,一定要吃现成的?
附件名称/大小 下载次数 最后更新
2004-03-13_Commu_Event.rar (190KB)  39
Tom_lyd
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-13 13:02
驱动和应用共享内存和驱动与应用程序的通信是分不开的,驱动在共享内存中存放了数据,要用某种方式通知应用程序去取数据。其实这跟两个应用程序共享缓冲区没有区别,驱动既然得到了应用程序内存的指针,就可以象使用自己分配的(ExAllocatePool)内存一样存储数据,然后通知(通常是通过共享事件的方式)应用程序来取数据。
通知的方式在《专栏文章》里也有多篇文章,自己找找看。
Tom_lyd
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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();
}
然后怎么搞呢? 是不是这样呢?能有个简单的例子吗?

还是要谢谢版主大哥~!



*学*
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-13 12:31
当前位置:首页->文档阅读->专栏文章->Inside Share memory between application and kernel 在应用程序和驱动程序间共享内存的综合研究


[编辑 -  3/13/04 by  Tom_lyd]
Tom_lyd
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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);

}
然后怎么搞呢? 是不是这样呢?
    
*学*
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-13 12:03
你能用几句话写个简单的列子吗? 拜托!
*学*
deltali
驱动小牛
驱动小牛
  • 注册日期2002-10-25
  • 最后登录2010-07-06
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-13 11:49
 MmMapLockedPages函数应该是在用户进程的上下文环境中调用的,就是在你的deviceIOcontrol 的dispatch routine中进行。
你应该自己定义一个iocontro,在他的处理过程中调用MmMapLockedPages。然后把返回的地址传给用户空间就可以拉。
我又来了,生命不息,驱动不止。
Zhujnt
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-03-13 10:47
请大哥帮忙呀,应用程序然后怎么调用呀,哪怕就写两句简单代码也行呀,谢谢各位大哥,在线等呀,急!
*学*
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-03-13 10:36
到专栏文章里去查找相关主题,都有n个人提交过这种文章了。
Tom_lyd
游客

返回顶部