быстрое копирование экрана

Тема в разделе "WASM.DirectX", создана пользователем nMaxwell, 10 окт 2011.

  1. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    всем привет.
    при снятии скринов экрана (видео), с помощью как бы аппаратной BitBlt, получаем ~15-20 fps, что маловато, также не показывается оверлейное видео. возможно, что процедуру тормозит копирование из видео в оп память (или в своп). как получить хотя бы 30-40 fps и "соскринить" оверлей?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Железо, ось, софт.
     
  3. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    атлон 6 ГГц, жираф 9600 (512 MB) ; вынь;
    машина, для которой все пишется несколько слабее
     
  4. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    nMaxwell
    Если правильно понял вашу мысль и ничего не путаю - смотреть код зевса.
     
  5. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    AndjellaArtavazdovna
    а причем здесь троян? или мы о разных вещах?
     
  6. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    nMaxwell
    Не - не, извиняюсь раз речь не о том.
     
  7. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Там VNC модуль есть, реализующий вашу задачу
     
  8. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    нашел VNC, буду смотреть, спасибо
     
  9. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    nMaxwell
    Есть там просто код такой,под ваши цели подходящий,я думал вы именно в этих целях интересуетесь.
     
  10. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    я возможно плохо искал, но большинство реализаций тормознутые, также коряво используют BitBlt. качественнее всех работает Radmin (DirectScreenTransfer - используется драйвер), но его исходников нет
     
  11. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    nMaxwell
    Radmin юзает имено драйвер-фильтр (video).
    Вы сначала опишите подробно что вам надо. Может есть что попроще драйвер-фильтра ...

    ЗЫ. Radmin 3.x тоже не совершенен, если включить видео поток в оверлее (тормоза те ещё).
     
  12. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    T800
    подробнее некуда: удаленное управление десктопом, как вы верно подметили, фильтр писать не хочется. этот драйвер позволяет делать несколько сотен кадров в секунду, мне хватит и 30-40
     
  13. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
  14. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    reverser
    тут, по моему, используется dxgi + dx10-11, что для хрюши и старого гпу неподъемная ноша... а счастье было так близко

    2all: может можно реализовать с помощью dshow?
    судя по тому, что в нете ничего не нашел и никто не отвечает, буду пробовать использовать драйвер. для детектирования изменений на экране поможет mirror driver, а вот как сделать скрин?
     
  15. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    nMaxwell
    А вы не задавались вопросом, какая пропускная способность сети должна быть, чтобы передавать "сырые" скриншоты. radmin их пакует и всячески пытается уменьшить в объеме, передавая только изменения.
     
  16. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    valterg
    давно задавался и делаю все постепенно: сначала реализовал через bitblt и сжатие с помощью xvid / mpeg. локальные 12-20 fps не особо радовали. сейчас хочу хотя бы 25-30 кадров. буду фиксировать изменения через ddk-шный mirror driver, в памяти гпу находить измененные квадраты, жать их mpeg'ом, вроде он же для этих целей и создавался
     
  17. nMaxwell

    nMaxwell New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    77
    в общем, почти все это уже реализовано в TightVNC, осталось допилить сжатие.
    но ради спортивного интереса вопрос остается открытым: как из драйвера в памяти гпу копировать экран и редактировать там же его
     
  18. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    nMaxwell
    IDirectDraw::GetGDISurface
    IDirectDraw::FlipToGDISurface
     
  19. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Тут нет каких то API от MS.
    На старых видюхах можно было как то работать с видео памятью, т.к. она была линейной. Но на современных монстрах она не линейна и всё это не документировано и меняется.
    ЗЫ. Эту тему сам мусолил год назад. Даже Great подключался (я за основу взял его дров: http://www.wasm.ru/forum/viewtopic.php?id=30224 ).
     
  20. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Стоит признать из вас не кто не знает виндовс. вам бы только всякие гуано повторять и прочей буйней маятся...

    BitBlt ну уж не как не апаратна. и может быть актуальной для 5X ядра /


    Что же касается 6X тут дело обстоят иначе.. На сцену (со своей сценой и адаптерами + вирт дефайсами) вступает 9,10X -> переходящий в 11 X/
    В Ядре снять экран моно через такую поепоту: http://msdn.microsoft.com/en-us/library/aa480220.aspx

    Что же касательно перехвата для ядро гуано дебаггер(типо сусера)
    Сплайсим ZwLoadDriver на предмет DXGKrnl -> IRP_MJ_INTERNAL_DEVICE_CONTROL + установить сплайс для DxgkInitialize.

    При спайсинге DxgkInitialize
    DxgkDdiSetVidPnSourceAddress
    DxgkDdiCreateAllocation
    DxgkDdiDestroyAllocation
    DxgkDdiSetVidPnSourceVisibility

    Вообще кто знает тот поймет ... :)



    User M0de. (Или унылый мод)

    Делает инжект dwm.exe (Если не знаем как то идем срать керпечами)
    Спайсим две функты
    D3D10CreateDevice1
    CreateDXGIFactory
    Подстовляем прокси ...
    CreateDXGIFactory -> Мониторим ProxyDXGIFactory::QueryInterface()
    На предмет запроса { 0x713F394E, 0x92CA, 0x47E7, { 0xAB, 0x81, 0x11, 0x59, 0xC2, 0x79, 0x1E, 0x54 } }; -> InterfaceDWM
    InterfaceDWM
    {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, VOID **ppvObject );
    virtual ULONG STDMETHODCALLTYPE AddRef(void);
    virtual ULONG STDMETHODCALLTYPE Release(void);

    STDMETHOD(CreateSwapChain)( IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc, IDXGIOutput *pOutput, IDXGISwapChainDWM **ppSwapChainDWM );
    }

    struct IDXGISwapChainDWM : public IDXGIDeviceSubObject
    {
    STDMETHOD(Present)( UINT SyncInterval, UINT Flags ) = 0;
    STDMETHOD(GetBuffer)( UINT Buffer, REFIID riid, void **ppSurface) = 0;
    STDMETHOD(GetDesc)( DXGI_SWAP_CHAIN_DESC *pDesc ) = 0;
    STDMETHOD(ResizeBuffers)( UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags ) = 0;
    STDMETHOD(ResizeTarget)( const DXGI_MODE_DESC *pNewTargetParameters ) = 0;
    STDMETHOD(GetContainingOutput)( IDXGIOutput **ppOutput ) = 0;
    STDMETHOD(GetFrameStatistics)( DXGI_FRAME_STATISTICS *pStats ) = 0;
    STDMETHOD(GetLastPresentCount)( UINT *pLastPresentCount ) = 0;
    STDMETHOD(SetFullscreenState)( BOOL Fullscreen, IDXGIOutput *pTarget ) = 0;
    STDMETHOD(GetFullscreenState)( BOOL *pFullscreen, IDXGIOutput **ppTarget ) = 0;
    };

    ProxyIDXGISwapChainDWM::Present(

    Дальше понадобится вытащить (или перехватить ) SourceScrene (ID3D10Texture2D *) ... Идея думаю ясна ... вообще все это буйня копибара не нужна ... вот как то так!


    П.С
    Я не говорю что мои слова или же текста (или просто буквы) основываются на какомто смысле и их стоит воспренимать в серъез... Но посмотреть можно :) особенно погуглить и будет дело... Ну если и так не получается значит просто руки очень кривые ... или полнейшее пустота в голове ...