Ресурсы PE файла.

Discussion in 'WASM.WIN32' started by Sunzer, Jun 30, 2010.

  1. Sunzer

    Sunzer Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    256
    Дайте ссылки на маны по поводу ресурсов PE файла.
    Так же есть несколько вопросов.

    Например для того что бы руками извлечь первую серию иконок в файле,
    нужно в начале сохранить данные расположенные в Icon Groups это я так понимаю хидер иконок? Далее обходим и дописываем в файл, все остатки из группы ресурсов Icon?

    В итоге получится нормальная иконка на диске?

    Или что означает эллемент из Icon Grpoup? Так как размер не большой, это наверное структура. Что за структура?
     
  2. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    Sunzer,

    Может, что-то в этой жизни проходит мимо меня, и ждать три часа ответа в форуме (вместо пары простых запросов) доставляет какое-то удовольствие?
     
  3. Sunzer

    Sunzer Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    256
    Ман по форматам у меня есть, я уже понял, а про другой вопрос?
     
  4. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    Так второй запрос и выдаёт первой ссылку на MSDN, где хоть и коряво, но описаны структуры, входящие в состав заголовка группы иконок/курсоров. Корявость выражается в неправильном описании структуры RESDIR, должна быть такая:
    Code (Text):
    1. #pragma pack(push, 1)
    2. typedef struct {
    3.   union {
    4.     ICONRESDIR Icon;
    5.     CURSORDIR  Cursor;
    6.   };
    7.   WORD  Planes;
    8.   WORD  BitCount;
    9.   DWORD BytesInRes;
    10.   WORD  IconCursorId;
    11. } RESDIR;
    12. #pragma pack(pop)
    Заголовок .Ico файла несколько отличается: вместо WORD IconCursorId там DWORD BitmapOffset (смещение в файле самой иконки, что в общем-то логично: идентификаторов ресурсов в нём нет).
     
  5. Sunzer

    Sunzer Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    256
    Я верно описал структуру?
    Code (Text):
    1. struct RT_ICON_GROUP
    2. {
    3. 00 00 // Должно быть 0
    4. 01 00 // ICO формат
    5. 01 00 // Кол-во иконок
    6. // Далее идут по порядку массивы структур
    7. 30 // Ширина
    8. 30 // Высота
    9. 00 // ColorCount
    10. 00 // Reserved
    11. 01 00 // Planes
    12. 08 00 // BitCount
    13. A8 0E 00 00 // Размер иконки
    14. 32 // ID Первого уровня в директории ресурсов RT_ICON
    15. 00 // ID Второго уровня в директории ресурсов RT_ICON
    16. };
    Особенно интересует два последних байта

    Code (Text):
    1. 32 // ID Первого уровня в директории ресурсов RT_ICON
    2. 00 // ID Второго уровня в директории ресурсов RT_ICON
    А как быть, если в имени ресурса установлен 31 бит, и это ссылка на имя, как тогда будут выглядеть две записи выше? А так я уже разобрался с ресурсами.

    А самый главный вопрос, что бы сохранить первую группу иконок, нужно:
    Выгрузить первый хидер, дозаписать иконки, которые указаны в хидере, поправить хидер(указатели на иконки на диске) Так?

    [​IMG]

    Значение CodePage на что влияет?

    14 Сдампленых байт:

    Code (Text):
    1. 00 00
    2. 01 00
    3. 01 00 // Кол-во иконок
    4. 20 // Ширина
    5. 20 // Высота
    6. 10 // ColorCount
    7. 00 // Reserved
    8. 01 00 // Planes
    9. 04 00 // BitCount
    10. E8020000 // Размер иконки
    11. 3175
    7531h == 30001d
    Это указатель на иконку, ее имя в ресурсках RT_ICON?
    [​IMG]

    А может быть такое что в RT_ICON есть иконка, имя которой с установленным 31 битом, это ведь будет RVA на имя ресурса,тогда эксплорером это не распознается? Ведь судя по структуре выше такое не возможно?