Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Определить тип приложения   Найти похожие ветки 

 
-=GaLaN=-   (2005-05-27 01:03) [0]

У меня есть путь к файлу exe. Как можно определить тип приложения - консольное ли оно, DOS, Win32?


 
Defunct ©   (2005-05-27 01:09) [1]

http://www.rsdn.ru/article/baseserv/peloader.xml

в этой статье можно найти краткое описание заголока PE файлов, а также список литературы, который вам не помешает.


 
Просто Джо ©   (2005-05-27 01:09) [2]

Во-первых, оно не обязано вообще быть приложением.
Во-вторых, определить, является ли оно DOS-приложением тоже нельзя.
В-третьих, приложения Win32 - это и консольные приложения, в том числе.
Ну, а если уверен, что оно точно является Win32-приложением, тогда можно попытаться прочитать PE-заголовок файла и из него определить тип приложения, там для этого предусмотрено поле. Короче говоря, ищи по ключевым словам "структура PE-заголовка".


 
Defunct ©   (2005-05-27 01:13) [3]

Просто Джо ©   (27.05.05 01:09) [2]

> Во-вторых, определить, является ли оно DOS-приложением тоже нельзя.

Можно - необходимые и достаточные условия:
1. Отсутствие MS-DOS заголовка EXE файла. (COM-формат)
2. Отсутствие Win32 заголовка.

> В-третьих, приложения Win32 - это и консольные приложения, в том числе.

Тоже можно определить по заголовку, но не помню как.


 
Просто Джо ©   (2005-05-27 01:19) [4]

[3] Defunct ©   (27.05.05 01:13)
> Можно - необходимые и достаточные условия:
> 1. Отсутствие MS-DOS заголовка EXE файла. (COM-формат)
> 2. Отсутствие Win32 заголовка.

Да, я неудачно выразился. Не заметил, что уточняется "EXE", увидел только ключевое слово "приложение".

> > В-третьих, приложения Win32 - это и консольные приложения,
> в том числе.
Это мое замечание к тому, что автор противопоставляет консольные и Win32-приложения. В то время как консольные - это разновидность Win32-приложений.

К автору: не стоит забывать, что в файле "екзе" может также находится 16-битное приложение, приложение для OS/2 и мало ли что еще.


 
KilkennyCat ©   (2005-05-27 01:25) [5]

И не стоит также забывать, что расширения еxe, com, bat - являются лишь информативными о запускаемости. Все остальное - согласно заголовкам, поэтому [3] Defunct ©   (27.05.05 01:13) - верно.


 
-=GaLaN=-   (2005-05-27 01:35) [6]

Спасибо за ответы, попробую немного точнее дать задачу. Есть путь к файлу exe. Нужно определить, что во-первых, это приложение, а вторых, это приложение, работающее в текстовом режиме. Не важно, DOS или Win32 Console.
Я попробую почитать статью по вышеприведённой ссылке и разобрать в ней, но неужели нет каких-нибудь WinAPI функций? Ведь command.com и cmd.exe как-то определяют это...


 
GuAV ©   (2005-05-27 01:48) [7]

-=GaLaN=-   (27.05.05 1:35) [6]
Не важно, DOS или Win32 Console.

DOS приложение, работающее в текстовом режиме не отличается никакими заголовками от DOS приложения, работающего в графическом режиме. Изначально дос-приложение запускается в текстовом режиме, но оно может перейти в графический.


 
Просто Джо ©   (2005-05-27 01:53) [8]


> [7] GuAV ©   (27.05.05 01:48)
> Изначально дос-приложение запускается в текстовом
> режиме

Ну уж нет, не обязательно. Оно запускается в том режиме, какой установлен на момент запуска.


 
Defunct ©   (2005-05-27 02:11) [9]

> Нужно определить, что во-первых, это приложение, а вторых, это приложение, работающее в текстовом режиме.

Можно определить наличие переключения в графический режим (в DOS приложении). Для этого придется "прошерстить" весь exe/com файл и искать последовательность команд

такую:
mov  ax, zzyy;  // где yy больше 3, а zz = 0
int  10h

вот как будет это выглядеть в hex:
xx xx xx xx B8 YY 00 CD 10 xx xx
на месте xx, любые числа.

или такую:
mov  ah, 0  
mov  al, yy     // где yy больше 3
...
int  10h

вот как будет это выглядеть в hex:
xx xx xx xx B4 00 B0 YY xx .... xx CD 10 xx xx

ps: чаще используется первая последовательность.


 
-=GaLaN=-   (2005-05-27 02:15) [10]

2Defunct:
Но, согласись, отсутствие данных последовательностей вовсе не означает, что это консольное приложение? Оно вполне может оказаться обычным графическим Win32 или WinNT приложением...


 
Просто Джо ©   (2005-05-27 02:16) [11]

Угу, или такую:
xor ah,ah


 
Просто Джо ©   (2005-05-27 02:18) [12]


> [10] -=GaLaN=-   (27.05.05 02:15)

А зачем это нужно, если не секрет?


 
Defunct ©   (2005-05-27 02:22) [13]

-=GaLaN=-   (27.05.05 02:15) [10]

> Но, согласись, отсутствие данных последовательностей вовсе не означает, что это консольное приложение?
Конечно.

Наличие данных последовательностей может быть информативным только в DOS приложениях которые переключают видеорежим, не более того. В Win32 приложении такой код будет просто неработоспособен.

Т.е. вначале нужно точно знать, что приложение - DOS. Затем, если интересует в каком режиме работает именно это DOS приложение, ищем эти последовательности. (плюс может быть ложное срабатывание, например, в программе размещены данные, которые совпадают с указанными последовательностями команд).


 
Просто Джо ©   (2005-05-27 02:24) [14]

Хм. А если это ДОС-приложение работает в графическом режиме, иногда переключаясь в текстовый, - то как его, простите, называть? Пример: Автокад версии 10.
Не туда копаете, товарищи :)


 
KilkennyCat ©   (2005-05-27 02:27) [15]


> Не туда копаете, товарищи :)


Угу. надо OCR экрана делать.


 
Просто Джо ©   (2005-05-27 02:28) [16]


>  [15] KilkennyCat ©   (27.05.05 02:27)

Да, ИИ в задаче мощный, это вам не плюшки со стола таскать (ц)
:)


 
Defunct ©   (2005-05-27 02:29) [17]

Просто Джо ©   (27.05.05 02:24) [14]

Ну и пусть себе переключается в текстовый. Код для переключения в графический режим все равно в нем будет.


 
Просто Джо ©   (2005-05-27 02:30) [18]


>  [17] Defunct ©   (27.05.05 02:29)
> Ну и пусть себе переключается в текстовый. Код для переключения
> в графический режим все равно в нем будет.


Какой? Может он напрямую с драйвером VESA общается с особыми изысками?


 
Defunct ©   (2005-05-27 02:31) [19]

Просто Джо ©   (27.05.05 02:30) [18]

Режимы VESA включаются такой же самой последовательностью кода.


 
Просто Джо ©   (2005-05-27 02:31) [20]

Или руки у программиста воот такой кривизны и у него там
xor ah,ah
push val
pop al
int 10h


 
Просто Джо ©   (2005-05-27 02:33) [21]


>  [19] Defunct ©   (27.05.05 02:31)
> Просто Джо ©   (27.05.05 02:30) [18]
>
> Режимы VESA включаются такой же самой последовательностью
> кода.

Я вот не уверен. Насколько помню, веза-драйвер висит на своем прерывании и допускает вызовы напрямую этого прерывания. Не помню, если честно. Да и кодв может быть столько вариантов, что все и не предусмотришь.


 
Defunct ©   (2005-05-27 02:34) [22]

Просто Джо ©   (27.05.05 02:31) [20]

:))
нельзя же думать только о плохом.
реализовать вначале 2 последовательности, при ошибке распознавания внести маску из приложения в определении которого программа ошиблась.


 
Просто Джо ©   (2005-05-27 02:34) [23]

Я автору не зря вопрос задал: зачем это надо. Тут от задачи нужно отталкиваться, имхо.


 
Defunct ©   (2005-05-27 02:36) [24]

Просто Джо ©   (27.05.05 02:33) [21]

А я в этом уверен (VESA драйвер "висит" на int 10h), просто довелось проработать с VESA.


 
-=GaLaN=-   (2005-05-27 02:38) [25]

Народ! Немного не в ту сторону беседа ушла. :) Честно говоря, если DOS приложение будет переключаться в графический режим - это не важно. Главное - определить, что это DOS-приложение. Т.е. по сути, мне надо решить задачу от противного - определить, что это приложение, но НЕ графическое Win32\16.

У меня есть уже несколько домыслов. Определить, что это приложение легко. Файл должен начинаться с 4D 5A. Если дальше НЕ идёт 50, то это, наверное, DOS. Если идёт, то это уже Win32 приложение, но опять же - не понятно, консольное или графическое. :(
Возможно, я не прав и что-то упустил...

2Просто Джо:
Не секрет. У меня программа должна запускать приложение. Я хочу определить, что это консольное приложение, чтобы запустить его не просто, а, например, через cmd.exe /k или иной обработчик.


 
Просто Джо ©   (2005-05-27 02:39) [26]

[24] Defunct ©   (27.05.05 02:36)

В-общем, пока автор пусть поспит, а мы все возможные сигнатуры тут ему напишем :)) А он проснется - и окажется, что ему стандартный вывод нужно было перехватить :)


 
Просто Джо ©   (2005-05-27 02:40) [27]


>  [26] Просто Джо ©   (27.05.05 02:39)

А поутру она проснулась :)) Опоздал.


 
-=GaLaN=-   (2005-05-27 02:41) [28]

Кстати, сама винда, когда жмякаешь Enter на файле, ведь определяет, надо ли звать command.com и cmd.exe или пускать приложение так...


 
Defunct ©   (2005-05-27 02:41) [29]

-=GaLaN=-   (27.05.05 02:38) [25]

> Если дальше НЕ идёт 50, то это, наверное, DOS.

Так дело не пойдет :)
Берите открывайте справочик, смотрите что обозначает каждое поле заголовка EXE файла, потом аналогичную процедуру для PE-заголовка и ваша задача решена.


 
Просто Джо ©   (2005-05-27 02:43) [30]


> Я хочу определить, что это консольное приложение, чтобы
> запустить его не просто, а, например, через cmd.exe /k или
> иной обработчик.

А разве другое нельзя запустить "через" cmd.exe /K ?


 
Просто Джо ©   (2005-05-27 02:44) [31]

Тебе ж дали ссылку на описание PE-заголовка, чего ты мучаешься?


 
-=GaLaN=-   (2005-05-27 02:48) [32]

2Просто Джо:
Ага, дали, вот цитата оттуда:
"Я не буду подробно описывать форматы заголовков – большая часть из них описана в Windows.pas". Ни ничего там практически нет для моей задачи. :(
А другое запустить через cmd.exe /k нельзя - консольное окно будет болтаться на экране, это не дело.


 
Defunct ©   (2005-05-27 02:51) [33]

> -=GaLaN=-

Если определять по вашему:
цифра 50 наверное DOS вы так долго будете определять. Вот если открыть спрвочник там четко написано.
MS-DOS заголовок exe-шника:

0000  word  Signature               "4D5A"
0002  word  Bytes on last page
0004  word  Pages in File
0006  word  Relocations
0008  word  Paragraphs in header
000A  word  Minimum memory
000C  word  Maximum memory
000E  dword SS:SP
0012  word  Checksum
0014  dword CS:IP (entrypoint)
0016  word  Relocation table address
0018  word  Overlay number
...

за MS-DOS заголовком располагается Win32 заголовок. Как отличить DOS от Win32 написал в [3]


 
Просто Джо ©   (2005-05-27 02:55) [34]

[32] -=GaLaN=-   (27.05.05 02:48)
Ну, тогда запускай все через WinExec.
Нужные определения ПЕ-заголовка есть в Windows.pas, в том чиле и константы, определяющие режим приложения (subsystem values): например IMAGE_SUBSYSTEM_WINDOWS_GUI. Если есть не все, что нужно, погугли, в сетке не раз встречал расширенное описание формата.


 
-=GaLaN=-   (2005-05-27 02:56) [35]

2Defunc:
Да, это я уже нашёл. И был прав, кстати, говоря, что если третий байт НЕ 50, то это DOS. :) Вопрос остался лишь в том, как из Win32 приложений отличить консольные...


 
Просто Джо ©   (2005-05-27 02:56) [36]


> Вопрос остался лишь в том, как из Win32 приложений отличить
> консольные...

См [34], константы Subsystem Values.


 
-=GaLaN=-   (2005-05-27 02:57) [37]

2Просто Джо:
Константы-то есть, кстати, нужная мне называется IMAGE_SUBSYSTEM_WINDOWS_CUI, однако больше в этом файле они нигде не используются...


 
Defunct ©   (2005-05-27 02:59) [38]

-=GaLaN=-   (27.05.05 02:56) [35]

Не может быть!!
Вы видимо смотрите только по одному dos exe-шнику.

Открыл у себя первый попавшийся DOS exe-шник, третий байт равен С0h

Да и разве не видно из приведенного в [33] заголовка, 3-й и 4-й байты показывают сколько байт занимает последняя страница exe файла.


 
Просто Джо ©   (2005-05-27 03:00) [39]


> однако больше в этом файле они нигде не используются...

а нужно?? Эти константы ты должен сравнивать со значением, полученным тобой из файла.
Но там может быть вообще что угодно, хотя бы и IMAGE_SUBSYSTEM_UNKNOWN. А консоль приложение само создаст с удовольствием после запуска. Поэтому лично мне и не ясен весь этот цирк. Уж извини.


 
-=GaLaN=-   (2005-05-27 03:05) [40]

2Defunct:
Я сказал НЕ 50, значит DOS. Внимательнее, пожалуйста. ;)

2Просто Джо:
Каким значением, полученным из файла? Каким образом полученным? Вы о чём вообще? :)
А цирк прост. Консоль-то приложение создаст. Но "ping www.ru" умрёт после того, как отработает. И если я сам хочу указать интерпретатор для обработки консольных приложений?



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.044 c
14-1120705203
Viktop
2005-07-07 07:00
2005.07.31
Установка Update на Delphi 2005


14-1120763384
Магнум
2005-07-07 23:09
2005.07.31
Ноутбук и зарядное устройство


1-1120999072
B-S-G
2005-07-10 16:37
2005.07.31
Изменить исполняемый файл


8-1111995656
DimKa
2005-03-28 11:40
2005.07.31
Методы интерполяции


3-1119572382
akhmadey
2005-06-24 04:19
2005.07.31
Как сохранить изменеия в таблице, используя UpdateSQL?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский