singlepost

асма << На главную или назад  

1) где в винде хранится экран? (желательно в виде h002205..)
2) какой командой записывать нужный байт в нужное место?
зЫ не ругайтесь с асмой не дружу а нада

26 ответов в теме “асма”

  1. 26
    Константин Смотритель ответил:

    #25+1 =)

  2. 25
    Никита Миклушов ответил:

    Мужики, почитал поста – открыл много позновательного, а то обычно, все посты про асм, заканчивались двумя – тремя цитатами (Сам его начал изучать довольна-таки не давно)

  3. 24
    Александр Lert ответил:

    #24: да, именно это. И безопасность вообще разрешения 16-битной программе напрямую обращаться к VESA (зачем тогда эмулятор, и смысл песочницы, которая не контролирует обращения к железу :) ) )

    #23: "Как я понимаю, видеобуфер находится вне его адресного пространства и фиг он что получит?" – я понимаю так же :) Видеобуфера не будет в пользовательской части адресного пространства никакого процесса. В ядерной части (выше 2 Гб) – есть, но доступ к ней имеют только драйвера.

    По сути вопроса, если уж так нужен адрес :) ))

    во-первых, постоянного адреса (числа) нет, и даже на конкретной системе он может зависеть от времени;
    во-вторых, получить этот адрес можно, вызвав функцию режима ядра DrvGetDirectDrawInfo (описана в DDK) (конкретно она позволяет получить все видеобуферы, контролируемые дисплейным драйвером, один из них -это будет первичный видеобуфер, т.е. экран).

    Т.е. пишешь драйвер, загружаешь его в систему, вызываешь функцию и получаешь адрес, с которым все равно ничего делать нельзя даже находясь в ядре :) ))

  4. 23
    Константин Смотритель ответил:

    Александр, система ХР была сделана для улучшения совместимости ядра NT с программами под Виндовс. Не секрет, что под оригинальной NT работали только Офис да ещё пара программ =) 2000 в этом плане ушла далеко вперёд, но всё равно виртуальная машина ДОС в ней хромала. В 2000 могли возникнуть проблемы не только с ДОС программами, но и с виндовыми программами (впрочем, в ХР тоже есть некоторые мелкие различия с 98-й =)
    Так что не удивительно, что в 2000 не работали ДОС программы (хотя, fullscreen – можно считать, что работали =)
    Насчёт VESA напрямую – не интересовался этим вопросом, но ведь к БИОС тоже доступ прямой ;-) КВ почитаю – интересно, о каких проблемах с безопасностью может идти речь, если виртуальная дос машина работает в собственной песочнице?…

    Кстати, вот также и Никита парится каким-то видеоадресом – быть может, он как раз хочет попасть на буфер экрана VESA? О_о Очень интересно, защищена ли система от таких передряг =) Как я понимаю, видеобуфер находится вне его адресного пространства и фиг он что получит?… У кого какое мнение?

    Вообще, дыр в системе много – из самых известных выполнение в стеке (от этого зарылись, непонятно только, зачем требуют новые процы?!) и прямой доступ к секторам диска (не сидите под админом!!!) Если ещё и видеобуфер открыт всем процессам – пересяду на Юникс – там хотя бы ручками закрыть можно =)))))))))

    Никита, мы не издеваемся, а всеми силами показываем, что считаем прямой доступ к видеопамяти: а) абсурдом, б) невыполнимой операцией, в) хаком… Ну что, у тебя получилось?

  5. 22
    Константин Смотритель ответил:

    По КВ – видимо, ты имел в виду безопасность захвата экрана пользователя? Что как раз и хочет проделать Никита своим "адресом" ;-)

  6. 21
    Никита Лисица ответил:

    нет вы реально издеваетесь
    адрес в виде шестнадцатеричного значения


    Дружище, "адрес" тебе сказали ещё в первом посте – GetDC(GetDesktopWindow()) или ещё вроде GetDC(0) тоже самое возвращает – вообще, вводная есть, далее см. MSDN. Получив хендл десктопа делаешь SelectObject с BITMAP'ом, и получаешь аппаратно-независимый растр, к которому и можно получить доступ "по адресу" (потом, правда, надо вернуть растр обратно, чтоб увидеть изменения =).

    это не шестнадцатеричная система

    #17 спс

  7. 20
    Александр Lert ответил:

    Кстати, интересно, что NTVDM не поддерживает вызовы VESA BIOS, вернее, не эмулирует их, а позволяет программе выполнять их напрямую. Т.е.из-за этого могут быть какие-нибудь проблемы (см. на MSDN бюллетень KB812681). И из-за этого же вероятно эту поддержку убрали в xp sp3 и vista, как проблему безопасности :)

  8. 19
    Александр Lert ответил:

    #19 эээээ, да, виноват. Конечно, на 2000/XP работает. Забыл, что у меня тоже ведь работали Doom 1/2 и т.д. :) )

    Просто у меня виста теперь, у меня ничего не работает ((( Хотя я помню, что некоторое множество старых программ при запуске даже в винде 2000 выдавали сообщение "This system does not support fullscreen mode". Я так понимаю, что здесь как раз речь идет не о fulscreen mode, а о некоторой неподдерживаемости графики. Вопрос тогда, в каком случае она support, а в каком нет?

  9. 18
    Константин Смотритель ответил:

    #13 Александр, откуда таки сведения – что NTVDM не поддерживает графические режимы? Признаюсь, после установки SP3 у меня перестали запускаться ДОСовские программы, но раньше, помниться, проблем ни с Civilization-1 ни с Doom 1-2 и т.п. не возникало. Они вродеи в оконном режиме работали (Doom при этом, правда, останавливался – что и неудивительно, его движёк использует нестандартный 4-х страничный видеорежим).
    Правда, поскольку в ХР всё равно с приоритетами проблема (плывёт звук), использовал DosBox – ну а теперь и подавно: в NTVDM все проги, даже текстового режима, вываливаются сразу при запуске.

  10. 17
    Константин Смотритель ответил:

    Дружище, "адрес" тебе сказали ещё в первом посте – 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 или собственными драйверами).

    Так что адрес тебе никто не скажет, потому как он заранее не известен.

  11. 16
    Андрей Горбоконь ответил:

    wasm.ru

  12. 15
    Никита Лисица ответил:

    не в досе (или вы там про што) а в винде
    он от режима не зависит
    от режима зависит скока экран тырит памяти

  13. 14
    Сергей Старовой ответил:

    #13
    Ну да, под эмулятором, но в контексте этого топика это несущественная подробность :) А графические видеорежимы таки поддерживаются.

    #14: адрес зависит от видеорежима. например в третьем режиме (цветной 80×25) он равен b8000 (ну или b800:0000).

  14. 13
    Никита Лисица ответил:

    мну адрес ктонибудь скажет?(((

  15. 12
    Никита Лисица ответил:

    тааааааааааааааааааааааак
    поясняю 1ый вопрос
    в винде рисовать через асму тупой записью в память МОЖНО
    имхо я так делал
    но давно(
    адрес забыл

  16. 11
    Александр Lert ответил:

    #11: Не совсем так. Напрямую 16-битные программы можно запускать только в винде 98, 95 или в более ранней.
    В Windows 2000, XP, Vista программа будет запущена под эмулятором NTVDM, в котором эта самая программа преспокойно сможет писать в свою личную видеопамять – окно консоли :) Только по-моему, в консоли работают только текстовые видеорежимы. А смена видеорежима на графический NTVDM не поддерживает, и программа выпадет с ошибкой.

    #9: АПИ конечно можно использовать на асме. И даже необязательно через invoke, можно просто через серию команд push, запихивающих параметры в стек, и следующей за ними команды call, выполняющей вызов. Так как большинство API используют конвенцию вызова stdcall, то больше никаких действий выполнять не надо, как в случае вызова функций C. Мануалов по использованию WinAPI на асме в инете существует предостаточно.

  17. 10
    Сергей Старовой ответил:

    Никто не мешает запускать 16-битные досовские программы в винде. И соответственно никто не мешает этим программам писать прямо в видеопамять.

  18. 9
    Никита Миклушов ответил:

    признаю мою не компитентность(

  19. 8
    Евгений Яворский ответил:

    to :Станислав  -zOrG-[PK] Марков
    Ну и что? А на асме нельзя использовать АПИ?
    Например через invoke.

  20. 7
    Александр Lert ответил:

    #7: бреда в ответе больше, чем в вопросе :)

    h8000 – откуда это взялось и что это такое? Еще раз повторю, в Windows видеопамять не доступна в пользовательском режиме. Если же речь теперь идет о 16-битном режиме (например, под чистым DOS), то и там адрес другой (в стандартном VGA, например, A000:0000h).

    Далее, написано byte, а регистр указан bx, который, как известно, хранит слово (2 байта) – несостыковка! Кстати, более того, в 16-битном режиме по регистру ax адресовать нельзя.

    Если же речь все-таки о работе под Windows, то, чтобы рисовать на экране, нужно использовать функции Windows GDI, такие как GetDC, SetPixel и т.д. Или создавать картинки в памяти в формате DIB, "рисовать" в памяти, и выводить их на экран (см. функции CreateDIBitmap, StretchDIBits) – этот вариант больше согласуется с асмом в смысле похожести на традиционный прямой доступ к видеопамяти.

  21. 6
    Никита Миклушов ответил:

    h8000 – видео память
    mov byte ds:[ax], bx
    ax – по какому адрессу
    bx – что нужно записать

  22. 5
    Станислав Марков ответил:

    он же хочет на асме

  23. 4
    Евгений Яворский ответил:

    может GetDesktopWindow?

  24. 3
    Виталий Лещенко ответил:

    В винде это тоже возможно, но делается путем использования WinApi.

  25. 2
    Александр Lert ответил:

    По первому вопросу:
    Тоже не понял. Если вы собираетесь рисовать на экране с помощью асма, записывая байты по всяким адресам, то, уведомляю, в винде это невозможно :)

  26. 1
    Руслан Шамюнов ответил:

    Первый вопрос не понял. Хэндл нужен что ли?
    MOV BYTE PTR DS:[addr], byte

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.