42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
|
||||||
1 | ||||||
Прямой доступ к видеопамяти18.07.2013, 17:10. Показов 14008. Ответов 41
Метки нет (Все метки)
Требуется написать программу, которая будет напрямую обращаться в видеопамяти. Описание:
Реализовать функцию, принимающую три параметра - цвет фона, цвет тона и код символа и производящую заполнение этим символом всего экрана. Реализовать функцию очистки экрана с использованием созданной функции. Для заполнения видеопамяти воспользуйтесь указателем на беззнаковый символ. Для присвоения ему значения 0хВ8000000 необходимо осуществить явное преобразование типов. Непосредственное значение 0хВ8000000 имеет тип int. Следует сначала привести тип этого значения к void* а затем - к unsigned char* для того, чтобы присовение стало возможным. Для обращения к различным байтам видеопамяти воспользуйтесь этим указателем. Видеопамять организована следующим образом: байт по адресу 0хВ8000000 содержит код символа в левом верхнем углу экрана. Следующий за ним байт содержит цвет фона и цвет тона этого символа. В старшей половине этого байта содержится цвет фона, в младшей - цвет тона. Коды некоторых цветов: 0х0 - черный, 0х7 - серый, 0хf - белый При выполенини работы производите периодическое сохранение программы, так как некорректная работа с памятью может привести к ошибке ЭВМ и потере данных в оперативной памяти. КОД, КОТОРЫЙ НЕ РАБОТАЕТ:
Доступно ли прямое обращение к памяти в Windows 7 в режиме user mode?
0
|
18.07.2013, 17:10 | |
Ответы с готовыми решениями:
41
Прямой доступ к переменным Прямой доступ к видео памяти вопрос по си-подключение видеопамяти Прямой доступ к видеопамяти |
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
18.07.2013, 17:12 | 2 |
Что значит "не работает"?
Добавлено через 1 минуту Не доступно. Используй эмулятор MSDOS - либо DosBox, либо к.-л. другую виртуальную машину.....
0
|
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
|
|
18.07.2013, 17:14 [ТС] | 3 |
А можно как то переключиться в динамическом режиме в kernel mode?
Добавлено через 1 минуту Т.е. я правильно понял, что для того, чтобы сделать скриншот, нужен либо драйвер, либо системные вызовы?
0
|
Модератор
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,687
|
|
18.07.2013, 17:16 | 4 |
ты это лет так на 30 опоздал
во времена Доса такое было возможно а теперь где она эта видеопамять ? в видеокартах по гектару и больше может стоять этим ты старательно лезешь в систему, ну и получаешь по рукам и откуда ты взял этот адрес? такой помню 0xA800:0x8000 и такой 0xB000:0000 а 32битных не припомню так что только через DirectX, и то это будет не реальная память а проекция её на твое адресное пространство Добавлено через 48 секунд BitBlt еще никто не отменял
1
|
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
|
|
18.07.2013, 17:20 [ТС] | 5 |
Где в современных ОС хранится изображение? В озу?
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
18.07.2013, 17:25 | 7 |
Во времена MSDOS, мир праху ее, именно так и нужно было адресовать 0xB000:0x0000. Компилятор (тот же Турбо Си) аккуратно преобразовывал 0xB0000000 в пару сегмент:смещение.
Но теперь да, подобные штуки остались только в истории - лет 30 назад.....
0
|
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
|
|
18.07.2013, 17:28 [ТС] | 8 |
0
|
Модератор
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,687
|
|
18.07.2013, 17:32 | 9 |
Не по теме: Может быть давно было не помню, да и писал в основном тогда на ассемблере но я писал всегда так сегмент:смешение Добавлено через 2 минуты ядро собирает картинки со всех программ компонует их и хранит внутри себя выдавая на видеокарту по мере необходимости, а может сразу компоновать в видеопамяти зависит от железа и драйверов ты конкретно что хочешь сделать? рисовать на десктопе? экран сохранить?
1
|
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
|
|
18.07.2013, 17:40 [ТС] | 10 |
То есть, если я правильно понял, надо глядеть в сторону kernel mode?
0
|
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
|
|
18.07.2013, 17:43 | 11 |
0
|
Ушел с форума
|
|
18.07.2013, 17:54 | 12 |
Раньше в ядре Windows были некоторые документированные возможности работать с
содержимым дисплея. Потом из-за DRM их стали целенаправлено вырезать (чтобы нельзя было грабить защищенный медиа-контент), а в Windows 8 вообще убрали.
2
|
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
|
|
03.07.2023, 02:54 | 14 |
Нет, конечно. Надо смотреть в сторон современных графических библиотек.
Никто туда абстрактные данные не грузит. Вы можете воспользоваться GUI-библиотекой системы чтобы вывести кнопки, формочки, поля ввода и т.п., можете напрямую через OpenGL вывести графику. А прямая запись в видеопамять давно уже юзер-спейс приложениям запрещена из соображений безопасности.
0
|
Rius
|
03.07.2023, 05:42
#15
|
Не по теме: Это без проблем можно там, где нет защиты и ограничений.
0
|
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,563
|
|
03.07.2023, 08:33 | 16 |
А всё же, мог бы кто-нибудь кратенько расссказать как сейчас железячно устроен обмен с отображаемым изображением в современных архитектурах PC?
Можно ли получить отборажение видеопамяти (той, что отрисовывается на дисплее сейчас) в какое-либо адресное пространство? (не берём в расчет "Windows не пустит обращения в память куда попало"). Или к "видеопамяти" вообще уже нет никакого доступа напрямую, а всей отрисовкой занимается процессор видеокарты, принимая команды типа "нарисуй окружность"? Меня тоже интересует этот вопрос для общего развития.
0
|
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
|
|
03.07.2023, 10:03 | 17 |
О, очень по-разному.
Самый простой способ я видел, когда читал про изготовление USB-мониторчика. Там картинка средствами проца рисуется в специально выделенной памяти, а потом целиком выбрасывается по USB для отображения. То есть рендеринг полностью софтварный. Аналогичный способ используется когда надо запустить программу с GUI, но графики на компьютере не установлено - виртуальный фреймбуфер. Программа отправляет стандартные команды рисования, а драйвер их тихонько утилизирует. Но это все же экзотика. Если же мы говорим про "обычный" вывод графики, то он построен на общении с видеокартой. Передача ей координат примитивов, матриц преобразования, текстур. А еще шейдеров - программ, скомпилированных под процессор видеокарты и собственно команд что со всем этим делать. Как именно это реализовано на совсем уж низком уровне, точно не скажу. Но наверняка каждый производитель извращается как может, и наверняка сам обмен выглядит так же, как и с любым другим устройством - запись в порты, передача массивов данных, прерывания и опрос флагов. Вроде бы можно - но делается это только в монопольном режиме, когда кроме вашей программы никакая другая туда не лезет. Довольно сложный способ. Не стоит им пользоваться, если не изучаете соответствующий уровень оконной системы. А что вам мешает сформировать картинку в собственной оперативной памяти, создать обычное окно и вывести туда? Ну например, glDrawPixels. Вроде бы и через более простые библиотеки вроде SDL это можно, но надо искать. В интернете встречал даже вариант рисования в файл картинки, вообще без работы с экраном. Вот как раз с окружностями на видеокартах проблемы... Но в целом да, вы посылаете команды "создать окно", "создать кнопку", а графический сервер их выполняет. Ваша программа на экране ведь обычно не одна, нехорошо если она полезет рисовать поверх чужих окон.
0
|
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,563
|
|
03.07.2023, 11:58 | 19 |
Вот этот кусочек меня и интересует. И именно про IBM PC платформу или как оно нынче называется, а не вообще "как можно подключить произвольный дисплей".
Хорошо, а в случае готовый картинки? Подчеркну еще раз: вопрос не про API какое-либо, с API все понятно. Как оно железячно сейчас сделано? (ранее область ОЗУ c заранее известными адресами "проецировалась" на монитор.)
0
|
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
|
|
03.07.2023, 12:50 | 20 |
Весь мой пост был именно об этом.
Если видеокарта слабая (как в примере с USB-шной) или ее нет вообще, может и в обычной ОЗУ. В более типичном случае - в памяти видеокарты. Так или иначе прямого доступа туда для юзерских приложений нет. Нечего им рисовать поверх чужих окон. --- Вы лучше опишите чего добиться хотите.
0
|
03.07.2023, 12:50 | |
03.07.2023, 12:50 | |
Помогаю со студенческими работами здесь
20
Прямой доступ к видеопамяти в DirectХ 9 Прямой доступ к видеопамяти в режиме VESA Вывод строки используя прямой доступ к видеопамяти Доступ к видеопамяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |