Странная штука: в одном и том же EXE файле есть вызовы "invoke Sleep, nnn". Сделано, для задержки вывода, чтобы успеть прочитать информацию. Программа - не консоль (!), а сэмулированная консоль, т.е. обычный CreateWindow() с WM_PAINT и прочими делами, но сделано для вывода текста (цвет букв нужен был в True Color). Два thread-а: основной, принимающий WM_CHARs от пользователя и другой (запущенный через CreateThread), где происходит действие и вывод в окно. Короче, в некоторых местах второго thread-а нет задержек, хотя есть "invoke Sleep, nnn". Кто-то видел такое ранее? Проходя по этому месту (F8 в Olly) - задержки нет. Очень странно.
Таким вот образом: Код (Text): push 0092FDFAh push 00000000h call NtDelayExecution ; ; EAX = 80000002h (похоже на код ошибки, но LastError=0) ; А где-то есть литература по недокументированным функциям NTDLL?
Строка кода (не работающая): Код (Text): invoke Sleep, 800 Здесь вроде нет переменных. Стек всегда выровнен (там, у меня в коде стоят Assertions про это). Хорошо, с этим мы будет бороться... посмотрю на выравнивание для NtDelayExecution(). В крайнем случае можно зациклить GetTickCount() или что-то похожее.
AsmGuru62 Не выровнен у вас стек. 92FDFAh Почему - да потомучто в виндоз можно использовать только переменные кратные 4, а у вас там гдето либо в локальных переменных выделяется лишний ворд, либо юзается функция которая требует на входе нечто кратное двум.
Код (Text): NTSTATUS NtDelayExecution ( __in BOOLEAN Alertable, __in PLARGE_INTEGER DelayInterval ) /*++ Routine Description: This function delays the execution of the current thread for the specified interval of time. Arguments: Alertable - Supplies a boolean value that specifies whether the delay is alertable. DelayInterval - Supplies the absolute of relative time over which the delay is to occur. Return Value: NTSTATUS. --*/ { LARGE_INTEGER Interval; KPROCESSOR_MODE PreviousMode; // // Get previous processor mode and probe delay interval address if // necessary. // PreviousMode = KeGetPreviousMode(); if (PreviousMode != KernelMode) { try { ProbeForReadSmallStructure(DelayInterval, sizeof(LARGE_INTEGER), sizeof(ULONG)); Interval = *DelayInterval; } except(EXCEPTION_EXECUTE_HANDLER) { return GetExceptionCode(); } } else { Interval = *DelayInterval; } // // Delay execution for the specified amount of time. // return KeDelayExecutionThread(PreviousMode, Alertable, &Interval); } Видим проверку выравнивания на sizeof(ULONG). А параметр - у вас до вызова какой стек - вот я про это и говорю.