TimerProc и инициализированные данные

Тема в разделе "WASM.WIN32", создана пользователем cresta, 18 дек 2004.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Есть процедура таймера. Есть переменная PreferActive dd 0, расположена она в секции .data

    При попытке вписать что-либо в PreferActive в теле TimerProc, последняя просто прекращает свой ход. Т.е. операции, стоящие после mov PreferActive,1 просто не выполняются. Если же перенести PreferActive в секцию .data? то процедура нормально доходит до своего ret.



    Почему такой эффект?
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  3. Oleg_SK

    Oleg_SK Guest

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

    Покажи код...
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Вот вся процедура, без сокращений. Процедура расположена в .asm, секции .data и .data? - в .inc. Из других мест .asm переменная ведёт себя нормально


    Код (Text):
    1. TimerProc proc hWin:DWORD, uMsg:DWORD, idEvent:DWORD, dwTime:DWORD
    2.     LOCAL CurrID            :DWORD
    3.     LOCAL Buff[256]         :BYTE
    4.     LOCAL Buff_1[128]       :BYTE
    5.    
    6.     Call GetIntefaceCount   ;заполнение листбокса
    7.     ;получаем из реестра имя prefer интерфейса
    8.     invoke RegGetStringValue,HKEY_LOCAL_MACHINE,ADDR KeyName,ADDR ValuePrefer,ADDR Buff
    9.     invoke SendMessage,hListBox,LB_FINDSTRING,0,ADDR Buff
    10.     .if eax == LB_ERR    ;если его нет, выделяем первый
    11.         .if PreferActive==1 ;если prefer был,но исчез
    12.             mov PreferActive,0
    13.         .endif
    14.         mov CurrID,0
    15.     .else
    16.         mov CurrID,eax
    17.         mov PreferActive,1
    18.     .endif
    19.     ;до этого мессаджбокса не доходит.....
    20.     invoke MessageBox,NULL,ADDR Fucking_Data,ADDR Fucking_Data,MB_OK
    21.     ;и все последующие инструкции не выполняются тоже
    22.     invoke SendMessage,hListBox,LB_SETCURSEL,CurrID,0
    23.     push CurrID
    24.     Call FillListView
    25.     invoke IsIconic,hWnd
    26.     test eax,eax
    27.     jnz @F
    28.         Call DrawTraff
    29.         Call GetNetTime
    30.         invoke SecondsToTime,ADDR Buff,eax
    31.         invoke lstrcpy,ADDR Buff_1,ADDR szNetTime
    32.         invoke lstrcat,ADDR Buff_1,ADDR Buff
    33.         invoke lstrcat,ADDR Buff_1,SADD("  сек")
    34.         invoke SetDlgItemText,hWnd,IDC_STC6,ADDR Buff_1
    35.     @@:
    36.     ret
    37.  
    38. TimerProc endp




    Если перенести PreferActive в .data? или закомментировать строки, где она встречается, то процедура работает до конца
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Да, и ещё: PreferActive больше нигде не используется, только в этой процедуре. Я просто хотел немного переделать код, и начал с этой переменной, в других частях её пока что нет.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    bogrus



    Попробовал в твоем коде - работает и в .data и в .data?

    Правда у тебя один файл, без .inc, может это влияет как-то?
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    OllyDbg + бряк на TimerProc, один F9, потом по F8
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Блин, ещё одна такая же фигня: сделал специально в .data Var dd 0 в файле inc, и по нажатию кнопки, обработка которой в .asm, записал единственную инструкцию: mov Var,1. Результат - программа вылетела :dntknw:

    Перенёс Var dd 0 в .asm - работает. Интересный эффект, никогда не сталкивался раньше



    Видимо придётся в отладчик загружать...
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    cresta

    Вобще-то нужно все исходники показывать а также строку компиляции, может ты что с секциями нахимичил и у твоей .data стоит атрибут READONLY
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В отладчике программа ломится в ntdll при mov Var,1 и там происходит я понял обработка исключений и Process Terminared Exit Code 80 :dntknw:



    С секциями я вообще ничего не делал, как RadAsm установил, так и стоит.



    Исходник тут:

    P.S. Я там кнопку вставил, так и называется Var dd 0



    [​IMG] _564391095__Net Stat.zip
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    У тебя Var dd 0 расположена в секции .const.

    У меня masm выдал "Net_Stat.asm(125) : warning A4000: cannot modify READONLY segment".

    Сделал в Net Stat.Inc так
    Код (Text):
    1. ...
    2.     Counter             dd  0
    3.    
    4. .data?
    5.     Var                 dd 0
    6.     hInstance           dd ?
    7. ...
    программа работает, т.е. не вылетает с ошибкой.
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    cresta



    Не надо путать .const с .data, в .const помещают READONLY данные.
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Да, точно. А я чего-то думал, что они вроде как практически одно и то же :dntknw: Ну ясно в чем дело, спасибо :)