进程相关API

一、ID与句柄

1、每个进程都有一张私有的句柄表,系统有一张全局句柄表
2、进程ID在所有进程都有意义
在这里插入图片描述
演示:
3、此代码打开一个软件,并打印进程ID句柄

#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;	
	}

	printf("PID:%d  - 进程句柄:%x",pi.dwProcessId,pi.hProcess);//打印进程ID和句柄

	//释放句柄
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
	return TRUE;
}


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

在这里插入图片描述
4、尝试用进程句柄结束进程:

TerminateProcess函数需要两个参数
进程句柄
什么原因退出
#include "stdafx.h"
#include <windows.h>

int main(int argc, char* argv[])
{
	HANDLE	hProcess;
	hProcess = (HANDLE)0x34a;

	if(!TerminateProcess(hProcess,1))//终止|杀死其它进程 
	{
		printf("终止程序失败:%d\n",GetLastError());
	}
	getchar();
	return 0;
}

结果如下6,查询错误代码信息,句柄无效
在这里插入图片描述
在这里插入图片描述

5、可以用进程ID来结束进程

OpenProcess函数需要三个参数
1)、想要获取的权限(PROCESS_ALL_ACCESS获取全部权限)
2)、是否继承父进程的句柄
3)、进程ID
#include "stdafx.h"
#include <windows.h>

int main(int argc, char* argv[])
{
	HANDLE	hProcess;

//	hProcess = (HANDLE)0x34a;

	hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,1920);//打开一个已存在的进程对象,并返回进程的句柄

	if(!TerminateProcess(hProcess,1))//终止|杀死其它进程 
	{
		printf("终止程序失败:%d\n",GetLastError());
	}
	getchar();
	return 0;
}

二、以挂起的形式创建进程

任何进程都是别的进程创建的:CreateProcess()

进程的创建过程

1、映射EXE文件
2、创建内核对象EPROCESS
3、映射系统DLL(ntdll.dll)
4、创建线程内核对象ETHREAD
5、如果是挂起的方式创建的:
。。。
6、恢复以后再继续执行
映射DLL(ntdll.LdrInitializeThunk)
线程开始执行

#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,
		CREATE_SUSPENDED,	//挂起的方式创建
		NULL,
		NULL,
		&si,				//创建子进程的详细信息
		&pi)				//存储的是进程ID,线程ID,进程句柄,线程句柄
		)
	{//打印错误信息
		printf("Error:%d\n",GetLastError());
		return FALSE;	
	}
	
	for(int i=0;i<8;i++)
	{
		Sleep(1000);
		printf("--------------\n");
	}

	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");
	
	CreateProcess(route,NULL);	//程序路径,命令行参数
	getchar();
	return 0;
}

三、模块目录与工作目录

char strModule[256];
GetModuleFileName(NULL,strModule, 256); //模块目录 

char strWork[1000];
int i=1000; 
GetCurrentDirectory(i,strWork);		//工作目录

printf("模块目录:%s \n工作目录:%s \n",strModule,strWork);

四、其他进程相关API

获取进程PID
GetCurrentProcessId
获取进程句柄
GetCurrentProcess

获取命令行
GetCommandLine
获取启动信息
GetStartupInfo

遍历进程ID
EnumProcesses

快照
CreateToolhelp32Snapshot

猜你喜欢

转载自blog.csdn.net/qq_41232519/article/details/108560075