一、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