Трабла с строкой. Несколько мистического плана...

Тема в разделе "WASM.WIN32", создана пользователем ALLeX, 16 мар 2007.

  1. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    Следующая часть кода, по идее должна "нажать" и через 1 сек. "отжать" кнопку спикерфона на системном телефоне. Делается это довольно примитивно - посылая строку через функцию lineDevSpecific. Но, как выяснилось, проблема не связана с TAPI.

    Код (Text):
    1. .00401199: 6A0B             push        00B           ; длина строки ниже
    2. .0040119B: 6867304000    push        000403067 ; ptr to asciiz - "PUSH_BTN/N"
    3. .004011A0: 6A00             push        000
    4. .004011A2: 6A00             push        000
    5. .004011A4: 53                 push        ebx          ; хэндл линии
    6. .004011A5: E80C070000    call        lineDevSpecific
    7. .004011AA: 68E8030000    push        0000003E8
    8. .004011AF: E8AE060000    call        Sleep         ; ждем 1 сек.
    9. .004011B4: 6A0B              push        00B
    10. .004011B6: 6867304000     push        000403067  ; "PUSH_BTN/N"
    11. .004011BB: 6A00              push        000
    12. .004011BD: 6A00              push        000
    13. .004011BF: 53                  push        ebx
    14. .004011C0: E8F1060000     call        lineDevSpecific
    Первый вызов отрабатывает ок, а второй возращает ошибку. Запустив это дело под API монитором (а затем и под дебаггером) я офигел - вместо строки "PUSH_BTN/N", во втором вызове от строки остается только хвост - "/N"! Люди добрые, объясните как такое может быть? Во время выполнения Sleep - строку кто то покоцал.. Кривой TSP драйвер?
    Лог SoftSnoop-а:
    Код (Text):
    1. 1-й вызов:
    2. API: lineDevSpecific(tapi32.dll), 00010367h, 00000000h, 00000000h, 00403067h="PUSH_BTN/N", 0000000Bh
    3. API: lineDevSpecific returned: 00010323h
    4. 2-й вызов:
    5. API: lineDevSpecific(tapi32.dll), 00010367h, 00000000h, 00000000h, 00403067h="/N", 0000000Bh
    6. API: lineDevSpecific returned: 00010312h
    Доп. инфа к размышлению:
    1. В программе есть еще один треад обрабатывающий всякие тапишные эвенты. Эту строку он вообще никоим образом не трогает.
    2. Кусок кода выше выполняется при создании окна (WM_CREATE)
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А куда ведёт "ptr to asciiz" - не в стек ли случаем?
     
  3. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    .data
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Y_Mur
    указатель вида 000403067 обычно на стек не указывает ;)
    у стека совсем другие адреса, при старте программы они вида 0012FFxx
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а lineDevSpecific ничего не должна записать в буфер строки?
     
  6. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    Не должна по-идее - там поинтер на команду девайсу.

    Проясняется помаленьку: Строку грохает lineDevSpecificPostProcess вызываемый из lineDevSpecific.
    Вот кусок который соб-но и пишет в мои данные (какого-то хрена):
    Код (Text):
    1. .text:76EB30DD                 mov     ecx, ebx
    2. .text:76EB30DF                 mov     eax, ecx
    3. .text:76EB30E1                 add     esi, 28h  
    4. .text:76EB30E4                 shr     ecx, 2
    5. .text:76EB30E7                 rep movsd           ; В esi указатель на "/N", в edi ptr "PUSH_BTN/N" в моем .data
    Но опять же непонятно - после возврата из этой функции строка, если верить дебаггеру и своим глазам, цела. Портится она во время исполнения ф-ции Sleep. (Вот так вот, подло, во сне ;o)
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    movsd не портит строку, если на нее не указывает edi. Поставь бряк на запись в память на это строку (в олли) и посмотри, кто ее затирает.
     
  8. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    Да, забыл добавить в коде выше edi=00403067h т.е. как раз моя строка.
     
  9. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну тогда создай локальную переменную, копируй туда строку и передавай функциям указатель на эту локальную переменную. Тока ж перед вызовом функций обязательно копируй строку в эту переменную заново!
     
  10. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    Так и сделал. Даже работает. Но это не есть карашо - у меня тысча таких вот строк...
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну и шо? Если функция так устроена, что очищает строку, шо ты будешь делать? Писать свою функцию??? Не надо же для каждой строки создавать отдельную локальную переменную. Создай одну единственную и перед вызовом функции копируй в нее нужную строку. По-другому никак :-/
     
  12. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    Всё равно есть ощущение, что кто-то хреново парсит строку. "..BTN/N" - достаточно каверзное окончание... Вопрос (уже риторический) кто? m$ tapi? Или разрабы TSP драйвера станции? Чтобы выяснить - надо перелопатить кучу враждебного кода. :dntknw: И потом, хоть убей, я не понимаю - нафига переписывать эту несчастную строку???
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Зачем тебе переписывать или зачем ф-я ее затирает? Возможно, так совпали звезды. А вообще, почитай описание ф-ии. Возможно,она пишет в этот буфер какой-то ответ.
     
  14. MikDay

    MikDay New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    32
    Адрес:
    Minsk
    Мистики не бывает.
    Пользовательская программа не имеет права портить регистры EBX, EDI...
    Похоже, что ты на входе не сохраняешь, а на выходе не восстанавливаешь один из этих регистров.
     
  15. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Еще как бывает! Только в компьютерах из ниоткуда появляются ошибки и в никуда исчезают файлы. А объем измеряется в метрах и называется весом! :)
     
  16. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вот это правда мистика
    можешь выложить кусок работоспособного кода, де такое наблюдается? (а то твой дописывать лениво)
     
  17. ALLeX

    ALLeX Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    141
    Адрес:
    Ukraine
    Естественно 2-е. Насчет описания - спасибо за совет. Так и есть - невнимательно я читал msdn. :dntknw: Там есть такое маленькое примечание:

    Спасибо огромное всем, кого я напрасно побеспокоил из за своей невнимательности... :dntknw:
     
  18. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    тада не нада
    по крайней мере, пока я не куплю себе LG-Nortel ))