2014-06-24 04:00:39 +00:00
|
|
|
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
|
|
|
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {
|
|
|
|
var blob;
|
|
|
|
var minifat_store = 0, pl = (Paths.length?2:0);
|
|
|
|
var sector = sector_list[dir_start].data;
|
|
|
|
var i = 0, namelen = 0, name, o, ctime, mtime;
|
|
|
|
for(; i < sector.length; i+= 128) {
|
|
|
|
blob = sector.slice(i, i+128);
|
|
|
|
prep_blob(blob, 64);
|
|
|
|
namelen = blob.read_shift(2);
|
|
|
|
if(namelen === 0) continue;
|
|
|
|
name = __utf16le(blob,0,namelen-pl);
|
|
|
|
Paths.push(name);
|
|
|
|
o = {
|
|
|
|
name: name,
|
|
|
|
type: blob.read_shift(1),
|
|
|
|
color: blob.read_shift(1),
|
|
|
|
L: blob.read_shift(4, 'i'),
|
|
|
|
R: blob.read_shift(4, 'i'),
|
|
|
|
C: blob.read_shift(4, 'i'),
|
|
|
|
clsid: blob.read_shift(16),
|
|
|
|
state: blob.read_shift(4, 'i')
|
|
|
|
};
|
|
|
|
ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
|
|
|
|
if(ctime !== 0) {
|
|
|
|
o.ctime = ctime; o.ct = read_date(blob, blob.l-8);
|
|
|
|
}
|
|
|
|
mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
|
|
|
|
if(mtime !== 0) {
|
|
|
|
o.mtime = mtime; o.mt = read_date(blob, blob.l-8);
|
|
|
|
}
|
|
|
|
o.start = blob.read_shift(4, 'i');
|
|
|
|
o.size = blob.read_shift(4, 'i');
|
|
|
|
if(o.type === 5) { /* root */
|
|
|
|
minifat_store = o.start;
|
|
|
|
if(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = "!StreamData";
|
|
|
|
/*minifat_size = o.size;*/
|
|
|
|
} else if(o.size >= 4096 /* MSCSZ */) {
|
|
|
|
o.storage = 'fat';
|
2014-11-03 04:02:42 +00:00
|
|
|
if(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);
|
2014-06-24 04:00:39 +00:00
|
|
|
sector_list[o.start].name = o.name;
|
|
|
|
o.content = sector_list[o.start].data.slice(0,o.size);
|
|
|
|
prep_blob(o.content, 0);
|
|
|
|
} else {
|
|
|
|
o.storage = 'minifat';
|
|
|
|
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN) {
|
|
|
|
o.content = sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size);
|
|
|
|
prep_blob(o.content, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
files[name] = o;
|
|
|
|
FileIndex.push(o);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function read_date(blob, offset) {
|
|
|
|
return new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);
|
|
|
|
}
|
|
|
|
|