"invoke Sleep" иногда не работает...

Тема в разделе "WASM.WIN32", создана пользователем AsmGuru62, 25 апр 2009.

  1. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Странная штука: в одном и том же EXE файле есть вызовы "invoke Sleep, nnn". Сделано, для задержки вывода, чтобы успеть прочитать информацию. Программа - не консоль (!), а сэмулированная консоль, т.е. обычный CreateWindow() с WM_PAINT и прочими делами, но сделано для вывода текста (цвет букв нужен был в True Color).

    Два thread-а: основной, принимающий WM_CHARs от пользователя и другой (запущенный через CreateThread), где происходит действие и вывод в окно.

    Короче, в некоторых местах второго thread-а нет задержек, хотя есть "invoke Sleep, nnn".
    Кто-то видел такое ранее?

    Проходя по этому месту (F8 в Olly) - задержки нет. Очень странно.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Какие параметры передаются в NtDelayExecution ?
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Clerk в своем стиле.
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Таким вот образом:
    Код (Text):
    1. push    0092FDFAh
    2. push    00000000h
    3. call    NtDelayExecution
    4. ;
    5. ; EAX = 80000002h (похоже на код ошибки, но LastError=0)
    6. ;
    А где-то есть литература по недокументированным функциям NTDLL?
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    AsmGuru62
    про это?
    есть у НЕББЕТА , но смотри по Zw* аналогам
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. STATUS_DATATYPE_MISALIGNMENT     equ 80000002h
    Выравнивайте стек на 4(если параметр в нём).
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Строка кода (не работающая):
    Код (Text):
    1. invoke Sleep, 800
    Здесь вроде нет переменных. Стек всегда выровнен (там, у меня в коде стоят Assertions про это).
    Хорошо, с этим мы будет бороться... посмотрю на выравнивание для NtDelayExecution().
    В крайнем случае можно зациклить GetTickCount() или что-то похожее.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AsmGuru62
    Не выровнен у вас стек. 92FDFAh
    Почему - да потомучто в виндоз можно использовать только переменные кратные 4, а у вас там гдето либо в локальных переменных выделяется лишний ворд, либо юзается функция которая требует на входе нечто кратное двум.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. NTSTATUS
    2. NtDelayExecution (
    3.     __in BOOLEAN Alertable,
    4.     __in PLARGE_INTEGER DelayInterval
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This function delays the execution of the current thread for the specified
    12.     interval of time.
    13.  
    14. Arguments:
    15.  
    16.     Alertable - Supplies a boolean value that specifies whether the delay
    17.         is alertable.
    18.  
    19.     DelayInterval - Supplies the absolute of relative time over which the
    20.         delay is to occur.
    21.  
    22. Return Value:
    23.  
    24.     NTSTATUS.
    25.  
    26. --*/
    27.  
    28. {
    29.  
    30.     LARGE_INTEGER Interval;
    31.     KPROCESSOR_MODE PreviousMode;
    32.  
    33.     //
    34.     // Get previous processor mode and probe delay interval address if
    35.     // necessary.
    36.     //
    37.  
    38.     PreviousMode = KeGetPreviousMode();
    39.     if (PreviousMode != KernelMode) {
    40.         try {
    41.             ProbeForReadSmallStructure(DelayInterval, sizeof(LARGE_INTEGER), sizeof(ULONG));
    42.             Interval = *DelayInterval;
    43.  
    44.         } except(EXCEPTION_EXECUTE_HANDLER) {
    45.             return GetExceptionCode();
    46.         }
    47.  
    48.     } else {
    49.         Interval = *DelayInterval;
    50.     }
    51.  
    52.     //
    53.     // Delay execution for the specified amount of time.
    54.     //
    55.  
    56.     return KeDelayExecutionThread(PreviousMode, Alertable, &Interval);
    57. }
    Видим проверку выравнивания на sizeof(ULONG).
    А параметр - у вас до вызова какой стек - вот я про это и говорю.
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Понял. Спасибо, буду копать.
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Clerk
    Заработало! Я упомянул в коде про твою помощь, спасибо!