version bump 1.0.0: walk minifat
This commit is contained in:
parent
ec9ab57132
commit
46719dfe3c
@ -4,6 +4,10 @@ This log is intended to keep track of backwards-incompatible changes, including
|
||||
but not limited to API changes and file location changes. Minor behavioral
|
||||
changes may not be included if they are not expected to break existing code.
|
||||
|
||||
## 1.0.0 (2017-11-05)
|
||||
|
||||
* Actually walk mini-fat
|
||||
|
||||
## 0.14.0 (2017-11-04)
|
||||
|
||||
* Completely removed `FullPathDir`
|
||||
|
@ -1 +1 @@
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
|
@ -79,7 +79,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files/*:CFBFiles*/ = {}, Paths/*:Array<string>*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array<string>*/ = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
|
14
bits/44_readmfat.js
Normal file
14
bits/44_readmfat.js
Normal file
@ -0,0 +1,14 @@
|
||||
function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0)/*:any*/);
|
||||
return (bconcat(o).slice(0, entry.size)/*:any*/);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -41,7 +41,7 @@ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sector
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size)/*:any*/);
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
22
cfb.flow.js
22
cfb.flow.js
@ -179,7 +179,7 @@ type CFBFiles = {[n:string]:CFBEntry};
|
||||
/* [MS-CFB] v20130118 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -283,7 +283,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files/*:CFBFiles*/ = {}, Paths/*:Array<string>*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array<string>*/ = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
@ -381,6 +381,20 @@ function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array<string>*/, Paths/*:Arr
|
||||
}
|
||||
}
|
||||
|
||||
function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0)/*:any*/);
|
||||
return (bconcat(o).slice(0, entry.size)/*:any*/);
|
||||
}
|
||||
|
||||
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
||||
DIFAT chains by storing the next sector number as the last 32 bits */
|
||||
function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array<RawBytes>*/, ssz/*:number*/, fat_addrs)/*:void*/ {
|
||||
@ -442,7 +456,7 @@ function make_sector_list(sectors/*:Array<RawBytes>*/, dir_start/*:number*/, fat
|
||||
}
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -484,7 +498,7 @@ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sector
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size)/*:any*/);
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
22
cfb.js
22
cfb.js
@ -161,7 +161,7 @@ function new_buf(sz) {
|
||||
/* [MS-CFB] v20130118 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports = {};
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l, r) {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -265,7 +265,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files = {}, Paths = [], FileIndex = [], FullPaths = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
@ -363,6 +363,20 @@ function build_full_paths(FI, FP, Paths) {
|
||||
}
|
||||
}
|
||||
|
||||
function get_mfat_entry(entry, payload, mini) {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size));
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0));
|
||||
return (bconcat(o).slice(0, entry.size));
|
||||
}
|
||||
|
||||
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
||||
DIFAT chains by storing the next sector number as the last 32 bits */
|
||||
function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
|
||||
@ -424,7 +438,7 @@ function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
|
||||
}
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -466,7 +480,7 @@ function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, Fil
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size));
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
22
dist/cfb.js
vendored
22
dist/cfb.js
vendored
@ -161,7 +161,7 @@ function new_buf(sz) {
|
||||
/* [MS-CFB] v20130118 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports = {};
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l, r) {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -265,7 +265,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files = {}, Paths = [], FileIndex = [], FullPaths = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
@ -363,6 +363,20 @@ function build_full_paths(FI, FP, Paths) {
|
||||
}
|
||||
}
|
||||
|
||||
function get_mfat_entry(entry, payload, mini) {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size));
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0));
|
||||
return (bconcat(o).slice(0, entry.size));
|
||||
}
|
||||
|
||||
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
||||
DIFAT chains by storing the next sector number as the last 32 bits */
|
||||
function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
|
||||
@ -424,7 +438,7 @@ function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
|
||||
}
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -466,7 +480,7 @@ function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, Fil
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size));
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
2
dist/cfb.min.js
vendored
2
dist/cfb.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/cfb.min.map
vendored
2
dist/cfb.min.map
vendored
File diff suppressed because one or more lines are too long
22
dist/xlscfb.js
vendored
22
dist/xlscfb.js
vendored
@ -38,7 +38,7 @@ type CFBFiles = {[n:string]:CFBEntry};
|
||||
/* [MS-CFB] v20130118 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -142,7 +142,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files/*:CFBFiles*/ = {}, Paths/*:Array<string>*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array<string>*/ = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
@ -240,6 +240,20 @@ function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array<string>*/, Paths/*:Arr
|
||||
}
|
||||
}
|
||||
|
||||
function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0)/*:any*/);
|
||||
return (bconcat(o).slice(0, entry.size)/*:any*/);
|
||||
}
|
||||
|
||||
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
||||
DIFAT chains by storing the next sector number as the last 32 bits */
|
||||
function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array<RawBytes>*/, ssz/*:number*/, fat_addrs)/*:void*/ {
|
||||
@ -301,7 +315,7 @@ function make_sector_list(sectors/*:Array<RawBytes>*/, dir_start/*:number*/, fat
|
||||
}
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -343,7 +357,7 @@ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sector
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size)/*:any*/);
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cfb",
|
||||
"version": "0.14.0",
|
||||
"version": "1.0.0",
|
||||
"author": "sheetjs",
|
||||
"description": "Compound File Binary File Format extractor",
|
||||
"keywords": [ "cfb", "compression", "office" ],
|
||||
|
@ -38,7 +38,7 @@ type CFBFiles = {[n:string]:CFBEntry};
|
||||
/* [MS-CFB] v20130118 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports/*:CFBModule*/ = /*::(*/{}/*:: :any)*/;
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l/*:string*/, r/*:string*/)/*:number*/ {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -142,7 +142,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files/*:CFBFiles*/ = {}, Paths/*:Array<string>*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array<string>*/ = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
@ -240,6 +240,20 @@ function build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array<string>*/, Paths/*:Arr
|
||||
}
|
||||
}
|
||||
|
||||
function get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0)/*:any*/);
|
||||
return (bconcat(o).slice(0, entry.size)/*:any*/);
|
||||
}
|
||||
|
||||
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
||||
DIFAT chains by storing the next sector number as the last 32 bits */
|
||||
function sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array<RawBytes>*/, ssz/*:number*/, fat_addrs)/*:void*/ {
|
||||
@ -301,7 +315,7 @@ function make_sector_list(sectors/*:Array<RawBytes>*/, dir_start/*:number*/, fat
|
||||
}
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array<RawBytes>*/, Paths/*:Array<string>*/, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -343,7 +357,7 @@ function read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sector
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size)/*:any*/);
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
22
xlscfb.js
22
xlscfb.js
@ -8,7 +8,7 @@ var DO_NOT_EXPORT_CFB = true;
|
||||
/* [MS-CFB] v20130118 */
|
||||
var CFB = (function _CFB(){
|
||||
var exports = {};
|
||||
exports.version = '0.14.0';
|
||||
exports.version = '1.0.0';
|
||||
/* [MS-CFB] 2.6.4 */
|
||||
function namecmp(l, r) {
|
||||
var L = l.split("/"), R = r.split("/");
|
||||
@ -112,7 +112,7 @@ sector_list.ssz = ssz;
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
var files = {}, Paths = [], FileIndex = [], FullPaths = [];
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex);
|
||||
read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
|
||||
|
||||
build_full_paths(FileIndex, FullPaths, Paths);
|
||||
Paths.shift();
|
||||
@ -210,6 +210,20 @@ function build_full_paths(FI, FP, Paths) {
|
||||
}
|
||||
}
|
||||
|
||||
function get_mfat_entry(entry, payload, mini) {
|
||||
var start = entry.start, size = entry.size;
|
||||
//return (payload.slice(start*MSSZ, start*MSSZ + size));
|
||||
var o = [];
|
||||
var idx = start;
|
||||
while(mini && size > 0 && idx >= 0) {
|
||||
o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
|
||||
size -= MSSZ;
|
||||
idx = __readInt32LE(mini, idx * 4);
|
||||
}
|
||||
if(o.length === 0) return (new_buf(0));
|
||||
return (bconcat(o).slice(0, entry.size));
|
||||
}
|
||||
|
||||
/** Chase down the rest of the DIFAT chain to build a comprehensive list
|
||||
DIFAT chains by storing the next sector number as the last 32 bits */
|
||||
function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
|
||||
@ -271,7 +285,7 @@ function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
|
||||
}
|
||||
|
||||
/* [MS-CFB] 2.6.1 Compound File Directory Entry */
|
||||
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex) {
|
||||
function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
|
||||
var minifat_store = 0, pl = (Paths.length?2:0);
|
||||
var sector = sector_list[dir_start].data;
|
||||
var i = 0, namelen = 0, name;
|
||||
@ -313,7 +327,7 @@ function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, Fil
|
||||
} else {
|
||||
o.storage = 'minifat';
|
||||
if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
|
||||
o.content = (sector_list[minifat_store].data.slice(o.start*MSSZ,o.start*MSSZ+o.size));
|
||||
o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);
|
||||
prep_blob(o.content, 0);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user