1、Windows程序设计基础程序设计基础32位处理器有位处理器有3种工作模式种工作模式:实模式:重启以后到载入实模式:重启以后到载入WINDOWS以前都是实模式,以前都是实模式,纯纯32位位windows是不能进入实模式的。是不能进入实模式的。保护模式:保护模式提供的保护机制管理和维护自己保护模式:保护模式提供的保护机制管理和维护自己,保护主要指对存储器的保护。进入保护模式是每个保护主要指对存储器的保护。进入保护模式是每个32位位系统必须的系统必须的。虚拟虚拟86模式:为了让以前的模式:为了让以前的16位程序能在位程序能在32位下运行,位下运行,32位处理器就提供了虚拟位处理器就提供了虚拟86模
2、式模式。第二章第二章 win32程序运行原理程序运行原理2.1 CPU的保护模式和的保护模式和Windows系统系统扩展模式:扩展模式:1)兼容模式:该模式下,)兼容模式:该模式下,64位操作系统运行在位操作系统运行在32位兼位兼容环境,能正常运行容环境,能正常运行16,32位应用程序就像基本的保护位应用程序就像基本的保护模式一样,访问模式一样,访问32位地址空间,但不能运行纯位地址空间,但不能运行纯16位实模位实模式程序(就是不能运行虚拟式程序(就是不能运行虚拟86模式程序了)。模式程序了)。2)64位模式:在该模式下,处理器完全执行位模式:在该模式下,处理器完全执行64位指令,位指令,使用
3、使用64位地址空间和位地址空间和64操作数,运行操作数,运行16,32位程序必须位程序必须切换到兼容模式。切换到兼容模式。64位处理器位处理器系统管理模式:当系统管理模式:当SMI引脚为有效进入系统管理模式,引脚为有效进入系统管理模式,首先保存当前的首先保存当前的CPU上下文。它有独立的地址空间,用上下文。它有独立的地址空间,用来执行电源管理或系统安全方面的指令。(基本模式)来执行电源管理或系统安全方面的指令。(基本模式)32位处理器对多任务操作系统的支持性主要位处理器对多任务操作系统的支持性主要体现在体现在 1)在硬件上为任务之间的切换提供了良好的)在硬件上为任务之间的切换提供了良好的条件条
4、件 2)实现了多任务隔离,)实现了多任务隔离,“进程进程”地址空间独地址空间独立立 在在windows下,任务被进程取代,进程就是下,任务被进程取代,进程就是正在运行的应用程序的实例。但是占用正在运行的应用程序的实例。但是占用cpu时间时间片的不是进程,而是线程。片的不是进程,而是线程。Windows的多任务实现的多任务实现虚拟内存虚拟内存 保护模式下,保护模式下,32位处理器有位处理器有32根地址线,根地址线,处理器寻址范围(处理器寻址范围(0 x000000000 xFFFFFFFF)()(232,4GB)。)。32位机器上的位机器上的RAM的大小很难达到的大小很难达到4GB,window
5、s为每个进程分配为每个进程分配4GB的地址空间主要的地址空间主要依靠依靠cpu的支持。的支持。cpu在保护模式下支持虚拟内在保护模式下支持虚拟内存。它可以帮助操作系统将磁盘空间当作内存存。它可以帮助操作系统将磁盘空间当作内存空间来使用。空间来使用。各进程内的地址空间安排各进程内的地址空间安排2GB的系统空间2GB的用户空间0 xFFFFFFFF0 x800000000 x7FFFFFFF0 x00000000整个系统共用整个系统共用每个进程私有每个进程私有 用户空间部分是进程私有地址空间,进程不能以任用户空间部分是进程私有地址空间,进程不能以任何方式读、写其他进程此部分空间中的数据。对所有应何
6、方式读、写其他进程此部分空间中的数据。对所有应用程序,大量进程数据被保存在块空间中而相互独立,用程序,大量进程数据被保存在块空间中而相互独立,所以应用程序很少被其他程序打断,使系统更加稳定。所以应用程序很少被其他程序打断,使系统更加稳定。系统空间部分放置操作系统的代码,包括内核代码、系统空间部分放置操作系统的代码,包括内核代码、设备驱动代码、设备设备驱动代码、设备I/O缓冲区等。系统空间部分在所缓冲区等。系统空间部分在所有的进程中是共享的。在有的进程中是共享的。在32位系统中,这些数据结构位系统中,这些数据结构被完全的保护起来,如果试图访问这部分内存,访问线被完全的保护起来,如果试图访问这部分
7、内存,访问线程会遇到一个访问异常。程会遇到一个访问异常。两种地址空间区别两种地址空间区别 32位处理器共定义了位处理器共定义了4种(种(0-3)特权级别,)特权级别,或称环。或称环。0是最高级(特权级),是最高级(特权级),3级是最低级级是最低级(用户级)。(用户级)。为了阻止应用程序访问或者修改关键的系统数为了阻止应用程序访问或者修改关键的系统数据,据,windows提供了两种访问模式:提供了两种访问模式:内核模式(使用内核模式(使用0级):系统程序的代码在此模式级):系统程序的代码在此模式下运行下运行用户模式(使用用户模式(使用3级):用户程序的代码在此模式级):用户程序的代码在此模式下运
8、行下运行内核模式和用户模式内核模式和用户模式CPU支持的特权级类别支持的特权级类别应用程序应用程序常规扩展常规扩展系统服务系统服务内核内核级别级别0级别级别1级别级别2级别级别3在实模式下在实模式下,没有级没有级别之分别之分.在保护模式在保护模式下下,CPU有有4个特权个特权级别级别.虽然每个进程都有自己的虽然每个进程都有自己的4G地址空间。但地址空间。但内核模式下的系统和设备驱动程序共用一块虚内核模式下的系统和设备驱动程序共用一块虚拟地址空间。即整个系统共用的拟地址空间。即整个系统共用的2G部分。虚拟部分。虚拟内存中的每一页的页属性中都有访问模式标记,内存中的每一页的页属性中都有访问模式标记
9、,它标识了哪一个模式下的代码才有权限访问该它标识了哪一个模式下的代码才有权限访问该页。系统地址空间的页仅仅能够从内核模式访页。系统地址空间的页仅仅能够从内核模式访问,所有用户地址空间的页都从用户模式访问。问,所有用户地址空间的页都从用户模式访问。当应用程序调用一个系统函数的时候,用当应用程序调用一个系统函数的时候,用户的应用程序会从用户模式切换到内核模式去户的应用程序会从用户模式切换到内核模式去执行。例如:执行。例如:Win32函数函数ReadFile最终会调用最终会调用Windows内部的从文件中读取数据的程序代内部的从文件中读取数据的程序代码,因为这些代码访问了系统内部的数据,所码,因为这
10、些代码访问了系统内部的数据,所以他们必须运行在内核模式下。以他们必须运行在内核模式下。内核模式:内核模式:研究研究WDM(Windows Driver Model)设备驱动类设备驱动类 用户模式:用户模式:SDK程序设计程序设计两种模式下的程序设计两种模式下的程序设计 内核对象是系统提供的用户模式下代码与内核对象是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口。软件开内核模式下代码进行交互的基本接口。软件开发人员会经常的创建、打开和操作内核对象。发人员会经常的创建、打开和操作内核对象。2.2 内核对象内核对象 为了管理应用程序,系统有必要维护一些不为了管理应用程序,系统有必要维护一
11、些不允许用户应用程序直接访问的数据。一个内核允许用户应用程序直接访问的数据。一个内核对象就是一块内核分配的内存,它只能被运行对象就是一块内核分配的内存,它只能被运行在内核模式下的代码访问。内核对象记录的数在内核模式下的代码访问。内核对象记录的数据在整个系统中只有一份,故也称系统资源。据在整个系统中只有一份,故也称系统资源。内核对象和普通的数据结构间的最大区别内核对象和普通的数据结构间的最大区别是其内部数据结构是隐藏的,必须调用一个对是其内部数据结构是隐藏的,必须调用一个对象服务才能从此对象中得到数据,或者是向其象服务才能从此对象中得到数据,或者是向其输入数据,而不能直接读或者改变对象的内部输入
12、数据,而不能直接读或者改变对象的内部数据。增加这些限制来保证内核对象包含一致数据。增加这些限制来保证内核对象包含一致的状态。的状态。引入内核对象,系统可方便的完成以下任务:引入内核对象,系统可方便的完成以下任务:1)为系统资源提供可识别的名字。)为系统资源提供可识别的名字。2)在进程之间共享资源和数据。)在进程之间共享资源和数据。3)保护资源不被未经认可的代码访问。)保护资源不被未经认可的代码访问。4)跟踪对象的引用情况。在不被使用时,释放)跟踪对象的引用情况。在不被使用时,释放占有空间。占有空间。内核对象的数据结构仅能从内核模式访问,所以内核对象的数据结构仅能从内核模式访问,所以直接在内存中
13、定位这些数据结构对应用程序来说是不直接在内存中定位这些数据结构对应用程序来说是不可能的。应用程序必须使用可能的。应用程序必须使用API函数访问内核对象。函数访问内核对象。调用函数创建内核对象时,函数会返回标识此内核对调用函数创建内核对象时,函数会返回标识此内核对象的句柄。象的句柄。为了使系统稳定,这些句柄和进程有关,就是仅为了使系统稳定,这些句柄和进程有关,就是仅对创建该内核对象的进程有效。对创建该内核对象的进程有效。若要多个进程共享一个内核对象,要调用若要多个进程共享一个内核对象,要调用DuplicateHandle函数复制一个进程句柄传给其他进函数复制一个进程句柄传给其他进程即可。程即可。
14、对象句柄对象句柄 内核对象是进程内的资源,使用计数属性内核对象是进程内的资源,使用计数属性指明进程对特定内核对象的引用次数,第一次指明进程对特定内核对象的引用次数,第一次创建内核对象时,系统为进程分配内核对象资创建内核对象时,系统为进程分配内核对象资源,并将该内核对象的使用计数属性初始化为源,并将该内核对象的使用计数属性初始化为1。打开一次使用计数加。打开一次使用计数加1,关闭,系统将使用,关闭,系统将使用计数减计数减1,当系统发现引用次数是,当系统发现引用次数是0时,它就会时,它就会自动关闭资源。自动关闭资源。使用计数使用计数2.3 进程的创建进程的创建进程和线程进程和线程 进程是一个正在运
15、行的程序,它拥有自己的虚进程是一个正在运行的程序,它拥有自己的虚拟地址空间,拥有自己的代码、数据和其他系统资拟地址空间,拥有自己的代码、数据和其他系统资源,如进程创建的文件、管道、同步对象等。一个源,如进程创建的文件、管道、同步对象等。一个进程也包含了一个或者多个运行在此进程内的线程。进程也包含了一个或者多个运行在此进程内的线程。线程是进程内执行代码的独立实体。没有它,线程是进程内执行代码的独立实体。没有它,进程中的程序代码是不可能执行的。操作系统创建进程中的程序代码是不可能执行的。操作系统创建进行后会创建一个线程执行进程中的代码,称主线进行后会创建一个线程执行进程中的代码,称主线程,它在运行
16、过程中创建其他线程,一般将主线程程,它在运行过程中创建其他线程,一般将主线程创建的线程称为该进程的辅助线程。创建的线程称为该进程的辅助线程。进程是不活泼的,一个进程要完成任何进程是不活泼的,一个进程要完成任何事情,必须有一个运行在它的地址空间中的事情,必须有一个运行在它的地址空间中的线程。此线程负责执行该进程地址空间的代线程。此线程负责执行该进程地址空间的代码。每个进程至少拥有一个在它的地址空间码。每个进程至少拥有一个在它的地址空间中运行的线程。对一个不包含任何线程的进中运行的线程。对一个不包含任何线程的进程来说,它是没有理由继续存在下去的,系程来说,它是没有理由继续存在下去的,系统会自动销毁
17、该进程和它的地址空间。统会自动销毁该进程和它的地址空间。进程和程序进程和程序程序:一连串静态的指令程序:一连串静态的指令进程:一个容器,它包含一系列运行在这个进程:一个容器,它包含一系列运行在这个程序实例上下文中的线程使用的资源。程序实例上下文中的线程使用的资源。Win32进程的两个组成部分进程的两个组成部分进程内核对象:操作系统使用此内核对象来进程内核对象:操作系统使用此内核对象来管理该进程。这个内核对象也是操作系统存管理该进程。这个内核对象也是操作系统存放进程统计信息的地方。放进程统计信息的地方。私有的虚拟地址空间:此地址空间包含了所私有的虚拟地址空间:此地址空间包含了所有可执行的或者是有
18、可执行的或者是DLL模块的代码和数据,模块的代码和数据,它也是程序动态申请内存的地方,比如说线它也是程序动态申请内存的地方,比如说线程堆栈和进程堆。程堆栈和进程堆。应用程序必须有一个入口函数,它在程序应用程序必须有一个入口函数,它在程序开始运行时被调用。控制台应用程序入口函数开始运行时被调用。控制台应用程序入口函数是是main。int main(int argc,char*argv)应用程序的启动过程应用程序的启动过程开始开始主线程调用主线程调用C/C+运行期启动函数运行期启动函数N操作系统调用操作系统调用CreateProcess函数创建新的进程函数创建新的进程系统创建一个进程内核对象,使用
19、计数初始化为系统创建一个进程内核对象,使用计数初始化为1系统为进程创建主线程系统为进程创建主线程成功成功调用程序入口函数调用程序入口函数mainY结束结束系统为新进程创建虚拟地址空间,加载应用程序运行时需要代码和数据系统为新进程创建虚拟地址空间,加载应用程序运行时需要代码和数据CreateProcess函数函数WIN32API函数函数CreateProcess用来创建一个新的进程和它的主线程,用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。这个新进程运行指定的可执行文件。函数原型:函数原型:BOOL CreateProcess(LPCTSTR lpApplicationNam
20、e,/可执行文件名称可执行文件名称 LPTSTR lpCommandLine,/指定要传递给执行模块的参数指定要传递给执行模块的参数 LPSECURITY_ATTRIBUTES lpProcessAttributes,/进程安全性进程安全性 LPSECURITY_ATTRIBUTES lpThreadAttributes,/进程安全性进程安全性 BOOL bInheritHandles,/指定当前进程中的可继承句柄是否可被新进程继承指定当前进程中的可继承句柄是否可被新进程继承 DWORD dwCreationFlags,/指定新进程的优先级及其他创建标志指定新进程的优先级及其他创建标志 LPV
21、OID lpEnvironment,/指定新进程使用的环境变量指定新进程使用的环境变量 LPCTSTR lpCurrentDirectory,/指定新进程使用的当前目录指定新进程使用的当前目录 LPSTARTUPINFO lpStartupInfo,/指定新进程中主窗口的位置、大小和句柄等指定新进程中主窗口的位置、大小和句柄等 LPPROCESS_INFORMATION lpProcessInformation/返回新进程的标志信息返回新进程的标志信息);lpApplicationName:指向一个:指向一个NULL结尾的、用来指结尾的、用来指定可执行模块的字符串。定可执行模块的字符串。这个字
22、符串可以是可执行模块的绝对路径,也可以这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。和目录建立可执行模块的路径。这个参数可以被设为这个参数可以被设为NULL,在这种情况下,可执,在这种情况下,可执行模块的名字必须处于行模块的名字必须处于 lpCommandLine 参数的最前参数的最前面并由空格符与后面的字符分开。面并由空格符与后面的字符分开。这个被指定的模块可以是一个这个被指定的模块可以是一个Win32应用程序。如应用程序。如果适当的子系统在当前计算机上可用的话,它也可以果适
23、当的子系统在当前计算机上可用的话,它也可以是其他类型的模块(如是其他类型的模块(如MS-DOS 或或 OS/2)。)。lpCommandLine:指向一个:指向一个NULL结尾的、用来指定结尾的、用来指定要运行的命令行。要运行的命令行。这个参数可以为空,那么函数将使用参数指定的字符这个参数可以为空,那么函数将使用参数指定的字符串当作要运行的程序的命令行。串当作要运行的程序的命令行。如果如果lpApplicationName和和lpCommandLine参数都不参数都不为空,那么为空,那么lpApplicationName参数指定将要被运行的参数指定将要被运行的模块,模块,lpCommandLi
24、ne参数指定将被运行的模块的命参数指定将被运行的模块的命令行。新运行的进程可以使用令行。新运行的进程可以使用GetCommandLine函数函数获得整个命令行。获得整个命令行。C语言程序可以使用语言程序可以使用argc和和argv参数。参数。如果如果lpApplicationName参数为空,那么这个字符串中的第一个被空格分隔的要参数为空,那么这个字符串中的第一个被空格分隔的要素指定可执行模块名。如果文件名不包含扩展名,那么素指定可执行模块名。如果文件名不包含扩展名,那么.exe将被假定为默认的将被假定为默认的扩展名。如果文件名以一个点(扩展名。如果文件名以一个点(.)结尾且没有扩展名,或文件
25、名中包含路)结尾且没有扩展名,或文件名中包含路径,径,.exe将不会被加到后面。如果文件名中不包含路径,将不会被加到后面。如果文件名中不包含路径,Windows将按照如下将按照如下顺序寻找这个可执行文件:顺序寻找这个可执行文件:1.当前应用程序的目录。当前应用程序的目录。2.父进程的目录。父进程的目录。3.Windows 95:Windows系统目录,可以使用系统目录,可以使用GetSystemDirectory函数获得。函数获得。Windows NT:32位位Windows系统目录。可以使用系统目录。可以使用GetSystemDirectory函数函数获得,目录名是获得,目录名是SYSTEM
26、32。4.在在Windows NT中:中:16位位Windows系统目录。不可以使用系统目录。不可以使用Win32函数获得这函数获得这个目录,但是它会被搜索,目录名是个目录,但是它会被搜索,目录名是SYSTEM。5.Windows目录。可以使用目录。可以使用GetWindowsDirectory函数获得这个目录。函数获得这个目录。6.列在列在PATH环境变量中的目录。环境变量中的目录。如果被创建的进程是一个以如果被创建的进程是一个以MS-DOS或或16位位Windows为基础的应用程序,为基础的应用程序,lpCommandLine参数应该是一个以可执行文件的文件名作为第一个要素的绝对参数应该是
27、一个以可执行文件的文件名作为第一个要素的绝对路径,因为这样做可以使路径,因为这样做可以使32位位Windows程序工作的很好,这样设置程序工作的很好,这样设置lpCommandLine参数是最强壮的。参数是最强壮的。dwCreationFlags:指定附加的、用来控制优先级和:指定附加的、用来控制优先级和进程的创建的标志。以下的创建标志可以以除下面列进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。出的方式外的任何方式组合后指定。值:值:CREATE_DEFAULT_ERROR_MODE含义:新的进程不继承调用进程的错误模式。含义:新的进程不继承调用进程的错误模式。
28、值:值:CREATE_NEW_CONSOLE含义:新的进程将使用一个新的控制台,而不是含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。标志一起使用。值:值:CREATE_NEW_PROCESS_GROUP含义:新进程将使一个进程树的根进程。进程树含义:新进程将使一个进程树的根进程。进程树种的全部进程都是根进程的子进程。种的全部进程都是根进程的子进程。值:值:CREATE_SUSPENDED含义:新进程的主线程会以暂停的状态被创建,直到调含义:新进程的主线程会以暂停的状态被创建,直到调用用
29、ResumeThread函数被调用时才运行。函数被调用时才运行。值:值:CREATE_UNICODE_ENVIRONMENT含义:如果被设置,由含义:如果被设置,由lpEnvironment参数指定的环境块参数指定的环境块使用使用Unicode字符,如果为空,环境块使用字符,如果为空,环境块使用ANSI字符。字符。优先级:优先级:HIGH_PRIORITY_CLASS 含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个证正确。这个优先级的程序优先于正常优
30、先级或空闲优先级的程序。一个例子是例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的先级的CPU关联应用程序可以占用几乎全部的关联应用程序可以占用几乎全部的CPU可用时间。可用时间。优先级:优先级:IDLE_PRIORITY_CLASS 含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护
31、程序。空闲优先级会被子进程继承。优先级的任务打断。例如屏幕保护程序。空闲优先级会被子进程继承。优先级:优先级:NORMAL_PRIORITY_CLASS 含义:指示这个进程没有特殊的任务调度要求。含义:指示这个进程没有特殊的任务调度要求。优先级:优先级:REALTIME_PRIORITY_CLASS 含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程
32、可能导致磁盘缓存不足或进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。鼠标反映迟钝。STARTUPINFO结构结构typedef struct DWORD cb;/本结构长度,总是应该被设为本结构长度,总是应该被设为sizeof(STARTUPINFO)LPTSTR lpReserved;/保留字段保留字段 LPTSTR lpDesktop;/指定桌面名称指定桌面名称 LPTSTR lpTitle;/控制台应用程序用,指定控制台窗口标题控制台应用程序用,指定控制台窗口标题 DWORD dwX;/指定新创建窗口的位置坐标和大小信息指定新创建窗口的位置坐标和大小信息
33、DWORD dwY;DWORD dwXSize;DWORD dwYSize;DWORD dwXCountChars;/控制台程序用,指定控制台窗口的行数控制台程序用,指定控制台窗口的行数 DWORD dwYCountChars;DWORD dwFillAttribute;/控制台程序用,指定控制台窗口的背景色控制台程序用,指定控制台窗口的背景色 DWORD dwFlags;/标志,它的值决定标志,它的值决定STARTUPINFO结构中那些成员的值有效结构中那些成员的值有效 WORD wShowWindow;/窗口的显示方式窗口的显示方式 WORD cbReserved2;LPBYTE lpRe
34、served2;HANDLE hStdInput;/控制台程序使用,几个标准句柄控制台程序使用,几个标准句柄 HANDLE hStdOutput;HANDLE hStdError;STARTUPINFO,*LPSTARTUPINFO;PROCESS_INFORMATION结构结构typed struct HANDLE hProcess;/新建进程的内核句柄新建进程的内核句柄HANDLE hThread;/新建进程中主线程的内核句柄新建进程中主线程的内核句柄DWORD dwProcessId;/新建进程的新建进程的IDDWORD dwThreadId;/新建进程的主线程新建进程的主线程IDPRO
35、CESS_INFORMATION,*LPPROCESS_INFORMATION;获取系统进程获取系统进程首先使用首先使用CreateToolhelp32Snapshot函函数给当前系统内执行的进程拍快照,也就获数给当前系统内执行的进程拍快照,也就获得一个进程列表,这个列表中记录着进程的得一个进程列表,这个列表中记录着进程的ID、进程对应的可执行文件的名称和创建、进程对应的可执行文件的名称和创建该进程的进程该进程的进程ID等数据。然后使用等数据。然后使用Process32First函数和函数和Process32Next函函数遍历快照中记录的列表。数遍历快照中记录的列表。2.4 进程的控制进程的控
36、制结构结构typedef struct DWORD dwSize;/结构的长度,必须预先设置结构的长度,必须预先设置 DWORD dwUsage;/进程的引用计数进程的引用计数 DWORD th32ProcessID;/进程进程IDDWORD;进程默认堆的;进程默认堆的;进程模块的;进程模块的;进程创建的线程数;进程创建的线程数;进程的父线程;进程的父线程;进程创建的线程的基本优先级;进程创建的线程的基本优先级;内部使用;内部使用;进程对应的可执行文件名;进程对应的可执行文件名;终止当前进程终止当前进程-ExitProcess函数函数终止进程就是结束程序的执行,让它从内存中终止进程就是结束程序
37、的执行,让它从内存中卸载。终止原因:卸载。终止原因:1)主线程的入口函数返回。)主线程的入口函数返回。2)进程中一个线程调用了)进程中一个线程调用了ExitProcess函数函数3)此进程中的所有线程都结束了。)此进程中的所有线程都结束了。4)其他进程中的一个线程调用了)其他进程中的一个线程调用了 TerminateProcess函数。函数。终止其他进程终止其他进程-TerminateProcess函数函数对一个进程操作前,必须首先取得该进程的进对一个进程操作前,必须首先取得该进程的进程句柄。程句柄。CreateProcess函数创建进程后返回一个进程函数创建进程后返回一个进程句柄。对已存在进
38、程,用句柄。对已存在进程,用OpenProcess函数函数取得这个进程的访问权限。取得这个进程的访问权限。保护进程保护进程 保护进程不被其他进程非法关闭。保护进程不被其他进程非法关闭。1)防止被其他进程检测到。)防止被其他进程检测到。2)防止此进程被其他进程关闭。)防止此进程被其他进程关闭。WPE(截获网络数据软件截获网络数据软件)检测系统进程:检测系统进程:ToolHelp,Process Status函数函数 HOOK掉系统对这些函数的调用掉系统对这些函数的调用 HOOK掉其他进程对掉其他进程对TerminateProcess函数的函数的调用。调用。2.5 游戏内存修改器(实例)游戏内存修
39、改器(实例)实现原理实现原理BOOL ReadProcessMemory(HANDLE hProcess,/待读进程的句柄待读进程的句柄LPCVOID lpBaseAddress,/目标进程中待读内存的起始地址目标进程中待读内存的起始地址LPVOID lpBuffer,/用来接收读取数据的缓冲区用来接收读取数据的缓冲区DWORD nSize,/要读取的字节数要读取的字节数LPDWORD lpNumberOfBytesRead/用来供函数返回实际读取的字节数用来供函数返回实际读取的字节数);WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nS
40、ize,lpNumberOfBytesRead);OSVERSIONINFO结构结构Typedef struct_OSVERSIONINFODWORD dwOSVersionInfoSize,/本结构的大小,必须在调用之本结构的大小,必须在调用之前设置前设置 DWORD dwMajorVersion,/操作系统的主版本号操作系统的主版本号DWORD dwMinorVersion,/操作系统的次版本号操作系统的次版本号DWORD dwBuildNumber,/操作系统的编译版本号操作系统的编译版本号DWORD dwPlatformId/操作系统平台。可以是操作系统平台。可以是VER_PLATFORM_WIN32_NT(2000系列系列)等等TCHAR szCSDVersion128;/指定安装在系统上的最新服务包,指定安装在系统上的最新服务包,例如例如”Service Pack4”等等OSVERSIONINFO;结结 束束