注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

《Windows核心编程》学习笔记(5)– 详述"复制对象句柄"  

2010-10-10 16:36:03|  分类: 《Windows核心编 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1。跨进程边界共享内核对象的最后一招是使用DuplicateHandle函数:
BOOL DuplicateHandle( 
  HANDLE hSourceProcessHandle, 
  HANDLE hSourceHandle, 
  HANDLE hTargetProcessHandle, 
  LPHANDLE lpTargetHandle, 
  DWORD dwDesiredAccess, 
  BOOL bInheritHandle, 
  DWORD dwOptions );

简单的说,这个函数获得一个进程的句柄表中的一个记录项,然后在另一个进程的句柄表中创建这个记录项的一个副本.

具体应用如下:
#include <stdio.h>
#include <windows.h>

int main(void)
{
//进程
A
创建一个名为
"MYOBJ"的
互斥量
HANDLE hObjInProcessA = CreateMutex(NULL, FALSE, "MYOBJ");

//判断,如果已经创建了这个互斥量就打印
"run error\n"
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
printf("run error\n");
system("pause");
return 0;
}

//获得进程B的进程句柄(7036为进程B的PID,随便弄了个做了下试验)
HANDLE hProcessB = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 7036);

//
 hObjInProcessB是相对于
进程
B的句柄,他标示的对象就由"进程A中代码引用的
hObjInProcessA"所标示的对象.
HANDLE hObjInProcessB;
DuplicateHandle(GetCurrentProcess(),
hObjInProcessA,
hProcessB,
&hObjInProcessB,
0,
FALSE,
DUPLICATE_SAME_ACCESS);
//收尾工作.
//ps:
hObjInProcessB千万不能关掉
CloseHandle(hProcessB);
CloseHandle(hObjInProcessA);
printf("run \n");
system("pause");
return 0;
}
以上程序第一次运行的时候把互斥量句柄
hObjInProcessA复制到进程B的句柄表中,用变量名
hObjInProcessB来保存.
此时A退出,B不退出,
再运行A,就会打印 run error 的提示,表明互斥量复制成功,已存在于B进程中.
.
2。还可以通过另一种方式来使用
DuplicateHandle:假设一个进程有对一个文件映射对象的读写权限.在程序中的某个位置,我们要调用一个函数,并希望它对文件映像对象进行只读访问.为了是应用程序变得更健壮,可以使用
DuplicateHandle 为现有的对象创建一个新句柄,并确保这个这个新句柄只有只读权限.然后,把这个只读权限的句柄传递给函数.
示例代码:
HANDLE hFileMapRW = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
10240,
NULL);
HANDLE hFileMapRO;
DuplicateHandle(GetCurrentProcess(), hFileMapRW,
GetCurrentProcess(), &hFileMapRO,
FILE_MAP_READ, FALSE, 0);
//调用自己的函数
ReadFromTheFileMapping(hFileMapRO);
CloseHandle(hFileMapRO);
CloseHandle(hFileMapRW);
  评论这张
 
阅读(484)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018