您的位置:首页 > 其它

Windows系统服务与用户进程共享内存

2017-05-02 23:00 411 查看
通常使用CreateFileMapping的WINAPI函数可以创建共享内存,可以实现在不同进程中访问同一数据,实现通信等。但我们在其他实际编程中会遇到,服务和进程通信的情况,及系统服务与用户进程共同访问共享内存,如果仍然使用这个API,你会发现,在另一个程序中Open时,是无法返回正确的HANDLE的。

以下这段代码也是来自 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 api
相关文章推荐