Тема должна быть понятна, но я приведу пару примеров. 1) Например, при вызове функции lstrcpy или похожей, если флаг направления стоит назад, то функция будет копировать байты при декременте приемника и источника. Т.е. флаг направления до вызова функции надо устанавливать на нормальный. 2) При выполнении DLLEntry надо в начале выполнения Вашего кода сохранить регистры, а потом когда наш код выполнился надо восстановить регистры(конкренто - esi). Если мы не сохраним значение esi, то DLLEntry возвратиться неизвестно куда(известно, но неважно).
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, и т.п.)
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)
Когда я обнаружил, что под Win2000 у меня почти все глючит (ebx, esi, edi и флаг направления), меня слегка это зае#ало. Но потом сделал 2-а макроса inv_win и inva_win, которые сохраняют все регистры (мои) и подсовывают Винде ее ebx, esi, edi. Вызов правда стал длиннее на два push'а и идет через заглушку, но зато забот не знаю
staier Да согласен, но я сказал с функцией "lstrcpy или похожей" потому что не помню точно с какой именно функцией возник такой трабл. Но он был. Так что будте осторожней!
Еще оказывается что когда мы кладем параметры в стек, то для некоторых функций перед этим значение esp должно быть выровнено на 4. Но вот вопрос - почему? И где это написано? Но это не работаети в 9x(mustdie)