Custom DLL loader 2
От: Patalog Россия  
Дата: 09.09.12 08:19
Оценка:
Всем привет!

<pre>
Cабж — реальность данная в ощущениях, по сему убеждать про кривость данного подхода не нужно.
</pre>

Столкнулся со след. проблемой в схеме —
WMP (Windows Media Player) -> my DLL -> my custom loader -> quartz.dll
не работает resize окна WMP c видео рендером (vmr7, vmr9).
Точнее так — окно WMP ресайзется, ресайзится видео текстура рендера, а вот окно самого vmr (windowed mode) — нет.
Еще точнее — окно ресайзиться в начальных пределах, т.е. если изначально рендер создал окно 320x200, то в 100x100 (в сторону уменьшения) оно ресайзиться нормально, а вот в сторону увеличения — нет. Fullscreen соответ. тоже не работает.
Хотя, если смотреть spy'ем — события к окну рендера прилетают.

Есть один интересный нюанс — если при вызове dll entry point подсунуть загружаемой dllке instance "внешней" библиотеки (загруженной штатным загрузчиком) — все работает! :crash:
Т.е. схема WMP (Windows Media Player) -> my DLL -> my custom loader (call DllMain with my DLL instance handle) -> quartz.dll работает.
Попытки повторить поведение в песочнице не увенчались успехом — т.е. схема
My test app. -> my DLL -> my custom loader -> quartz.dll так же нормально работает.

Есть идеи куда смотреть?

Сначала грешил на отсут. реализации нотификации DLL_THREAD_ATTACH в загрузчике — исправил, не помогло, тем более если грузить quartz штатным образом, у него стоит флаг LDR_DONT_CALL_FOR_THREADS.
TLS вроде как тоже не причем — статического TLS в quartz нет (по крайней мере нет директории IMAGE_DIRECTORY_ENTRY_TLS),
а динамический должен нормально работать (проверялось при загрузке своих либ).
Может проблема с Activation Context? Сам по себе он в моем загрузчике запилен для для библиотек в манифестом, но у кварца его в ресурсах нет.
Должен ли в этом случае как-то использоваться ActivationContextData\SystemDefaultActivationContextData из PEB?
Может нужно смотреть куда-нибудь в сторону TEB.Win32ThreadInfo\TEB.Win32ClientInfo?
Почетный кавалер ордена Совка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.