Windows程序设计基础

来源:互联网 发布:mysql分类后如何排序 编辑:程序博客网 时间:2024/05/16 11:16

基本概念:

1.CPU保护模式:

1.各进程的地址空间:被分为用户空间和系统空间,用户空间是私有的空间,保证进程间不能互相访问,虽然是同一地址,但是可以不同进程可以保存不同数据。但是通过调用API函数,就可以访问所有数据

2.内核模式和用户模式:系统通过环来管理特权级别。一般情况下用户进程是处在用户模式下,访问的是用户空间,但是,当用户访问系统资源的时候,也就是调用系统的API函数的时候,就会切换到内核模式。

2.内核对象

内核对象主要3个概念:什么是内核对象,什么是对象句柄,怎么管理内核对象的使用

3.进程

1.创建进程

Win32应用程序的启动过程:调用CreateProcess创建一个进程内核对象,其初始值是1,分配虚拟地址空间,加载所需要的代码和数据,创建主线程,主线程调用c++的运行启动代码,运行启动代码再调用main函数

当进程将自己的内核对象句柄传给hProcess,对应的句柄数会由1增加至2,所有在调用完结束的时候要closehandle,否则,无法释放这个内核对象。

2.进程控制

获取系统进程

#include "stdafx.h"#include <windows.h>#include <tlhelp32.h> // 声明快照函数的头文件int main(int argc, char* argv[]){PROCESSENTRY32 pe32;// 在使用这个结构之前,先设置它的大小pe32.dwSize = sizeof(pe32); // 给系统内的所有进程拍一个快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap == INVALID_HANDLE_VALUE){printf(" CreateToolhelp32Snapshot调用失败! \n");return -1;}// 遍历进程快照,轮流显示每个进程的信息BOOL bMore = ::Process32First(hProcessSnap, &pe32);while(bMore){printf(" 进程名称:%s \n", pe32.szExeFile);printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);bMore = ::Process32Next(hProcessSnap, &pe32);}// 不要忘记清除掉snapshot对象::CloseHandle(hProcessSnap);return 0;}

 

终止当前进程

终止进程有4个原因

1.主线程的入口函数返回

2.进程中某个线程调用了ExitProcess

3.所有的线程都结束了

4.其他进程的一个线程通过调用TerminateProcess结束这个进程

注:通过调用TerminateProcess结束进程,对于操作系统是正常的,但是对于c++运行库来说,系统会没有机会去析构全局和静态的对象。

 

终止其他进程

通过进程的ID调用OpenProcess获取需要的进程的句柄,然后TerminateProcess来结束该进程

一旦进程被终止会发生下面的事情

1.所有被这个进程打开的句柄会关闭

2.该进程的所有线程结束

3.进程内核对象变为受信状态,所有的等待在这个对象上的线程开始执行

4.系统进程对象中退出码变为指定的退出码。

 

保护进程

其他进程需要结束一个进程,会先用ToolHelp或者EnumProcess查找相应的进程,然后再去kill这个进程,所以可以通过Hook这两个函数,或者直接HookTerminateProcess函数就可以保护进程不被kill掉

 

练习:《游戏内存修改器》

原创粉丝点击