内核对象(2)之跨越边界进程共享内核对象

在两个进程之间共享内核对象的方法有很多
1.通过对象句柄的继承性共享内核对象,但是这两个进程之间必须要存在父子关系
步骤是:创建一个内核对象,将该内核对象的安全属性的bInheritHandle属性置为true,再用CreateProcess创建一个进程,将参数中的bInheritHandles也置为true,这样再新进程创建完成时,系统会自动复制父进程的句柄表中的可继承标志为true的句柄到子进程的句柄表中,此时子进程不知道自己已经继承了父进程的句柄,需要通过CreateProcess的命令行参数将句柄值传递给子进程

2.通过命名对象跨进程共享内核对象
一般创建内核对象的函数除了有安全属性,还会有一个名字属性,这个属性就是为在另一个进程得到某个内核对象的句柄而设置的
步骤是:假设有2个进程,分别为A,B,
A进程创建一个带有名字的内核对象
B进程也用创建函数创建相同名字的内核对象,如果该内核对象是第一次被创建,则GetLastError返回0,否则返回ERROR_ALREADY_EXISTS(对象已经存在)的错误,表明打开了一个已经存在的对象,这样就可以实现跨进程共享对象了
此处B进程也可以用Open函数,比如OpenMutex,OpenEvent等打开内核对象,不过与CreateMutex,CreateEvent等函数不一样的是,如果该内核对象不存在,Create函数会直接创建一个,Open函数会打开失败
但是需要注意的是,如果此时进程A使用CloseHandle关闭了带命名的内核对象,就无法再用OpenMutex等函数打开了
3.终端服务器的命名空间,此处缺少环境,我也不是很清楚,请见谅

4.复制对象句柄DuplicateHandle函数
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, // 源进程句柄
HANDLE hSourceHandle, // 源句柄
HANDLE hTargetProcessHandle, // 目标进程句柄
LPHANDLE lpTargetHandle, // 接收目标句柄的指针
DWORD dwDesiredAccess, // 设定访问(读或写)权限
BOOL bInheritHandle, // 设定该句柄是否可以被子进程继承
DWORD dwOptions // 标志:设定屏蔽值,如果设定为DUPLICATE_SAME_ACCESS标志,则dwDesiredAccess参数将无效化
若设定DUPLICATE_CLOSE_SOURCE标志,则源进程的句柄将会被关闭,这样内核对象的引用计数会加1再减1也就是保持不变
);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值