Google

星期三, 一月 23, 2008

PE Format(9)

映象文件是一个Win32二进制图象文件。(它还是能用AllocConsole()打开一个控制台界面,但在开始时却不能自动地打开。)

  IMAGE_SUBSYSTEM_WINDOWS_CUI(3)

  二进制文件是一个Win32控制台界面二进制文件。(它将在开始时按照缺省值打开一个控制台,或者继承其父程序的控制台。)

  IMAGE_SUBSYSTEM_OS2_CUI(5)

  二进制文件是一个OS/2控制台界面二进制文件。(OS/2控制台界面二进制文件是OS/2格式,因此此值在PE文件中很少使用。)

  IMAGE_SUBSYSTEM_POSIX_CUI(7)

  二进制文件使用POSIX控制台子系统。

  Windows95的二进制文件总是使用Win32子系统,因此它的二进制文件的合法值只有2和3;我不知道windows95的“原”二进制文件是否可能(会有其它值----译者添加,仅供参考)。

  24)下一个是16位的值,指明,如果是DLL文件,何时调用DLL文件的入口点(‘DllCharacteristics’,“DLL特性”)。此值似乎不用;很明显地,DLL文件总是被通报所有的情况。

  如果位0被置1,DLL文件被通知进程附加(亦即DLL载入)。

  如果位1被置1,DLL文件被通知线程附加(亦即线程终止)。

  如果位2被置1,DLL文件被通知线程附加(亦即线程创建)。

  如果位3被置1,DLL文件被通知进程附加(亦即DLL卸载)。

  25-28)下4个32位值分别是:保留栈的大小(SizeOfStackReserve)、初始时指定栈大小(SizeOfStackCommit)、保留堆的大小(SizeOfHeapReserve)和指定堆大小(SizeOfHeapCommit)。

“保留的”数量是保留给特定目的的地址空间(不是真正的RAM);在程序开始时,“指定的”数量是指在RAM中实际分配的大小。如果需要的话,“指定的”值也是指定的堆或栈用来增加的数量。(有资料说,不管“SizeOfStackCommit”的值是多少,栈都是按页增加的。我没有验证过。)

  因此,举例来说,如一个程序的保留堆有1MB,指定堆为64KB,那么启动时堆的大小为64KB,并且保证可以扩大到1MB。堆将按64KB一块来增加。

  “堆”在本文中是指主要(缺省)堆。如果它愿意的话,一个进程可创建很多堆。

  栈是指第一个线程的栈(启动main()的那个)。进程可以创建很多线程,每个线程都有自己的栈。

  DLL文件没有自己的堆或栈,所以它们的映象文件忽略这些值。我不知道驱动程序是否有它们自己的堆或栈,但我认为它们没有。

标签: , ,

0 条评论:

发表评论

<< 主页

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger