Ошибка при вызове ReadConsoleOutputCharacter

Тема в разделе "WASM.BEGINNERS", создана пользователем themind, 15 окт 2005.

  1. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Хочу сделать что-то вроде зелёного экрана из "Матрицы".

    Столкнулся с такой проблемой, апишная функция ReadConsoleOutputCharacter ругается и не работает (см. комментарии). Спасибо всем, кто ответит.


    Код (Text):
    1.  
    2.  .486
    3.  .model flat,stdcall
    4. option casemap:none
    5.  
    6. includelib ../lib/kernel32.lib
    7. include ../include/windows.inc
    8. include ../include/kernel32.inc
    9.  
    10.  .const
    11.  
    12. sConsoleTitle db 'Random',0
    13.  
    14.  .data
    15. dMultiplier dd 16807d   ;данные для генерирования случайных чисел
    16. dDivider dd 2147483647d
    17. sLine db 80 dup(48)     ;2 буфера для двух строк
    18. sTmpLine db 80 dup(30h)
    19. dTmp dd 0               ;здесь хранится последнее случайное число
    20.                         ;нужно только для генерирования следующего
    21.                        
    22.  .code
    23.  
    24. Main PROC
    25.   LOCAL hStdout :DWORD                          ;получаем хендл консольного вывода
    26.   invoke SetConsoleTitle, offset sConsoleTitle
    27.   invoke GetStdHandle, STD_OUTPUT_HANDLE
    28.   mov hStdout, eax
    29.  
    30.   ;делаем текст зелёным
    31.   invoke FillConsoleOutputAttribute, hStdout, FOREGROUND_GREEN, 80*25, 0h, NULL
    32.  
    33.   invoke GetTickCount ;первое случайное число)
    34.   or eax, 1b          ;обязательно не ноль, поэтому включаем первый бит
    35.   mov dTmp, eax
    36.  
    37. NextLine:
    38.   mov eax, dTmp
    39.   mov ecx, 20d
    40.   mov ebx, offset sLine
    41. NextChar:              
    42.   xor edx, edx                  ;Здесь генерируется случайное 32-х битное число,
    43.   imul eax, [dMultiplier]      
    44.   idiv [dDivider]
    45.   mov eax, edx
    46.   mov [ebx], edx                ;помещаем это число в буфер,
    47.   add ebx, 4h                   ;т.е. 4 случайных символа
    48.   loop NextChar
    49.   mov dTmp, eax
    50.  
    51.   ;пишем сгенерированную строку
    52.   invoke WriteConsoleOutputCharacter, hStdout, offset sLine, 80d, 00000000h, NULL  
    53.  
    54.   ;!-------------------------------------------------------------------- -----------!
    55.   ;вот здесь должна читаться первая строка в буфер, но почему-то происходит ошибка
    56.   ;№12 - что-то вроде "нет доступа", хотя по тому, что написано в SDK, GetStdHandle даёт
    57.   ;необходимые права
    58.   invoke ReadConsoleOutputCharacter, hStdout, offset sTmpLine, 80d, 00000000h, NULL
    59.  
    60.   cmp eax, 0
    61.   je Error
    62.   invoke WriteConsoleOutputCharacter, hStdout, offset sTmpLine, 80d, 00010000h, NULL
    63.   jmp NextLine
    64. Error:                  
    65.   invoke GetLastError
    66.   mov DWORD PTR [sTmpLine], eax
    67.   mov dword ptr sTmpLine, eax
    68.   invoke WriteConsoleOutputCharacter, hStdout, offset sTmpLine, 4d, 00010000h, NULL
    69.   invoke Sleep, 9000d
    70.   invoke ExitProcess, NULL
    71.  
    72. Main ENDP
    73.  
    74.  
    75. end Main
    76.  
     
  2. Fry Chicken

    Fry Chicken New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2005
    Сообщения:
    15
    invoke ReadConsoleOutputCharacter, [hStdout], sTmpLine, 80d, 00000000h, pReadNumber;NULL



    pReadNumber dd ?



    это для фасма. вообщем посл. параметр - адрес для записи считанных количества байт
     
  3. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Сделал так:
    Код (Text):
    1.  
    2. dReadNumber dd 0
    3. pReadNumber dd offset dReadNumber
    4. ...
    5. invoke ReadConsoleOutputCharacter, hStdout, offset sTmpLine, 80d, 00000000h, pReadNumber
    6.  


    Как ни странно, всё заработало. Я почему-то думал, что там может NULL стоять. А вообще бред... ведь с WriteConsoleOutputCharacter и NULL прокатило...
     
  4. Fry Chicken

    Fry Chicken New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2005
    Сообщения:
    15
    пересылки может и не те, но логика думаю понятна



    ; ReadConsoleOutputCharacter

    ; esi - pReadNumber

    ...

    7C8728DB 890E MOV [DWORD ESI],ECX

    ...

    7C8728F8 F3:A5 REP MOVS [DWORD ES:EDI],[DWORD ESI]

    ...



    ; WriteConsoleOutputCharacter

    ; edx - pWriteNumber

    ...

    7C872A9F F3:A4 REP MOVS [BYTE ES:EDI],[BYTE ESI]

    ...

    7C872AD4 890A MOV [DWORD EDX],ECX

    ...