Следующая часть кода, по идее должна "нажать" и через 1 сек. "отжать" кнопку спикерфона на системном телефоне. Делается это довольно примитивно - посылая строку через функцию lineDevSpecific. Но, как выяснилось, проблема не связана с TAPI. Код (Text): .00401199: 6A0B push 00B ; длина строки ниже .0040119B: 6867304000 push 000403067 ; ptr to asciiz - "PUSH_BTN/N" .004011A0: 6A00 push 000 .004011A2: 6A00 push 000 .004011A4: 53 push ebx ; хэндл линии .004011A5: E80C070000 call lineDevSpecific .004011AA: 68E8030000 push 0000003E8 .004011AF: E8AE060000 call Sleep ; ждем 1 сек. .004011B4: 6A0B push 00B .004011B6: 6867304000 push 000403067 ; "PUSH_BTN/N" .004011BB: 6A00 push 000 .004011BD: 6A00 push 000 .004011BF: 53 push ebx .004011C0: E8F1060000 call lineDevSpecific Первый вызов отрабатывает ок, а второй возращает ошибку. Запустив это дело под API монитором (а затем и под дебаггером) я офигел - вместо строки "PUSH_BTN/N", во втором вызове от строки остается только хвост - "/N"! Люди добрые, объясните как такое может быть? Во время выполнения Sleep - строку кто то покоцал.. Кривой TSP драйвер? Лог SoftSnoop-а: Код (Text): 1-й вызов: API: lineDevSpecific(tapi32.dll), 00010367h, 00000000h, 00000000h, 00403067h="PUSH_BTN/N", 0000000Bh API: lineDevSpecific returned: 00010323h 2-й вызов: API: lineDevSpecific(tapi32.dll), 00010367h, 00000000h, 00000000h, 00403067h="/N", 0000000Bh API: lineDevSpecific returned: 00010312h Доп. инфа к размышлению: 1. В программе есть еще один треад обрабатывающий всякие тапишные эвенты. Эту строку он вообще никоим образом не трогает. 2. Кусок кода выше выполняется при создании окна (WM_CREATE)
Y_Mur указатель вида 000403067 обычно на стек не указывает у стека совсем другие адреса, при старте программы они вида 0012FFxx
Не должна по-идее - там поинтер на команду девайсу. Проясняется помаленьку: Строку грохает lineDevSpecificPostProcess вызываемый из lineDevSpecific. Вот кусок который соб-но и пишет в мои данные (какого-то хрена): Код (Text): .text:76EB30DD mov ecx, ebx .text:76EB30DF mov eax, ecx .text:76EB30E1 add esi, 28h .text:76EB30E4 shr ecx, 2 .text:76EB30E7 rep movsd ; В esi указатель на "/N", в edi ptr "PUSH_BTN/N" в моем .data Но опять же непонятно - после возврата из этой функции строка, если верить дебаггеру и своим глазам, цела. Портится она во время исполнения ф-ции Sleep. (Вот так вот, подло, во сне ;o)
movsd не портит строку, если на нее не указывает edi. Поставь бряк на запись в память на это строку (в олли) и посмотри, кто ее затирает.
ну тогда создай локальную переменную, копируй туда строку и передавай функциям указатель на эту локальную переменную. Тока ж перед вызовом функций обязательно копируй строку в эту переменную заново!
ну и шо? Если функция так устроена, что очищает строку, шо ты будешь делать? Писать свою функцию??? Не надо же для каждой строки создавать отдельную локальную переменную. Создай одну единственную и перед вызовом функции копируй в нее нужную строку. По-другому никак :-/
Всё равно есть ощущение, что кто-то хреново парсит строку. "..BTN/N" - достаточно каверзное окончание... Вопрос (уже риторический) кто? m$ tapi? Или разрабы TSP драйвера станции? Чтобы выяснить - надо перелопатить кучу враждебного кода. И потом, хоть убей, я не понимаю - нафига переписывать эту несчастную строку???
Зачем тебе переписывать или зачем ф-я ее затирает? Возможно, так совпали звезды. А вообще, почитай описание ф-ии. Возможно,она пишет в этот буфер какой-то ответ.
Мистики не бывает. Пользовательская программа не имеет права портить регистры EBX, EDI... Похоже, что ты на входе не сохраняешь, а на выходе не восстанавливаешь один из этих регистров.
Еще как бывает! Только в компьютерах из ниоткуда появляются ошибки и в никуда исчезают файлы. А объем измеряется в метрах и называется весом!
вот это правда мистика можешь выложить кусок работоспособного кода, де такое наблюдается? (а то твой дописывать лениво)
Естественно 2-е. Насчет описания - спасибо за совет. Так и есть - невнимательно я читал msdn. Там есть такое маленькое примечание: Спасибо огромное всем, кого я напрасно побеспокоил из за своей невнимательности...