JSFiddle - React, Tailwind, and code Playground

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(context){
  const dosMagicCode = 0x5a4d;
  var dosHeader = context.ImageDOSHeader = {};
  this._loader(dosHeader, IMAGE_DOS_HEADER);
  if(dosHeader.e_magic !== dosMagicCode){
    return Promise.reject(
    	new Error("Unsupported executable file.\nIMAGE_DOS_HEADER.e_magic = 0x" + ("0000" + dosHeader.e_magic.toString(16)).slice(-4))
    );
  }
  return Promise.resolve(context);
};

PELoader.prototype._loadNTHeaders = function(context){
  var ntHeaders = context.ImageNTHeaders = {};
  this.offset = context.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 === 0x8664){  //...