Как идентифицировать иконку?

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как идентифицировать иконку?

Сообщение ger_kar » 10.03.2012 (Сб) 20:35

iGrok писал(а):EnumResourceNames по RT_ICON -> EnumResourceLanguages по найденным -> FindResourceEx -> LoadResource.Далее LockResource выдаст тебе указатель на данные, а SizeOfResource - размер даных.Вот эти-то данные тебе и нужны.
Спасибо за помощь. Я понял, что в случае с ExtractIcon это видимо тупиковый путь. Только я вот одного не могу понять.
Из описания
Функция ExtractIcon извлекает дескриптор значка из указанного исполняемого файла, динамически подключаемой библиотеки (DLL) или файла значка.

iGrok писал(а):EnumResourceNames по RT_ICON -> EnumResourceLanguages по найденным -> FindResourceEx -> LoadResource.

Функция LoadResource загружает указанный ресурс в глобальную память
Если функция завершается успешно, возвращаемое значение - дескриптор данных, связанных с ресурсом

Я так и не понял что за дескриптор я получал посредством ExtractIcon. Или функция извлекает дескриптор, но при этом в память ничего не загружает в отличии от цепочки EnumResourceNames по RT_ICON -> EnumResourceLanguages по найденным -> FindResourceEx -> LoadResource?
В чем основное отличие дескриптора полученного посредством ExtractIcon и через цепочку?
Кстати а зачем EnumResourceLanguages вообще здесь нужна, что то она сюда не очень вписывается, я же не со строковыми ресурсами работаю?
Бороться и искать, найти и перепрятать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как идентифицировать иконку?

Сообщение iGrok » 11.03.2012 (Вс) 1:33

ExtractIcon, по-моему, возвращает всё-таки не группу, а просто HICON. Т.е. то же самое, что и в предыдущем варианте (PrivateExtract...)
Плюс я не помню, какую конкретно иконку у группы она берёт. По-моему, из группы автоматом выбирается иконка с оптимальной для текущих настроек экрана цветностью и "стандартным" для текущих настроек разрешением (32*32, например).

Отличие в том, что через последовательность вызовов *Resource*-функций ты можешь получить ЛЮБОЙ ресурс из файла, а не только то, что тебе выдаёт ExtractIcon. Поэтому в твоём случае нужно использовать как раз эту "цепочку".

Ресурсы хранятся в виде дерева с тремя (сам формат хранения позволяет создавать и больше уровней, но в винде используется только три) уровнями вложенности. Первый уровень - тип (RT_ICON, RT_GROUP_ICON, RT_BITMAP, какой-то кастомный тип, etc). Второй уровень - строковое имя ресурса или его числовой ID. Третий уровень - LanguageId. Соответственно, может быть несколько языковых версий любого ресурса любого типа, и желательно сравнивать их все.
label:
cli
jmp label

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как идентифицировать иконку?

Сообщение ger_kar » 11.03.2012 (Вс) 8:25

iGrok писал(а):ExtractIcon, по-моему, возвращает всё-таки не группу, а просто HICON.
Если при вызове ExtractIcon последним параметром передавать 0хFFFFFFFF то ф-ция возвращает количество групп иконок. Проверял на разных файлах, всегда возвращает правильное количество групп, такое-же какое показывают редакторы ресурсов. В дальнейшем при вызове ExtractIcon с последним параметром содержащим номер группы, начиная с нуля, ф-ция возвращает дескрипторы. Но вот вопрос что за дескриптор она возвращает? Толи дескриптор группы, то ли действительно из группы выбирает наиболее подходящий значок и возвращает его дескриптор тут не очень понятно, но все таки хотелось бы знать это точно.
Полученные этой функцией дескрипторы пробовал применить с DrawIcon, для рисования значков на форме, все рисует корректно. Но опять же непонятно то ли DrawIcon используя готовый дескриптор отдельного значка просто рисует его в указанный контекст, либо все таки в зависимости от данного контекста сама выбирает нужный значок из группы, дескриптор которого был передан. С одной стороны логично, что именно DrawIcon производит выборку, так как именно она знает в отличии от ExtractIcon, с каким контекстом предстоит работать, но с другой стороны в описании ExtractIcon речь идет о значке, но ни как не о группе. Или группа значков для разных режимов отображения это и есть значок? Тогда, что такое группа?
Пока искал ответы на свои вопросы нашел такую информацию:
Когда система показывает на экране значок, она должна извлечь соответствующее изображение значка из .exe или .dll файла. Система использует нижеследующие шаги, чтобы выбрать изображение значка:
Выбирирается ресурс RT_GROUP_ICON. Если существует более чем один такой ресурс, Windows NT Microsoft / Windows 2000/Windows XP используют первый ресурс, перечисленный в сценарии ресурса, в среде Windows 95/Windows 98/Windows Millennium Edition (Windows ME) выбирается первый ресурс, перечисленный в алфавитном порядке.
Выбирается соответствующее изображение RT_ICON из ресурса RT_GROUP_ICON. Если существует более чем одно изображение, система использует нижеследующие критерии, чтобы выбрать изображение:
Изображение, самое близкое к затребованному выбором размеру.
Если присутствуют два или больше изображения одного и того же размера, выбирается тот, который соответствует насыщенности цвета дисплея.
Если нет изображения точно соответствующего насыщенности цвета дисплея, выбирается изображение с самой большой насыщенностью цвета, которая не выходит за пределы насыщенности цвета дисплея. Если все они выходят за пределы насыщенности цвета, выбирается изображение с самой нижней насыщенностью цвета. Обратите внимание! на то, что система обрабатывает все насыщенности цвета 8 bpp или больше как равные. Поэтому, нет никакого преимущества включения изображения 16x16 с 256 цветами и изображения 16x16 с 16 цветами в том же самом ресурсе — система просто выберет первый, с которым она встретится. Когда дисплей находится в режиме 8-bpp, система предпочтет значок с 16 цветами значку с 256 цветами и покажет на экране все значки, используя системную палитру по умолчанию.
Бороться и искать, найти и перепрятать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как идентифицировать иконку?

Сообщение iGrok » 11.03.2012 (Вс) 14:55

Ну, а я что написал? ExtractIcon возвращает кол-во групп, или хэндл одной "оптимальной" иконки из выбранной группы.
Я только не был уверен, по какому принципу она выбирается.

DrawIcon рисует одну иконку, про группы она ничего не знает.
label:
cli
jmp label

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как идентифицировать иконку?

Сообщение Antonariy » 12.03.2012 (Пн) 11:47

ger_kar писал(а):Чистая флешка вставляется в зараженный компьютер. И после того, как она там побывала, на ней вместо папок появляются файлы *.lnk и *.exe с одноименным названием, а сами папки в лучшем случае становятся системными и невидимыми, а иногда переносятся в созданный в корне каталог \.., а в худшем удаляются или шифруются файлы.
Так может и проверять наличие этих признаков, а не иконки сравнивать? Я вообще видел лишь когда папки становятся системными и невидимыми.
Лучший способ понять что-то самому — объяснить это другому.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как идентифицировать иконку?

Сообщение ger_kar » 12.03.2012 (Пн) 14:33

Вообще сравнение будет идти по многим критериям, и проверка иконки будет одним из них. Причем проверятся это будет в самую последнюю очередь, если предыдущих оценок было недостаточно, что-бы принять решение об удалении файла. Это будет работать у клиентов, поэтому лучше перестраховаться и проверить еще один признак, чем удалить что нибудь полезное. Те файлы, которые попали под подозрение, но в отношении которых имеются сомнения, будут вместо удаления перемещаться в спец. папку.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как идентифицировать иконку?

Сообщение ger_kar » 15.03.2012 (Чт) 22:13

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

Пред.

Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList