Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1702回复:8

共享内存出错

楼主#
更多 发布于:2002-04-15 13:56
    我在内核出分配一块非分页内存,然后建立一个MDL来描述它,再将它映射到进程空间,将映射得到的虚拟内存指针通过IOCTL传给应用程序。然后我做两个测试都失败,请帮忙分析为什么:
     测试1.在上述步骤成功后,在应用程序写这块内存,引起Access violacation错误;
     测试2.在驱动程序写入预定数据到共享内存,再到应用程序查看这个地址,发现内容没有变化。
     我的代码如下:

PVOID pSharedBuffer = NULL;
PMDL pMdl = NULL;
PVOID pToUser = NULL;

pSharedBuffer = ExAllocatePool(NonPagedPool,
64*400);
if(!pSharedBuffer)
{
return STATUS_INSUFFICIENT_RESOURCE;
}
pMdl = IoAllocateMdl(pSharedBuffer,64*400,FALSE,FALSE,NULL);
if(!pMdl)
{
ExFreePool(pSharedBuffer);
return STATUS_INSUFFICIENT_RESOURCE;
}

MmBuildMdlForNonPagedPool( pMdl );

pToUser = MmMapLockedPages( pMdl,UserMode );

if( !pToUser )
{
MmUnMapLockedPages(pToUser,pMdl);
IoFreeMdl( pMdl );
ExFreePool( pSharedBuffer );
return STATUS_INSUFFICIENT_RESOURCE;
}

RtlZeroMemory(lpSharedBuffer,64*400);
char TestString[]=\"This is a test\";
RtlCopyMemory(lpSharedBuffer,TestString,sizeof(TestString));

return STATUS_SUCCESS;

然后在应用程序查看映射内存地址,发现内容没有改变。

最新喜欢:

baoyibao99baoyib...
Tom_lyd
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-15 14:35
你是在驱动程序的什么地方做的?前三步没有规定,但最后一步映射到用户空间(MmMapLockedPages)必须在Dispatch例程中完成。
没有你,我不知道怎么办...
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-04-15 14:47
MmMapLockedPages映射为UserMode时,必须保证是在当前进程的上下文环境中进行。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-15 14:55
你是在驱动程序的什么地方做的?前三步没有规定,但最后一步映射到用户空间(MmMapLockedPages)必须在Dispatch例程中完成。
 

没错,我是在Dispatch例程中做的,这就是我的不理解之处
Tom_lyd
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-15 14:56
补充:我前三步在DriverEntry例程中做的,后一步在Dispatch例程中做的。
Tom_lyd
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-15 15:00
Callers of MmMapLockedPages must be running at IRQL <= DISPATCH_LEVEL if AccessMode is KernelMode. Otherwise, the caller must be running at IRQL < DISPATCH_LEVEL.

[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
ymvv
驱动牛犊
驱动牛犊
  • 注册日期2001-11-30
  • 最后登录2005-05-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-15 15:11
你分配的内存为pSharedBuffer, 但在对它进行赋值时却用的是lpSharedBuffer,是笔误?
没有你,我不知道怎么办...
AChen
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2002-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-15 23:19
你的这个程序,我试过了,一切正常,没有你说的现象。

上面的代码写在 IRP_MJ_DEVICE_CONTROL中,2000DDK编译调试
This posting is provided "AS IS" with no warranties, and confers no rights.
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-07 09:58
MmUnmapLockedPages()是否也必须在dispatch例程中调用呢?
游客

返回顶部