Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Вывод разноцветного текста в консоли

26.11.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter

Вывод разноцветного текста в консоли

Давно не обращался к теме консольных приложений, надо бы восполнить этот недостаток. С обычным консольным вводом-выводом вопросов возникнуть не должно, тут ничего сложного нет. А вот какие-нибудь необычные действия с консолью, надеюсь, будут интересными. В оконных приложениях можно менять цвета отдельных элементов, что-то похожее можно делать и в консоли.

Читать статью целиком »
Просмотров: 14642 | Комментариев: 10

Перехват ввода и вывода консольных программ

13.04.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Перехват ввода и вывода консольных программ бывает нужен, когда требуется получить результат их работы для обработки в нашем приложении. Также мы получаем возможность передавать консольным программам собственные данные. Как обычно в FASM'е готовых решений нет, пришлось разбираться самому и портировать с языков высокого уровня. Технически перехват ввода и вывода консоли выполняется с использованием специальных структур, называемых "Pipe". По принципу действия они и вправду похожи на трубы: в один конец информация "вливается", из другого "выливается", а перехват является просто подключением нашего "крана" к тому или иному концу трубы. Для перехвата требуется переопределить стандартные дескрипторы ввода и вывода консольного приложения на наши. Создать новые дескрипторы можно при помощи функции CreatePipe, а затем прописать в структуру STARTUPINFO запускаемого приложения. После этого новые дескрипторы будут доступны для чтения и записи как обычный файл.

В сегменте данных родительского приложения требуется определить следующие переменные и структуры:
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; Данные для перехвата консоли
  5. newstdin      dd ?  ; Новый дескриптор стандартного ввода
  6. newstdout     dd ?  ; Новый дескриптор стандартного вывода
  7. read_stdout   dd ?  ; Дескриптор для использования ReadFile
  8. write_stdin   dd ?  ; Дескриптор для использования WriteFile
  9. bytestoread   dd ?  ; Всего байт в буфере консоли
  10. available     dd ?  ; Счетчик байт, доступных для чтения из консоли
  11.  
  12. ; Эта структура по умолчанию не определена, сделаем это сами
  13. struct SECURITY_ATTRIBUTES
  14.        nLength               dd ?
  15.        lpSecurityDescriptor  dd ?
  16.        bInheritHandle        dd ?
  17. ends
  18.  
  19. ; Описание структур для запуска консольной программы и настройки дескрипторов
  20. sinfo      STARTUPINFO
  21. sattr      SECURITY_ATTRIBUTES
  22. pinfo      PROCESS_INFORMATION
  23.  
  24. ; Дополнительно зарезервируем буфер для чтения информации
  25. buff   rb 1024
Буфер большого размера для чтения данных лучше не использовать, вполне достаточно 1 килобайта. Количество байт, доступных для чтения из консоли, можно получить при помощи функции PeekNamedPipe. Обратите внимание, что фактически данные из консоли при этом не забираются, это надо будет сделать при помощи функции чтения файла ReadFile. Вот пример кода перехватчика вывода консоли.

Читать статью целиком »
Просмотров: 10786 | Комментариев: 11

01 02 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0021 сек.) / Память: 4.5 Mb
Наверх