白话windows内核对象共享之复制对象句柄

引子:话说老王的果园大丰收,老王心花怒放,带着全家去美国阿拉斯加度假。阿拉斯加有很多东西琳琅满目,都是中国没有的,老王及家人都过了一把购物瘾。但是有一次却遇到了比较尴尬的事。怎么回事呢?原来老王第一次出国,在买地摊上的东西时讨价还价100元,但是给人家的却是100元人民币,人家自然不干撒,你100元才多少美元呀,老王只好忍痛割爱给了600元人民币。

为什么会出现这样的尴尬呢?因为两个国家的货币换算不是一样的。中国的100元和美国的100元不是等价的,如何才能等价呢?必须根据当前汇率来换算。今天要讲的复制内核对象句柄也是这个道理。A进程不能直接用B进程中的内核对象,必须调用相关的函数进行复制并转换成该进程的句柄值。

下面给出代码:

A进程:

#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#include <TlHelp32.h>
#include <time.h>

HANDLE g_hMutext = NULL ;

HANDLE GetProcessHandle(LPCTSTR szName)
{
	HANDLE hSanpshot;
	hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if ( INVALID_HANDLE_VALUE == hSanpshot ){
		return NULL;
	}

	PROCESSENTRY32 pe;
	BOOL bOk;
	pe.dwSize = sizeof(pe);

	bOk = Process32First (hSanpshot, &pe);
	if (!bOk)
		return NULL;
	do {
		if ( !wcscmp (pe.szExeFile, szName) ){
			return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
		}
		bOk = Process32Next (hSanpshot, &pe);
	}while (bOk);

	return NULL;
}

void GetCurTime(char* str)
{
	time_t ct ;
	tm *ctm ;
	time(&ct) ;
	ctm = localtime(&ct) ;
	sprintf(str, "%02d:%02d:%02d", ctm->tm_hour, ctm->tm_min, ctm->tm_sec) ;
}

DWORD WINAPI Fun(LPVOID lp)
{
	WaitForSingleObject(g_hMutext, INFINITE) ;
	printf("%d doing something now in Process Id %d\n", GetCurrentThreadId(), GetCurrentProcessId()) ;
	Sleep(1000 * 10) ;
	printf("%d has Finished in Process Id %d\n", GetCurrentThreadId(), GetCurrentProcessId()) ;
	char strTime[100] ;
	GetCurTime(strTime) ;
	printf("The Current time is %s\n", strTime) ;
	ReleaseMutex(g_hMutext) ;
	return 0 ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	g_hMutext = CreateMutex(NULL, FALSE, NULL) ;

	HANDLE handToCvt = NULL ;
	DuplicateHandle(GetCurrentProcess(), g_hMutext, GetProcessHandle(_T("DuplicateHandle2.exe")), &handToCvt, 0, FALSE, DUPLICATE_SAME_ACCESS) ;
	printf("the raw and duplicate handle value is %d, %d\n", g_hMutext, handToCvt) ;
	Sleep(2000) ;
	CreateThread(NULL, 0, Fun, NULL, 0, NULL) ;

	printf("the value is %d\n", handToCvt) ;

	while(1){}
	return 0;
}

B进程:

#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#include <time.h>

HANDLE g_hMutext = NULL ;

void GetCurTime(char* str)
{
	time_t ct ;
	tm *ctm ;
	time(&ct) ;
	ctm = localtime(&ct) ;
	sprintf(str, "%02d:%02d:%02d", ctm->tm_hour, ctm->tm_min, ctm->tm_sec) ;
}

DWORD WINAPI Fun(LPVOID lp)
{
	WaitForSingleObject(g_hMutext, INFINITE) ;
	char strTime[100] ;
	GetCurTime(strTime) ;
	printf("The Current time is %s\n", strTime) ;
	printf("%d doing something now in Process Id %d\n", GetCurrentThreadId(), GetCurrentProcessId()) ;
	Sleep(1000 * 10) ;
	printf("%d has Finished in Process Id %d\n", GetCurrentThreadId(), GetCurrentProcessId()) ;
	ReleaseMutex(g_hMutext) ;
	return 0 ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	printf("please enter the mutext handle value:") ;
	scanf("%d", &g_hMutext) ;
	CreateThread(NULL, 0, Fun, NULL, 0, NULL) ;

	while(1){}
	return 0;
}

下面给出分析:

A进程创建了一个互斥变量g_hMutext,然后调用DuplicateHandle将这个句柄表的记录项复制到B进程(B进程必须首先运行,A进程才能通过GetProcessHandle(A)获得B进程的句柄)句柄表的记录项中,并给出在B进程中对应的索引。请看效果:

A进程把创建的g_hMutext(句柄值是48)复制到B进程,得到B进程中该句柄值也是48(不知道有什么联系,还请大神告知)。这样将这个值给进程B中的g_hMutext句柄。A进程中线程结束之后,B进程中等待g_hMutext的线程立马开始执行,时间都是14:14:36,所以成功实现共享。

白话windows内核对象共享之复制对象句柄,布布扣,bubuko.com

时间: 2024-10-07 06:14:51

白话windows内核对象共享之复制对象句柄的相关文章

Windows内核之内核对象

1内核对象定义: 1.1:每个内 核对象只是内核分配的一个内存块,并且只能由该内核访问. 1.2:该内存块是一种数据结构,它的成员负责维护该对象的各种信息. 有些数据成员(如安全性描述符.使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型.例如,进程对象有一个进程ID .一个基 本优先级和一个退出代码,而文件对象则拥有一个字节位移.一个共享模式和一个打开模式. 2内核对象种类: 比如存取符号对象. 事件对象.文件对象.文件映射对象.I / O 完成端口对象.作业对象.信箱对

windows内核对象管理学习笔记

目前正在阅读毛老师的<windows内核情景分析>一书对象管理章节,作此笔记. Win内核中是使用对象概念来描述管理内核中使用到的数据结构.此对象(Object)均是由对象头(Object Header)组成,实际上由于对象头概念的特殊结构,还有些可选成分.于是一个对象实际上是分为三部分. OBJECT_HEADER对象头. 数据本体(比如文件对象File Object.Event等) 附加信息(比如Object Header Name Info等) 结构如下: //摘录自 Reactos代码

(转)WINDOWS内核对象

WINDOWS内核对象 原文地址:http://blog.csdn.net/misterliwei/article/details/976988  支持原创 一.前言 Windows中有很多像进程对象.线程对象.文件对象等等这样的对象,我们称之为Windows内核对象.内核对象是系统地址空间中的一个内存块,由系统创建并维护.内核对象为内核所拥有,而不为进程所拥有,所以不同进程可以访问同一个内核对象. 二.内核对象结构 每个对象都有对象头和对象体组成.所有类型的对象头结构都是相同的,而结构体部分却

UNITY 复制对象后局部坐标和世界坐标的变化问题

void Start () { var pgo = transform.Find ("Button").gameObject; obtn = Instantiate (pgo); //obtn = Instantiate (pgo, pgo.transform.Parent);         var pos = obtn.transform.position; //obtn.transform.localPosition = Vector3.zero; Debug.LogFormat

随手写了个能【真】复制对象的函数

简单来说就是通过递归调用自身来完成对对象的完整复制. 然而对于有属性的函数依旧无解,期待找到解决办法. 除此之外,测试了一下并没有发现什么问题,应该能用. function copy(objIn,objOut){ for(var prop in objIn){ switch (typeof objIn[prop]){ case "number":objOut[prop]=objIn[prop]; break; case "string":objOut[prop]=o

转载---Java集合对象的深度复制与普通复制

原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复制的区别. 1.首先是对Java集合对象得浅复制与深度复制的理解 普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域.所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象

多个jsp页面共享一个js对象的超级方法

一个jsp页面为A.jsp,在A.jsp中点击一个按钮打开另一个B.jsp页面.思路如下: 在A.jsp打开B.jsp的事件中,写入如下代码: 1 2 window.top['_CACHE'] = chatFrdList; window.top['_CACHE'][frdUserId] = frdUserId; 其中,chatFrdList定义为var chatFrdList = new Object(); frdUserId为一个用户的id. 那么,在B.jsp的一个事件中,就可以执行下面的操

条款12:复制对象时勿忘其每一个成分

对象复制操作operator=或copy构造函数,一定要记得复制对象每一个成份,特别是base class的成分: 注意:

js复制对象

<script type="text/javascript"> function getType(o){ var _t; return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();}function extend(destinati