zhengshangj
驱动牛犊
驱动牛犊
  • 注册日期2005-04-27
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望9点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1398回复:4

郁闷啊: 为什么内存共享的句柄在别的例程不可用啊

楼主#
更多 发布于:2005-07-01 16:38
  我在应用层中创建了共享内存,然后在驱动层中的IRP_MJ_DEVICE_CONTROL例程中打开成功,也可以和读读取此内存块.  但为什么在IRP_MJ_READ中就不能访问此内存块呢!!!!!!
  我在驱动层中把此内存块的地址作为全局量的.我用sice调试发现此内存地址在IRP_MJ_DEVICE_CONTROL和IRP_MJ_READ中是一样的.但为什么一个能访问而另一个不行呢!
在IRP_MJ_READ中访问此内存有时出现IRQL_NOT_LESS_OR_EQUA错误,蓝屏.
   请大家指点一下了!!!!!
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-01 17:12
不在同一个进程地址空间吧,你必须在read中再打开该共享内存,然后再访问

http://support.microsoft.com/default.aspx?scid=kb;zh-cn;191840

还有可能IRP_MJ_READ的Irql不对
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2005-07-04 17:38
你可以通过物理地址来读写......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
zhengshangj
驱动牛犊
驱动牛犊
  • 注册日期2005-04-27
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望9点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-05 11:10
先谢谢各位!
to tooflat:
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;191840网址我看过了,共享内存在驱动层打开我是正确的.
在IRP_MJ_READ例程中我用KeGetCurrentIrql(),返回的是NULL,应该是这个有问题!!那应该怎么解决呢!

to wowocock:
"你可以通过物理地址来读写......"     这个不太清楚,能说得明白一点吗!!或给个例子!!

两位大牛,再帮一下了!
zhengshangj
驱动牛犊
驱动牛犊
  • 注册日期2005-04-27
  • 最后登录2008-08-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望9点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-06 15:55
版主! 再帮一下啊!
我在程序中测了一下!
为什么在IRP_MJ_DEVICE_CONTROL例和中打开共享内存成功, 但在IRP_MJ_READ例程中在执行到ZwOpenSection()时就出错了.错误码是STATUS_OBJECT_NAME_NOT_FOUND.

在两个例程中打开的源码是一样的:
我的打开共享内存源码是:
                UNICODE_STRING      sectionNameUnicodeString;
                WCHAR sectionName[] = L"\\BaseNamedObjects\\SecSharedMemory";

       RtlInitUnicodeString(&sectionNameUnicodeString, sectionName);      

               InitializeObjectAttributes(&objectAttributes,
                               &sectionNameUnicodeString,                                                                          OBJ_CASE_INSENSITIVE ,
                               (HANDLE) NULL,
                               (PSECURITY_DESCRIPTOR) NULL);

       status = ZwOpenSection(&sectionHandle,
                     SECTION_ALL_ACCESS,
                     &objectAttributes);
              
       if (!NT_SUCCESS(status))
       {
              KdPrint(("ZwOpenSection failed\n"));
              return status;
        }
              
       viewsize = 0;
              
       status = ZwMapViewOfSection(sectionHandle,
                     (HANDLE) -1,
                     &virtualAddress,
                     0L,              // zero bits
                     PAGE_SIZE,       // commit size
                     NULL,            // section offset
                     &viewsize,
                     ViewShare,
                     0,
                     PAGE_READWRITE);
              
       if (!NT_SUCCESS(status))
       {
              KdPrint(("ZwMapViewOfSection failed\n"));
              ZwClose (sectionHandle);
              return status;
       }

为什么啊????????
游客

返回顶部