IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1801回复:9

为什么我的共享内存不可用?(50分)

楼主#
更多 发布于:2004-11-06 15:06
我在Dispatch里面创建共享内存,
PVOID
CreateAndMapMemory()
{
    PVOID buffer;    
    PMDL  mdl;
    PVOID userVAToReturn;
    //
    // Allocate a 4K buffer to share with the application
    //
    buffer = ExAllocatePoolWithTag(NonPagedPool,
                                   1024,
                                   'Ksir');
    if(!buffer)  {
        return(NULL);
    }
    //
    // Allocate and initalize an MDL that describes the buffer
    //
    mdl = IoAllocateMdl(buffer,
                        1024,
                        FALSE,
                        FALSE,
                        NULL);
    if(!mdl)  {
        ExFreePool(buffer);
        return(NULL);
    }
    //
    // Finish building the MDL -- Fill in the "page portion"
    //
    MmBuildMdlForNonPagedPool(mdl);

#if NT_40

    //
    // Map the buffer into user space
    //
    // NOTE: This function bug checks if out of PTEs
    //
    userVAToReturn = MmMapLockedPages(mdl,
                                      UserMode);
#else

    //
    // The preferred V5 way to map the buffer into user space
    //
    userVAToReturn =
         MmMapLockedPagesSpecifyCache(mdl,          // MDL
                                      UserMode,     // Mode
                                      MmCached,     // Caching
                                      NULL,         // Address
                                      FALSE,        // Bugcheck?
                                      NormalPagePriority); // Priority

    //
    // If we get NULL back, the request didn't work.
    // I'm thinkin' that's better than a bug check anyday.
    //
    if(!userVAToReturn)  {
        IoFreeMdl(mdl);        
        ExFreePool(buffer);
        return(NULL);
    }
#endif
    //
    // Store away both the mapped VA and the MDL address, so that
    // later we can call MmUnmapLockedPages(StoredPointer, StoredMdl)
    //
   // StoredPointer = userVAToReturn;
   // StoredMdl = mdl;
    //DbgPrint("UserVA = 0x%0x\n", userVAToReturn);
    return(userVAToReturn);

}

然后
 *((PVOID*)pIrp->AssociatedIrp.SystemBuffer)=pShareMemory;
 pIrp->IoStatus.Information = sizeof(PVOID);
返回共享内存指针
但是改指针不能够在NdisReceive里面用,一用到就兰屏,例如用NdisZeroMemory,
是不是在NdisReceive里面也要MmMapLockedPages一次?
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-11-07 20:36
BaseAddress
If AccessMode = UserMode, this parameter specifies the starting user address to map the MDL to, or NULL to allow the system to choose the starting address

为什么要在NdisReceive(指ProtocolReceive?)用返回的userVAToReturn?user space address呀,不bsod倒怪了。不是得到kernle的地址(buffer)了吗,直接用,还是NonPaged,多好
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-07 21:27
*((PVOID*)pIrp->AssociatedIrp.SystemBuffer)=pShareMemory;
修改一下
*((PVOID*)pIrp->AssociatedIrp.SystemBuffer)相当于PVOID *,也就是指针的指针。修改为
memcpy(pIrp->AssociatedIrp.SystemBuffer , &pShareMemory , sizeof(PVOID) );应该可以
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-08 09:05
BaseAddress
If AccessMode = UserMode, this parameter specifies the starting user address to map the MDL to, or NULL to allow the system to choose the starting address

为什么要在NdisReceive(指ProtocolReceive?)用返回的userVAToReturn?user space address呀,不bsod倒怪了。不是得到kernle的地址(buffer)了吗,直接用,还是NonPaged,多好


感觉有道理应该按着这种方法查一查
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-08 10:06
谢谢楼上几位大哥
找出问题所在了,是线程的问题
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-08 10:09
给分
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-11-09 23:23
晕了,现在又有问题了,返回的指针为NULL的
不知道哪里有问题
  PVOID pShareMemory=NULL;
  DWORD dwDev=0;

  SetLastError(0);
  if(!DeviceIoControl(m_hDevice,
              IO_GETLOG_CONTROL,
     &m_hLogSemaphore,
     sizeof(HANDLE),
     &pShareMemory,
     sizeof(PVOID),
     &dwDev,
     NULL
     ))
  {
 DWORD dwRet=GetLastError();
 return false;
  }
  
  if(pShareMemory==NULL)
 ::MessageBox (NULL,"共享内存没有分配成功","提示",MB_OK);



case IO_GETLOG_CONTROL:
{
HANDLE hSemaphore;

hSemaphore=*((HANDLE*)(pIrp->AssociatedIrp.SystemBuffer));

                 ObReferenceObjectByHandle(hSemaphore,
                                           GENERIC_ALL,
                                           NULL,
                                           KernelMode,
                                           &pSemaphore,
                                           NULL);

                 pUserVirtualAddress = MmMapLockedPages(pMdl, UserMode);

                 *((PVOID *)(pIrp->AssociatedIrp.SystemBuffer))=pUserVirtualAddress;

                 pIrp->IoStatus.Information = sizeof(PVOID);


break;
                    
}

各位大哥,帮帮忙啊
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-10 09:25
上次我不是说了将
*((PVOID *)(pIrp->AssociatedIrp.SystemBuffer))=pUserVirtualAddress;

修改为
*(ULONG *)(pIrp->AssociatedIrp.SystemBuffer))=(ULONG)pUserVirtualAddress ;这样应该可以的。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-11-10 11:19
谢谢楼上的大哥,但是还是不行,我这样改了
HANDLE hSemaphore;

hSemaphore=*((HANDLE*)(pIrp->AssociatedIrp.SystemBuffer));

                 ObReferenceObjectByHandle(hSemaphore,
                                           GENERIC_ALL,
                                           NULL,
                                           KernelMode,
                                           &pSemaphore,
                                           NULL);

                 pUserVirtualAddress = MmMapLockedPages(pMdl, UserMode);

                 *((ULONG *)(pIrp->AssociatedIrp.SystemBuffer))=(ULONG)pUserVirtualAddress;

                 pIrp->IoStatus.Information = sizeof(ULONG);

PVOID pShareMemory=NULL;
  DWORD dwDev=0;

App里面
  SetLastError(0);
  if(!DeviceIoControl(m_hDevice,
              IO_GETLOG_CONTROL,
     &m_hLogSemaphore,
     sizeof(HANDLE),
     &pShareMemory,
     sizeof(ULONG),
     &dwDev,
     NULL
     ))
  {
 DWORD dwRet=GetLastError();
 return false;
  }
  
  if(pShareMemory==NULL)
 ::MessageBox (NULL,"共享内存没有分配成功","提示",MB_OK);
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-07 10:11
在我创建的系统线程中可否调用MmUnmapLockedPages()函数来释放我先前分配的一块共享内存。
游客

返回顶部