Windows操作系统上常见文件格式介绍 田 肃 1995-01-06 BMP格式图象文件是目前最流行的几种图象文件之一,它也是Microsoft Windows的操作系统支持的主要文件格式。在这里, 笔者介绍一下BMP非压缩的存储格式。BMP一般由以下三部分组成的: ● 位图文件头(共14个字节) ● 位图信息头结构(共40个字节) ● 位图彩色映象表和图象数据。 BMP的图象文件格式具体定义参见下表1。 表1 BMP图象文件格式 地址 长度(字节) 说明 00h 2 位图文件的标记“BM” 02h 4 以字节为单位的位图文件的大小 06h 2 保留字(一般为0) 08h 2 保留字(一般为0) 0Ah 4 图象数据的起始地址 0Eh 4 位图信息头的长度,共40个字节 12h 4 位图图象宽度的象素值 16h 4 位图图象高度的象素值 1Ah 2 图象目标设备的位平面数值为1 1Ch 2 每个象素的位数(1、4、8、24) 1EH 4 位图图象的压缩类型:0 - 未压缩 1- RLE 8 2 - RLE 4 22H 4 以字节为单位的压缩图象大小 26h 4 目标设备水平分辨率 2Ah 4 目标设备垂直分辨率 2EH 4 实际使用的颜色数 32H 4 重要颜色数 36h 1 蓝色相对亮度值 37h 1 绿色相对亮度值 38h 1 红色相对亮度值 39h 1 位图保留字,其值为零以下为BMP实际位图数据 1.BMP图象文件格式有关说明 (1) BMP文件头偏移22h 该偏移代表了压缩图象的大小,它不能简单地通过把图象长、 宽和每象素所占用的字节相乘得到。由于BMP图象数据是按行存放的,每行按双字节对齐。因此, 位图的长度是由实际的行宽与行数相乘的结果,每个象素所占用字节数相乘得到。 (2) 文件头偏移2EH 它代表实际使用的颜色数,说明位图实际使用的颜色表中的色彩索引值。 当图象每个象素对应1 bit、4 bit或8 bit时就必须有一个彩色映象。 彩色图象的大小一般分为2、16或256个表项。若此值非0,则它包含使用的颜色数目, 同时它也是彩色映象的表项号码。若此值为0,则彩色映象为全大小。从表1中可看出,位图数据是紧跟在彩色映象表后面的。 一般而言,对于每个象素是1 bit的位图,由于每个象素只占用一位,因此,1个字节表示可有8个象素点。第一个字节最高位对应最左边的象素,依次类推。对于每个象素对应4 bit的位图,若图象没有被压缩,则每一个字节可表示两个象素,高4 位对应最左边的象素,低4位对应右边的象素且每行填充到一个4字节的边界。 对于每个象素对应8 bit的位图,每个字节表示一个象素,每行填充到一个4字节的边界。对应每个象素24 bit的位图,每个象素为3个字节,顺序为红色、绿色和蓝色的值。 每行填充到4字节的边界。 2.C语言定义的BMP文件格式  typedef struct TagBitMapFileHeader { int BmpType:LongBmpSize; int BmpReserve1; int BmpReserve2; long BmpOffsetBits; } BitMapFileHeader; typedef struct TagBitMapInfoHeader { long BinfoSize; long BWidth; long BHeight; int BPlane; int BBitNum; long BCompress; long BImageSize; long BXPerMeter; long BYPerMeter; long BImportantClr; } BitMapInfoHeader; typedef struct TagRGBQUAD { int RGBBlue; int RGBGreen; int RGBRed; int RGBReserved; } RGBQUAD; 二、GIF图象文件格式 GIF 是“Grapgics Interchange Format ”( 图象互换格式) 的缩写, 它是CompuServe公司制定的图象存储规范。GIF采用散列法(Hash-Method) 进行图象数据的压缩编码,它是一个最多256种颜色的调色板实现对24 bits彩色图象的支持,图象最大可为64KB×64KB个象素点。GIF文件分为文件头和文件体两大部分。 文件头包括文件标记、彩色表、图象信息描述等, 它的结构可随文件包含的实际图象数据而变化,相当灵活。下表2给出GIF文件的文件头的格式。 1.GIF文件头偏移0AH处字节含义 位于0AH处有一个全局标志字节,位7表明文件有无彩色表,1则有,全局彩色表将紧随彩色表的存在标识符,0则无,背景色索引将无意义。 后三位表示每个象素所要求的位数,每个象素所要求的位数是将后三位数加1而得到的值。之后包含1 bit 的排序标志。为0则全局彩色表不进行排序;为1则全局彩色表按重要性排序,最重要的颜色在先,次之在后,依次类推。另外,还有3 bits 表示全局彩色表大小用于计算全局彩色表所含的字节数。全局颜色表由代表红色、绿色、蓝色组合的字节序列组成。全局颜色表用于不包含局部颜色表的图象和简单文本的扩展。其长度等于3×2× (颜色表的大小+1)字节。全局颜色表之后是局部图象数据。下表3就是GIF 局部表头数据。 表2 GIF图象格式文件头 地址 长度(字节) 说明 00h 6 GIF文件标志,一般为GIF87a或GIF89a 06h 2 图象的水平分辨率(逻辑屏幕宽度) 08h 2 图象的垂直分辨率(逻辑屏幕高度) 0ah 1 全局标志字节,文件有无彩色表,每象素位数 0bh 1 图象背景颜色 0ch 1 GIF文件保留字节,一般设置为0 0dh 1 全局彩色表起始,其长度与每象素位数有关 表3 GIF局部表头数据 偏址 长度(字节) 内容 00h 1 图象分隔符,一般为0x2C 01h 2 图象左边界的象素列数 03h 2 图象顶部边界的象素列数 05h 2 图象以象素计的宽度 07h 2 图象以象素计的宽度 09h 1 标识字节 2.局部表头的标识字节含义 bit 7标识有无局部颜色表,为1表示有局部颜色表, 为0 表示无局部颜色表。 bit 6标识图象有无交叉,为1表示图象有交叉,为0表示图象无交叉。bit 5 指示局部颜色表是否排除,bit 4 3为保留位,bit 2 0指示局部颜色表大小。 若有局部颜色表,则其将紧跟在局部图象表头之后。该表也是由红色、绿色、 蓝色三种颜色组合的字节序列组成的。此部分之后,为图象编码数据。GIF文件压缩后的数据是分块存储的,每块的第一字节表示该块中的数据长度。 解压缩操作实际上是按块读出每块中的数据。 3.GIF文件头的C语言结构表示 typedef struct GIFFileHeader { char Version[6]; unsigned ScrWidth; unsigned ScrHeight; unsigned GlobalClrSize:3; unsigned SortFlag:1; unsigned ClrResolution:3; unsigned GlbalClrFlag:1; int BkClr: int Reserved; } GIFFileHeader; typedef struct GIFLoacalHeader { int ImageSeparator; unsigned ImgLeft;  unsigned ImgTop; unsigned ImgWidth; unsigned ImgHeight; unsigned LocalClrSize:3; unsigned LocalReserved:2; unsigned LocalSortFlag:1; unsigned LocalCrossFlag:1 unsigned LocalClrFlag:1 } GIFLocalHeader; 三、PCX图象文件格式 Zsoft公司开发的PCX是一种广泛流行的标准图象文件格式,它能表示多达256色的彩色图象,目前绝大多数的扫描仪、图象编辑软件(如CCED、 SPT 、 Windows 的Paintbrush等)都支持这一格式。PCX文件由文件头、 位图数据和彩色表三部分组成的。PCX文件头长度固定为128字节,但对于16色PCX和256色的PCX文件,彩色表的位置有所不同,位图数据是采用扫描线行程压缩法存放的。 表4 PCX文件头结构 地址 长度(字节) 内容 00h 3 PCX文件标记段(0A0501),01H处为版本号 03h 1 每个位平面的每个象素的位数 04h 4 PCX图象的左上角坐标(Xmin,Ymin) 08h 4 PCX图象的右下角坐标(Xmax,Ymax) 0ch 2 图形适配器水平分辨率 0eh 2 图形适配器垂直分辨率 10h 1 红色相对亮度值 11h 1 绿色相对亮度值 12h 1 蓝色相对亮度值 ..... ..... ................ 40h 1 Zsoft保留值,一般设置为0 41h 1 彩色/灰色位平面数 42h 2 每一水平行的一个彩色位平面所需要的内存字节数 44h 2 调色板方式,1为彩色或黑白,2为灰度方式 46h 2 视频输出的水平象素数-1 48h 2 视频输出的垂直象素数-1 4Ah 54 以空格填满文件头 在过去PCX图象格式只能支持单色或16色彩色图象,但PC Paintbrush IV以后版本可支持256色全彩调色板,在上表的表头偏移01H处是版本标志。 它的值对应版本信息如下: 0=PC Paintbrush 2.5版 2=PC Paintbrush 2.8版,有调色板 3=PC Paintbrush 2.8版,无调色板 4=PC Paintbrush for windows版 5=PC Paintbrush 3.0以上版本 位于偏移46H和48H处的数据,只有PC Paintbrush IV或Paintbrush IV PLUS 版本中才有意义。PCX文件中包含有调色板信息,其中的彩色表每一项由3 bits组成( 分别对应红色、绿色、蓝色亮度值),对16色的PCX文件彩色表为48 bits, 位于文件头的中部。对于256色PCX,其彩色表位于文件后部图象数据后面的786 BITS里。 同时在文件倒数第769字节置扩展调色板信息0X0C。 PCX是一种历史悠久的图象存储格式,版本很多,因此,为了对PCX 文件正确解码就需要根据版本号,确定每个象素对应的位数及彩色位平面数。 表5 PCX图象数据信息 每象素的位数 位平面数 说明 1 1 单色图象 1 2 4色图象 1 3 8色图象 1 4 16色图象 2 1 4色、CGA头调色板 2 4 16色图象 4 1 16色、EGA头调色板 8 1 256色图象 8 3 16.7M种颜色 PCX图象文件数据在文件头偏移80H处开始存放,数据是以RLE编码方式进行压缩的,其基本思想是用一种重复计数值来记录相邻重复的字节数,且压缩仅对一条扫描线进行。面对彩色图象每根扫描线按其位平面数分成若干段进行。其算法如下: 设扫描线上某段由连续出现的N次的字节B组成: (1) if (N=1)  { if (B<0Xc1h) 输出B; else 输出(0xC1h,B); } (2) if (N>63)  { 输出(0XFFH,B); N=N-63; goto (1):  } (3) if (N>1 && N<63)  { 输出(0xC0h+N,B); } 上述算法就是位映象格式到压缩格式的转换算法。由此压缩过程对连续出现一次的字节B,若B>0x0ch,则压缩时在该字节前加上压缩标志0xc1h。若B<=0xccH,则不加。对于连续输出N(N>1)次的字节B,则压缩为0XC0+N,B这两个字节。 PCX文件结构的C语言描述如下: typedef struct PCXFileHeader { char SignFacture; char Version; char Encoding; char BitsPerPixel; int Xmin,Ymin; int Xmax,Ymax; int HRes; int VRes; char Palette[48]; char Reserved; char NumOfPalette; int XPixel; int YPixel; char Fiuer[54]; } PCXFileHeader; 四、TIFF图象格式文件 TiFF(Tag Image File Format)格式是由Aldus和Microsoft 公司联合开发推出的,TIFF在组织上比较复杂,编程非常灵活,它可支持任意大小的图象,支持从单色到24 bits真彩色及灰色图象,且具有与设备无关性。TIFF描述非常全面,但它需要大量的编程工作进行解码。 TIFF文件一般由文件头、参数指针表、参数数据表和图象数据四部分组成的。 表6 TIFF格式文件头 地址 长度(字节) 说明 00h 2 字节顺序:MM(Motorla格式)或II(Intel格式) 02h 2 版本标志号,其值为42 04h 4 指向第一个参数块的指针 文件头后面根据指针指向第一参数指针表及参数数据块。 表7 TIFF参数指针表(偏址由本指针表开始) 偏址 长度(字节) 说明 00D 2 参数块指针数目计算,设值为n 02D 12 第一参数数据表 014D 12 第二个参数数据表 ... ... ................ n×12-10D 12 第n个参数数据表 n×12+2D 4 若有,指向下一个参数指针表,否则为0 表8 TIFF参数数据表结构(偏址由本块开始算起) 偏址 长度(字节) 说明 00h 2 参数标记码 02h 2 参数数据类型 04h 4 参数长度字段 08h 4 参数数据指针或指向参数数据的指针 在TIFF参数数据表结构中,前两个字节为标记码。共用标记码值为254到321,可在TIFF规定中查到。当此值大于或等于32768时为赋给各个公司的软件私有码。 参数类型码指出TIFF支持的数据类型,其代码如下: 1=1字节整型数Byte(字节类型) 2=1字节ASCII码Char(单字节字符) 3=2字节整型数Short(短整数类型) 4=4字节整型数Long(长整数类型) 5=8字节分数Rational(有理数类型,4字节分子,4字节分母) 参数长度字段指定数据字段中值的数目,而不是字节数目。 实际字节数目可通过将参数长度乘以数据类型中的字节数求得。最后四个字节通常是指向数据字段开始处的一个指针,也就是文件开始到数据开始之间的字节偏移数。 在TIFF文件中经常会遇到一些参数码,为了帮助读者理解这些码的意义, 下表9给出了一些常用的TIFF参数码及它们的意义说明。 表9 常用TIFF参数码及其意义 参数码 类型 名称 内容 256(100H) Short 图象宽度 图象以象素为单位的宽度 257(101H) Short 图象长度 图象以扫描行为单位的垂直高度 258(102H) Short 每样点位数 象素深度 259(103H) Short 压缩码 图象数据的压缩代码号:1:未压缩 2:CCITT Group 3 改进一维霍夫曼行程长度编码 3:CCITT Group 3二维编码 4:CCITT Group 4二维编码 5:L32773:PackBits压缩 262(106H) Short 彩色顺序 0.最小值为白,最大值为黑,其余为灰度 1.最小值为黑,最大值为白,其余为灰度 2.RGB真彩色,最大、小值为饱和度,无调色板 3.伪彩色调色板,最大、小值由调色板定义 273(111H) Long 图象块偏移 图象块的偏移地址 277(115H) Short 每象素样点数 值为1:单色、灰度图象值为3:24位真彩色图象 282(11AH) ational 水平分辨率 象素/单位的X方向分辨率 283(11Bh) ational 垂直分辨率 象素/单位的Y方向分辨率 284(11CH) ational 平面配置 值为1:一个位平面为2:彩色位平面 291(123H) Short 灰度响应曲线 数据指向一个灰度校正表。缺省为2。 296(128H) Short 分辨率单位 值为1:无,为2:英寸,为3:厘米,缺省值为2 301(12DH) Short 彩色响应曲线 指向三个连续存放的表的指针每个表对应于R、G、B 的彩色校正表 319(13FH) Long 原色 CIE值的指针 320(140H) Short 调色板 指向调色板的指针 TIFF文件头的结构可用C语言描述如下: typedef struct TIFFHeader { unsigned Bytes; unsigned Version; unsigned long NextPoint; } TIFFHeader; typedef struct IFDBlock { unsigned Tag; unsigned Type; unsigned long Length; unsigned long Value; } IFDBlock; 五、WINDOWS的可执行文件EXE的格式 Microsoft Windows 3.X可执行文件可由代码和数据组成,也可由代码、数据和资源三部分共同组成。若用户想在DOS中运行WINDOWS 可执行文件, 它必须能同时被DOS和WINDOWS识别,这样,WINDOWS可执行文件(.EXE)也必须包含两个文件头结构:MS-DOS头和WINDOWS头。下面对这两个头进行分析。 (一) MS-DOS头结构(旧型头) MS DOS头结构定义了一个不能分段执行的程序,它由4部分组成: 一个头信息块其中包含一些头信息,如文件的标识字、文件大小等;一个保留区;一个指向WINDOWS头结构的指针(假设有一个WINDOWS头结构存在),还有一部分就是DOS Stub程序。 文件起始处:(偏移量) 00H 头信息块 20H 保留区 3CH 新型头部地址的偏移量 40H DOS stub程序 ...................  若偏移量为18H的那个单元的数值为40H或更大,则在3CH字单元的数值就是一个新型头结构的偏移量。若Windows没有装入,而用户试图运行一个WINDOWS 可执行文件,则DOS stub程序将给出提示信息:“This program requres Microsoft Windows”,即该程序必须在WINDOWS下运行。 (二) Windows头结构(新型头) 新型头分为可分段执行的文件定义了所需要的信息。它有一个头信息块、多个段表、资源表和名字表等部分组成,它的结构如下所示。 ................. DOS stub程序(MS DOS头结尾) 头信息块 (Windows头开始) 段表 资源表 常驻内存名字表 模块参照表 引入模块名字表 入口表 非常驻内存名字表 代码段和数据段(文件结尾)  1.头信息块 新型头结构的第一部分就是头信息块,它包括链接程序的版本号、 用来进一步描述可执行的各种表的长度、堆和栈的大小等。表10定义了头信息块中相对其首地址的每一位置的内容。 表10 Windows头信息块 偏移量 描述 00h 指明了标识符,低字节值为4EH("N"),高字节为4 5("E") 02H 指明了链接程序的版本号 03H 指明了链接程序的修改版本号 04H 指明了入口表偏移量(相对于新型头结构的起始地址) 06H 指明了入口表所占用的字节数 08H 保留 0CH 指定了一个用来描述可执行文件内容的标志集, 它的值可以是下列各位的组合: 位 说明 0 若可执行文件是SINGLEDATA型, 链接程序设置该位为1,这样的文件只含有一个数据段,若文件是一个动态连接库(DLL)型,该位也设置成1 1 若可执行文件属MULTIPLEDATA型,链接程序设置该位为1,这样的文件含有多个数据段。 若文件是一个WINDOWS应用程序,该位也被设置为1。若第0位和该位都未设置成1,则可执行文件格式是NOAUTODATA,即不含有自动数据段 2 保留位 3 若该位被设置为1, 则EXE 文件只能在保护模式下运行 8 若该位设置为1,则EXE文件包含不与OS/2环境下Microsoft Windows的各个库相兼容的代码 9 若该位设置为1,则EXE文件包含有能与OS/2环境下Microsoft Windows的各个库相兼容的代码 11 若该位被设置为1,则EXE文件的第一个段包含有用来装载应用程序的代码 13 若该位被设置为1, 表示链接程序在链接时发错误,但仍能创建可执行文件 14 若该位被设置为1, 则可执行文件是一个驻留在MS存储区内的动态连接库(DLL) 15 若该位被设置为1, 表示可执行文件是一个库模块,当该库被装入时,CS:IP指向一个被调用的初始化函数,该函数以AX的值作为标识它的句柄。初始化函数执行后必须远返回调用程序,AX值不为0表示返回成功,否则表示返回失败。 若可执行文件是SINGLEDATA型,则DS指向库模块的数据段,否则, 它指向用来装入库模块的应用程序的数据段 0EH 指明自动数据段的个数, 若不指明是SINGLEDATA 或MULTIPLEDATA,这个值为0。 10H 指明局部堆的大小(字节数),若未分配局部堆, 则它的值为0 12H 指明栈的大小(字节数),如SS不等于DS,则它的值为0 14H 指明了由于CS:IP所标识的段:偏移量的值 18H 指明了由SS:IP所标识的段:偏移量的由SS指定的值是一个指向模块段表的索引值(从序号1开始),若SS指出了自动数据的地址并且SP的值为0,则把SP 设置为自动数据段的大小所形成的地址 1CH 指明了段表中的项数 1EH 指明了模块参照表中的项数 20H 指明了非常驻内存名字表所占用的字节数 22H 指明了段表的起始位置相对于Windows头结构起始位置的偏移量 24H 指明了资源表的起始位置相对于Windows头结构起始位置的偏移量 26H 指明了常驻内存名字表的起始位置相对于Windows头结构起始位置的偏移量 28H 指明了模块参照表的起始位置相对于Windows头结构起始位置的偏移量 2AH 指明了输入模块名字表起始位置相对于Windows头结构起始位置的偏移量 2CH 指明了非常驻内存名字表的起始位置相对于Windows头结构起始位置的偏移量 30H 指明了可移动入口点的个数 32H 指明了一个可用来校正逻辑扇区的位移量,此位移量为段扇区大小的对数值(以2为底)缺省值是9。 这个值与链接程序的开关项/ALLIGN相对应,比如说:当链接程序的命令行含有/ALLIGN:16,则位移量就为4 34H 指明了资源段的个数 36H 一个用来指明目标操作系统的标志集 位 说明 0 操作系统未知 1 操作系统为OS/2 2 操作系统为Microsoft Windows 3 保留 4 保留 38H 指明了快速加载区的首地址(仅能被Windows使用) 3AH 指明了加速加载区的长度(仅能被Windows使用) 3CH 保留 3EH 指明了所期望的Windows版本号(仅能被Windows使用) 2.段表  紧接在头部信息块后面的是段表, 它包含用来描述可执行文件中每一个段的重定位信息,其中包括了段的长度、段的类型以及每个段的重定位信息。表11 定义了段表中相对其首址的每一个位置的内容。 表11 段表 偏移量 描述 00H 指明了段数据相对于文件起始位置的偏移量(扇区数),值为0表示没有段数据 02H 指明了文件中段的长度(字节数),若它的值为0, 并且扇区偏移量不为0,表示段的长度为64KB 04H 指明了用来描述可执行文件内容的标志集, 它的值可以是下面各位的组合 位 说明 0 该位设置为1,表示该段为数据段,否则为代码段 1 该位设置为1,则装载程序已经为该段分配内容 3 保留 4 该位为1表示段类型为MOVEABLE(可移动), 否则段类型为FIXED(固定的) 5 该位为1表示段类型为PURE或SHAREABLE,否则段类型为IMPURE或NONSHAREABLE 6 该位设置为1,表示段类型为PRELOAD, 否则段类型为LOADONCALL 7 该位设置为1,并段为代码段,表示段类型为EXECUTEONLY,若该位设置为1,并段为数据段, 表示该段类型为READONLY 8 该位设置为1,表示段含有可重定位数据 9 该位设置为1,表示段是一致的 10 保留 11 保留 12 该位为1,表示该段是可丢弃的 13 保留 14 保留 15 保留 06H 指明了分配给段的最小尺寸,值为0表示最小的尺寸为 64KB 3.资源表 紧接着段表后面的是资源表, 表中含有用来描述可执行文件中每一种资源的信息,表12定义了此表中的内容,其中所有被指定的位置都是相对每一种资源内容的起始位置。 表12 资源表1 偏移量 描述 00H 指明了确定资源位置所需的校正位移量 02H 指明了资源类型标识符ID,若高位为1,则它是下面标识符之一(定义在WINDOWS.H中), 否则它的值表示为一个代表特定资源类型的字符串相对于资源表起始位置的偏移量(字节数)若资源类型ID值为0,表示资源内容结束 标识符ID 资源类型 RT-ACCELERATOR 加速键 RT-BITMAP 位置 RT-CURSOR 光标 RT-DIALOG 对话框 RT-FONT 字体 RT-FONTDIR 字体目录 RT-ICON 图标 RT-Group-Icon 图标目录(在Windows.H中未定义) RT-Group-Cursor 光标目录(在Windows.H中未定义) RT-MENU 菜单 RT-RECDATA 用户定义数据 RT-STRING 串表 RT-NAME-TABLE 名字表(在Window.H中未定义) 04H 指明了这种资源的资源个数 06H 保留 0AH 指明了到资源数据内容的偏移量,该偏移量相对于文件的起始位置并且依赖于资源表起始位置所指的校正位移量 0CH 指定资源的长度(字节数) 0EH 标志集,定义如下: 位 说明 4 指明了这种资源不是固定的(MOVEABLE) 5 指明了该资源是可共享的(PURE) 6 指明了该资源是预装入的(PRELOAD) 10H 指明了资源标识符,若高位为1(8000H), 则标识符是一个整数,否则为一个指明资源字符串的偏移量, 该偏移量相对于资源表的起始位置 12H 保留 16H 指明了类型或类型名的长度,在资源表末尾该值为0 17H 指明了该类型或类型名的文本描述每种资源在偏移量2H和12H之间的值被重复描述,直到02H单元的值为0, 而偏移量0AH和12H之间的值也被重复描述,重复的次数为04H单元所指的值。 4.常驻内存名字表 常驻内存名字表包含有用来标识可执行文件的输出函数的字符串, 正如表名所指,这些字符串常驻在系统存储区并且永不丢失,所有的常驻名字符串都对大小写敏感,并且不能以NULL终结的字符串,表13描述了常驻内存名字表中的值,其中的篇移量都相对于每一项的起始位置。 表13 常驻内存名字表 偏移量 描述 00H 指定了字符串的长度,若表中没有更多的字符串,它的值为0 01H-XXH 指定了常驻内存名字字符串, 该字符串对大小写敏感并且不能以NULL终结的字符串, 常驻内存名字表的第一个字符串是模块名 XXH+1H 指定了用来标识该字符串的序号, 这个数字可用来作为进入该表项的索引值 5.模块参照表 该表包含了一系列模块名字的偏移量,这些模块名字存放在引入模块表中,模块参照表中的每一项均为一个2B的序号值。 6.引入模块名字表 表中包含有可执行文件所引入的模块名字,表中的每一项由两部分组成:一个字节用以指明字符串的长度, 另一部分则用来存放字符串本身, 表中的字符串不能以NULL终结。 7.入口表 入口表包含有进入可执行文件的成组入口点, 它们由链接程序创建并且标明了从数字1开始的连续序号。链接程序总是创建尽可能紧密的入口表的组集合,以限制入口点不能被重新排序, 这是因为有许多应用程序都使用一个指定的序号值来对应入口点。入口表中的每一组都以一个2B的头开始, 第一个字节指出了该组中项的个数,值为00H表示表结束,第二个字节指出了关于段的附加信息,值为FFH 表示相对应的段是可移动的,值为FEH表示相对应一个段而指向一个定义在模块中的常量, 若是其它值,则它是一个段的索引值。 对应可移动的段来说,这一组有6个字节,如表14所示。 表14 固定段的入口表项 偏移量 描述 00H 该字节的值由如下各位组合而成: 位 说明 0 该位置为1,表示该项被引出 1 该位置为1,表示该段使用一个可共享的全局数据段3-7 若可执行文件包含执行嵌套的代码, 这些位指定了占用堆栈的字单元数, 执行嵌套时这些单元的值必须从嵌套程序中拷贝过来 01H 指明了一个中断指令INT 3FH 03H 指明了该段的段号 04H 指明了该段的偏移量 8.非常驻内存名字表 该表包含了用来识别可执行文件中引出的字符串,这些字符串不能常驻内存,而且有可能在装入时丢失。非常驻内存名字符串区分大小写并且不能以NULL为终结。 表15描述了此表中的值,所有指定的值都是相对于每一入口起始位置的偏移量。 表15 非常驻内存名字表 偏移量 描述 00H 指定了字符串的长度,若表中没有别的字符串,它的值为001H-XXH指定了非常驻内存名字字符串文本,该字符串区分大小写并且不能以NULL终结的字符串 XXH+1H 指定了标识字符串的序号值, 该值可作为进入入口表项的索引值 (三) 代码段及重定位数据 紧接在Windows头结构后面的是代码和数据段,有一些代码段能调用其它段中的函数,因此,需要重定位数据以解决地址转换的问题。这些重定位的数据存放在重定位表中,并且可以紧接段中的代码和数据口立即显示。 重定位表中的头两个字节指明了表中的包含的重定位项的个数, 每一个重定位项都指定了如下信息: ● 地址类型 (仅为段地址,仅为段偏移量,或者两者兼有) ● 重定位类型 (内部参照,引入名字或引入序号) ● 段号或序号标识符 (相对于内部参照) ● 参照表索引或函数序号 (相对于引入名字) 每个重定位项包含8个字节的数据。其含义说明如下: ● 第1个字节指定了下列重定位地址类型之一: 位 含义 0 偏移量的低字节 1 16位选项 3 32选项 5 16位的偏移量 11 48位的指针 13 32位的偏移量 ● 第2字节指定了重定位类型 值 含义 0 内部参照 1 引入函数序号 2 引入函数名字 3 OSFIXUP ● 第3、4字节定义了重定位项在段内的偏移量 ● 若重定位类型是引入函数序号,第5、6字节指明了进入模块参照表中的索引值,第7、8字节指明了函数序号值。 ● 若重定位类型是引入函数名字,第5、6字节指明了进入模块参照表的索引值,第7、8字节指明了到输入模块名字表的偏移量。 ● 若重定位类型是内部参照并且段是固定的,则第5字节指明了段号,第6 字节为0,第7、8字节指明了段偏移量。 ● 若重定位类型是内部参照并且段是可移动的,第5字节值为FFH,第6字节值为0,而第7、8字节指明了在段入口表中的序号。