Сообщение Получение событий от работающего WMPlayer от 29.04.2015 13:30
Изменено 29.04.2015 13:42 Weiss
Коллеги,
Мне нужно отлавливать события о работе уже запущенного wmplayer: начало/конец проигрывания видео. Не могу подключиться к нему легальным способом, т.е. инжекты на рассматриваю. ОС: Windows 8 x64.
Когда wmplayer стартует он регистрирует свой IUnknown в ROT с таким DisplayName: "clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2".
Попробовал слежующие способы подключения к нему:
1) Через GetActiveObject (из oleauto.h): в качестве CLSID задавал {91778246-9BE4-4713-A651-E833B853CC30}:
const wchar_t MediaPlayerClsidString [] = L"{91778246-9BE4-4713-A651-E833B853CC30}";
CLSIDFromString(MediaPlayerClsidString, &clsid);
HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
получаю hr 0x800401e3 Operation unavailable.
2) Через GetActiveObject: в качестве CLSID задавал {22D6F312-B0F6-11D0-94AB-0080C74C7E95}, который является clsid от coclass из библиотеки типа C:\Windows\System32\msdxm.tlb:
получаю hr 0x800401e3 Operation unavailable.
3) Через ROT, используя IRunningObjectTable::EnumRunning. Т.о. получаю moniker, который идентифицирую по DisplayName=="clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2". С помощью IRunningObjectTable::GetObject(rot, moniker) получаю IUnknown.
С этого IUnknown пытаюсь скверить интерфейсы: IWMPCore, IWMPPlayer, IWMPPlayer2 и т.д. — все что есть в хедере wmp.h. Кроме них еще и IDispatch, IDispatchEx, IInternalUnknown. На все получаю E_NOINTERFACE.
Также попробовал скверить интерфейсы с iid-ами {22D6F311-B0F6-11D0-94AB-0080C74C7E95} и {20D4F5E0-5475-11D2-9774-0000F80855E6}, которые посмотрел в той же библиотеке типа msdxm.tlb — это интерфейсы IMediaPlayer и IMediaPlayer2. Тоже получаю E_NOINTERFACE.
4) Прошелся под дизассемблером по QueryInterface того IUnknown, который получил через моникер из ROT. Обнаружил что можно скверить интерфейсы:
IMarshal, IMarshal2, IStdIdentity, IAgileObject, IProxyManager, IAggregatedIdentity, IRemUnknown. Меня заинтересовал из них IProxyManager, видимо через него можно было бы создать прокси к объекту, который живет в адресном пространстве процесса wmplayer.exe. IProxyManager действительно можно скверить, но как с ним работать дальше пока не нашел.
Т.о. в данный момент у меня есть только последний метод, дающий призрачную надежду на успех предприятия.
И мне подумалось, может я двигаюсь не в тех направлениях? Мнения?
Мне нужно отлавливать события о работе уже запущенного wmplayer: начало/конец проигрывания видео. Не могу подключиться к нему легальным способом, т.е. инжекты на рассматриваю. ОС: Windows 8 x64.
Когда wmplayer стартует он регистрирует свой IUnknown в ROT с таким DisplayName: "clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2".
Попробовал слежующие способы подключения к нему:
1) Через GetActiveObject (из oleauto.h): в качестве CLSID задавал {91778246-9BE4-4713-A651-E833B853CC30}:
const wchar_t MediaPlayerClsidString [] = L"{91778246-9BE4-4713-A651-E833B853CC30}";
CLSIDFromString(MediaPlayerClsidString, &clsid);
HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
получаю hr 0x800401e3 Operation unavailable.
2) Через GetActiveObject: в качестве CLSID задавал {22D6F312-B0F6-11D0-94AB-0080C74C7E95}, который является clsid от coclass из библиотеки типа C:\Windows\System32\msdxm.tlb:
получаю hr 0x800401e3 Operation unavailable.
3) Через ROT, используя IRunningObjectTable::EnumRunning. Т.о. получаю moniker, который идентифицирую по DisplayName=="clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2". С помощью IRunningObjectTable::GetObject(rot, moniker) получаю IUnknown.
С этого IUnknown пытаюсь скверить интерфейсы: IWMPCore, IWMPPlayer, IWMPPlayer2 и т.д. — все что есть в хедере wmp.h. Кроме них еще и IDispatch, IDispatchEx, IInternalUnknown. На все получаю E_NOINTERFACE.
Также попробовал скверить интерфейсы с iid-ами {22D6F311-B0F6-11D0-94AB-0080C74C7E95} и {20D4F5E0-5475-11D2-9774-0000F80855E6}, которые посмотрел в той же библиотеке типа msdxm.tlb — это интерфейсы IMediaPlayer и IMediaPlayer2. Тоже получаю E_NOINTERFACE.
4) Прошелся под дизассемблером по QueryInterface того IUnknown, который получил через моникер из ROT. Обнаружил что можно скверить интерфейсы:
IMarshal, IMarshal2, IStdIdentity, IAgileObject, IProxyManager, IAggregatedIdentity, IRemUnknown. Меня заинтересовал из них IProxyManager, видимо через него можно было бы создать прокси к объекту, который живет в адресном пространстве процесса wmplayer.exe. IProxyManager действительно можно скверить, но как с ним работать дальше пока не нашел.
Т.о. в данный момент у меня есть только последний метод, дающий призрачную надежду на успех предприятия.
И мне подумалось, может я двигаюсь не в тех направлениях? Мнения?
Коллеги,
Мне нужно отлавливать события о работе уже запущенного wmplayer: начало/конец проигрывания видео. Не могу подключиться к нему легальным способом, т.е. инжекты на рассматриваю. ОС: Windows 8 x64.
Когда wmplayer стартует он регистрирует свой IUnknown в ROT с таким DisplayName: "clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2".
Попробовал следующие способы подключения к нему:
1) Через GetActiveObject (из oleauto.h): в качестве CLSID задавал {91778246-9BE4-4713-A651-E833B853CC30}:
const wchar_t MediaPlayerClsidString [] = L"{91778246-9BE4-4713-A651-E833B853CC30}";
CLSIDFromString(MediaPlayerClsidString, &clsid);
HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
получаю hr 0x800401e3 Operation unavailable.
2) Через GetActiveObject: в качестве CLSID задавал {22D6F312-B0F6-11D0-94AB-0080C74C7E95}, который является clsid от coclass из библиотеки типа C:\Windows\System32\msdxm.tlb:
получаю hr 0x800401e3 Operation unavailable.
3) Через ROT, используя IRunningObjectTable::EnumRunning. Т.о. получаю moniker, который идентифицирую по DisplayName=="clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2". С помощью IRunningObjectTable::GetObject(rot, moniker) получаю IUnknown.
С этого IUnknown пытаюсь скверить интерфейсы: IWMPCore, IWMPPlayer, IWMPPlayer2 и т.д. — все что есть в хедере wmp.h. Кроме них еще и IDispatch, IDispatchEx, IInternalUnknown. На все получаю E_NOINTERFACE.
Также попробовал скверить интерфейсы с iid-ами {22D6F311-B0F6-11D0-94AB-0080C74C7E95} и {20D4F5E0-5475-11D2-9774-0000F80855E6}, которые посмотрел в той же библиотеке типа msdxm.tlb — это интерфейсы IMediaPlayer и IMediaPlayer2. Тоже получаю E_NOINTERFACE.
4) Прошелся под дизассемблером по QueryInterface того IUnknown, который получил через моникер из ROT. Обнаружил что можно скверить интерфейсы:
IMarshal, IMarshal2, IStdIdentity, IAgileObject, IProxyManager, IAggregatedIdentity, IRemUnknown. Меня заинтересовал из них IProxyManager, видимо через него можно было бы создать прокси к объекту, который живет в адресном пространстве процесса wmplayer.exe. IProxyManager действительно можно скверить, но как с ним работать дальше пока не нашел.
Т.о. в данный момент у меня есть только последний метод, дающий призрачную надежду на успех предприятия.
И мне подумалось, может я двигаюсь не в тех направлениях? Мнения?
Мне нужно отлавливать события о работе уже запущенного wmplayer: начало/конец проигрывания видео. Не могу подключиться к нему легальным способом, т.е. инжекты на рассматриваю. ОС: Windows 8 x64.
Когда wmplayer стартует он регистрирует свой IUnknown в ROT с таким DisplayName: "clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2".
Попробовал следующие способы подключения к нему:
1) Через GetActiveObject (из oleauto.h): в качестве CLSID задавал {91778246-9BE4-4713-A651-E833B853CC30}:
const wchar_t MediaPlayerClsidString [] = L"{91778246-9BE4-4713-A651-E833B853CC30}";
CLSIDFromString(MediaPlayerClsidString, &clsid);
HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
получаю hr 0x800401e3 Operation unavailable.
2) Через GetActiveObject: в качестве CLSID задавал {22D6F312-B0F6-11D0-94AB-0080C74C7E95}, который является clsid от coclass из библиотеки типа C:\Windows\System32\msdxm.tlb:
получаю hr 0x800401e3 Operation unavailable.
3) Через ROT, используя IRunningObjectTable::EnumRunning. Т.о. получаю moniker, который идентифицирую по DisplayName=="clsid:91778246-9BE4-4713-A651-E833B853CC30:!session:2". С помощью IRunningObjectTable::GetObject(rot, moniker) получаю IUnknown.
С этого IUnknown пытаюсь скверить интерфейсы: IWMPCore, IWMPPlayer, IWMPPlayer2 и т.д. — все что есть в хедере wmp.h. Кроме них еще и IDispatch, IDispatchEx, IInternalUnknown. На все получаю E_NOINTERFACE.
Также попробовал скверить интерфейсы с iid-ами {22D6F311-B0F6-11D0-94AB-0080C74C7E95} и {20D4F5E0-5475-11D2-9774-0000F80855E6}, которые посмотрел в той же библиотеке типа msdxm.tlb — это интерфейсы IMediaPlayer и IMediaPlayer2. Тоже получаю E_NOINTERFACE.
4) Прошелся под дизассемблером по QueryInterface того IUnknown, который получил через моникер из ROT. Обнаружил что можно скверить интерфейсы:
IMarshal, IMarshal2, IStdIdentity, IAgileObject, IProxyManager, IAggregatedIdentity, IRemUnknown. Меня заинтересовал из них IProxyManager, видимо через него можно было бы создать прокси к объекту, который живет в адресном пространстве процесса wmplayer.exe. IProxyManager действительно можно скверить, но как с ним работать дальше пока не нашел.
Т.о. в данный момент у меня есть только последний метод, дающий призрачную надежду на успех предприятия.
И мне подумалось, может я двигаюсь не в тех направлениях? Мнения?