windows api进程创建与句柄表

一、createprocess

BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module  //要创建的进程名称

LPTSTR lpCommandLine, // command line string   //命令行
LPSECURITY_ATTRIBUTES lpProcessAttributes, //  是否继承进程句柄
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD  //是否继承线程句柄

BOOL bInheritHandles, // handle inheritance option  //是否继承句柄
DWORD dwCreationFlags, // creation flags  //有没有创建标志
LPVOID lpEnvironment, // new environment block  // 是否使用父进程环境变量
LPCTSTR lpCurrentDirectory, // current directory name  //使用父进程目录作为当前目录,可以自己设置目录
LPSTARTUPINFO lpStartupInfo, // startup information   //STARTUPINFOW结构体详细信息(启动状态相关信息)
LPPROCESS_INFORMATION lpProcessInformation // process information  //PROCESS_INFORMATION结构体进程信息

#include "stdafx.h"
#include "windows.h"
int main(int argc, char* argv[])
{  
//在堆栈中的局部遍历需要赋初值      char lpPath[] = "notepad.exe"; STARTUPINFO si = {sizeof(si)}; //记录结构体有多大,必须要参数 PROCESS_INFORMATION pi; //进程id,进程句柄,线程id,线程句柄存在于这个结构体 CreateProcess(NULL,lpPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); return 0; }

 二、句柄表

1.内核对象,像进程,线程,文件,互斥体,事件等在内核都有一个对应的结构体,这些结构体由内核负责管理,管这样的对象叫做内核对象。

CreateProcess等函数使用的时候都相当于在0环创建了一个结构体,句柄表不是每个内核对象都有,只有每个进程才有句柄表

扫描二维码关注公众号,回复: 11261362 查看本文章

图文说明:会将A,B,C,D的0环地址(内核层)写进这张表里面,3环(应用层)想用的时候只需要返回编号就好了,存储的相当于是一种映射关系,得到句柄的值也就是这张表的索引,句柄表就是为了操作内核对象

0环是所有进程公用的内存,内核对象都可以跨进程共享的,句柄表是私有的一张表,句柄的值只针对当前的进程才有意义,图文中的2代表的是"计数器",closehandle()将计数器减1,当计数器的值为0,内核对象才会被关闭。

猜你喜欢

转载自www.cnblogs.com/websecyw/p/12952448.html
今日推荐