чистый WinAPI в C++

Тема в разделе "LANGS.C", создана пользователем BlagJack, 28 мар 2009.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    инфа о путях в хиедр идет.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Эм... В заголовок? У меня Debug Data после IAT. Формата Debug Data не знаю, но ещё после таблицы импорта идёт какая-то атрибутика и собственно путь.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В детали PE лезть лень, а в HEX редакторе ничего похожего на пути не вижу. Отладочная инфа разрешена, pdb нормально генерируется. Размер exe от запрета не меняется.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А кстати, кто знает - зачем студия по умолчанию цепляет манифест?
    Для XP контролов он всё равно не годится - нужен другой.
    В качестве шаблона тоже - создается при компиляции, а не при генерации проекта.
     
  5. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    да, манифест - фейл.
    вся студия после выхода vc6 является огромным фейлом.

    демотиватор нарисовал бы, но это уже будет пошло.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А разобрался - он чтобы CRT из dll нормально цеплялся, соответственно при компиляции с /MT или без CRT бесполезен. А манифест для XP это отдельная история он цепляется и при отключенной генерации манифеста в опциях линкера.
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Вот мы тоже удивлялись, когда однажды в проекте, собранном со статической CRT, обнаружили студийный манифест для длл. Из-за этого на системах без студийных длл'ок такое приложения по идее не стало бы запускаться.

    Оказалось, что в файле <crtdefs.h>, который включён в кучу библиотек, есть такие строчки:
    Код (Text):
    1. ...
    2.     #if !defined(_CRT_FORCE_MANIFEST) && defined(_VC_NODEFAULTLIB)
    3.         #define _CRT_NOFORCE_MANIFEST
    4.     #endif
    5.  
    6. ...
    7.  
    8. #include <crtassem.h>
    9.  
    10. ...
    11.  
    12. #if !defined(_CRT_NOFORCE_MANIFEST)
    13. #ifdef _M_IX86
    14.  
    15. #ifdef _DEBUG
    16. #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
    17.         "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "         \
    18.         "version='" _CRT_ASSEMBLY_VERSION "' "                          \
    19.         "processorArchitecture='x86' "                                  \
    20.         "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    21. #else
    22. #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
    23.         "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              \
    24.         "version='" _CRT_ASSEMBLY_VERSION "' "                          \
    25.         "processorArchitecture='x86' "                                  \
    26.         "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    27. #endif
    28.  
    29. #endif  /* _M_IX86 */
    30.  
    31. #ifdef _M_AMD64
    32. ....
    33.  
    34.  
    35. crtassem.h:
    36. #define __LIBRARIES_ASSEMBLY_NAME_PREFIX "Microsoft.VC90"
    37. #define _VC_ASSEMBLY_PUBLICKEYTOKEN "1fc8b3b9a1e18e3b"
    38. #define _CRT_ASSEMBLY_VERSION "9.0.21022.8"
     

    Кстати, удобный способ цеплять манифест для стилей:
    Код (Text):
    1. //
    2. // styles.h
    3. //
    4. //     Include this file
    5. //             @
    6. // Enable Visual Styles Support
    7. //
    8. #pragma once
    9.  
    10. #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' "\
    11.         "version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
     

    Если момент — физический размер секций не обязательно должен быть кратен 200h (в PE спецификации сказано иное хотя). В винде можно использовать меньшее значение — в этом случае и размер файла можно будет уменьшить. Правда, линкер от МС этого делать не умеет (впрочем, этому его несложно научить, также как и объединению "необъединяемых" секций :).
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Sol_Ksacap
    Ну во-первых, 2,5 КБ кратно 200h. Во-вторых, никто ж не спорит, что возможно меньше. Можно вообще без секций. Но, как Вы правильно заметили, "линкер от МС этого делать не умеет". А странновато, т.к. непонятно, что туда линкер у Y_Mur напихал. Если не объединять секции, то у меня 2 КБ и сплошные пустоты.
    А где они необъединямые? Они объединяются. В результате exe занимает 1 КБ. И, кстати, в нём остаётся ещё полно места.
     
  9. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    драстье. с какого перепугу линкер от мс этого не умеет? минимальный раземер exe, собираемого ms link - полкило. это это без всяких хаков. и он работает на любой NT.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    kaspersky
    Полкилобайта всё ещё кратно 200h. :)
    P.S. Хотя... каким образом получается PE размером в 512 байт? 512 на заголовок и 512 на единственную секцию. Как сделать ещё меньше "без всяких хаков"?
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Глянул в olli - оказывается соврал :)) система после retn не выбрасывает eax, а передаёт его в ExitTread, так что можно без CRT возвращать код завершения как return xxx;. Впрочем просто return; там всё равно компилируется как return 0, даже если void main(void).
    Разглядел повнимательнее - действительно путь появляется/исчезает при разрешении/запрете pdb, но размер не меняется, может express линкер такой "особенный" впрочем для меня это не существенно :)
     
  12. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    На некоторые имена секций наложен запрет (лайк, "выглядит так, будто ты пытаешься сделать что-то с 'особой' секцией. Просто чтобы быть в безопасности, мы не будем линковать этот беспорядок"). Среди таких секций — .pdata (информация об исключениях для x64),.. Ээ, не помню, какие ещё секции.


    Выглядит лайк, мы неясно сформулировали мысль — в прошлом посте мы лишь хотели сказать, что ms link не умеет выставлять секциям физический размер меньше 200h. Кстати, насчёт совместимости у таких (Sections.PhysicalSize < 200h) экзешников — везде не проверяли, мб на 2k или NT4 не будет работать.


    Решили попробовать собрать HelloWorld без секций. (HelloWorld-payload в dos-стабе). Без хаков. Пока что добились падения линкера на финальной стадии сборки; если позволить внешним силам вмешаться и помешать падению, то собирается файл 424б (what?), при попытке просмотреть который с помощью CFF Explorer намертво виснет уже CFF Explorer. Это нас весьма позабавило. Сейчас ещё попытаемся — должны быть дополнительные варианты.