Win32进程创建、进程快照、进程终止用例

进程创建: 1 #include <windows.h>
 2 #include <stdio.h>
 3
 4 int main()
 5 {
 6     // 创建打开系统自带记事本进程
 7     STARTUPINFO si1 = {sizeof(si1)};
 8     PROCESS_INFORMATION pi1;
 9     char * szCmdLine1 = "notepad";
10     if(::CreateProcess(NULL, szCmdLine1, NULL, NULL, FALSE, NULL, NULL, NULL, &si1, &pi1))
11         printf("Create notepad process successfully!\n");
12
13
14     // 新建一个cmd进程窗口
15     char* szCmdLine2 = "cmd";
16     STARTUPINFO si2 = {sizeof(si2)};
17     PROCESS_INFORMATION pi2;
18     si2.dwFlags = STARTF_USESHOWWINDOW;        // 指定wShowWindow成员有效
19     si2.wShowWindow = TRUE;                    // 此成员设为TRUE的话则显示新建进程的主窗口,FALSE不显示
20
21     BOOL bRet = ::CreateProcess(
22                                 NULL,                    // 不在此指定可执行文件的文件名
23                                 szCmdLine2,                // 命令行参数
24                                 NULL,                    // 默认进程安全性
25                                 NULL,                    // 默认线程安全性
26                                 FALSE,                    // 指定当前进程内的句柄不可以被子进程继承
27                                 CREATE_NEW_CONSOLE,        // 为新进程创建一个新的控制台窗口,如果为NULL,不会创建新的窗口
28                                 NULL,                    // 使用本进程的环境变量
29                                 NULL,                    // 使用本进程的驱动器和目录
30                                 &si1,
31                                 &pi2);
32
33     if (bRet)
34     {
35         // 既然不使用两个句柄,最好是立刻将它们关闭
36         ::CloseHandle(pi2.hThread);
37         ::CloseHandle(pi2.hProcess);
38         printf("新进程的进程ID号:%d\n", pi2.dwProcessId);
39         printf("新进程的主线程ID号:%d\n", pi2.dwThreadId);
40     }
41
42     return 0;
43 }

运行效果:

 进程快照 1 #include <windows.h>
 2 #include <TLHELP32.H>            // 声明快照函数的头文件
 3 #include <stdio.h>
 4
 5 int main()
 6 {
 7     PROCESSENTRY32 pe32;
 8     pe32.dwSize = sizeof(pe32);
 9
10     // 给系统内的所有进程拍一个快照--改函数用于获取系统指定进程的快照,也可以传入不同参数获取被这些进程使用的堆、模块和线程的快照
11     HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
12     if (hProcessSnap == INVALID_HANDLE_VALUE)
13     {
14         printf("CreateToolhelp32Snapshot 调用失败!\n");
15         return -1;
16     }
17
18     // 遍历进程快照,轮流显示每个进程的信息
19     BOOL bMore = ::Process32First(hProcessSnap, &pe32);
20     while(bMore)
21     {
22         printf("进程名称:%s\n", pe32.szExeFile);
23         printf("进程ID号:%u\n\n", pe32.th32ProcessID);
24         bMore = ::Process32Next(hProcessSnap, &pe32);
25     }
26
27     // 不要忘记清除掉snapshot 对象
28     ::CloseHandle(hProcessSnap);
29     return 0;
30 }

注释:
CreateToolhelp32Snapshot 用于获取系统内指定进程的快照,也可以获取被这些进程使用的堆、模块和线程的快照。函数的具体用法是。
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, // 用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID // 一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
);
本函数不仅可以获取进程列表,也可以用来获取线程和模块等对象的列表。dwFlags 参数指定了获取的列表的类型,其值可以是:
TH32CS_SNAPHEAPLIST 枚举 th32ProcessID 参数指定的进程中的堆。
TH32CS_SNAPMODULE 枚举 th32ProcessID 参数指定的进程中的模块。
TH32CS_SNAPPROCESS 枚举系统范围内的进程,此时 th32ProcessID 参数被忽略。
TH32CS_SNAPTHREAD 枚举系统范围内的线程,此时 th32ProcessID 参数被忽略。
函数执行成功将返回一个快照句柄,否则返回 INVALID_HANDLE_VALUE(即-1) 。
从快照列表中获取进程信息需要使用 Process32First 和 Process32Next 函数, 函数的每次调用仅返回一个进程的信息。Process32First 函数用来进行首次调用,以后的调用由
Process32Next 函数循环完成,直到所有的信息都被获取为止。当不再有剩余信息的时候,函数返回 FALSE,所以程序中使用下面的循环结构来获取进程列表。
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
while(bMore)
{ // 在这里处理返回到 PROCESSENTRY32 中的进程信息
bMore = ::Process32Next(hProcessSnap, &pe32);
}

运行效果:

终止进程:

终止进程也就是结束程序的执行,让它从内存中卸载。进程终止的原因可能有 4 种:
(1)主线程的入口函数返回。
(2)进程中一个线程调用了 ExitProcess 函数,该函数只能终止当前进程。
(3)此进程中的所有线程都结束了。
(4)其他进程中的一个线程调用了 TerminateProcess 函数。

终止当前进程:
void ExitProcess(UINT uExitCode); // 参数uExitCode 为此程序的退出代码。

终止其他进程:
BOOL TerminateProcess(
    HANDLE hProcess, // 要结束的进程(目标进程)的句柄
    UINT uExitCode  // 指定目标进程的退出代码,你可以使用GetExitCodeProcess 取得一个进程的退出代码
);

  在对一个进程操作前, 必须首先取得该进程的进程句柄。 CreateProcess 函数创建进程后会返回一个进程句柄,而对于一个已经存在的进程,只能使用 OpenProcess 函数来取得这个进程
的访问权限,函数用法如下:

 HANDLE OpenProcess(
    DWORD dwDesiredAccess, // 想得到的访问权限,可以是PROCESS_ALL_ACCESS等
    BOOL bInheritHandle,   // 指定返回的句柄是否可以被继承
    DWORD dwProcessId      // 指定要打开的进程的ID 号
  );

 一般使用下面的代码来终止一个进程:
 BOOL TerminateProcessFromId(DWORD dwId)
 {
    BOOL bRet = FALSE;
   // 打开目标进程,取得进程句柄
   HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
   if(hProcess != NULL)
   { // 终止进程

    bRet = ::TerminateProcess(hProcess, 0);
   }
   CloseHandle(hProcess);
   return bRet;
}

时间: 2024-12-09 15:00:30

Win32进程创建、进程快照、进程终止用例的相关文章

如何用一个父进程创建多个子进程?

#include <unistd.h> #include <stdio.h> int main(void) { int i=0; printf("i son/pa ppid pid fpid\n"); //ppid指当前进程的父进程pid //pid指当前进程的pid, //fpid指fork返回给当前进程的值 for(i=0;i<4;i++){ pid_t fpid=fork();//此句执行成功后,就有两个进程(父进程和子进程) if(fpid==0)

Linux-进程描述(4)之进程优先级与进程创建执行

进程优先级 进程cpu资源分配就是指进程的优先权(priority).优先权高的进程有优先执行权利. 权限与优先级.权限(privilege)是指在多用户计算机系统的管理中,某个特定的用户具有特定的系统资源使用权力,像是文件夹,特定系统指令的使用或存储量的限制.权限是有或没有的问题,而优先级则是在已经具有了权限而讨论权限大小的问题.配置进程优先权对多任务环境的linux很有用,可以改善系统性能.还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能.

[转载]Dll注入技术之劫持进程创建注入

转自:黑客反病毒 DLL注入技术之劫持进程创建注入 劫持进程创建注入原理是利用Windows系统中CreateProcess()这个API创建一个进程,并将第6个参数设为CREATE_SUSPENDED,进而创建一个挂起状态的进程,利用这个进程状态进行远程线程注入DLL,然后用ResumeThread()函数恢复进程.1.创建挂起的进程     下面是创建一个挂起的计算器程序进程的主要代码: STARTUPINFO si = {0}; si.cb = sizeof si; si.dwFlags

进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端

摘要:本文主要介绍进程的基本属性,基本属性包括:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义: #include <sys/types.h> #include <unistd.h> pid_t getpid(void); 函数说明: 每个进程都有一个非负整型表示的唯一进程ID(PID).好比如我们的身份证一样,每个人的身份证号是唯一的.因为进程ID标示符总是唯一的,常将其用来做其他标示符的一部分以保证其唯一性,进程ID(PID)

Linux环境编程之进程(四):创建新进程、执行程序和进程终止

引言: 对于每个进程,都有一个非负整数表示的唯一进程ID.虽然进程的ID是唯一的,但却是可重用的.系统中有一些专用的进程.如ID为0的进程通常是调度进程,也成交换进程或系统进程(它是内核进程).进程ID为1通常是init进程,它是一个普通的用户进程.一些与进程ID有关的函数: #include <unistd.h> pid_t getpid(void);   //返回值:调用进程的进程ID pit_t getppid(void); //返回值:调用进程的父进程ID uid_t getuid(v

Windows下C/C++创建一个新进程

本文翻译自:XQQ524148626的专栏,http://blog.csdn.net/xqq524148626/article/details/4960513 本文地址:http://blog.csdn.net/qingdujun/article/details/41808261 VC++6.0运行通过,示例: #include <iostream> #include <windows.h> using namespace std; int main() { STARTUPINFO

进程创建与销毁

Unix操作系统紧紧依赖进程创建来满足用户需求 创建进程 Unix创建进程的三种机制 1.写时复制技术运行父子进程读相同的物理页.只要两者中有一个试图写一个物理页,内核就把这个页的内容拷贝到    一个新的物理页,并把这个新的物理页分配给正在写的进程. 2.轻量级进程允许父子进程共享每个进程在内核的很多数据结构,如页表(整个用户态的地址空间).打开文件表及信    号处理. 3.vfork()系统调用创建的进程能共享其父进程的内存地址空间.为了防止父进程重写子进程需要的数据,阻塞父进    程的

作业6:进程的描述和进程的创建 20135115臧文君

进程的描述和进程的创建 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 操作系统的三大功能:进程管理,内存管理和文件系统. 1.进程描述符task_struct数据结构 (1)进程控制块PCB---task_struct (2)进程描述符提供了内核所需了解的进程信息. task_struct中包含:进程状态,进程打开的文件,进程优先级信息. tty_st

Linux内核创建一个新进程的过程

进程在创建它的时刻开始存活.在Linux系统中,这通常是fork()系统的结果,该系统调用通过复制一个现有的进程来创建一个全新的进程.只有在创建init进程时,是通过代码实现数据结构的填充.调用fork()的进程称为父进程,新生的进程称为子进程.在系统调用结束时,在返回点这个相同位置上,父进程恢复执行,子进程开始执行.fork()系统调用从内核两次返回:一次回到父进程,另一次回到创建的新的子进程. 进程的描述符--task_struct (下面是中英文大体注释) volatile long st