Узнать, что на рабочем столе произошли изменения %)

Тема в разделе "WASM.A&O", создана пользователем apple, 13 ноя 2006.

  1. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Это я про отсылку скриншотов сервером.
    Если тупо слать их по таймеру, трафик будет немеренный.

    Если анализировать каждый n-ый пиксел на изменение цвета,
    то для приемлегого качества картинки нужно пройтись
    от 80000 до 800000 пикселей и отправлять структуру,
    в которой содержаться только измененые пиксели.

    Может есть какая-то стандартная фукция?

    По крайней мере rAdmin интересно пересылает картинку -
    обновляет только изменившиеся пиксели.

    Желательно сделать это в User mode и без прав админа, а то
    сейчас посоветуете перехватывать драйвер видеоподсистемы %)

    Заранее спасибо.
     
  2. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Радмин версии 3 использует mirror драйвер, который перехватывает функции рисования, и поэтому сами по себе передаются только изменения. Сделать его довольно сложно(так шоб работал нормально) и он не хватает DirextX(еси сильна не извращатся). Поэтому я думаю тебе это не нужно Радмин версии 2х для win2000/2003/XP не использует драйвер. Он хватает с помощью BitBlt. А патом уже ищет какие части изменились. Это можно сделать довольно быстро - думаю 9 кадров в секунду тебя устроят(при оч неплохом сжатии).
     
  3. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    +1
    Значит, я правильно думал. Буду делать так.

    А что обычно быстрее? Сверить хэш потока или несколько пикселей соответствующих секторов.
     
  4. DLag

    DLag New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2006
    Сообщения:
    14
    Быстрее сравнить два куска памяти.
    Делать это на Асме.
    Кста, если кто предложит быстро работающий код на Асме - буду очень благодарен.
     
  5. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Не... второй тоже дравер юзает.. если он небыл такой быстрый, он бы так сильно не покупался...
     
  6. Pushkoff

    Pushkoff New Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    40
    Адрес:
    Донецк
    Для того чтобы передать изменения можно сделать такой изврат
    Делаешь XOR между старым и новым состоянием рабочего стола
    части которые не изменились превратятся в 0
    Этот поток ужимаешь алгоритмом хафмана
    на стороне клиента распаковываешь делаешь XOR содержимого с принятыми данными

    чем меньше будет изменений на рабочем столе тем больше будет коеффициент сжатия
     
  7. Sharp

    Sharp New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    143
    Адрес:
    Ukraine
    RLE в таком случае будет работать лучше Хаффмана.
     
  8. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Лучше всего LZ прокатит. LZ это же чистые данные и повторы. Так вот добавить к ним ещё понятие пропуска. Я видел лет пять назад програ на спетруме по такому принципу ролики сжимала, и её до сих пор никто не переплюнул (кстати у меня образ проги имеется)... Только дело это очень творческое, если охота возиться, то....
     
  9. izebars

    izebars Гадя Петрович Хренова

    Публикаций:
    0
    Регистрация:
    30 сен 2006
    Сообщения:
    25
    Адрес:
    На диване
    Proteus прав. Но если тебе влом изучать LZ, то самым идеальным вариантом будет сжимание, только измененного квадрата, архиватором, находящемся в той же системе, с помощью консольных команд. Лучше всего подойдет 7Z. только не забудь прикрепить к нему 4 координаты квадрата. Врятли тебе кто-нибудь предложит вариант по лучше.
     
  10. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    К счастью, изучать не надо. Наработки есть и по LZ, и по 7Z.
    Только вот представим экран 1024x786 и посчитаем кол-во
    пикселей ~ 80000 это значение каждого пикселя надо получить,
    перевернуть, сравнить. В секунду повторить хотя бы 5 раз.
    Через что это днлать, чтобы получить приемлемую скорость
    считывания хотя бы 5 экранов в секунду?
     
  11. izebars

    izebars Гадя Петрович Хренова

    Публикаций:
    0
    Регистрация:
    30 сен 2006
    Сообщения:
    25
    Адрес:
    На диване
    Ты можешь перевернуть, сравнить и даже сжать, при скорости 25 раз в секунду, это гарантировано, если не брать во внимание связь. На какую скорость трафика ты рассчитываешь? Так как при скорости трафика 56 кбит/сек, ровно 5 fps не получится, будет прыгать в пределах 1-5 fps, чаще будет 2 fps. Но ты к примеру можешь уменьшить качество изображения с 1024х768 на 800х600 и уменьшить цвет пикселя с 32 бит до 1 байта тогда будет даже больше 5 fps. Но не советую, так как уменьшение мелкого подчерка сделает его хренчитаемым.
     
  12. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> Врятли тебе кто-нибудь предложит вариант по лучше

    сжатие с потерей качества
     
  13. izebars

    izebars Гадя Петрович Хренова

    Публикаций:
    0
    Регистрация:
    30 сен 2006
    Сообщения:
    25
    Адрес:
    На диване
    По твоему это лучше? Какой именно алгоритм? Так как jpeg эффективен только если постоянно фильмы или фотографии просматриваются на весь экран. В остальных же случаях намного круче улучшенный алгоритм LZ. И ваще apple говорил про “только изменившееся пиксели”.
     
  14. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    дано:
    произвольный алгоритм (в среднем сжимает в n раз)
    1 исходная картинка 1024*764*24bpp = 2359296 байт
    2 картинка 1024*764*8bpp (получена из предыдущей усечением глубины цвета) = 786432 байт
    что лучше сожмется 1 или 2 ?
    а вот твой же ответ: "уменьшить цвет пикселя с 32 бит до 1 байта тогда будет даже больше 5 fps" :)

    >> И ваще apple говорил про “только изменившееся пиксели”

    и ваще давно придуман MPEG ( а 7Z нет и врядл и будет )
     
  15. izebars

    izebars Гадя Петрович Хренова

    Публикаций:
    0
    Регистрация:
    30 сен 2006
    Сообщения:
    25
    Адрес:
    На диване
    fr0b-p, чтобы тебе было легче понять то что я написал, попробуй создай свой троянец с этим методом. А если у тебя нет желания его писать, то просто сосредоточь всю свою силу и концентрацию и вдарь клавиатурой себе по башке, чтобы не было глупых вопросов.
     
  16. izebars

    izebars Гадя Петрович Хренова

    Публикаций:
    0
    Регистрация:
    30 сен 2006
    Сообщения:
    25
    Адрес:
    На диване
    Молодец, сразу бы так;)
     
  17. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    о великий izebars ! сколько раз мне нужно вдарить клавиатурой по моей башке что бы понять какое из моих утверждений является вопросом? :P
     
  18. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Ага. Корректно работающий драйвер зделать тяжело. Я пробовал ставить хук на wm_paint, но отображаюцца не все изменения :/

    Способ с BitBlt хорош, если еще и пожать например LZO-шкой то вообще гут.
    Можно зделать вычитание образов либо через 2 bitblt либо напрямую. Видел код на дельфи по этому поводу. Если интересует могу поискать.
     
  19. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Вопрос по теме: Важна ли загрузка проца на удаленной машине? Я просто на днях делал такого шпиона (подключился к местной локалке и стало интересно;) ) Делал все приблизительно так: экран (допустим 1024х768) разбивал на участки 64х64. Выходит 192 участка. Создавал в оперативе 192 битмапа, залитых черным цветом. Считал хеш всех участков экрана, и если какойто хеш изменился - делал BitBlt по XOR-у (SRCINVERT) на соответствующий ему битмап. Далее пожимал измененные битмапы неким подобием RLE и "вещал" их по UDP. Все писалось на С++ без всяких MFC/CRT чисто на API, влезло в 4кб. Добился около 5фпс, но при этом агрузка ЦПУ на удаленной машине (AMD64 3200 runing at 2700MHz + ASUS 6600GT) была 20-30% :dntknw:
     
  20. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    У rAdmina, если изменений много, примерно такая же загрузка (AMD3000+), так что вполне подходит.
    Мне интересен трафик, передаваемый по сети.
    Я пока пробую ксорить 2 битмапа, потом компрессовать. Получается для 1024x786 24bpp без ксора 146кБ, с ксором в два раза меньше (хз, наверное, из-за преобладания одинаковых бит). Конечно, разбив на участки и передавая только изменившиеся, трафик должен снизится.
    Bohdan200, а можно код посмотреть?