Помогите, плиз, разобраться: почему масдай не хочет запускать мою программу?

Тема в разделе "WASM.WIN32", создана пользователем Oleg_SK, 22 апр 2005.

  1. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Захотел я протестировать работу одной своей утилитки под Windows 98 SE. Попытался запустить ее и обломался. Масдай выдает мне сразу два сообщения. Первым появляется сообщение об ошибке в заголовке которого указан путь к моей программке, а само сообщение говорит о том, что запуск программы невозможен, т.к. она имеет неверный формат. Вторым появляется сообщение в заголовке которого говорится о том, что произошла ошибка при запуске программы, а само сообщение говорит о том, что файл моей программы по-видимому поврежден и советует переустановить файл и повторить попытку. При этом, под Windows 2000 этот же exe-файл запускается нормально. Помогите мне разобраться: из за чего происходит эта трабла? При создании утилиты использовался MASM32 v8.2 и RadASM. Для ассемблирования и линкования использовались те ключи, которые RadASM v2.2.0.0. предлагает по умолчанию для релизной версии проекта.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Было у меня такое после использования всяких rebuilder'ов, левых упаковщиков, совмещения секций.
     
  3. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Quantum

    Нет, я ничего такого не использовал! Да и вообще не делал IMHO ничего, что могло бы привести к такому результату.



    З.Ы.: Масдай у меня свежеустановленный. Я еще даже не успел поставить никаких драйверов. Может быть трабла из-за этого?
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Oleg_SK

    Перекомпилить масмом с параметрами по умолчанию (как в примерах). Может в радасме настройки какие-то слишком минималистские...





    Но другие программы ведь запускаются?
     
  5. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Попробуйте запустить прогу (она в аттаче) под своим масдаем и сообщите получится это или нет.

    [​IMG] _1989391542__FileDoctor.exe
     
  6. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Quantum



    Настройки вроде бы нормальные:

    Ассемблер: 3,O,$B\ML.EXE /c /coff /Cp /nologo /I"$I",2

    Линковщик: 5,O,$B\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5",3,4





    Обычные Win-приложения (калькулятор, Paint) запускаются без проблем.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Oleg_SK

    Там таблица коэффициентов в отдельной секции. Это имеет смысл делать в DLL, но в экзешнике лучше все данные свалить в одну секцию. Скорее всего дело именно в этом.
     
  8. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Quantum

    Попробовал я переместить эту таблицу в секцию .data (а ту секцию, где она была раньше, удалил), но это не помогло...



    З.Ы.: Дополнительная секция нужна для того, чтобы в ней можно было задать такое выравнивание, которое нельзя сделать в секции .data (в данном случае: align 32).
     
  9. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    А, опять с несовместимостью столкнулись!? :)



    Я попробую вечером, у меня дома P-166 Win98, самая лучшая машина для тестирования.
     
  10. l0kki

    l0kki New Member

    Публикаций:
    0
    Регистрация:
    7 май 2004
    Сообщения:
    22
    Адрес:
    Russia
    ага машина зверь... вобще на xp sp2 запускается нормально... может со стеком что? а то у тебя как то резко все с GetModuleHandle все начинается...

    а что если RtlZeroMemory на ZeroMemory заменить? будет какой нибудь эффект?

    ps. а зачем нам тут калькулятор? не, нам калькулятор не нужен, этож сишный засланец :)
     
  11. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    на COMCTL32.dll стоит ординал, это нехорошо.
     
  12. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    NoName



    Из этой dll-ки моей программе нужна только функция InitCommonControls. Я кстати тоже удивился что вместо имени этой функции используется ординал...



    l0kki



    Программа использует те настройки стека, которые MASM32 дает по умолчанию...





    Даже если убрать из программы вызов функции RtlZeroMemory, проблема не устраняется.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Quantum



    Я долго не мог понять, что происходит с файлом при компиляции. Первый раз всё ок, компилирую второй раз - файл повреждён. Взглянул на него - отсутствует MZ- заголовок, т.е. сразу идёт РЕ.



    Позже разобрался - дело в /incremental и своём stub'e. Без /incremental файл получается нормальный с любыми, даже "извращёнными" заглушками..





    Но что здесь - сразу не понятно. Возможно, дело в новой секции. Хотя убил её из заголовка PeEditor'ом, не помогло.

    Win98 SE OEM.



    Oleg_SK

    Если хочешь, можешь выслать исходник, попробую у себя перекомпилировать.





    Он всегда там стоит, InitCommonControls так и вызывается
     
  14. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Такие штуки бывают, если у проги есть ресурсы, у которых идентификаторы > 32767
     
  15. sen

    sen New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2005
    Сообщения:
    47




    а забавно, однако... Даже при внимательном рассмотрении файло кажется абсолютно правильным. По крайней мере что касается заголовка и секций.



    Ординал, стек и имена функций к проблеме никакого отношения не имеют вообще.



    Можно подозревать что 98 отчего-то не понравились твои ресурсы и в частности диалоги. По крайней мере сразу видно несоотвествие language с кодировкой строк.Убери диалоги (ресурсы) вместе с кодом который к ним обращается - тебе ведь сейчас главное понять обо что 98 спотыкается.







    тогда смотри как там ресурсы устроены
     
  16. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Oleg_SK



    В ресурсах поменяй ординал диалога 34464 на любой номер меньше 32768.



    P.S. С тебя 50$ ;)
     
  17. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Закралось тут мне в голову одно подозрение… Мне показалось что трабла вполне могла возникнуть из-за того, что ординал функции InitCommonControls для Windows 98 SE может отличаться от такового в Windows 2000 Pro. Дело в том, что я когда-то обновил lib-файлы в своем пакете MASM32, взяв соответствующие файлы из пакета MS Platform SDK for Windows 2000. Начал я копать в эту сторону. Я нашел программу которая использует функцию InitCommonControls и в тоже время нормально запускается под масдаем, и сравнил ее импорт функции InitCommonControls с импортом своей утилитки. Вот что у меня получилось:



    Thunk RVA Thunk Offset Thunk Value Hint/Ordinal API Name

    Моя утилитка: 00008000 00006800 80000011 0011 (by ordinal)



    Работающая прога: 00005118 00001F18 000052CC 003E InitCommonControls



    Сразу видно что эти строки отличаются. Особенно мне бросилось в глаза что отличаются ординалы. Чтобы проверить свое подозрение я восстановил в своем MASM32 старые lib-файлы, и заново сассемблировал и слинковал свою утилитку. Посмотрев теперь на ее импорт я увидел, что теперь функция InitCommonControls импортируется по имени и ординал ее совпадает с тем, который я вижу в работающей программе. Ну, подумал я, теперь трабла, по идее, возникать не должна, но я ошибся… При запуске утилитки под масдаем все осталось по прежнему.



    IceStudent

    OK, сейчас вышлю...



    All

    К сожалению проект утилитки даже в архиве занимает ~262Kb (это для меня не очень маленький размер), поэтому я вероятно не смогу выслать его всем желающим.
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Нет, это не критично.



    TarasCo

    Ты прав. Но почему так? Разве загрузчик смотрит в ресурсы при загрузке? Я считал, что его дело только загрузить секцию в память. Другое дело, что при загрузке этого диалога возникла бы ошибка.
     
  19. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    По спецификации PE, ordinal ресурса может быть макс. 31 бит.

    А здесь макс. 15.

    М.б. этот баг связан с тем, что w9x насквозь 16-битная для модулей gdi/user.

    Я сразу пробежался пробежался по ресурсам и этот орд. 34464 в глаза бросился. Я ещё не забыл макрос MAKEINTRESOURCE, который принимает word. ;)
     
  20. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    TarasCo и _BC_

    Да, был у меня диалог с таким идентификатором. Он в данной версии утилитки пока не нужен, поэтому я его кильнул. К стати он даже не вызывался из программы, т.е. это был мусор. К сожалению, проблема не исчезла... Приаттачиваю перекомпилиную утилитку. При ее сборке я использовал "родные" lib-файлы из пакета MASM32, а также в ней исправлены указанные вами баги.



    sen

    Убери диалоги (ресурсы) вместе с кодом который к ним обращается - тебе ведь сейчас главное понять обо что 98 спотыкается.

    Сейчас попробую это сделать. Позже сообщу о результатах.



    IceStudent

    Минут через 5-10 я вышлю тебе архив с проектом.



    [​IMG] _2045104667__FileDoctor.exe