一、什么是内核对象?
像进程、线程、文件、互斥体、事件等在内核都有一个对应的结构体,这
些结构体由内核负责管理。我们管这样的对象叫做内核对象。
二、如何管理内核对象?
一个进程可以在创建进程、线程、事件、文件,在内核中也会对应一个内核对象(结构体)
三、每个进程都有一个句柄表
正常管理,因该是将内核对象地址返回来,应用层通过地址访问,但是因为内核对象在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;
}