test
by zerippe
HTML
<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>
<output id="list2"></output>
CSS
table{
font-size: 10px;
font-family: Consolas;
}
JavaScript
console.clear();
var Type = {};
var Typedef = function(name, type, size){
Type[name] = { name: type, size: size };
};
Typedef("BYTE", "Uint8", 1);
Typedef("WORD", "Uint16", 2);
Typedef("DWORD", "Uint32", 4);
Typedef("LONG", "Int32", 4);
Typedef("Struct", "Struct", 0);
Type.Array = function(type, size){
return { name: "Array", size: size, innerType: type };
};
var PELoader = function(container, dataView){
this.container = container;
this.dv = dataView;
this.offset = 0;
};
PELoader.prototype._loader = function(container, signature){
for(var i = 0; i < signature.length; i++){
var entry = signature[i];
if(entry.type.name === "Struct"){
container[entry.name] = {};
} else if(entry.type.name === "Array"){
container[entry.name] = [];
for(var j = 0; j < entry.type.size; j ++){
container[entry.name][j] = this.dv["get" + entry.type.innerType.name](this.offset, true);
this.offset += entry.type.innerType.size;
}
} else {
container[entry.name] = this.dv["get" + entry.type.name](this.offset, true);
this.offset += entry.type.size;
}
}
};
PELoader.prototype._loadDOSHeader = function(){
var dosHeader = this.container.ImageDOSHeader = {};
this._loader(dosHeader, IMAGE_DOS_HEADER);
return new Promise(function(resolve, reject){
if(dosHeader.e_magic === 0x5a4d){
resolve(dosHeader);
} else {
reject(new Error("Unsupported executable file.\nIMAGE_DOS_HEADER.e_magic = 0x"
+ ("0000" + dosHeader.e_magic.toString(16)).slice(-4)));
}
});
};
PELoader.prototype._loadNTHeaders = function(){
var ntHeaders = this.container.ImageNTHeaders = {};
this.offset = this.container.ImageDOSHeader.e_lfanew;
this._loader(ntHeaders, IMAGE_NT_HEADERS);
this._loader(ntHeaders.FileHeader, IMAGE_FILE_HEADER);
if(ntHeaders.FileHeader.Machine === 0x014c){ // X86 Image
this._loader(ntHeaders.OptionalHeader, IMAGE_OPTIONAL_HEADER32);
} else if(ntHeaders.FileHeader.Machine ===...