Mirror Driver

Тема в разделе "WASM.NT.KERNEL", создана пользователем nbyte, 27 май 2007.

  1. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Здравствуйте вижу тут народ серьезный может ктонибудь тут сможет ответить.
    Вообщем хочю сделать снятие скриншота и сжатие его по размеру, также как делает Radmin.
    Вижу что Radmin юзает mirror display driver.
    Начал разбираться с этим прибамбасом, в DDK нашол пример src\video\displays\mirror.
    Там якобы как пишет M$ есть пример и сам драйвер.
    Скомпилировал я драйвер и пример.
    Драйвер установил нормально.
    Вот так выглядит
    [​IMG]
    С этим у меня проблем нету.
    Но когда я запускаю пример я кроме инфы о драйвере ничего не вижу.
    [​IMG]
    Как-же с ним всётаки работать?
    В readme написано что типа показывает, но реально ничего невижу.
    Уже обыскал интернет весь то это точно я уверен.
    Как-же всё-таким им пользоваться ? :rolleyes:
     
  2. kelt

    kelt New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    16
    его нужно приаттачить к десктопу --- указать origin и width/height, после чего ты сможешь подписаться на вызовы GDI. чтобы отодрать его обратно - сделать тоже самое, но width = height = 0. в DDK всё описано, смотреть по ключевому слову ChangeDisplaySettingsEx.
     
  3. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Kelt, извиняюсь что непонимаю всё.
    Читал я доки т не один раз прочел про Mirror Drivers и Mirror Driver Installiation, но саму суть так и немогу понять.
    Очень прошу помочь.
    А именно мне вот что непонятно всетаки:
    Что они понимают под словом десктоп?
    И как подписаться на вызовы GDI(при помощи какой(-их) Api функций) если точнее как их ловить?
     
  4. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Мне именно очень интересует как ловить то что делает Mirror Driver.
     
  5. kelt

    kelt New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    16
    nbyte
    Начну с простого: нафига Mirror Driver нужен в твоем случае. RAdmin (и прочие подобные тулзы) так или иначе посылают изображение по сети. Для уменьшения траффика, один раз посылается весь экран целиком, дальше посылаются только измененные части. Есть несколько способов определить измененные части, например сделать два последовательных скриншота и побайтово их сравнить :) Это плохо, ибо сильно нагружает процессор. Другой вариант: воспользоваться Mirror Driver'ом для отслеживания изменившихся регионов.

    Теперь чуть глубже. Видел когда-нибудь мультимониторные системы? Так вот. Каждый монитор (каждое графическое устройство) прцеплено куда-то на т.н. виртуальный десктоп. Ты можешь сделать длинную колбасу из трех дисплеев или, например, фигуру, напоминающую букву "г" (один дисплей снизу, другой справа). Так вот: Mirror Driver можно прицепить к какой-то точке этого виртуального дисплея и задать ему размер области, с которой он работает.

    Дальше, GDI будет дергать соответствующие методы твоего драйвера, если какие-либо пользовательские вызовы GDI будут затрагивать регион, к которому Mirror Driver прицеплен.

    По памяти примерно так :) Будут конкретные вопросы - задавай.
     
  6. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Спасибо за ответ.
    Да я изза этого делаю.
    Я в эту сторону и делаю :).
    Меня интересуют следущие вопросы:
    1.После того как я правильно заполню и сделаю вызов ChangeDisplaySettingsEx то как будет GDI (тоесть какие сообщения будут приходить или еше как либо)?
    2.И еше вот что мне очень интересно насшет сжатия(изменение полученного изображения), как так быстро удаёться Radminu это сделать, у меня тока за 80ms получалось сжать качественно, тут скорей всего с Mirror Driver тоже чтото связано?
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    nbyte
    я делал аналог радмина. получился более медленный по скорости.
    пришел к выводу, что надо оптимизировать сжатие, возможно пользоваться алгоритмами типа mpeg, разделять пересылку и приготовление кадров
     
  8. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Ну там если простой алгоритм MaX до 50 ms можно сделать, а это неособо хорошо.
     
  9. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    бррр... ну никак я тут немогу врубиться.
    Помогите ктонибудь пожалуйста !!!
     
  10. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Как мне хоть перехватить, эти GDI сообшения?
     
  11. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    slow
    А как насчет структуры DEVMODEW, может там можно сжатие задать(по размеру)?
    Я немогу это проверить так как незнаю как получить изображение.
     
  12. kelt

    kelt New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    16
    1. посмотри файлик disp\enable.c из примера. это оно и есть. там вначале идет табличка функций, на которые подписывается драйвер. её можно расширить до того состояния, которое тебе требуется. вот такого должно хватить:
    Код (Text):
    1. static DRVFN gadrvfn[] =
    2. {
    3.     {   INDEX_DrvEnablePDEV,            (PFN) DrvEnablePDEV         },
    4.     {   INDEX_DrvCompletePDEV,          (PFN) DrvCompletePDEV       },
    5.     {   INDEX_DrvDisablePDEV,           (PFN) DrvDisablePDEV        },
    6.     {   INDEX_DrvEnableSurface,         (PFN) DrvEnableSurface      },
    7.     {   INDEX_DrvDisableSurface,        (PFN) DrvDisableSurface     },
    8.     {   INDEX_DrvAssertMode,            (PFN) DrvAssertMode         },
    9.     {   INDEX_DrvDisableDriver,         (PFN) DrvDisableDriver      },
    10.     {   INDEX_DrvBitBlt,                (PFN) DrvBitBlt             },
    11.     {   INDEX_DrvCopyBits,              (PFN) DrvCopyBits           },
    12.     {   INDEX_DrvTextOut,               (PFN) DrvTextOut            },
    13.     {   INDEX_DrvEscape,                (PFN) DrvEscape             },
    14.     {   INDEX_DrvGetModes,          (PFN) DrvGetModes           },
    15.     {   INDEX_DrvStrokePath,        (PFN) DrvStrokePath         },
    16.     {   INDEX_DrvStrokeAndFillPath, (PFN) DrvStrokeAndFillPath  },
    17.     {   INDEX_DrvStretchBlt,        (PFN) DrvStretchBlt         },
    18.     {   INDEX_DrvPlgBlt,            (PFN) DrvPlgBlt             },
    19.     {   INDEX_DrvStretchBltROP,     (PFN) DrvStretchBltROP      },
    20.     {   INDEX_DrvLineTo,            (PFN) DrvLineTo             },
    21.     {   INDEX_DrvAlphaBlend,            (PFN) DrvAlphaBlend         },
    22.     {   INDEX_DrvGradientFill,          (PFN) DrvGradientFill       },
    23.     {   INDEX_DrvTransparentBlt,        (PFN) DrvTransparentBlt     },
    24.     {   INDEX_DrvSetPointerShape,       (PFN) DrvSetPointerShape    },
    25.     {   INDEX_DrvMovePointer,           (PFN) DrvMovePointer        },
    26.     {   INDEX_DrvSetPalette,            (PFN) DrvSetPalette         },
    27. };
    описание каждой из них есть в DDK.

    2. попробуй передавать измененные регионы по квадрантам. возможно, выиграешь.
     
  13. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, я извиняюсь что непонимаю ,но вот самого главного как мне этой таблицей пользовать(я новичок в драйверах).
    Описание есть тока ими пользоваться из своей проги (тут импортировать както нужно или как)?
    Можешь на любом языке программирования кусок кода показать или просто пояснить?
    Ну не доходит до меня.
    Заранее спасибо.
     
  14. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Ну не какого экспорта я не вижу в Pe Explorere.
     
  15. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Ну пока сколько я статей читал понял что как-то с DrvDrawEscape надо отлавливать тока как?
    Или я в не правильную сторону думаю?
    Пробовал DrvDrawEscape в драйвер вставить ,но безусшно.
     
  16. kelt

    kelt New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    16
    функции не только экспортом можно передавать. посмотри, как используется глобальная переменная gadrvfn в этом драйвере.

    табличка очень простая: это массив структур вида { индекс_функции, адрес_функции }. принципиальной разницы между драйвером и не драйвером тут нет :) эти функции используются только внутри твоего драйвера. ты эти функции пишешь (дописываешь). если тебе надо получить суммарный измененный регион, то делай так: каждой из этих функций так или иначе передается прямоугольник, который предполагается изменить. собираешь все изменения в кучку, после чего при помощи Escape-запроса к DC можно вытащить их из user-mode приложения.
     
  17. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, а пример из src\video\displays\mirror\app, то как я понимаю врубает этот драйвер?
    То почему я не ловлю при помощи dbview следушии участки кода из enable.c например
    Код (Text):
    1.    DISPDBG((1,
    2.             "Mirror Driver DrvTextOut: pwstr=%08x\n",
    3.             pstro ? pstro->pwszOrg : (WCHAR*)-1));
    А код
    Код (Text):
    1.     DISPDBG((0,"DrvEnableDriver:\n"));
    Ловиться?
    Чета я до конца не врубаюсь как он работает.
     
  18. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, но я вроде
    Код (Text):
    1.  {   INDEX_DrvBitBlt,                (PFN) DrvBitBlt             },
    2. и
    3. HOOK_COPYBITS
    Внёс ,а почему не сробатыет тогда функция DrvCopyBits при BitBlt, я хоть в правильную сторону думаю она по идее должна сробатывать ?
     
  19. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Доперло до меня в чем проблема. Я незнал что не только надо dll менять ,но и инсталить драйвер заново.
     
  20. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Теперь другая проблема.
    Когда я начинаю юзать Mirror Driver, то на рабочем столе под иконками надпись вместо прозрачного фона получаются с фоном вот так они выглядят и лево прорисовывается выпадающие меню.
    [​IMG]