分享

Power Builder9.0 PBL文件结构解析 – 计算机与信息技术

 quasiceo 2013-12-02
Power Builder9.0 PBL文件结构解析
更新时间 2009-11-23
 

 

Power Builder9.0 PBL文件结构解析

张春华
(东北财经大学 信息工程学院,大连 116025)
    摘  要 在PowerBuilder程序开发中,PBL库文件是编程开发的核心文件,通过对其文件结构的分析研究,编程从PBL文件提取出程序对象的源程序,并能完成对PBL文件中所有程序对象的修改。通过编程验证,结果表明对文件结构理解的正确性,以及该文件结构在PowerBuilder机考系统中的应用。
    关键词 机考系统;PowerBuilder;PBL文件;文件结构

1 引言

    PowerBuilder(简称PB)是专业的客户/服务器结构数据库应用程序快速开发工具,它支持多种关系数据库管理系统,提供了多种平台的开发环境,内置了功能强大的数据窗口对象,并且其编程简单易学,因此,PB是应用较为广泛的数据库应用程序开发工具,拥有大量的用户。从PB9.0后开始提供对nTier结构及Web数据库应用以及嵌入式设备的支持,鉴于此,PowerBuilder仍然是各学校数据库应用开发的主要教学内容。
    PBL文件是PB应用程序库文件(以下简称库文件),在其中存储了应用系统所使用到的所有系统对象或者用户自定义对象的集合,同时库文件中还存储了源代码版本控制信息(Source Code Control,简称SCC),因此,它是PB编程开发中的核心文件。
    我校在PowerBuilder机考系统的开发中由于需要向考生的PBL文件中注入测试代码,即对PBL文件进行查看与修改,以便阅卷程序能分析程序源码并能测试考生PB程序答案。然而在不了解PBL文件的情况下只能以二进制方式打开它,这样是无法获得有用的程序结构及源码,修改其中的代码更是无法处理了。对其文件结构的研究,可以准确地了解程序结构并能对PBL文件中的程序对象进行修改。同时也有利于库文件的修复,源程序控制、程序动态执行等方面的工作。

2 PB库管理相关知识介绍

    在PB中提供了库文件的管理程序接口ORCA(Powersoft Open Library API),该接口提供了包括六大类函数,即ORCA会话管理函数、库管理函数、程序对象编译函数、程序对象查询函数、DLL及EXE生成函数、源代码控制函数。使用这六大类函数,可以完成对库文件中的程序对象的复制、重命名、删除、移动、导出,导入、伪编译及签入(checkin)签出(checkout)的版本控制操作,同时还能将PBL文件编译成可执行文件或动态链接库。其库管理的功能应是比较完整的了。
    如果要修改PBL库文件中的某个程序对象,可通过LibraryEntryExport导出程序对象的源代码,将修改后的源代码用LibraryEntryImport函数导入到PBL库文件中。然而,这一方法不能修改应用程序对象。因此,必须通过直接修改库文件的方法来完成对应用程序对象的修改。

3 PBL文件结构分析

3.1  PBL文件的存储结构及组织形式

    PBL文件存储信息时是以块(BLOCK)为单位为程序对象分配存储空间的,每块的大小固定为512字节,数据块块号从0开始计算,例如文件头就是0号数据块,数据块块号与数据块首字节的偏移地址有如下关系(本文中所用偏移地址从0计数,并以16进制表示):
          数据块块号 = 数据块首字节偏移地址/512
    整个文件是由文件头数据块、文件位图数据块、NOD数据块、DAT数据块组成。其中除文件头及文件位图数据块外,其它数据块均以链表结构组织,而DAT数据块是NOD数据块中Entry目录表项的具体内容,是从属于NOD数据块的。图1说明了这四类数据块的关系。
    图1中文件头、文件位图及首NOD数据块在存储空间上是相邻的,其中NOD类型数据块比较特别,占6个数据块,其余数据块只占一个数据块,其空间大小及起始地址如表1所示。


图1  PBL文件总体数据结构
表1 PBL文件整体数据结构
块号
起始偏移量
描述
0块
0000-01FF
文件头
1块
0200-03FF
首文件位图数据块
2-7块
0400-0FFF
首NOD数据块

3.2  PBL文件头部信息解析

    PBL文件头包含了PBL库文件的版本识别、注释,SCC首数据块偏移量信息。具体内容如表2所示。

表2 PBL文件头数据结构
块内偏移量
所占空间(单位:Byte)
数据类型
描述
0000-0003
4
char
文件头标识,内容为’HDR*’
0004-0011
14
char
工具标识,内容为’PowerBuilder’+’x00’+’x00’
0012-0015
4
char
库文件格式版本(如9.0版为’0900’)
0016-0019
4
long
库文件创建/修改日期时间
001C-00FF
228
char
库文件注释
011C-011F
4
DWORD
存储SCC首DAT块偏移量
0120-0123
4
DWORD
SCC信息实际长度

3.3  文件位图数据块信息解析

    文件位图数据块中存放的是表示文件存储空间的使用情况,其作用类似于文件系统的FAT表,该块数据结构如表3所示。

表3 PBL文件位图数据块数据结构
块内偏移量
所占空间(单位:Byte)
数据类型
描述
0000-0003
4
char
位图数据块标识,内容为’FRE*’
0004-0007
4
DWORD
下个位图数据块偏移量或0
0007-00FF
504
BYTE
文件位图

    在文件位图中为1的位,表示与该位序号对应的数据块已被使用。反之,表示对应数据块未使用。位图中的位序号计算公式如下。
位序号 = 位图字节偏移量×8 + 字节内位序号 -7
    如: FF FF 40 00还原为位图则为 11111111 11111111 01000000 00000000,该位图表示第16号数据块空闲未使用,PBL文件共有18个数据块,其中的第16号数据块应是文件中的碎片。由表3可知包含一个位图数据块的PBL文件的可使用504×8个数据块。当文件空间超过504×8个数据块时,可使用第二个文件位图块,该块的偏移量由本块块内偏移0004-0007中的双字表示,最后一块的下块偏移量为0,这样就形成了位图数据块单向链表。

3.4  NOD数据块信息解析

    NOD数据块是用于存放Entry目录表项的数据块,每一个Entry表项对应于一个应用程序对象的源程序或PCODE代码的描述信息,因此Entry目录表,就是应用程序对象目录表,表4是NOD数据块的数据结构

表4 PBL文件NOD数据块数据结构
块内偏移量
所占空间(单位:Byte)
数据类型
描述
0000-0003
4
char
NOD数据块标识,内容为’NOD*’
0004-0007
4
DWORD
下一NOD数据块偏移量或0
0008-000B
4
DWORD
前一NOD数据块偏移量或0
0010-0011
2
WORD
块内可用空间
0014-0015
2
WORD
该NOD块中的Entry表项数
0020-0BFF
3040
Entry
ENT表

    其中ENT表是顺序表,当一个NOD数据表的空间不足以存储整个ENT表时,可以再使用一个NOD数据块来存储,同时ENT表的表项不能跨数据块存储,因此数据块中的空间不能完全利用,会有一定的可用空间。

3.5  Entry表项信息解析

    Entry表中存储了各程序对象的目录信息,每个程序对象在目录中对应源代码和PCODE两项目录,如在编程中创建一个名为“dbtest”的应用程序对象,则在Entry表中则要存放该对象的三个表项,分别为“dbtest.sra”用于存储源代码文本,“dbtest.apl”用于存储伪编译PCODE。在PB应用开发中的程序对象及其在Entry表中存储的程序对象名如表5所示。

表5 程序对象名后辍含义
程序对象
源代码后辍
PCODE后辍
Application(应用程序对象)
.sra
.apl
应用程序对象资源

.pra
DataWindow(数据窗口对象)
.srd
.dwo
function (函数)
.srf
.fun
menu (菜单)
.srm
.men
Query(查询)
.srq
 -
Pipeline(管道)
.srp
 -
Project(工程)
.srj
 -
Structure(结构)
.srs
.str
Userobject(用户算定义对象)
.sru
.udo
Window(窗口)
.srw
.win

    以上各种应用程序对象目录则以Entry表项的数据结构形式存储,Entry表项的具体内容如表6所示。

表6 Entry表项数据结构(变长)
块内偏移量
所占空间(单位:Byte)
数据类型
描述
0000-0003
4
char
ENT数据块标识,内容为’ENT*’
0004-0007
4
char
库文件格式版本
0008-000B
4
DWORD
首DAT数据块偏移量
000C-000F
4
DWORD
程序对象的实际长度
0010-0013
4
Long
程序对象的创建/修改日期时间
0014-0015
2
WORD
程序对象的注释长度
0016-0017
2
WORD
程序对象名长度
0018-
由程序对象名长度指定
Char
程序对象名+0×00

3.6  DAT数据块的数据结构

    在Entry表中的各程序对象的实际数据内容是存储在DAT数据块中的,DAT数据块的数据结构如表7所示。

表7 DAT数据块数据结构
块内偏移量
所占空间(单位:Byte)
数据类型
描述
0000-0003
4
char
DAT数据块标识,内容为’DAT*’
0004-0007
4
DWORD
下一个DAT数据块偏移量或0
0008-0009
2
WORD
本块内存储的数据实际长度
0010-01FF
502
DWORD
程序对象的实际数据

    由表7可知,,若程序对象的数据内容在502字节以上时,就需用多个DAT数据块存放,这些DAT数据块形成一个单向链表。链表的的最后一个DAT数据块的004-007中存储的偏移量为0,表示链表结束。010-1FF这段空间存放的是程序对象的实际数据长度,只有最后一个DAT数据块的长度有可能小于502。
    通过以上分析,可以看出,PBL文件就是一个小型的文件系统。

3.7  SCC DAT数据块的数据结构

    PBL库文件中还在SCC DAT数据块中保存了源代码控制信息,首SCC DAT数据块由文件头的011C-011F处的偏移指出,SCC DAT数据块0000-0009处的信息结构同DAT数据块完全相同,也采用单向链表结构。不同之处在于0010-01ff这段内容中存放的是SCC表,SCC表的具体内容如表8所示。

表8 SCC表数据结构
块内偏移量
所占空间(单位:Byte)
数据类型
描述
0010-0013
4
char
SCC表标识,内容为’SCC*’
0014-01FF
488
Char
SCC表

    在SCC表中各变长表项以顺序结构存储,各个表项包括两部分信息,第一部分是被Checkin或Checkout的程序对象名,第二部分是该程序对象的版本号。这两部分信息没有固定长度,而是以一个值为0×00字节表示结束。

4  实验例证

4.1 PBL文件结构解析实证

    在Windows SP3操作系统平台上,用Visual C++ 6.0开发环境下编程实现了PBL文件结构的解析程序,该程序采用递归算法对链表进行查找,运行效果较好。通过对PB9.0的多组不同的PBL文件进行解析,均能得到正确的结果,解析结果示例如图2所示(限于篇幅,程序仅对第二个NOD块中的程序对象目录开放了解析功能)。实验结果表明,以上对PBL文件的解析方法是可行的,具有较高的可靠性,

4.2 修改应用程序对象

    在正确解析应用程序对象的基础上,通过对PBL文件中程序对象名后辍为.sra的程序对象数据进行读取,经过语法分析后,加上测试代码,然后按程序对象的链表结构将经修改后的程序写入,写入时要保证以下两点:①保证程序对象的链表结构的完整;②保证文件位图正确地反映数据块的使用情况。
    完整一个应用程序对象包括两部分,一是源程序,另一部分则是对应源程序的PCODE伪码,生成伪码必须由PB系统完成,因此,应用程序对象修改完成之后,还必须调用ORCA的API函数CompileEntryRegenerate对程序对象进行重建才能完成修改应用程序对象的工作。
    应用程序对象的修改实证应用在我校的PB机考系统中,运行效果较好,我们将经过修改后的考生程序,再调用ORCA编译和可执行文件生成API,经运行后通过进程间通讯,即可使机考系统得到考生成绩,这种方法使考生程序能在机考系统的进程外运行,避免了因考生程序代码的不稳定,造成机考系统的崩溃。

5 结语

    在PB的程序开发中,借助于对PBL文件结构的了解和ORCA系统调用,可以完成对程序代码的动态修改,动态运行,并通过实验表明分析结果的正确性,在PowerBuilder机考系统中得到了很好的应用。
图2  PBL文件的解析结果

参考文献

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多