Example #1
0
  /**
   * Read the Portable Execution format header information from the IFileEx, or directly from the
   * file itself, and convey it to the item.
   */
  private void addHeaderInfo(FileObject fObj, IFile file, FileItem item) throws IOException {
    session.getLogger().trace(JOVALMsg.STATUS_PE_READ, file.toString());
    IFileEx extended = file.getExtended();
    Map<String, String> peHeaders = null;
    if (file.isFile() && file.length() == 0) {
      MessageType msg = Factories.common.createMessageType();
      msg.setLevel(MessageLevelEnumeration.INFO);
      msg.setValue(JOVALMsg.getMessage(JOVALMsg.STATUS_PE_EMPTY));
      item.getMessage().add(msg);
    } else if (extended instanceof IWindowsFileInfo) {
      peHeaders = ((IWindowsFileInfo) extended).getPEHeaders();
    } else if (file.isFile()) {
      try {
        Header header = new Header(file);
        peHeaders = new HashMap<String, String>();
        String cs = Integer.toString(header.getNTHeader().getImageOptionalHeader().getChecksum());
        peHeaders.put(IWindowsFileInfo.PE_MS_CHECKSUM, cs);
        String key = VsVersionInfo.LANGID_KEY;
        VsVersionInfo versionInfo = header.getVersionInfo();
        VsFixedFileInfo value = null;
        if (versionInfo != null) {
          value = versionInfo.getValue();
          key = versionInfo.getDefaultTranslation();
        }
        if (value != null) {
          String version = versionInfo.getValue().getFileVersion().toString();
          peHeaders.put(IWindowsFileInfo.PE_VERSION, version);
          StringTokenizer tok = new StringTokenizer(version, ".");
          if (tok.countTokens() == 4) {
            peHeaders.put(IWindowsFileInfo.PE_VERSION_MAJOR_PART, tok.nextToken());
            peHeaders.put(IWindowsFileInfo.PE_VERSION_MINOR_PART, tok.nextToken());
            peHeaders.put(IWindowsFileInfo.PE_VERSION_BUILD_PART, tok.nextToken());
            peHeaders.put(IWindowsFileInfo.PE_VERSION_PRIVATE_PART, tok.nextToken());
          }
          String locale = LanguageConstants.getLocaleString(key);
          if (locale != null) {
            peHeaders.put(IWindowsFileInfo.PE_LANGUAGE, LanguageConstants.getLocaleString(key));
          }
          Map<String, String> stringTable = versionInfo.getStringTable(key);
          if (stringTable.containsKey("CompanyName")) {
            peHeaders.put(IWindowsFileInfo.PE_COMPANY_NAME, stringTable.get("CompanyName"));
          }
          if (stringTable.containsKey("InternalName")) {
            peHeaders.put(IWindowsFileInfo.PE_INTERNAL_NAME, stringTable.get("InternalName"));
          }
          if (stringTable.containsKey("ProductName")) {
            peHeaders.put(IWindowsFileInfo.PE_PRODUCT_NAME, stringTable.get("ProductName"));
          }
          if (stringTable.containsKey("OriginalFilename")) {
            peHeaders.put(IWindowsFileInfo.PE_ORIGINAL_NAME, stringTable.get("OriginalFilename"));
          }
          if (stringTable.containsKey("ProductVersion")) {
            peHeaders.put(IWindowsFileInfo.PE_PRODUCT_VERSION, stringTable.get("ProductVersion"));
          }
        }
      } catch (IllegalArgumentException e) {
        MessageType msg = Factories.common.createMessageType();
        msg.setLevel(MessageLevelEnumeration.ERROR);
        msg.setValue(e.getMessage());
        item.getMessage().add(msg);
      }
    }

    EntityItemStringType msChecksumType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_MS_CHECKSUM)) {
      msChecksumType.setValue(peHeaders.get(IWindowsFileInfo.PE_MS_CHECKSUM));
    } else {
      msChecksumType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setMsChecksum(msChecksumType);

    EntityItemStringType languageType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_LANGUAGE)) {
      languageType.setValue(peHeaders.get(IWindowsFileInfo.PE_LANGUAGE));
    } else {
      languageType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setLanguage(languageType);

    EntityItemVersionType versionType = Factories.sc.core.createEntityItemVersionType();
    versionType.setDatatype(SimpleDatatypeEnumeration.VERSION.value());
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_VERSION_MAJOR_PART)) {
      int major = Integer.parseInt(peHeaders.get(IWindowsFileInfo.PE_VERSION_MAJOR_PART));
      int minor = 0, build = 0, priv = 0;
      if (peHeaders.containsKey(IWindowsFileInfo.PE_VERSION_MINOR_PART)) {
        minor = Integer.parseInt(peHeaders.get(IWindowsFileInfo.PE_VERSION_MINOR_PART));
      }
      if (peHeaders.containsKey(IWindowsFileInfo.PE_VERSION_BUILD_PART)) {
        build = Integer.parseInt(peHeaders.get(IWindowsFileInfo.PE_VERSION_BUILD_PART));
      }
      if (peHeaders.containsKey(IWindowsFileInfo.PE_VERSION_PRIVATE_PART)) {
        priv = Integer.parseInt(peHeaders.get(IWindowsFileInfo.PE_VERSION_PRIVATE_PART));
      }
      if (major == 0 && minor == 0 && build == 0 && priv == 0) {
        versionType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
      } else {
        versionType.setValue(new Version(major, minor, build, priv).toString());
      }
    } else {
      versionType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setFileVersion(versionType);

    EntityItemStringType companyType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_COMPANY_NAME)) {
      companyType.setValue(peHeaders.get(IWindowsFileInfo.PE_COMPANY_NAME));
    } else {
      companyType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setCompany(companyType);

    EntityItemStringType internalNameType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_INTERNAL_NAME)) {
      internalNameType.setValue(peHeaders.get(IWindowsFileInfo.PE_INTERNAL_NAME));
    } else {
      internalNameType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setInternalName(internalNameType);

    EntityItemStringType productNameType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_PRODUCT_NAME)) {
      productNameType.setValue(peHeaders.get(IWindowsFileInfo.PE_PRODUCT_NAME));
    } else {
      productNameType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setProductName(productNameType);

    EntityItemStringType originalFilenameType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_ORIGINAL_NAME)) {
      originalFilenameType.setValue(peHeaders.get(IWindowsFileInfo.PE_ORIGINAL_NAME));
    } else {
      originalFilenameType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setOriginalFilename(originalFilenameType);

    EntityItemVersionType productVersionType = Factories.sc.core.createEntityItemVersionType();
    productVersionType.setDatatype(SimpleDatatypeEnumeration.VERSION.value());
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_PRODUCT_VERSION)) {
      productVersionType.setValue(peHeaders.get(IWindowsFileInfo.PE_PRODUCT_VERSION));
    } else {
      productVersionType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setProductVersion(productVersionType);

    EntityItemStringType developmentClassType = Factories.sc.core.createEntityItemStringType();
    if (peHeaders != null && peHeaders.containsKey(IWindowsFileInfo.PE_VERSION)) {
      try {
        developmentClassType.setValue(
            getDevelopmentClass(peHeaders.get(IWindowsFileInfo.PE_VERSION)));
      } catch (IllegalArgumentException e) {
        MessageType msg = Factories.common.createMessageType();
        msg.setLevel(MessageLevelEnumeration.INFO);
        msg.setValue(JOVALMsg.getMessage(JOVALMsg.STATUS_PE_DEVCLASS, e.getMessage()));
        item.getMessage().add(msg);
        developmentClassType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
      }
    } else {
      developmentClassType.setStatus(StatusEnumeration.DOES_NOT_EXIST);
    }
    item.setDevelopmentClass(developmentClassType);
  }