Hello,

I am implementing a software to read JFS partitions in Windows/Mac OS
X. Only reading, no writing involved.

It works already for many partitions, but someone sent me a disk, and
this is something wrong with my interpretation of the JFS
documentation or something like that, because for this particular
disk, it doesn't work =(

I read in this order:

1> Aggregate Map -> Always from offset A000

2> Fileset zero inode -> Always from offset D000

Here I read _xtroot: xtpage_t; in this inode to obtain the next
address. See the screenshot:

http://magnifier.sourceforge.net/tmp/jfs_fileset_zero_inode.png

And the data that I read here (data in the comments):

xtpage_t->xtpage_t = packed record
xtpage_t->case Integer of 0: (
// struct xtheader {
xtpage_t->next: le64; //  0
xtpage_t->prev: le64; //  0
xtpage_t->flag: Byte; //  $85
xtpage_t->rsrvd1: Byte; //  0
xtpage_t->nextindex: le16; //  3
xtpage_t->maxentry: le16; //  $12
xtpage_t->rsrvd2: le16; //  0
xtpage_t->self: pxd_t; // 0
xtpage_t-> );

xtpage_t->xad[2] => xad_t
xad_t->flag: Byte; //  0
xad_t->rsvrd: uint16; //  0
xad_t->off1: Byte; //  0
xad_t->off2: le32; //  0
xad_t->len: array[0..2] of Byte; // 1
xad_t->addr1: Byte; //  0
xad_t->addr2: le32; // 2754
xad_t->addr calculated: 0x2754000

xtpage_t->xad[3] => xad_t = packed record
xad_t->flag: Byte; // 1: flag */ 0
xad_t->rsvrd: uint16; // 2: reserved */ 0
xad_t->off1: Byte; // 1: offset in unit of fsblksize */ 0
xad_t->off2: le32; // 4: offset in unit of fsblksize */ 2
xad_t->len: array[0..2] of Byte; // 3: length in unit of fsblksize */ 1
xad_t->addr1: Byte; // 1: address in unit of fsblksize */ 0
xad_t->addr2: le32; // 4: address in unit of fsblksize */ } 2000
xad_t->addr calculated: 0x2000000

xtpage_t->xad[4] => xad_t = packed record
brings addr 0x4000000
etc

So my interpretation of the data is:

A> xad[2] is the control page
B> xad[3] is the Fileset Zero Inode Allocation Map

Wierd that xad[2] has len=1 and xad[3] has offset=2 ... very wierd, as
if the actual data is missing....

3> So now I am at the Fileset Zero Inode Allocation Map at offset 0x2000000

Screenshots:

http://magnifier.sourceforge.net/tmp/jfs_fileset_zero_map_1.png
http://magnifier.sourceforge.net/tmp/jfs_fileset_zero_map_2.png

>From it I read the following structures:

inoext[0]
->pxd_t.len: array[0..2] of Byte;// 4
->pxd_t.addr1: Byte;// 0
->pxd_t.addr2: le32; // 0x2004
inoext[1]
->pxd_t.len: array[0..2] of Byte; // 4
->pxd_t.addr1: Byte; // 0
->pxd_t.addr2: le32; // 0x200C
inoext[2]
->pxd_t.len: array[0..2] of Byte; // 4
->pxd_t.addr1: Byte; // 0
->pxd_t.addr2: le32; // 0x37B4

My conclusion is:

A> The root inode is located at the address given by inoext[0] which
is: 0x2004400

Now the problem:

0x2004400 is *not* the root inode =( It is an empty inode

I manually searched the disk and I found the real Root Inode at 0x26400!

Using this information I manually searched the disk and I concluded
that 0x2000000 is probably also not Fileset Zero Inode Map =( I found
an Inode Map candidate at 0x2B000 which has: inoext[0].pxd_t.addr2 =
0x26

But then I look again at the Fileset Zero inode D000 and I cannot find
anything wrong with my reading of its data =( It doesn't feature the
hex value 0x2B at all.

Any ideas what I did wrong here? It must be something simple that I am
getting wrong, but after hours and hours reading the hex data, I just
cannot find =) Any tips appreciated.

thanks,
-- 
Felipe Monteiro de Carvalho

------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
Jfs-discussion mailing list
Jfs-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jfs-discussion

Reply via email to