阅读:1702回复:8
共享内存出错
我在内核出分配一块非分页内存,然后建立一个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; 然后在应用程序查看映射内存地址,发现内容没有改变。 |
|
最新喜欢:![]()
|
沙发#
发布于:2002-04-15 14:35
你是在驱动程序的什么地方做的?前三步没有规定,但最后一步映射到用户空间(MmMapLockedPages)必须在Dispatch例程中完成。
|
|
|
板凳#
发布于:2002-04-15 14:47
MmMapLockedPages映射为UserMode时,必须保证是在当前进程的上下文环境中进行。
|
|
地板#
发布于:2002-04-15 14:55
你是在驱动程序的什么地方做的?前三步没有规定,但最后一步映射到用户空间(MmMapLockedPages)必须在Dispatch例程中完成。 没错,我是在Dispatch例程中做的,这就是我的不理解之处 |
|
|
地下室#
发布于:2002-04-15 14:56
补充:我前三步在DriverEntry例程中做的,后一步在Dispatch例程中做的。
|
|
|
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.
|
|
|
6楼#
发布于:2002-04-15 15:11
你分配的内存为pSharedBuffer, 但在对它进行赋值时却用的是lpSharedBuffer,是笔误?
|
|
|
7楼#
发布于:2002-04-15 23:19
你的这个程序,我试过了,一切正常,没有你说的现象。
上面的代码写在 IRP_MJ_DEVICE_CONTROL中,2000DDK编译调试 |
|
|
8楼#
发布于:2005-01-07 09:58
MmUnmapLockedPages()是否也必须在dispatch例程中调用呢?
|
|