句柄表

一、什么是内核对象?

像进程、线程、文件、互斥体、事件等在内核都有一个对应的结构体,这
些结构体由内核负责管理。我们管这样的对象叫做内核对象。
在这里插入图片描述

二、如何管理内核对象?

一个进程可以在创建进程、线程、事件、文件,在内核中也会对应一个内核对象(结构体)
在这里插入图片描述

三、每个进程都有一个句柄表

正常管理,因该是将内核对象地址返回来,应用层通过地址访问,但是因为内核对象在0环,如果将值改了,就会产生内存不可访问,然后蓝屏,因此为了安全,就产生了句柄表
在这里插入图片描述

四、多进程共享一个内核对象

1、句柄值,只在自己的表中才有意义
2、内核对象,被多个进程打开、此时内核会有个计数器,有几个打开记录几,只有计数器为0才会移除

3、只有线程是计数器为0和线程关闭,才能将内核对象移除

在这里插入图片描述

五、句柄是否”可以”被继承

创建进程、线程、事件、文件时,创建函数会有一个会有一个安全描述符成员,是否继承父进程的句柄表
在这里插入图片描述

继承是将父进程的句柄表,复制一份,允许继承的继承过来,不允许继承的填0
在这里插入图片描述

六、句柄的作用

比如你用程序打开一个软件,此时可以获得句柄,然后可以用

SuspendThread(pi.hThread)`;//使程序停下来
ResumeThread(pi.hThread);//让程序跑起来
#include "stdafx.h"
#include "windows.h"

//打开子进程函数
BOOL CreateProcess(PTCHAR route,PTCHAR szCommandLine)
{
	//定义两个结构体
	STARTUPINFO si;
	PROCESS_INFORMATION pi ;

	//初始化结构体
	ZeroMemory(&pi,sizeof(pi));
	ZeroMemory(&si,sizeof(si));
	
	//si结构体的cb 必须要赋值
	si.cb = sizeof(si);

	//创建子程序  返回成功与失败
	if(!CreateProcess(
		route,				//打开程序的路径
		szCommandLine,		//命令行参数
		NULL,	//是否允许被继承(进程句柄)
		NULL,//是否允许被继承(线程句柄)
		FALSE,//是否允许(继承句柄)
		0,
		NULL,
		NULL,
		&si,				//创建子进程的详细信息
		&pi)				//存储的是进程ID,线程ID,进程句柄,线程句柄
		)
	{//打印错误信息
		printf("Error:%d\n",GetLastError());
		return FALSE;	
	}

	SuspendThread(pi.hThread);//使程序停下来,在此下断点,可以使软件卡死(假死状态)
	ResumeThread(pi.hThread);//让程序继续跑起来

	//释放句柄
	CloseHandle(pi.hProcess);//计数器减一
	CloseHandle(pi.hThread);//计数器减一
	return TRUE;
}


int main(int argc, char* argv[])
{
	
	TCHAR route[] = TEXT("C://Program Files//Tools//DTDebug//DTDebug.exe");
	//TCHAR szCmdLine[] = TEXT("https://www.ifeng.com");
	CreateProcess(route,NULL);	//程序路径,命令行参数
//	getchar();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值