微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用户模式和内核模式之间的共享内存

我正在为Windows7编写一些内核端代码来访问在用户模式下创build的共享内存,如此处所示 。

共享内存在用户空间中创build,名称为:

"MySharedMem"

打开用户空间中的共享内存。

调用ZwOpenSection内核模式下打开相同的共享内存失败返回:

#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)

内核代码是:

NTSTATUS CModule1::OpenShared() { SIZE_T vs = 256; WCHAR stringBuffer[] = L"\BaseNamedobjects\MySharedMem"; UNICODE_STRING sectionName; RtlInitUnicodeString(&sectionName,stringBuffer); OBJECT_ATTRIBUTES myAttributes; InitializeObjectAttributes(&myAttributes,&sectionName,NULL,NULL); NTSTATUS status0 = ZwOpenSection(&sectionHandle_,SECTION_MAP_READ|SECTION_MAP_WRITE,&myAttributes); NTSTATUS status = ZwMapViewOfSection(&sectionHandle_,ZwCurrentProcess(),(PVOID *)&pSharedData_,&vs,ViewShare,PAGE_READWRITE); return status; }

我尝试了几个名字( L"\MySharedMem"或L"MySharedMem" ),但是我得到了其他错误,如STATUS_OBJECT_PATH_INVALID或STATUS_OBJECT_PATH_NOT_FOUND 。

另外创build共享内存为"Global\MySharedMem"不起作用。

shm_open和ftruncate竞争条件可能吗?

其他程序访问STATIC共享数据结构会对Linux中C的访问时间产生巨大的影响

C静态variables和linux fork

Ashmem保留政策

为什么C中的全局数组(初始化)不能完全算作PSS

我究竟做错了什么?

我试图在内核模式下创build共享内存,我在ZwCreateSection和ZwMapViewOfSection上获得成功,但是当我访问pSharedData_指针来testing缓冲区时,出现访问冲突:

NTSTATUS CModule1::MapUserSection() { typedef struct SHARED_SECTION {DWORD i; }; NTSTATUS status = STATUS_SUCCESS; ULONG Attributes=OBJ_KERNEL_HANDLE | OBJ_FORCE_ACCESS_CHECK; OBJECT_ATTRIBUTES objectAttributes; LARGE_INTEGER MaxSize; SIZE_T ViewSize=sizeof(SHARED_SECTION); MaxSize.QuadPart=sizeof(SHARED_SECTION); WCHAR stringBuffer[] = L"\MySm2"; UNICODE_STRING sectionName; RtlInitUnicodeString(&sectionName,stringBuffer); InitializeObjectAttributes(&objectAttributes,Attributes,NULL); status= ZwCreateSection(&sectionHandle_,SECTION_ALL_ACCESS,&objectAttributes,&MaxSize,PAGE_READWRITE,SEC_COMMIT,NULL); status = ZwMapViewOfSection(sectionHandle_,&ViewSize,PAGE_READWRITE); //To test the buffer RtlFillMemory(pSharedData_,'1',ViewSize); return status; }

一切都失败了

防止截断共享映射文件

Linux共享内存同步

C ++ Boost为两个不同的进程创build共享内存

我是否需要在共享内存对象上使用shm_unlink?

我们如何检查linux中进程的“locking”共享内存?

关于CreateFileMapping :

从会话零以外的会话在全局名称空间中创建文件映射对象需要SeCreateGlobalPrivilege权限。

从KB191840 :

[T]对象总是映射到进程的用户地址空间(低于0x80000000)(无论对象是在内核模式还是用户模式下创建的),地址只有在进程上下文中访问时才有效。

KB继续说道:

不推荐使用方法因为低级设备驱动程序最少使用方法 ,因为如前所述,地址范围仅限于对象映射过程,并且无法在DPC或ISR中访问。 [重点排除]

解决方法是:

在内核模式下创建文件映射。 (由KB文章推荐)

使用IOCTL

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐