几个知识点:
1.进程通常被定义为一个正在运行的程序的实例。它由两个部分组成:一个是操作系统用来管理进程的内核对象。另一个是地址空间,它包含所有可执行模块或DLL模块的代码和数据,还包括动态内存分配的空间,如线程堆栈和堆分配空间。
2.Windows应用程序必须拥有一个在应用程序启动运行时调用的进入点函数。可以使用的进入点函数有4个:WinMain、wWinMain、main和wmain。操作系统实际上并不调用这些进入点函数。它调用的是C/C++运行时启动函数。该函数负责对C/C++运行时库进行初始化,它还能够确保已经声明的任何全局对象和静态C++对象能够在代码执行以前正确的创建。与上面进入点函数相对应的启动函数为:WinMainCRTStartup、WinMainCRTStartup、mainCRTStartup和wmainCRTStartup。启动函数的功能如下:检索指向新进程的完整命令行的指针;检索指向新进程的环境变量的指针;对C/C++运行时的全局变量进行初始化。如果包含了StdLib.h文件,代码就能访问这些变量;对C运行时的内存单元分配函数和其他底层输入/输出函数使用的内存栈进行初始化;为所有全局和静态C++类对象调用构造函数。
3.启动函数返回时,调用C运行时的exit函数,将返回值传递给该函数,exit函数负责下面的操作:调用由(_onexit)函数的调用而注册的任何函数;为所有全局的和静态的C++类对象调用析构函数;调用操作系统的ExitProcess函数,将main函数的返回值传递给它,这使得操作系统能够撤销进程并设置它的exit代码。
4.使用GetModuleHandle函数来得到进程中可执行文件或DLL加载到进程空间时所用的句柄,如果为参数传递NULL,则返回该进程的可执行文件的句柄(基地址)。
5.使用GetEnvironmentVariable、ExpandEnvironmentVariable和SetEnvironmentStrings来操作进程的环境变量;
6.一个进程的线程可能被强制在可用CPU的子集上运行,这称为进程的亲缘性。
7.可用SetErrorMode设置进程的错误模式。
8.使用GetCurrentDirectory和SetCurrentDirectory来获得和设置进程的当前驱动器和目录。进程使用GetFullPathName来获得它的当前目录。
9.使用GetVersionEx来获取操作系统的版本信息,使用VerifyVersionInfo来验证当前操作系统的版本。
10.当父进程创建子进程以后,需要关闭子进程的进程或线程句柄,以免在应用程序运行时泄露资源。
11.使用TerminateProcess可以使得任何线程都可以终止另一个进程或它自己的进程的运行。
12.当一个进程做某些额外的操作,但是需要保护地址空间时,可以使用启动一个新进程来执行操作。新进程与父进程通信时,可以使用Windows提供的若干种方法,以便在不同的进程中间传递数据。如动态数据交换(DDE)、OLE、管道和邮箱等。共享数据最方便的方法之一是,使用内存映射文件。
13.枚举系统中的进程:使用PerformanceData Helper;使用ToolHelp API(Process32First、Process32Next)、以及Process Status函数(PSAPI.dll、EnumProcesses)。
本章的源代码应该说极具价值,为了解Windows进程的相关知识提供了很好的实践材料。