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 ===...