Нужно из под Linux (без Wine) вытащить с Windows EXE/DLL файла такую информацию:
CompanyName
FileVersion
ProductVersion
Из под Windws используя API функции это сделать не сложно
GetFileVersionInfoSize()
GetFileVersionInfo()
итд.
Как узнать информацию о версии Windows EXE/DLL файла?
Нужно из под Linux (без Wine) вытащить с Windows EXE/DLL файла такую информацию:
команда file не даёт? тогда никак. разве что самому писать.
может на cpan.org найдете модуль для добычи данной информации?
правда вам надо будет еще уметь на perl написать программу использующую данный модуль.
утилита "file" выдает только короткое описание о файле.
-notepad.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
-img627.jpg: JPEG image data, JFIF standard 1.01
Нашел "objdump".
Дает много информации, но нужной мне - нет.
утилита "file" выдает только короткое описание о файле.
дайте ссылочку на формат PE, а то я уже и не помню... Конвертор написать достаточно просто, например используя sed.
исполняемый файл в виндовсе это EXE
http://en.wikipedia.org/wiki/Portable_Executable
Например редактор DBF файлов под Виндовс http://www.jdv-soft.com/User/File/DBFView/Download/DBFView.zip
В архиве есть инсталятор: JDV-DBFView-Setup-283.exe
исполняемый файл в линуксе это ELF
http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
э... это здесь читать надо:
http://kishorekumar.net/pecoff_v8.1.htm
ИМХО проще на C реализовать программку, чем sed|perl мучить. Запутанный формат, это изучать его надо...
ага, и я о том же :)
надо будет самому разбираться.
Напишу парсер - выложу.
Есть еще модуль для PERL, но при установке (cpan Win32::File::VersionInfo) на Linux выдает ошибку:
куча текста...Make had returned bad status, install seems impossible
Возможно он ставится только под Win32 платформу и использует Windows API
Есть еще другой модуль для PERL (cpan Win32::Exe)
В нем много всего, в том числе и версию файла можно узнать. Правда, для больших файлов медленно работает.
Пример:
use Win32::Exe;
my $exe = Win32::Exe->new('C:\windows\notepad.exe');
# Get version information
print $exe->version_info->get('FileVersion'), "\n";
я вот ещё что подумал: можно стянуть с мысы их компилятор (для студентов вроде бесплатно), написать приложение под WinAPI (там одна функция нужна ЕМНИП), и запустить его под wine - последняя реализует эту функцию, которая и вернёт значения. Ну и эти значения достаточно выдать в stdout в человеческом виде.
Можно позаимствовать идеи/реализацию из wine/dlls/version/, но с этим уже, наверное, в Программирование.
Не исключено, что подобное уже кто-то делал.
Из под Windws используя API функции это сделать не сложно
GetFileVersionInfoSize()
GetFileVersionInfo()
Можно позаимствовать идеи/реализацию из wine/dlls/version/,
вон, тут даже функции указаны. неужели wine их не умеет? Это-же эмулятор WinAPI! ([в сторону]не надо тут кричать, что wine - не эмулятор. Я в курсе. Прочтите до конца фразу - "wine не эмулятор виндовс", а вот WinAPI вполне даже себе эмулирует)
Вам нужна 2-ая запись (считая с нуля) в Data Directory (директория ресурсов).
Я не изучал ее формат - проще копнуть исходники wine или любой утилиты просмотра PE-формата (biew, HTEditor).
Хотя зачем что-то писать? Можно установить hex-редактор и пользоваться им.
Можно установить hex-редактор и пользоваться им.
не нужно:
[console]$ xxd -h 2>&1 | xxd -g1
0000000: 55 73 61 67 65 3a 0a 20 20 20 20 20 20 20 78 78 Usage:. xx
0000010: 64 20 5b 6f 70 74 69 6f 6e 73 5d 20 5b 69 6e 66 d [options] [inf
0000020: 69 6c 65 20 5b 6f 75 74 66 69 6c 65 5d 5d 0a 20 ile [outfile]].
0000030: 20 20 20 6f 72 0a 20 20 20 20 20 20 20 78 78 64 or. xxd
...
[/console]
работает вместе с vim как hex-editor