private static BoundImportDirectoryTable readBoundImportDirectoryTable(byte[] b) throws IOException { DataReader dr = new DataReader(b); BoundImportDirectoryTable bidt = new BoundImportDirectoryTable(); List<BoundImport> imports = new ArrayList<BoundImport>(); BoundImport bi = null; while ((bi = readBoundImport(dr)) != null) { bidt.add(bi); imports.add(bi); } Collections.sort( imports, new Comparator<BoundImport>() { @Override public int compare(BoundImport o1, BoundImport o2) { return o1.getOffsetToModuleName() - o2.getOffsetToModuleName(); } }); IntMap names = new IntMap(); for (int i = 0; i < imports.size(); i++) { bi = imports.get(i); int offset = bi.getOffsetToModuleName(); String n = (String) names.get(offset); if (n == null) { dr.jumpTo(offset); n = dr.readUtf(); names.put(offset, n); } bi.setModuleName(n); } return bidt; }
private static BoundImport readBoundImport(IDataReader dr) throws IOException { BoundImport bi = new BoundImport(); bi.setTimestamp(dr.readDoubleWord()); bi.setOffsetToModuleName(dr.readWord()); bi.setNumberOfModuleForwarderRefs(dr.readWord()); if (bi.getTimestamp() == 0 && bi.getOffsetToModuleName() == 0 && bi.getNumberOfModuleForwarderRefs() == 0) return null; return bi; }