Форум: "Media";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизEnumSurfaces в контексте потока чужего процесса Найти похожие ветки
← →
Torvald (2005-10-19 18:23) [0]Как, находясь в контексте потока чужего процесса (через hook), можно получить список всех Surfaces (IDirectDrawSurface) или же интерфейс IDirectDraw, если приложение использует DirectX?
И вообще возможно ли это сделать?
Я не знаток COM технологий и подавно DirectX, но вот пришлось столкнуться.
Спасибо.
← →
Sapersky (2005-10-19 19:10) [1]В составе madCollection/madCodeHook ( http://www.madshi.net ) есть пример. Во всяком случае, получение IDirectDraw там есть. А поверхности - IDirectDraw.EnumSurfaces или перехватить IDirectDraw.CreateSurface.
← →
Torvald (2005-10-19 20:02) [2]
> Sapersky (19.10.05 19:10) [1]
Спасибо огромное, гляну!
← →
Torvald (2005-10-19 22:44) [3]Установил madCollection, вещь просто нет слов какая ) почему я раньше про неё не слышал !!!
Глянул пример внедрения/перехвата Direct3D. Всё очень понятно и главное работает.
НО программы для захвата изображения через оверлей, например HyperSnap-DX, работают по-другому.
Специфика madCodeHook в том, что он перехватывает API вызовы, т.е. чтобы получить интерфейс IDirectDraw, там перехватывается функция DirectDrawCreateEx, таким образом невозможно получить уже созданый интерфейс.
HyperSnap-DX работет по-другому, он как-то перехватывает уже загруженые интерфейсы. Как? С помощью дизасемблера/отладчика удалось выяснить, что создаётся глобальный хук (dxsnap.dll) на клавиатуру и в момент нажатия клавиши PrintScreen этот хук передаёт в основную программу "захваченую" картинку.
Вот несколько интересных ресурсов-строк из этой ДЛЛ
" ... and it is VISIBLE, ddc.dwCaps "
" alpha = 0x%X"
" Got OVERLAY surface in EnuSurfCB() "
" Got OVERLAY surface in EnuSurfCB2()"
" Got OVERLAY surface in EnuSurfCB3()"
" Got PRIMARY surface in EnuSurfCB() "
" Got PRIMARY surface in EnuSurfCB2()"
" green = 0x%X"
...
"Bits per pixel: %d"
"Capture from MyGetDeviceData()"
"Capture from MyGetDeviceState()"
"CardType: %d"
"CBTHookProc"
...
"ddraw.dll"
"dinput.dll"
"dinput8.dll"
"DirectDrawCreate"
"DirectDrawCreateEx"
"DirectInput8Create"
"DirectInputCreateEx"
"DirectX 3Dfx filter"
"Discard Very First Scroll Lock"
"dwBBitMask = %x"
"dwFourCC = %x, MAKEFOURCC(UYVY) "
"dwGBitMask = %x"
"dwProcId = %8X"
"dwRBitMask = %x"
"dwUBitMask = %X"
"dwVBitMask = %X"
..
"Got lpDDSurface in EnuSurfCB() "
"Got lpDDSurface in EnuSurfCB2() "
"Got lpDDSurface in EnuSurfCB3() "
..
"pDDCreate is NULL"
"pDDSMem after CreateSurface() "
"pDirectDraw = %x, pDirectDraw2 "
"pDirectDraw->GetDisplayMode() "
"pDirectDraw2->EnumSurfaces() for "
"pDirectDraw2->GetDisplayMode() "
"pDirectDraw4->EnumSurfaces() caused "
"pDirectDraw4->GetDisplayMode() "
"pDirectDraw7->EnumSurfaces() caused "
"pDirectDraw7->GetDisplayMode() "
"pDirectInput8Create is NULL"
...
За madCollection спасибо, такое пригодиться )
Может есть другое решение?
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.047 c