winston 发表于 2012-3-17 22:36:06

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

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);








页: [1]
查看完整版本: 《Windows核心编程》学习笔记(5)– 详述"复制对象句柄"