1) где в винде хранится экран? (желательно в виде h002205..)
2) какой командой записывать нужный байт в нужное место?
зЫ не ругайтесь с асмой не дружу а нада
1) где в винде хранится экран? (желательно в виде h002205..)
2) какой командой записывать нужный байт в нужное место?
зЫ не ругайтесь с асмой не дружу а нада
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
25 декабря 2008 в 19:03
#25+1 =)
24 декабря 2008 в 14:03
Мужики, почитал поста – открыл много позновательного, а то обычно, все посты про асм, заканчивались двумя – тремя цитатами (Сам его начал изучать довольна-таки не давно)
24 декабря 2008 в 6:05
#24: да, именно это. И безопасность вообще разрешения 16-битной программе напрямую обращаться к VESA (зачем тогда эмулятор, и смысл песочницы, которая не контролирует обращения к железу ) )
#23: "Как я понимаю, видеобуфер находится вне его адресного пространства и фиг он что получит?" – я понимаю так же Видеобуфера не будет в пользовательской части адресного пространства никакого процесса. В ядерной части (выше 2 Гб) – есть, но доступ к ней имеют только драйвера.
По сути вопроса, если уж так нужен адрес ))
во-первых, постоянного адреса (числа) нет, и даже на конкретной системе он может зависеть от времени;
во-вторых, получить этот адрес можно, вызвав функцию режима ядра DrvGetDirectDrawInfo (описана в DDK) (конкретно она позволяет получить все видеобуферы, контролируемые дисплейным драйвером, один из них -это будет первичный видеобуфер, т.е. экран).
Т.е. пишешь драйвер, загружаешь его в систему, вызываешь функцию и получаешь адрес, с которым все равно ничего делать нельзя даже находясь в ядре ))
24 декабря 2008 в 1:01
Александр, система ХР была сделана для улучшения совместимости ядра NT с программами под Виндовс. Не секрет, что под оригинальной NT работали только Офис да ещё пара программ =) 2000 в этом плане ушла далеко вперёд, но всё равно виртуальная машина ДОС в ней хромала. В 2000 могли возникнуть проблемы не только с ДОС программами, но и с виндовыми программами (впрочем, в ХР тоже есть некоторые мелкие различия с 98-й =)
Так что не удивительно, что в 2000 не работали ДОС программы (хотя, fullscreen – можно считать, что работали =)
Насчёт VESA напрямую – не интересовался этим вопросом, но ведь к БИОС тоже доступ прямой КВ почитаю – интересно, о каких проблемах с безопасностью может идти речь, если виртуальная дос машина работает в собственной песочнице?…
Кстати, вот также и Никита парится каким-то видеоадресом – быть может, он как раз хочет попасть на буфер экрана VESA? О_о Очень интересно, защищена ли система от таких передряг =) Как я понимаю, видеобуфер находится вне его адресного пространства и фиг он что получит?… У кого какое мнение?
Вообще, дыр в системе много – из самых известных выполнение в стеке (от этого зарылись, непонятно только, зачем требуют новые процы?!) и прямой доступ к секторам диска (не сидите под админом!!!) Если ещё и видеобуфер открыт всем процессам – пересяду на Юникс – там хотя бы ручками закрыть можно =)))))))))
Никита, мы не издеваемся, а всеми силами показываем, что считаем прямой доступ к видеопамяти: а) абсурдом, б) невыполнимой операцией, в) хаком… Ну что, у тебя получилось?
24 декабря 2008 в 1:01
По КВ – видимо, ты имел в виду безопасность захвата экрана пользователя? Что как раз и хочет проделать Никита своим "адресом"
23 декабря 2008 в 21:01
нет вы реально издеваетесь
адрес в виде шестнадцатеричного значения
—
Дружище, "адрес" тебе сказали ещё в первом посте – GetDC(GetDesktopWindow()) или ещё вроде GetDC(0) тоже самое возвращает – вообще, вводная есть, далее см. MSDN. Получив хендл десктопа делаешь SelectObject с BITMAP'ом, и получаешь аппаратно-независимый растр, к которому и можно получить доступ "по адресу" (потом, правда, надо вернуть растр обратно, чтоб увидеть изменения =).
—
это не шестнадцатеричная система
#17 спс
23 декабря 2008 в 18:02
Кстати, интересно, что NTVDM не поддерживает вызовы VESA BIOS, вернее, не эмулирует их, а позволяет программе выполнять их напрямую. Т.е.из-за этого могут быть какие-нибудь проблемы (см. на MSDN бюллетень KB812681). И из-за этого же вероятно эту поддержку убрали в xp sp3 и vista, как проблему безопасности
23 декабря 2008 в 17:01
#19 эээээ, да, виноват. Конечно, на 2000/XP работает. Забыл, что у меня тоже ведь работали Doom 1/2 и т.д. )
Просто у меня виста теперь, у меня ничего не работает ((( Хотя я помню, что некоторое множество старых программ при запуске даже в винде 2000 выдавали сообщение "This system does not support fullscreen mode". Я так понимаю, что здесь как раз речь идет не о fulscreen mode, а о некоторой неподдерживаемости графики. Вопрос тогда, в каком случае она support, а в каком нет?
23 декабря 2008 в 8:04
#13 Александр, откуда таки сведения – что NTVDM не поддерживает графические режимы? Признаюсь, после установки SP3 у меня перестали запускаться ДОСовские программы, но раньше, помниться, проблем ни с Civilization-1 ни с Doom 1-2 и т.п. не возникало. Они вродеи в оконном режиме работали (Doom при этом, правда, останавливался – что и неудивительно, его движёк использует нестандартный 4-х страничный видеорежим).
Правда, поскольку в ХР всё равно с приоритетами проблема (плывёт звук), использовал DosBox – ну а теперь и подавно: в NTVDM все проги, даже текстового режима, вываливаются сразу при запуске.
23 декабря 2008 в 8:03
Дружище, "адрес" тебе сказали ещё в первом посте – GetDC(GetDesktopWindow()) или ещё вроде GetDC(0) тоже самое возвращает – вообще, вводная есть, далее см. MSDN. Получив хендл десктопа делаешь SelectObject с BITMAP'ом, и получаешь аппаратно-независимый растр, к которому и можно получить доступ "по адресу" (потом, правда, надо вернуть растр обратно, чтоб увидеть изменения =).
Второй вариант – использовать WinGame (WinG), это предок DirectX, там есть функция прямого доступа к экранной видеопамяти, но тоже "адрес" тебе будет известен после вызова определённой функции (ИМХО правильнее предыдущий метод =)
Третий вариант, самый быстрый – использовать DirectX (подойдёт любая версия, даже 1). Там также либо через создание первичной экранной поверхности, либо (что тебе, похоже. и надо), через тот же хендл десктопного DC, с залочиванием его как поверхности DirectDraw.
Вообщем, резюме такое – адрес напрямую недоступен, но доступно поместить туда информацию. Windows это тебе не ДОС, если ты не в kernel mode, то и адресов никаких устройств тебе не видать, как своих ушей – они все закрыты от тебя.
По поводу независимости адреса видеопамяти от режима – ошибаешься. По спецификации VESA 2.0 видеоадаптер может работать во flat-режиме видеопамяти, в этом случае начало видеопамяти находится за пределами первого мегабайта и задаётся регистрами видеокарты. В реальности, полагаю, (см. спецификации nVIdia, например) видеопамять может присобачиваться в конец основной памяти (SPI режим).
То есть видеоадрес как минимум плавающий, поэтому чтобы его зафиксировать и используется один из трёх описанных мной вариантов (это не полный список, можно ещё и OpenGL использовать, и хакерские методы с VirtualLock или собственными драйверами).
Так что адрес тебе никто не скажет, потому как он заранее не известен.
23 декабря 2008 в 1:04
wasm.ru
22 декабря 2008 в 23:01
не в досе (или вы там про што) а в винде
он от режима не зависит
от режима зависит скока экран тырит памяти
22 декабря 2008 в 22:05
#13
Ну да, под эмулятором, но в контексте этого топика это несущественная подробность А графические видеорежимы таки поддерживаются.
#14: адрес зависит от видеорежима. например в третьем режиме (цветной 80×25) он равен b8000 (ну или b800:0000).
22 декабря 2008 в 22:04
мну адрес ктонибудь скажет?(((
22 декабря 2008 в 22:03
тааааааааааааааааааааааак
поясняю 1ый вопрос
в винде рисовать через асму тупой записью в память МОЖНО
имхо я так делал
но давно(
адрес забыл
22 декабря 2008 в 22:03
#11: Не совсем так. Напрямую 16-битные программы можно запускать только в винде 98, 95 или в более ранней.
В Windows 2000, XP, Vista программа будет запущена под эмулятором NTVDM, в котором эта самая программа преспокойно сможет писать в свою личную видеопамять – окно консоли Только по-моему, в консоли работают только текстовые видеорежимы. А смена видеорежима на графический NTVDM не поддерживает, и программа выпадет с ошибкой.
#9: АПИ конечно можно использовать на асме. И даже необязательно через invoke, можно просто через серию команд push, запихивающих параметры в стек, и следующей за ними команды call, выполняющей вызов. Так как большинство API используют конвенцию вызова stdcall, то больше никаких действий выполнять не надо, как в случае вызова функций C. Мануалов по использованию WinAPI на асме в инете существует предостаточно.
22 декабря 2008 в 22:02
Никто не мешает запускать 16-битные досовские программы в винде. И соответственно никто не мешает этим программам писать прямо в видеопамять.
22 декабря 2008 в 22:01
признаю мою не компитентность(
22 декабря 2008 в 22:00
to :Станислав -zOrG-[PK] Марков
Ну и что? А на асме нельзя использовать АПИ?
Например через invoke.
22 декабря 2008 в 21:05
#7: бреда в ответе больше, чем в вопросе
h8000 – откуда это взялось и что это такое? Еще раз повторю, в Windows видеопамять не доступна в пользовательском режиме. Если же речь теперь идет о 16-битном режиме (например, под чистым DOS), то и там адрес другой (в стандартном VGA, например, A000:0000h).
Далее, написано byte, а регистр указан bx, который, как известно, хранит слово (2 байта) – несостыковка! Кстати, более того, в 16-битном режиме по регистру ax адресовать нельзя.
Если же речь все-таки о работе под Windows, то, чтобы рисовать на экране, нужно использовать функции Windows GDI, такие как GetDC, SetPixel и т.д. Или создавать картинки в памяти в формате DIB, "рисовать" в памяти, и выводить их на экран (см. функции CreateDIBitmap, StretchDIBits) – этот вариант больше согласуется с асмом в смысле похожести на традиционный прямой доступ к видеопамяти.
22 декабря 2008 в 20:03
h8000 – видео память
mov byte ds:[ax], bx
ax – по какому адрессу
bx – что нужно записать
22 декабря 2008 в 19:05
он же хочет на асме
22 декабря 2008 в 15:05
может GetDesktopWindow?
22 декабря 2008 в 15:01
В винде это тоже возможно, но делается путем использования WinApi.
22 декабря 2008 в 10:00
По первому вопросу:
Тоже не понял. Если вы собираетесь рисовать на экране с помощью асма, записывая байты по всяким адресам, то, уведомляю, в винде это невозможно
22 декабря 2008 в 8:05
Первый вопрос не понял. Хэндл нужен что ли?
MOV BYTE PTR DS:[addr], byte