全局句柄表
有看过我上一个文章的应该对这个就不陌生了,全局句柄表里包含了所有的正在运行的进程和线程。
简单的一个图举个例子
接下来继续创建进程的详细参数释义
下面是创建进程调用的Win32API函数
CreateProcess(
NULL, // No module name (use command line)对象名称
argv[1], // Command line //命令行
NULL, // Process handle not inheritable //不继承进程句柄
NULL, // Thread handle not inheritable //不继承线程句柄
FALSE, // Set handle inheritance to FALSE //不继承句柄
0, // No creation flags //没有创建标志
NULL, // Use parent’s environment block//使用父进程环境变量
NULL, // Use parent’s starting directory //使用父进程目录作为当前目录,可以自己设置目录
&si, // Pointer to STARTUPINFO structure//结构体详细信息
&pi ) // Pointer to PROCESS_INFORMATION structure//结构体进程详细信息
{
其它的大家有前面的基础应该都能明白,所以说一个可能不太好理解,但是很重要的一个参数,第六个参数,
源码如下
// crateProcess.cpp: implementation of the crateProcess class.
//
//
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
BOOL CreateChildProcess(PTCHAR modulename, PTCHAR cmdline)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// Start the child process.
if (!CreateProcess(
modulename, // No module name (use command line)
cmdline, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return FALSE;
}
printf("程序A执行了");
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return TRUE;
}
int main(int argc, char* argv[])
{
TCHAR cmdline[] = TEXT("C://A.exe");
CreateChildProcess(NULL, cmdline);
getchar();
return 0;
}
这里我本书输出了程序A执行了,然后调用外部程序执行的内容为程序B执行了,所以代码跑起来之后效果如下:
可以看到两个程序挤在同一个窗口执行,那有没有办法可以把它们分开呢?这里就延伸出我们要讲的第六个参数,现在设置的是0。
翻开MSDN文档,看看这个参数可以用哪些参数。
这里其实有一堆,我们要用到的是CREATE_NEW_CONSOLE,大概释义就是可以创建一个单独的新的窗口,具体可以自行翻译。
修改CreateProcess代码第六位参数为,如下
if (!CreateProcess(
modulename, // No module name (use command line)
cmdline, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
CREATE_NEW_CONSOLE, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
再次执行时,如下
当然如果对攻防感兴趣可以自行试试CREATE_SUSPENDED这个宏。