- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
进程入门
Windows核心编程学习笔记
进程入门
几句话
刚刚看完了Windows核心编程的进程一章,趁着印象深赶紧做个笔记。由于是第一遍看,所以领会的程度有限,权限提升的部分也没怎么细看,这篇文章只是整理下自己学完的收获,老鸟们请直接跳过。
概述
进程是Windows系统非常核心的一个概念,任何应用程序的运行的一个实例都是一个进程。对于系统而言,一个进程有着两个基本的属性:一是系统创建的用来专门管理该进程的内核对象;二是容纳进程所有资源的虚拟的私有地址空间,这里面将载入进程要执行的可执行文件代码以及所有需要的DLL模块。这篇笔记的结构如下:
浅谈对句柄的理解
进程句柄的释放
进程的执行流程
进程API的基本使用
CreateProcess的小例子
句柄
接触过Windows编程的同学们一定都接触过句柄,非常常见的HANDLE数据类型。句柄在Windows系统中用来唯一标识不同的对象或者同类对象中的不同实例,如:窗口、按钮、图标、文件、进程、线程等。我们可以从以下几个方面来理解句柄:
数值上看句柄是一个32位4字节的无符号整数
句柄实际是一个指针值,但它并不是所标识的对象的指针,准确地说,句柄是指针的指针,通过句柄可以找到一个数据结构,在这个数据结构里可以唯一定位我们的对象。
HANDLE的值正常时为一个无符号整数,无效失败的情况是NULL和-1,后者常常定义为符号常量INVALID_HANDLE_VALUE
Exa:进程的实例句柄,指的是进程中可执行模块和DLL模块的句柄。这里的句柄值就是该模块加载到进程地址空间的基地址。HMODULE和HINSTANCE等价,可以使用GetModuleHandle()得到进程实例句柄。
进程内核对象句柄表。虽然没有编入文档,内部原理机制并不公开,但是我们可以了解一个大致的情况。每个进程一旦创建就维护一张句柄表,用来记录进程创建使用的所有内核对象。这里各个内核对象的句柄作为句柄表的索引使用,每个条目包含:对象指针+访问掩码+标志三个内容。这里的句柄就是作为指针的指针而存在。一般地说句柄不能等同于对象的指针,只能作为该对象的一个唯一标识和索引。需要说明的是,句柄表是进程相关的概念,一个进程中的内核对象句柄是不能应用于其他进程的。
进程句柄??释放
进程作为内核对象,在创建的时候也维护着一个Count,创建时初始化为1,一旦递减到0便会将进程内核对象从内存中完全释放。每创建一个进程,都会同时创建一个进程内核对象和一个线程内核对象,前者用来管理新创建的进程,后者用来管理新进程的主线程。创建时都初始化为1;在CreatProcess()函数返回之前,系统会再次打开新创建的进程内核对象和线程内核对象,读取它们的句柄写入到PROCESS_INFORMATION的hProcee和hThread中,使得主调进程也可以操作子进程及其主线程所以,CreateProcess()返回时进程内核对象和线程内核对象的Count都为2,如果只是在新进程中自然返回,Count值只会递减1,内核对象仍然会在内存中存在,没有实现真正的释放。所以,在主调进程调用CreateProcess()函数返回后要调用
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess); //参看后面的PROCESS_INFORMAION结构说明
先将内核对象的Count值-1.
进程的执行流程
当我们运行一进程A,在进程A中调用CreateProcess()创建子进程时,一般过程如下图:
从图中看出,子进程结束时的pi.hProcess和pi.hThread都为1,说明内核对象仍在内存中存在,没有完全释放。为了可以使子进程结束时彻底释放,我们可以在主调进程中像上面那样调用CloseHandle()函数即可。这样创建的子进程也是和主调进程完全没有关联的。一旦一个进程调用了CloseHandle(),那么它将告诉系统再也不需要该句柄标识的对象,而不是直接将其从内存中释放,因此它再也无法操作该对象,虽然该对象可能还存在于内存中。
进程API的基本使用
CreateProcess()
我们用此函数创建一个进程,原型如下:
BOOL CreateProcess(
PCTSTR pApplicationName,
PTSTR pCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD dwCreationFlags,
PVOID pEnvironment,
PCWSTR pCurrentDirec
文档评论(0)