阅读:1398回复:4
郁闷啊: 为什么内存共享的句柄在别的例程不可用啊
我在应用层中创建了共享内存,然后在驱动层中的IRP_MJ_DEVICE_CONTROL例程中打开成功,也可以和读读取此内存块. 但为什么在IRP_MJ_READ中就不能访问此内存块呢!!!!!!
我在驱动层中把此内存块的地址作为全局量的.我用sice调试发现此内存地址在IRP_MJ_DEVICE_CONTROL和IRP_MJ_READ中是一样的.但为什么一个能访问而另一个不行呢! 在IRP_MJ_READ中访问此内存有时出现IRQL_NOT_LESS_OR_EQUA错误,蓝屏. 请大家指点一下了!!!!! |
|
沙发#
发布于:2005-07-01 17:12
不在同一个进程地址空间吧,你必须在read中再打开该共享内存,然后再访问
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;191840 还有可能IRP_MJ_READ的Irql不对 |
|
板凳#
发布于:2005-07-04 17:38
你可以通过物理地址来读写......
|
|
|
地板#
发布于: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: "你可以通过物理地址来读写......" 这个不太清楚,能说得明白一点吗!!或给个例子!! 两位大牛,再帮一下了! |
|
地下室#
发布于: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(§ionNameUnicodeString, sectionName); InitializeObjectAttributes(&objectAttributes, §ionNameUnicodeString, OBJ_CASE_INSENSITIVE , (HANDLE) NULL, (PSECURITY_DESCRIPTOR) NULL); status = ZwOpenSection(§ionHandle, 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; } 为什么啊???????? |
|