Во-первых, не
invoke ReadConsole, ADDR input, ADDR input_buf, 1, ADDR read, 0
а
invoke ReadConsole, input, ADDR input_buf, 1, ADDR read, 0
В данном случае надо не адрес переменной, а её содержимое. Поэтому, кстати, и не читается ничего.
Во-вторых, переменные
read
и
written
должны быть размером не
db
, а
dd
. ReadConsole возвращает DWORD, а не BYTE и само собой возвращаемое значение
read
забивает собой ранее полученное
output
, там получаются нули и поэтому ничего не выводится.
В-третьих, судя по
invoke ReadConsole, input, ADDR input_buf, 1, ADDR read, 0
производится чтение
ОДНОГО символа, а выводится
invoke WriteConsoleA, output, ADDR input_buf, 3, ADDR written, 0
почему-то три.
Ну и чисто косметически:
а) почему input_buf объявлен как массив DWORD? его надо объявлять как массив BYTE
input_buf db КОЛИЧЕСТВО_БАЙТ_ПЛАНИРУЕМОЕ_ПРОЧИТАТЬ dup(?)
б) нафига вызов Sleep? он там нафиг не нужен
в) зачем ReadConsole, но при этом WriteConsoleA? Или все *A, или уж все функции (что IMHO лучше) все функции
без *A в конце.