Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Source : http://www.dwox.com/PBL_File_Format.txt (by Arnd Schmidt)
+--------------------------------------------------------------+ I PBL File Format I +--------------------------------------------------------------+ Rules and facts: 1.) A PBL is always made out of blocks of 512 Bytes, except the Node Block, that has a size of 6 blocks, meaning 3072 Bytes. 2.) There is always one Header (HDR*), followed by a free/used blocks bitmap (FRE*). Then (after 1024 Byte) follows the first 'NOD*' block. Theoretically this first 'NOD*' block might(!) point to a parent node, but I have never seen that. 3.) Object Data (and SCC Informations - pre PB8) are always stored in single forward linked/chained 'DAT*'-Blocks. 4.) A PBD is a PBL. 5.) DLL and EXE files have a 'TRL*' at the end of the file. This is pointing to the one and only 'HDR*'-Block. +--------------------------------------------------------------+ I Library Header Block (512 Byte) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'HDR*' I I 5 - 18 I String I 'PowerBuilder' + 0x00 + 0x00 I I 19 - 22 I Char(4) I PBL Format Version? (0400/0500/0600)I I 23 - 26 I Long I Creation/Optimization Datetime I I 29 - ff I String I Library Comment I I 285 - 288 I Long I Offset of first SCC data block I I 289 - 292 I Long I Size (Net size of SCC data) I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I Library Header Block - Unicode (1024 Byte) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'HDR*' I I 5 - 32 I StringW I 'PowerBuilder' + 0x00 + 0x00 I I 33 - 40 I CharW(4) I PBL Format Version? (0400/0500/0600)I I 41 - 44 I Long I Creation/Optimization Datetime I I 45 - ff I StringW I Library Comment I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I Bitmap Block (512 Byte) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'FRE*' I I 5 - 8 I Long I Offset of next block or 0 I I 9 - 512 I Bit(504) I Bitmap, each Bit represents a block I +-----------+------------+-------------------------------------+ (512 - 8) * 8 = 4032 Blocks are referenced +--------------------------------------------------------------+ I Node Block (3072 Byte) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'NOD*' I I 5 - 8 I Long I Offset of next (left ) block or 0 I I 9 - 12 I Long I Offset of parent block or 0 I I 13 - 16 I Long I Offset of next (right) block or 0 I I 17 - 18 I Integer I Space left in chunks, inital = 3040 I I 21 - 22 I Integer I Count of entries in that node I I 33 - ff I Chunks I 'ENT*'-Chunks I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I Entry Chunk (Variable Length) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'ENT*' I I 5 - 8 I Char(4) I PBL version? (0400/0500/0600) I I 9 - 12 I Long I Offset of first data block I I 13 - 16 I Long I Objectsize (Net size of data) I I 17 - 20 I Long I Unix datetime I I 21 - 22 I Integer I Length of comment I I 23 - 24 I Integer I Length of objectname I I 25 - ff I String I Objectname I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I Entry Chunk - Unicode (Variable Length) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'ENT*' I I 5 - 12 I CharW(4) I PBL version? (0400/0500/0600) I I 13 - 16 I Long I Offset of first data block I I 17 - 20 I Long I Objectsize (Net size of data) I I 21 - 24 I Long I Unix datetime I I 25 - 26 I Integer I Length of comment I I 27 - 28 I Integer I Length of objectname I I 29 - ff I StringW I Objectname I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I Data Block (512 Byte) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'DAT*' I I 5 - 8 I Long I Offset of next data block or 0 I I 9 - 10 I Integer I Length of data in block I I 11 - XXX I Blob{} I Data (maximum Length is 502 I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I Trailer Block (in DLL/EXE) always last block (512 Byte) I +-----------+------------+-------------------------------------+ I Pos. I Type I Information I +-----------+------------+-------------------------------------+ I 1 - 4 I Char(4) I 'TRL*' I I 5 - 8 I Long I Offset of Library Header ('HDR*') I +-----------+------------+-------------------------------------+ +--------------------------------------------------------------+ I SCC DATA I I Structure of status information chunks I I in DAT*-blocks (Variable Length) I +---------+----------------------------------------------------I I Type I Information I +---------+----------------------------------------------------I I String I Libraryname (the opposite!) I I String I Objectname I I String I Developername I I Char(1) I Flag I +---------+----------------------------------------------------I +--------------------------------------------------------------+ I PB6/7 Status Flags I +------+------+------------------------------------------------+ I Icon I Flag I Meaning I +------+------+------------------------------------------------+ I I r I Object is registered I I I d I Object is Checked Out (locked) I I I s I Object (Working Copy) to be checked in I I I u I Unknown?! After an Error occurred. I I I I (Checked out by user <Unknown> I I I I Could be set to 'r' with an Hex-Editor.) I +------+------+------------------------------------------------+ DateTimes are stored in Long format in Unix representation. Timezone is always GMT (+/- 0:00), so the datetime has to be converted to LocalDateTime via LocalTimeZone conversation. In the compiled object data blocks, there are at least 2 more datetimes, starting at byte 23 and the other one at 27! Looks like these are the modification and regeneration date...
Hors ligne
À propos, j'ai découvert PBàDonf en tombant sur ce post.
Et à partir du format décrit par Arnd Schmidt j'ai commencé à écrire un petit dumper de pbd pour récupérer les ressources contenues dans un pbl / pbd / dll /exe fait par PB.
Je m'en suis servi pour récupérer des bitmaps dans un outil qui avait été fait par ma boîte et dont on a paumé les sources. Vu que ça dumpe tout, on a aussi les scripts et datawindows en version compilés. Pour le moment je n'en fais rien, mais on pourrait imaginer... des choses.
L'autre truc intéressant c'est qu'avec ce format j'ai pu compléter une lib que j'ai écrite pour aller modifier des ressources de version dans un exe ou une dll (cf GetFileVersionInfo et les structures VS_FIXEDFILEINFO / StringFileInfo). Le problème était que si on modifie la ressource on perd des données proprio à PB qui sont écrites à la fin de la dll / de l'exe et si on fait en sorte de ne pas perdre ces données, si la resource est un peu trop agrandie il y a un problème de décallage des mêmes données qui fait que PB ne retrouve plus ses infos et ne fonctionne plus. Avec la structure du format pbl, j'arrive à patcher les infos pour que ça refonctionne.
Le dumper est dispo sur ma page PB (il y a un bug que j'ai corrigé qui n'est pas encore dans la version publique)
La lib de modif des ressources sera en ligne prochainement. Si il y a des intéressés...
Hors ligne