Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Как обратится напрямую к видеопамяти


Автор: shedon 27.9.2004, 14:06
сабж собственно, вобщем хочу получить скриншот напрямую из видеобуфера.

Автор: Akina 27.9.2004, 14:41
Нормально... в каком видеорежиме? или его еще определить надо? под какой ОС? или вообще платформонезависимо? на каком железе? или для всех мыслимых?
Добавлено @ 14:42
а так - сэмулировать нажатие PrintScreen и перехватить вывод на печать (это под ДОСом... под Виндой вытянуть содержимое клипборды) biggrin.gif

Автор: shedon 27.9.2004, 14:54
Цитата(Akina @ 27.9.2004, 11:41)
а так - сэмулировать нажатие PrintScreen и перехватить вывод на печать (это под ДОСом... под Виндой вытянуть содержимое клипборды)

это не подходит
Цитата(Akina @ 27.9.2004, 11:41)
Нормально... в каком видеорежиме? или его еще определить надо? под какой ОС? или вообще платформонезависимо? на каком железе? или для всех мыслимых?

в любом, Win98/2k/XP/2k3, на любом железе

Автор: oleg1973 28.9.2004, 13:30
ну так в виндосе, в ддраве, в опенжль ?
там во всех 3х случаях по разному будет

Автор: shedon 28.9.2004, 15:38
oleg1973
В виндосе....

Автор: oleg1973 1.10.2004, 02:30
1 HDC handle нада
2 сделать компатибиле контекст
3 битблит туда
ну и все

Автор: shedon 2.10.2004, 23:00
oleg1973
Этот способ не работает, при получение скриншота фильмов.

Автор: oleg1973 2.10.2004, 23:03
shedon
там наверняка через директ драв кино крутят
из другого процесса нада подумать...

Автор: shedon 2.10.2004, 23:05
Ну дак я в начале и спросил, как напрямую сграбить изображение из видеобуфера...

Автор: oleg1973 2.10.2004, 23:13
ну из своего процесса не проблема
а вот с чужого...
а проги есть такого типа? я грабилки тока дектопа видел

Автор: Victorier 17.10.2004, 12:43
А нельзя прочитать память B800:xxxx?

Автор: oleg1973 17.10.2004, 13:11
в досе можно
в виндосе нет

Автор: p0s0l 17.10.2004, 15:48
Для проигрывания фильмов иногда или даже часто используются оверлеи (Overlay Mixer в Direct Show).
Для проверки - запусти фильм и нажми PrintScreen. Далее запусти Paint (но фильм не закрывай и окно проигрывателя лучше не двигать), жми в нём Ctrl-V (вставить из буфера) - и прямо в Paint'е будет просматриваться фильм :) (но окно нарисованного проигрывателя в Painte должно примерно совпадать с окном реального проигрывателя под Paintoм), т.е. для оверлея назначается область вывода и ключевой цвет, вместо которого видяха будет выводить содержимое оверлея. Поэтому в видеопамяти хранится лишь этот ключевой цвет оверлея, читать память напрямую смысла нет...

Возможно, повозившись с DirectDraw/DirectShow ты сможешь легально достать содержимое оверлеев, но я пробовал скриншотить фильмы с помощью HyperSnap-DX4 и CaptureSolution, которые якобы грабят и DirectX-овые игры и видеофильмы... Но эффект - как от обычного PrintScreen'а...

ЗЫ: возможно, я ошибаюсь :), т.к. всё это моё имхо...

Автор: oleg1973 17.10.2004, 16:44
остается вариант написания драйвера для непосредственного чтения из видеопамяти

Автор: p0s0l 17.10.2004, 23:58
oleg1973, а как ты узнаешь, в какой области видеопамяти хранится содержимое оверлея ? И какой области экрана этот оверлей соответствует ?
Чем писать драйвер, имхо, легче сделать так, чтобы проигрыватели не могли использовать оверлеи - их максимальное количество ограничено, и если одна прога юзает оверлей, то другая уже не сможет ;)
У меня, к примеру, видяха GF5600 держит максимум 1 оверлей - если запустить 2 проигрывателя, то второй уже будет нормально скриншотиться...

Автор: p0s0l 18.10.2004, 01:27
Кстати, я тут посмотрел, похоже к видеопамяти есть прямой доступ без всяких прибамбасов.
В директдраве у PrimarySurface делаем Lock ( + можно сразу же Unlock), при этом получаем адрес сурфейса. Этот адрес соответсвует базовому адресу видеопамяти (очень похоже на это).
Читайте и пишите туда наздоровье, как говорится, только против оверлеев это не спасёт...

Автор: oleg1973 18.10.2004, 09:36
Neo! оверлеев не бывает :)
есть видеокарта и линейный кусок видепамяти
адресс его находится елементарно
далее найдя адр начала , логично предположить что достаточно скопировать к примеру 1024*768*3 байт чтоб получить копию LFB которая будет являтся непосредственной частью видео памяти которую мы видим на экране, внеэкранная нас в данный момент не интересует

Автор: oleg1973 18.10.2004, 10:44
p0s0l
совершенно верно
при lock получаем адрес на видеопамять
но тут есть нюанс
ddraw позволяет делать эмуляцию в оперативе, если к примеру мала видеопамяти а нам нада 10 бэкбуферов, оно будет в оперативе
хотя в принципе на результат не повлеяет

осталось тока залесть в чужой процесс и сделать оттуда lock :D
предлагаю написать враппер ddraw.dll который по нажатию там каких нить кнопок будет шкрин грабить ;-)

Автор: p0s0l 18.10.2004, 17:06
Цитата
ddraw позволяет делать эмуляцию в оперативе, если к примеру мала видеопамяти а нам нада 10 бэкбуферов, оно будет в оперативе

Можно тогда просто создать любой малюсенный сурфейс в видеопамяти (в dwCaps указав DDSCAPS_VIDEOMEMORY), делаем Lock, получаем адрес сурфейса, далее VirtualQuery выдаст базовый адрес региона (AllocationBase), то бишь начало видеопамяти.

Цитата
осталось тока залесть в чужой процесс и сделать оттуда lock
Что-то не понимаю: зачем ? Видеопамять - одна на всех, изменяя её в своём процессе, я изменяю её и в другом. Она проецируется в виртуальное пространство процессов по разным адресам, но физически это одна и та же память.

Цитата
Neo! оверлеев не бывает

Объясни почему ? Откуда такая уверенность ? Загляни в настройки видеопроигрывателя и ты скорее всего найдешь метод вывода. Например, в Zoom Player: Standart Renderer, Overlay Mixer, Video Mixing Renderer (VMR9).
Если выставишь Overlay Mixer (а он выставлен по умолчанию), то при проигрывании фильма PrintScreen будет снимать вместо фильма черноту.

Цитата
есть видеокарта и линейный кусок видепамяти
адресс его находится елементарно
далее найдя адр начала , логично предположить что достаточно скопировать к примеру 1024*768*3 байт чтоб получить копию LFB которая будет являтся непосредственной частью видео памяти которую мы видим на экране, внеэкранная нас в данный момент не интересует
А ты пробовал ? Я пробовал. Как я и говорил - прямой доступ к памяти ничего не даст. Простой PrintScreen будет работать ничем не хуже. И я уже объяснял почему:
Проигрыватель закрашивает всю клиентскую область окна ключевым цветом оверлея, DirectShow рендерит фильм не на окно проигрывателя, а на невидимый оверлейный сурфейс. Поэтому и в куске видеопамяти, выводимой на экран, хранится только КЛЮЧЕВОЙ ЦВЕТ на месте оверлея, а то, что должно выводится вместо этого ключевого цвета (кадр фильма к примеру), тоже хранится в видеопамяти, но уже в другом куске памяти, и это и есть оверлей.
Я себе представляют так:
видяха при выводе на монитор читает последовательно видеопамять. Если есть хотя бы один видимый оверлей, она проверяет, входит ли выводимый пиксел в область оверлея, если да, то еще проверят, является ли считанный пиксел ключевым цветом, и если является, то вместо него выводит соотвествующий пиксел оверлея...

Автор: oleg1973 21.10.2004, 12:34
p0s0l
шас как тока будет свободная минутка попробую сделать грабилку, (ddraw.dll wrapper)

Автор: p0s0l 21.10.2004, 12:40
oleg1973, почитай, главное выделено, из MSDN:
Цитата

DirectDraw also supports overlays. An overlay surface is one that can be displayed on top of the primary surface without altering the physical bits in the surface underneath it. With an overlay, registers are set that define a rectangle on the primary surface that contains the overlay surface. The digital-to-analog converter (DAC) changes the location of the rectangles. The scan line reads data in primary surface memory until it reaches the rectangle that is set aside for the overlay. It reads from the overlay surface until that line in the overlay is finished, then continues with the original primary surface image. This switching from primary surface to the overlay and back happens on every pass of the scan line and continues until the overlay is completely displayed.

The overlay surface can have a different pixel depth than the primary surface. For example, while 8 bits per pixel (bpp) may look fine for the primary surface, a video clip may need 16 bpp to display acceptably. The pixel depth switches seamlessly between the primary surface and the overlay. For more information about overlays with DirectDraw, see the Video Port Extensions to DirectX section.

Overlays flip in exactly the same way as the primary surface. The DirectDraw surface objects swap pointers so that the new overlay surface is read when the scan line reaches the rectangle bounding the overlay. The same flipping algorithm described in Timing a Flip prevents tearing.

Т.е. если хочешь делать грабилку, то придётся грабить как ПримариСурфейс, так и Оверлейный Сурфейс...

Автор: RuslanB 6.11.2004, 23:04
Вы мое спасенье!!! smile Надо написать программу, выводящую дамп памяти (содержимое памяти) с адреса, указанного в ES:SI. Содержимое памяти выводить в текстовом видеорежиме 80x25, числа выводятся в шестнадцатеричном виде строками по 16 байт. Всего вывести 256 байт памяти (16 строк).

Автор: Byo 21.10.2005, 19:27
Нефиг спорить ))
p0s0l абсолютно прав .
так что удачи в поисках ).


Автор: JoyEx 3.12.2005, 19:59
Касательно Win!!! smile

Лучше всего иметь у себя PRM (Programmer's Reference Manual) на свою видяху.
Например, http://www.intel.com/design/chipsets/manuals/29823701.pdf
и затем работать напрямую

А если по-умному, то лучше изучить http://www.osronline.com/ddkx/graphics/vidintro_9tev.htm и делать драйверок.


p0s0l, с Днем Варенья тебя!

Автор: JoyEx 5.12.2005, 10:36
И потом, напрямую адрес (>0x80000000) видеопамяти получить можно, а вот вычислить внеэкранную будет намного сложнее. Еще можно вспомнить об основных VGA регистрах, чтобы попытаться сделать что-то нехорошое с видяхой.

Автор: oleg1973 5.12.2005, 11:34
Цитата
вот вычислить внеэкранную будет намного сложнее

ну если в досе все делать то там можно получить данные о установленом видеорежиме
и в том же массиве есть адрес (линейный) видеобуффера

Автор: JoyEx 5.12.2005, 11:52
oleg1973
ДА.

shedon
Через HDC проще всего сделать и потом сразу забыть о проблеме.

В DVD самое ценное это меню, а через видяху DVD-менюшку не сграбить. Если тебе нужно типа VHS, то тогда дерзай!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)