正在阅读:PE文件格式详解(5)PE文件格式详解(5)

2004-02-14 09:34 出处:PConline 作者:titilima/CSDN 责任编辑:linjixiong

  #define RT_FONT MAKEINTRESOURCE(8)
  #define RT_ACCELERATOR MAKEINTRESOURCE(9)
  #define RT_RCDATA MAKEINTRESOURCE(10)
  #define RT_MESSAGETABLE MAKEINTRESOURCE(11)

  在树的第一层级,以上列出的MAKEINTRESOURCE值被放置在每个种类入口的Name处,它标识了不同的资源种类。

  每个根目录的入口都指向了树中第二层级的一个兄弟结点,这些结点也是目录,并且每个都拥有它们自己的入口。在这一层级,目录被用来以给定的种类标识每一个资源种类。如果你的应用程序中有多个菜单,那么树中的第二层级会为每个菜单都准备一个入口。

  你可能意识到了,资源可以由名称或整数标识。在这一层级,它们是通过目录结构的Name域来分辨的。如果如果Name域最重要的位被设置了,那么其它的31个位就会被用作一个到IMAGE_RESOURCE_DIR_STRING_U结构的偏移量。

  WINNT.H
  typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
  USHORT Length;
  WCHAR NameString[1];
  } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;

  这个结构仅仅是由一个2字节长的Length域和一个UNICODE字符Length组成的。
  另一方面,如果Name域最重要的位被清空,那么它的低31位就被用于表示资源的整数ID。图2示范的就是菜单资源作为一个命名的资源,以及字串表作为一个ID资源。

  如果有两个菜单资源,一个由名称标识,另一个由资源标识,那么它们二者就会在菜单资源目录之后拥有两个入口。有名称的资源入口在第一位,之后是由整数标识的资源。目录域NumberOfNamedEntries和NumberOfIdEntries将各自包含值1,表示当前的1个入口。

  在第二层级的下面,资源树就不再更深一步地扩展分支了。第一层级分支至表示每个资源种类的目录中,第二层级分支至由标识符表示的每个资源的目录中,第三层级是被个别标识的资源与它们各自的语言ID之间一对一的映射。要表示一个资源的语言ID,目录入口结构的Name域就被用来表示资源的主语言ID和子语言ID了。Windows NT的Win32 SDK开发包中列出了默认的值资源,例如对于0x0409这个值来说,0x09表示主语言LANG_ENGLISH,0x04则被定义为子语言的SUBLANG_ENGLISH_CAN。所有的语言ID值都定义于Windows NT Win32 SDK开发包的文件WINNT.H中。

  既然语言ID结点是树中最后的目录结点,那么入口结构的OffsetToData域就是到一个叶子结点(即前面提到过的IMAGE_RESOURCE_DATA_ENTRY结构)的偏移量。

  再回过头来参考图2,你会发现每个语言目录入口都对应着一个数据入口。这个结点仅仅表示了资源数据的尺寸以及资源数据的相对虚拟地址。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品