进程

  • 进程实例句柄

GetModuleHandle,传递一个字符串,它指定了已在主调进程的地址空间中加载的一个可执行文件或DLL文件的名称,GetModuleHandle返回可执行文件/DLL文件映像加载到的基地址
如果传入NULL,返回主调进程的可执行文件的基地址,即使调用GetModuleHandle的函数在一个DLL文件中,返回值仍然是可执行文件的基地址,而非DLL文件的基地址
调用GetModuleHandleEx,将GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS作为它的第一个参数,将当前的函数地址作为第二个参数。最后一个参数是一个指向HMODULE的指针,GetModuleHandleEx会用传入函数所在DLL的基地址来填写该指针

  • 进程前一个实例的句柄

C/C++运行库启动代码总是向(w)WinMain的hPrevInstance参数传递NULL。

  • 进程的命令行

系统在创建一个新进程时,会传一个命令行给它。这个命令行几乎总是非空的
C运行库的启动代码开始执行一个GUI程序时,会调用Windows函数GetCommonLine来获取进程的完整命令行,忽略可执行文件的名称,然后将指向命令行剩余部分的指针传给WinMain的pszCmdLine参数
GetCommandLine返回的总是同一个缓冲区的地址
想释放这部分内存,正确的做法是调用HeapFree

  • 进程的环境变量
    每个进程都有一个与它关联的环境块,这是在进程地址空间分配的一块内存
    GetEnvironmentStrings函数获取完整的环境块
    FreeEnvironmentStrings函数来释放它
    GetEnvironmentVariable函数来判断一个环境变量是否存在,通过两次调用来安全的使用它
    可以使用SetEnvironmentVariable函数添加一个变量

  • 进程当前所在的驱动器和目录

GetCurrentDirectory
父进程可以通过调用GetFullPathName来获得它的当前目录

  • 系统版本

GetVersionEx
VerifyVersionInfo

  • CreateProcess函数

一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1。进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构--可以把进程内核对象想象成由进程统计信息构成的一个小型数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件(和所有必要的DLL)的代码及数据加载到进程的地址空间。

*pszApplicationName和pszCommandLine参数

pszApplicationName和pszCommandLine参数分别指定新进程的命令行字符串。

  • psaProcess,psaThread和bInheritHandles参数

为了创建一个新的进程,系统必须创建一个进程内核对象和一个线程内核对象。由于这些都是内核对象,所以父进程有机会将安全属性关联到这两个对象上。

  • fdwCreate参数

fdwCreate参数标识了影响新进程创建方式的标志。多个标志可以使用按位或起来,以便同时使用多个标志组合。

  • pvEnvironment参数

pvEnvironment参数指向一块内存,其中包含新进程要使用的环境字符串。大多时候,为这个参数传入的值都是NULL,这将导致子进程继承父进程使用的一组环境字符串

  • pszCurDir参数

pszCurDir参数允许父进程设置子进程的当前驱动器和目录。

  • psiStartInfo

psiStartInfo参数指向一个STARTINFO机构或STARTINFOEX结构

  • ppiProclnfo参数

ppiProlnfo参数指向一个PROCESS_INFORMATION结构,CreateProcee在返回前,会初始化这个结构的成员
如前所述,创建一个新的进程,会导致系统创建一个进程内核对象和一个线程内核对象,在创建时,系统会为每个对象指定一个初始的使用计数1。然后就在CreateProcee函数饭后前,它会使用完全使用权限来打开进程对象和线程对象,并将各自与进程相关的句柄放入PROCESS_INFORMATION结构的hProcee和hThread成员中,当CreateProcess在内部打开这些对象时,每个对象的使用计数就变成2。

终止进程

进程可以通过以下4中方式终止:

  • 主线程的入口点函数返回

  • 进程中的一个线程调用ExitProcess函数(要避免这个方式)

  • 另一个进程中的一个线程调用TerminateProcess函数(避免)

  • 进程中的所有线程都自然死亡(这种现象基本上从来不会发生)

  • 主线程的入口点函数返回

让主线程的入口点函数返回,可以保证以下操作会被执行

  1. 该线程创建的任何C++对象都将由这些函数的析构函数正确销毁
  2. 操作系统将正确释放线程栈使用的内存
  3. 系统将进程的推出代码设置成入口点函数的返回值
  4. 系统递减进程对象的使用计数
  • ExitProcess函数

该函数将终止进程,并将进程的退出代码设置为fuExitCode。

  • TerminateProcess函数

只有在无法通过其他方法来强制进程退出时,才应使用TerminateProcess。

  • 当进程终止运行时

一个进程终止运行时,系统会依次执行以下操作。
(1) 终止进程中遗留的任何线程
(2) 释放进程分配的所有用户对象和GDI对象,关闭所有内核对象。
(3) 进程的退出代码从STILL_ACTIVE变为传给ExitProcess或TerminateProcess函数的代码
(4) 进程内核对象的状态变成已触发
(5) 进程内核对象的使用计数递减1。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,004评论 0 23
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,665评论 0 27
  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,405评论 1 14
  • 今天电脑不给力,就用手机输入了。所以楔子什么的就不来了,结合今天的ACE授课内容,加上我自己的经验体会,围绕降低体...
    大海豹先生阅读 1,956评论 17 38
  • 刚结束了SKT VS ROX的比赛,看得观众热血沸腾!这五场比赛每一秒都让人不想错过。在激烈的比赛之下,SKT最终...
    里多icy阅读 958评论 4 3