/// <summary>
        /// Create a Data directory header from file
        /// </summary>
        /// <param name="reader">The reader</param>
        /// <param name="opHeader">The optional header</param>
        public DataDirectoryHeader(Reader reader, OptionalHeader opHeader)
        {
            this.reader = reader;

            this.entries = new List <Entry>();
            this.dirs    = new List <DataDirectory>();

            this.opHeader = opHeader;

            headerBaseAddress = this.opHeader.endOfHeader;

            setupStruct();

            ///
            /// init values
            ///

            foreach (var item in entries)
            {
                item.readValue(this.reader);
            }

            int sizeTmp = headerBaseAddress;

            entries.ForEach(e => sizeTmp += (((int)e.getEntrySize()) / 8) * 2);

            this.endOfHeader = sizeTmp + 0x8;
        }
        /// <summary>
        /// Create a Data directory header from memory
        /// </summary>
        /// <param name="opHeader">The optional header</param>
        public DataDirectoryHeader(OptionalHeader opHeader)
        {
            this.entries = new List <Entry>();
            this.dirs    = new List <DataDirectory>();

            this.opHeader = opHeader;

            headerBaseAddress = this.opHeader.endOfHeader;

            setupStruct();

            ///
            /// init values
            ///

            // exe as default, so export anything
            this.exportDirectory.setVirtualAddress(0);
            this.exportDirectory.setSize(0);

            // defined by the user
            this.importDirectory.setVirtualAddress(0);
            this.importDirectory.setSize(0);
            this.resourceDirectory.setVirtualAddress(0);
            this.resourceDirectory.setSize(0);
            this.exceptionDirectory.setVirtualAddress(0);
            this.exceptionDirectory.setSize(0);
            this.securityDirectory.setVirtualAddress(0);
            this.securityDirectory.setSize(0);
            this.baseRelocationDirectory.setVirtualAddress(0);
            this.baseRelocationDirectory.setSize(0);

            // debug info
            this.debugDirectory.setVirtualAddress(0);
            this.debugDirectory.setSize(0);

            this.architectureDirectory.setVirtualAddress(0);
            this.architectureDirectory.setSize(0);
            this.relativesAddressDirectory.setVirtualAddress(0);
            this.relativesAddressDirectory.setSize(0);
            this.tlsDirectory.setVirtualAddress(0);
            this.tlsDirectory.setSize(0);

            // null as default
            this.loadConfigDirectory.setVirtualAddress(0);
            this.loadConfigDirectory.setSize(0);
            this.boundImportsDirectory.setVirtualAddress(0);
            this.boundImportsDirectory.setSize(0);

            this.importTableAddressDirectory.setVirtualAddress(0);
            this.importTableAddressDirectory.setSize(0);

            // null as default
            this.delayLoadDescriptorDirectory.setVirtualAddress(0);
            this.delayLoadDescriptorDirectory.setSize(0);

            // defined by the user if is .NET executable
            this.netHeaderDirectory.setVirtualAddress(0);
            this.netHeaderDirectory.setSize(0);

            int sizeTmp = headerBaseAddress;

            entries.ForEach(e => sizeTmp += (((int)e.getEntrySize()) / 8) * 2);

            this.endOfHeader = sizeTmp + 0x8;
        }