detect windows DLL architecture
authorRobin Gareus <robin@gareus.org>
Tue, 6 Oct 2015 16:15:57 +0000 (18:15 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 6 Oct 2015 16:16:12 +0000 (18:16 +0200)
libs/ardour/plugin_manager.cc

index 9ffab34a18afbef7e8f167f351b1057543667ce0..f7581dd88fa05f83527128abc4be3bb6c786697f 100644 (file)
 #include "fst.h"
 #include "pbd/basename.h"
 #include <cstring>
+
+// dll-info
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdint.h>
+
 #endif // WINDOWS_VST_SUPPORT
 
 #ifdef LXVST_SUPPORT
@@ -781,13 +788,72 @@ PluginManager::windows_vst_discover_from_path (string path, bool cache_only)
        return ret;
 }
 
+static std::string dll_info (std::string path) {
+       std::string rv;
+       uint8_t buf[68];
+       uint16_t type = 0;
+       off_t pe_hdr_off = 0;
+
+       int fd = open(path.c_str(), O_RDONLY, 0444);
+
+       if (fd < 0) {
+               return _("- cannot open dll"); // TODO strerror()
+       }
+
+       if (68 != read (fd, buf, 68)) {
+               rv = _("- invalid dll, file too small");
+               goto errorout;
+       }
+       if (buf[0] != 'M' && buf[1] != 'Z') {
+               rv = _("- not a dll");
+               goto errorout;
+       }
+
+       pe_hdr_off = *((int32_t*) &buf[60]);
+       if (pe_hdr_off !=lseek (fd, pe_hdr_off, SEEK_SET)) {
+               rv = _("- cannot determine dll type");
+               goto errorout;
+       }
+       if (6 != read (fd, buf, 6)) {
+               rv = _("- cannot read dll PE header");
+               goto errorout
+       }
+
+       if (buf[0] != 'P' && buf[1] != 'E') {
+               rv = _("- invalid dll PE header");
+               goto errorout;
+       }
+
+       type = *((uint16_t*) &buf[4]);
+       switch (type) {
+               case 0x014c:
+                       rv = _("- i386 (32bit)");
+                       break;
+               case  0x0200:
+                       rv = _("- Itanium");
+                       break;
+               case 0x8664:
+                       rv = _("- x64 (64bit)");
+                       break;
+               case 0:
+                       rv = _("- Native Architecture");
+                       break;
+               default:
+                       rv = _("- Unknown Architecture");
+                       break;
+       }
+errorout:
+       close (fd);
+       return rv;
+}
+
 int
 PluginManager::windows_vst_discover (string path, bool cache_only)
 {
        DEBUG_TRACE (DEBUG::PluginManager, string_compose ("windows_vst_discover '%1'\n", path));
 
        if (Config->get_verbose_plugin_scan()) {
-               info << string_compose (_(" *  %1 %2"), path, (cache_only ? _(" (cache only)") : "")) << endmsg;
+               info << string_compose (_(" *  %1 %2 %3"), path, (cache_only ? _(" (cache only)") : "", dll_info (path))) << endmsg;
        }
 
        _cancel_timeout = false;