Windows系统服务与用户进程共享内存
2017-05-02 23:00
411 查看
通常使用CreateFileMapping的WINAPI函数可以创建共享内存,可以实现在不同进程中访问同一数据,实现通信等。但我们在其他实际编程中会遇到,服务和进程通信的情况,及系统服务与用户进程共同访问共享内存,如果仍然使用这个API,你会发现,在另一个程序中Open时,是无法返回正确的HANDLE的。
以下这段代码也是来自 stackoverflow上的,我们以此展开学习
查看MSDN,最重要的不是WINDOWSAPI,而是那两个字符串,这里就不说函数体每个参数的意思了,主要是这两个字符串比较诱人。
const char* sharename = “Global\mysharedmemory”;
const char* sharessdl = “D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)”;
其中 sharename必须是Global引头的,如果是进程间的,则这里不需要,直接指定名字即可,如果跨组,跨权,那这里就是要用到Global这个全局命名空间。微软是这么说的:
内核对象命名空间
https://msdn.microsoft.com/en-us/library/aa382954(v=vs.85).aspx
重要的是文中已说明:
注意 全局命名空间不适用于Windows Store应用程序。
CreateEvent( NULL, FALSE, FALSE, “Global\CSAPP” );
默认情况下,远程桌面服务环境中的服务应用程序使用全局命名空间。
全局命名空间使多个客户端会话上的进程与服务应用程序通信。
除了“Global \”前缀之外,客户端进程可以使用“Local \”前缀在其会话命名空间中显式创建一个对象。这些关键字区分大小写。
这个好理解,但下面那个字符串就难理解了
const char* sharessdl = “D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)”;
第一见的时候,感慨,这是什么鬼,太高端了。后来查阅了MSDN,好好的补习了一下。
这个字符串叫做 安全描述字符串,是微软的一套用来定义描述某个程序或者某个地址,某个文件,文件夹的访问权限,嗯,挺鬼的,因为不好写,或许和unix的mmod类似吧,有兴趣可以参考以下文章,提前预习。
https://blogs.technet.microsoft.com/askds/2008/04/18/the-security-descriptor-definition-language-of-love-part-1/
打开控制台,输入以下命令行
嗯没错,你会看到一堆的这样的字符串,这个字符串就是用来描述这个文件夹的访问控制权限的。
有限的时间,我们一起学习,下一博,安全描述符。
以下这段代码也是来自 stackoverflow上的,我们以此展开学习
const char* sharename = "Global\\mysharedmemory"; const char* sharessdl = "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)"; HANDLE CreateGlobalFileMapping() { SECURITY_ATTRIBUTES security; ZeroMemory(&security, sizeof(security)); security.nLength = sizeof(security); ConvertStringSecurityDescriptorToSecurityDescriptorA( sharessdl, SDDL_REVISION_1, &security.lpSecurityDescriptor, NULL); HANDLE tmp = CreateFileMappingA(INVALID_HANDLE_VALUE, &security, PAGE_READWRITE, 0, SHAMEM_MAX,sharename); LocalFree(security.lpSecurityDescriptor); return tmp; }
查看MSDN,最重要的不是WINDOWSAPI,而是那两个字符串,这里就不说函数体每个参数的意思了,主要是这两个字符串比较诱人。
const char* sharename = “Global\mysharedmemory”;
const char* sharessdl = “D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)”;
其中 sharename必须是Global引头的,如果是进程间的,则这里不需要,直接指定名字即可,如果跨组,跨权,那这里就是要用到Global这个全局命名空间。微软是这么说的:
内核对象命名空间
https://msdn.microsoft.com/en-us/library/aa382954(v=vs.85).aspx
重要的是文中已说明:
注意 全局命名空间不适用于Windows Store应用程序。
CreateEvent( NULL, FALSE, FALSE, “Global\CSAPP” );
默认情况下,远程桌面服务环境中的服务应用程序使用全局命名空间。
全局命名空间使多个客户端会话上的进程与服务应用程序通信。
除了“Global \”前缀之外,客户端进程可以使用“Local \”前缀在其会话命名空间中显式创建一个对象。这些关键字区分大小写。
这个好理解,但下面那个字符串就难理解了
const char* sharessdl = “D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)”;
第一见的时候,感慨,这是什么鬼,太高端了。后来查阅了MSDN,好好的补习了一下。
这个字符串叫做 安全描述字符串,是微软的一套用来定义描述某个程序或者某个地址,某个文件,文件夹的访问权限,嗯,挺鬼的,因为不好写,或许和unix的mmod类似吧,有兴趣可以参考以下文章,提前预习。
https://blogs.technet.microsoft.com/askds/2008/04/18/the-security-descriptor-definition-language-of-love-part-1/
打开控制台,输入以下命令行
cacls C:\Windows /S
嗯没错,你会看到一堆的这样的字符串,这个字符串就是用来描述这个文件夹的访问控制权限的。
有限的时间,我们一起学习,下一博,安全描述符。
相关文章推荐
- Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?
- 将 Win32 C/C++ 应用程序迁移到 POWER 上的 Linux,第 1 部分: 进程、线程和共享内存服务 (转载)
- 编写Windows系统服务进程(VS2005 C++)
- Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?
- 系统编程之进程通信 共享内存
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
- windows下信号量和共享内存api, mark:共享内存实现进程间锁
- (转)进程通信(用户自定义消息,用户注册消息,windows剪贴板,WM_COPY, 内存映射,对目标进程的内存)
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
- Delphi编写系统服务五:在系统服务和桌面程序之间共享内存
- windows笔记-使用内存映射文件在进程之间共享数据
- 通过WMI获取系统.进程.CPU.磁盘.分区.网卡.主板.内存.显卡.共享.键盘.鼠标等信息
- windows无法连接到user profile service服务。此问题阻止标准用户登录系统
- Windows系统进程与服务
- 进程通信(用户自定义消息,用户注册消息,windows剪贴板,WM_COPY, 内存映射,对目标进程的内存)
- Delphi编写系统服务五:在系统服务和桌面程序之间共享内存
- Samba服务下Ubuntu 10.10与Windows系统共享
- Linux\Unix IPC进程通信实例分析(一):共享内存通信---系统V