Проблемы с вызовом API функций в ОС Windows

Тема в разделе "WASM.WIN32", создана пользователем Bill_Prisoner, 7 июл 2005.

  1. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Тема должна быть понятна, но я приведу пару примеров.

    1) Например, при вызове функции lstrcpy или похожей, если флаг направления стоит назад, то функция будет копировать байты при декременте приемника и источника. Т.е. флаг направления до вызова функции надо устанавливать на нормальный.



    2) При выполнении DLLEntry надо в начале выполнения Вашего кода сохранить регистры, а потом когда наш код выполнился надо восстановить регистры(конкренто - esi). Если мы не сохраним значение esi, то DLLEntry возвратиться неизвестно куда(известно, но неважно).
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    3) Ф-ции Windows API гарантируют, что не будут изменять регистры esi,edi,ebx,ebp, т.ч. Вы можете надеятся на их сохранность, НО Windows API требует такого же от Вас! Если Windows API вызывает Ваши ф-ции(DLLEntry, WndProc, etc), то последние не должны изменять esi,edi,ebx,ebp! (сохраняйте перед использованием и перед возвратом восстанавливайте)



    4) Многие Ф-ции Windows API не изменяют значение LastError! Т.ч. вызывая GetLastError Вы можете получить значение ошибки, установленное не последней ф-цией, а десятью ранее вызывавшейся! Вернее GetLastError нужно вызывать после того, как убедитесь, что ф-ция дала сбой (вернула в eax 0x00000000, 0xFFFFFFFF, и т.п.)
     
  3. _staier

    _staier New Member

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

    1)это не правда

    asm std end;

    lstrcpy(@b[0],a);

    showmessage(pchar(@b[0]));

    zeromemory(@b[1],10);

    asm cld end;

    lstrcpy(@b[0],a);

    showmessage(pchar(@b[0]));

    всё работает

    ( проверил в xpsp2)
     
  4. _staier

    _staier New Member

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

    пред вызовом надо ставить SetLastError(0);

    это где- то описано , я не помню где
     
  5. IceStudent

    IceStudent Active Member

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

    И так перед каждой функцией API? Не вижу смысла.
     
  6. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Когда я обнаружил, что под Win2000 у меня почти все глючит (ebx, esi, edi и флаг направления), меня слегка это зае#ало. Но потом сделал 2-а макроса inv_win и inva_win, которые сохраняют все регистры (мои) и подсовывают Винде ее ebx, esi, edi. Вызов правда стал длиннее на два push'а и идет через заглушку, но зато забот не знаю :)
     
  7. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    staier

    Да согласен, но я сказал с функцией "lstrcpy или похожей" потому что не помню точно с какой именно функцией возник такой трабл. Но он был. Так что будте осторожней!
     
  8. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Еще оказывается что когда мы кладем параметры в стек, то для некоторых функций перед этим значение esp должно быть выровнено на 4. Но вот вопрос - почему? И где это написано? Но это не работаети в 9x(mustdie)
     
  9. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Вот я и попался на выравнивании esp на 4.