private void parse() throws InvalidNTHeaderException, IOException {

		if (index < 0 || index > reader.length()) {
			return;
		}

		int tmpIndex = index;

		try {
			signature = reader.readInt(tmpIndex);
		}
		catch (IndexOutOfBoundsException ioobe) {
			// Handled below
		}

		// if not correct signature, then return...
		if (signature != Constants.IMAGE_NT_SIGNATURE) {
			throw new InvalidNTHeaderException();
		}

		tmpIndex += 4;

		fileHeader = new FileHeader(reader, tmpIndex, this);
		if (fileHeader.getSizeOfOptionalHeader() == 0) {
			Msg.warn(this, "Section headers overlap optional header");
		}
		tmpIndex += FileHeader.IMAGE_SIZEOF_FILE_HEADER;

		optionalHeader = new OptionalHeader(this, reader, tmpIndex);

		// Process symbols.  Allow parsing to continue on failure.
		boolean symbolsProcessed = false;
		try {
			fileHeader.processSymbols();
			symbolsProcessed = true;
		}
		catch (Exception e) {
			Msg.error(this, "Failed to process symbols: " + e.getMessage());
		}

		// Process sections.  Resolving some sections names (i.e., "/21") requires symbols to have
		// been successfully processed.  Resolving is optional though.
		fileHeader.processSections(optionalHeader, symbolsProcessed);
	}
Converts a virtual address (VA) into a pointer.

@param va the virtual address
@return the pointer into binary image, 0 if not valid
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/NTHeader.java