Как вручную отыскать иконку в ресурсах?

Тема в разделе "WASM.BEGINNERS", создана пользователем int2e, 23 фев 2009.

  1. int2e

    int2e New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2009
    Сообщения:
    169
    САБЖ
    нужно вручную (без апи тобто) выдрать значок приложения.
    Как это сделать?

    В принципе рекурсивно пройтись по дереву я сумею
    А вот названий переменных и констант, на которые нужно ориентироваться - не знаю

    Подскажите, в процессе пробежки по дереву ресурсов, как определить, что мы нашли иконку файла? Какие значения с какими константами сравнивать?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Тоже когдато интересовался, даже реверсил апи..
    Весь функционал в четырёх файлах, это win2k\private\ntos\w32\ntuser\client\
    > extract.c
    > clres.c
    > rtlres.c
    > acons.c
    Ищется ресурсы типа RT_ICON и тп., если нету то напиши могу дать.
     
  3. int2e

    int2e New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2009
    Сообщения:
    169
    задача простая, просто перенести с одного ехе на другой иконку, а все остальное срезать
    при этом ни ид, ни имени заранее неизвестно
    и я хз как реализовать
     
  4. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Все ресурсы организованы в дерево. На первом уровне Type, на втором Language, на третьем - Name (вроде бы так). Как уже выше было сказано, иконки хранятся с Type = RT_ICON (типы можно глянуть в файлике WinUser.h из Platform SDK идущего со студией). Применительно к иконке скорее всего язык будет один. Таким образом задача простая. Найти поддерево с типом RT_ICON, пройти его все в поисках ресурса с заданным именем. Как то писал код, который получает список всех ресурсов и выводит их содержимое без всяких API, за исключением ReadFile, CreateFile. Могу показать рабочий код, если не получится.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Насколько понимаю описатели иконок обьеденяются в директорию(ресурс RT_GROUP_ICON). Каждый элемент этой директории описывает иконку в ресурсах(её размер и количество цветов). Первую там отображает проводник.
    Значит нужно вначале найти эту директорию и извлечь ID иконки. Затем ищем директорию типа RT_ICON, там массив иконок. Берём по найденному ID первую. Собственно в сурцах всё есть, смотри ExtractIconFromEXE(), CreateIconFromResourceEx().
    Тока это в файл затолкать проблемно.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    наоборот
    ты не совсем прав. В группе иконок да, берется первая. А вот в ресурсе RT_ICON проводник из этой группы выбирает лучшую, а не первую, и отображает ее
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    MSoft
    Не совсем так.. когда раньше я компилировал экзешник с несколькими иконками определёнными в .rc последовательно, то не зависимо от качества иконки отображалась первая. Хотя не уверен. Вероятно берётся первая, которой ID наименьший.