我正在为Windows7编写一些内核端代码来访问在用户模式下创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(§ionName,stringBuffer); OBJECT_ATTRIBUTES myAttributes; InitializeObjectAttributes(&myAttributes,§ionName,NULL,NULL); NTSTATUS status0 = ZwOpenSection(§ionHandle_,SECTION_MAP_READ|SECTION_MAP_WRITE,&myAttributes); NTSTATUS status = ZwMapViewOfSection(§ionHandle_,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(§ionName,stringBuffer); InitializeObjectAttributes(&objectAttributes,Attributes,NULL); status= ZwCreateSection(§ionHandle_,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中访问。 [重点排除]
解决方法是:
使用IOCTL
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。