内核对象
创建进程
遍历进程
终止进程
创建线程及等待线程结束
获取句柄
线程的挂起与唤醒
终止线程
设置线程调度的优先级
内核对象
要学习进程和线程,首先必须了解内核及内核对象是怎么回事。
Win32程序在运行的时候,系统为其分配4GB的虚拟内存空间,其中低2G属于进程的私有空间,高2G是公用的系统空间(内核空间)。为了防止程序随意修改系统数据(高2G的数据),程序在运行时有两种模式,用户模式和内核模式,用户代码在用户模式下运行,系统程序在内核模式下运行。
内核对象是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口,本质是存储了相关数据的数据结构体,比如创建每个线程的时候都会在系统空间中生成相应的线程内核对象结构体,该结构体存储了线程的上下文环境,使用计数,是否挂起等相关数据。打开文件到内存中也会在系统空间中创建一个文件内核对象结构体,存储了该打开文件的相关数据。系统提供的相应API通过对该内核对象达到在系统的监视下对真正目标进行有序操作的过程。
创建进程
//CreateProcess定义:
BOOL CreateProcess(
LPCWSTR pszImageName, //可执行文件的名称
LPCWSTR pszCmdLine, //传递给模块的参数
LPSECURITY_ATTRIBUTES psaProcess, //进程安全性,NULL为默认
LPSECURITY_ATTRIBUTES psaThread, //线程安全性,NULL为默认
BOOL fInheritHandles, //指定了当前进程中的可继承句柄是否可被新进程继承
DWORD fdwCreate, //指定了新进程的优先级及其他创建标志
LPVOID pvEnvironment, //指定了新进程使用的环境变量
LPWSTR pszCurDir, //新进程使用的当前目录
LPSTARTUPINFOW psiStartInfo, //该结构体指定了新进程中主窗口位置大小和标准句柄等
LPPROCESS_INFORMATION pProcInfo //[out]返回进程的标志信息,如ID号,句柄等
);
CreateProcess函数的最后两个参数 结构体指针LPSTARTUPINFOW 指向的结构体和PRRCESS_INFORMATION结构体。LPPROCESS_INFORMATION指向的结构体用来接收新创建的进程的相关信息。
//STARTUPINFO定义
typedef struct _STARTUPINFO {
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
//PROCESS_INFORMATION定义
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
使用API函数GetStartipInfo来获取父进程创建自己时使用的STARTUPINFO结构。
//创建进程例子
#include <iostream>
#include <Windows.h>
int main()
{
LPCWSTR pszImageName = L"C:\\Windows\\System32\\notepad.exe";
wchar_t cmdLine[]= L" C:\\Users\\Administrator\\Desktop\\ttt.txt";
//注意前两个参数的用法,第一个参数LPCWSTR类型,表示进程的可执行文件名字
//第二个参数表示命令行参数,引号中*有空格*(注意)将两个参数隔开
//可以不适用第一个参数,只使用第二个参数,则第二个参数表示为(中间空格隔开· ):
//wchar_t cmdLine[]=L"C:\\Windows\\System32\\notepad.exe C:\\Users\\Administrator\\Desktop\\ttt.txt"
LPWSTR pszCmdLine = cmdLine;
STARTUPINFOW si = {
sizeof(si)};
si.wShowWindow = TRUE;
PROCESS_INFORMATION pi;
BOOL bCr = CreateProcess(
pszImageName,
pszCmdLine,
NULL,