📄 csdn技术中心 windows2000 进程-线程分析(一).htm
字号:
id=ArticleTitle1_ArticleTitle1_lblSource></SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width=10></TD>
<TD><SPAN id=ArticleContent1_ArticleContent1_lblContent>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"
align=center><B><SPAN lang=EN-US
style="FONT-SIZE: 16pt; COLOR: blue; mso-bidi-font-size: 12.0pt">Windows2000
</SPAN></B><B><SPAN
style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程</SPAN></B><B><SPAN
lang=EN-US
style="FONT-SIZE: 16pt; COLOR: blue; mso-bidi-font-size: 12.0pt">/</SPAN></B><B><SPAN
style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线程分析(一)</SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"
align=center><B><SPAN
style="FONT-SIZE: 16pt; COLOR: blue; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
---<FONT color=#080809
size=4>读书笔记</FONT></SPAN></B></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l2 level1 lfo1"><B><SPAN
lang=EN-US
style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 宋体"><SPAN
style="mso-list: Ignore">一、<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN></SPAN></B><B><SPAN
style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核对象</SPAN></B><B><SPAN
lang=EN-US
style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US
style="FONT-SIZE: 12pt">1</SPAN></B><B><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN></B><B><SPAN
lang=EN-US style="FONT-SIZE: 12pt">1 </SPAN></B><B><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是内核对象</SPAN></B><B><SPAN
lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></SPAN></B></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统和应用程序使用内核对象来管理各种各样的资源,比如:进程、线程和文件等。每个内核对象只是内核分配的一个内存块,并且只能有内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成员(如:安全描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如:进程对象有一个进程</SPAN><SPAN
lang=EN-US>ID</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构,并直接改变它们的内容。</SPAN><SPAN
lang=EN-US>Microsoft</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规定了这个限制条件,目的是为了确保内核对象的结构能够保持状态的一致性。这个限制也使</SPAN><SPAN
lang=EN-US>Microsoft</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能够在不破坏任何应用程序的情况下,在这些结构中添加、删除和修改数据成员。</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN lang=EN-US>Windows</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了一组函数,用于创建和访问内核对象。(例如:</SPAN><SPAN
lang=EN-US>CreateProcess</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN
lang=EN-US>CreateFileMapping</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。该句柄可以被视为一个不透明值,进程中的任何线程都可以使用这个值。通过将每个内核对象的句柄传递给</SPAN><SPAN
lang=EN-US>Windows</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的各个函数,系统就能知道你想操作那个内核对象了。</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><FONT
size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了使</SPAN><SPAN
lang=EN-US>OS</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更加健壮,内核对象的句柄是与进程密切相关的。因此,如果将该句柄传递给另一个进程中的某个线程(使用某种形式的进程间的通信)那么该线程使用此句柄所用的调用将会失败。当然,这并不是绝对的,使用“跨越进程边界共享内核对象”技术,就可使多个进程共享单个内核对象。</SPAN></FONT></P>
<DIV
style="BORDER-RIGHT: blue 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: blue 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 1pt; BORDER-LEFT: blue 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: blue 1pt solid; mso-border-alt: solid blue .5pt">
<P class=MsoNormal
style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-border-alt: solid blue .5pt; mso-padding-alt: 1.0pt 4.0pt 1.0pt 4.0pt"><FONT
size=3><SPAN lang=EN-US style="BACKGROUND: #f3f3f3"><SPAN
style="mso-spacerun: yes"> </SPAN></SPAN><B><SPAN
style="FONT-SIZE: 12pt; BACKGROUND: #f3f3f3; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">猜测:</SPAN></B><SPAN
style="BACKGROUND: #f3f3f3; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核对象不会位于单个进程的</SPAN><SPAN
lang=EN-US style="BACKGROUND: #f3f3f3; COLOR: blue">4GB</SPAN><SPAN
style="BACKGROUND: #f3f3f3; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虚拟空间中,而是位于处于内核控制下的某块内存区域中,这样的话,就能实现多个进程共享单个内核对象。内核对象的句柄到底是什么,没有确切的文档可以说明,但可以肯定同一个内核对象可以对应多个句柄,而同一个句柄只能对应一个内核对象,这就可以解释为什么通过给内核对象命名的方法,可以使两个毫无关系的进程访问同一个内核对象,但是这两个进程得到的针对同一内核对象的句柄却并不相同,这也是和子进程继承父进程句柄表的方式的区别。</SPAN></FONT></P></DIV>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B><SPAN lang=EN-US
style="FONT-SIZE: 12pt"><o:p> </o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><B><SPAN
lang=EN-US>1</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN
lang=EN-US>1</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN
lang=EN-US>1 </SPAN></B><B><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核对象的使用计数</SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN
lang=EN-US><SPAN style="mso-spacerun: yes">
</SPAN></SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核对象由内核拥有,这意味着,如果你的进程调用了一个创建内核对象的函数,然后你的进程就终止了运行。那么该内核对象不一定被撤销。当然,在大多数情况下,内核对象会被撤销。但是如果另一个进程正在使用你的进程创建的内核对象(如:子进程继承了父进程的句柄表,或者使用“跨越进程边界共享内核对象”技术),那么该内核知道,在另一个进程终止使用该对象前不能撤销该对象,<SPAN
style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">必须记住:内核对象的存在时间可以比创建该对象的进程长</SPAN>。</SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每个内核对象包含一个使用计数,使用计数是所有内核对象类型常用的数据成员之一。当一个对象刚刚创建时,它的使用计数被置为</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。然后,当另一个进程访问一个现有的内核对象时,使用计数就递增</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。当进程终止运行时,内核就自动确定该进程仍然打开的所有内核对象的使用计数。如果内核对象的使用计数将为</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,内核就撤销该对象。这样可以保证,在没有进程引用该内核对象时,系统将不会继续保留它。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
lang=EN-US><o:p><FONT size=3> </FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><B><SPAN
lang=EN-US>1</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN
lang=EN-US>1</SPAN></B><B><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">.</SPAN><SPAN
lang=EN-US>2 </SPAN></B><B><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安全性</SPAN><SPAN
lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=3>内核对象能够得到安全描述符的保护。安全描述符用于描述谁创建了该对象,谁能够访问和使用该对象,谁无权访问该对象。安全描述符通常在编写服务器应用程序时使用。</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=3>内核对象的默认安全性为:对象管理组中的任何成员和创建者都拥有对该对象的全部访问权。</FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了内核对象之外,应用程序也可以使用其他类型的对象,如:菜单、窗口、鼠标光彪、刷子和字体等。这些对象属于用户对象或</SPAN><SPAN
lang=EN-US>GDI</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">(图形设备接口)对象,而不是内核对象。如果创建对象的函数没有使用</SPAN><SPAN
lang=EN-US>PSECURITY_ATTRIBUTES</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数,那么创建的就不是内核对象。例如:</SPAN></FONT></P>
<P class=MsoNormal
style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=3>HICON CreateIcon(</FONT></SPAN></P>
<P class=MsoNormal
style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=3><SPAN
style="mso-spacerun: yes">
</SPAN>HINSTANCE<SPAN style="mso-spacerun: yes">
</SPAN>hInst,</FONT></SPAN></P>
<P class=MsoNormal
style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=3><SPAN
style="mso-spacerun: yes">
</SPAN>int<SPAN
style="mso-spacerun: yes">
</SPAN>nWidth,</FONT></SPAN></P>
<P class=MsoNormal
style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=3><SPAN
style="mso-spacerun: yes">
</SPAN>int<SPAN
style="mso-spacerun: yes">
</SPAN>nHeight,</FONT></SPAN></P>
<P class=MsoNormal
style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=3><SPAN
style="mso-spacerun: yes">
</SPAN>BYTE<SPAN
style="mso-spacerun: yes">
</SPAN>cPlanes,</FONT></SPAN></P>
<P class=MsoNormal
style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN
lang=EN-US><FONT size=3><SPAN
style="mso-spacerun: yes">
</SPAN>BYTE<SPAN
style="mso-spacerun: yes">
</SPAN>cBitsPixel,</FONT></SPAN></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -