FakeFilterMapper2.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:20k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include "fakefiltermapper2.h"
  23. #include "MacrovisionKicker.h"
  24. #include "......includedetoursdetours.h"
  25. #include "....DSUtilDSUtil.h"
  26. #include <initguid.h>
  27. #include <qedit.h>
  28. DETOUR_TRAMPOLINE(HRESULT WINAPI Real_CoCreateInstance(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter, IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID FAR* ppv), CoCreateInstance);
  29. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCloseKey(HKEY a0), RegCloseKey);
  30. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegFlushKey(HKEY a0), RegFlushKey);
  31. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCreateKeyA(HKEY a0, LPCSTR a1, PHKEY a2), RegCreateKeyA);
  32. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCreateKeyW(HKEY a0, LPCWSTR a1, PHKEY a2), RegCreateKeyW);
  33. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCreateKeyExA(HKEY a0, LPCSTR a1, DWORD a2, LPSTR a3, DWORD a4, REGSAM a5, LPSECURITY_ATTRIBUTES a6, PHKEY a7, LPDWORD a8), RegCreateKeyExA);
  34. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegCreateKeyExW(HKEY a0, LPCWSTR a1, DWORD a2, LPWSTR a3, DWORD a4, REGSAM a5, LPSECURITY_ATTRIBUTES a6, PHKEY a7, LPDWORD a8), RegCreateKeyExW);
  35. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteKeyA(HKEY a0, LPCSTR a1), RegDeleteKeyA);
  36. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteKeyW(HKEY a0, LPCWSTR a1), RegDeleteKeyW);
  37. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteValueA(HKEY a0, LPCSTR a1), RegDeleteValueA);
  38. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegDeleteValueW(HKEY a0, LPCWSTR a1), RegDeleteValueW);
  39. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegEnumKeyExA(HKEY a0, DWORD a1, LPSTR a2, LPDWORD a3, LPDWORD a4, LPSTR a5, LPDWORD a6, struct _FILETIME* a7), RegEnumKeyExA);
  40. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegEnumKeyExW(HKEY a0, DWORD a1, LPWSTR a2, LPDWORD a3, LPDWORD a4, LPWSTR a5, LPDWORD a6, struct _FILETIME* a7), RegEnumKeyExW);
  41. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegEnumValueA(HKEY a0, DWORD a1, LPSTR a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPBYTE a6, LPDWORD a7), RegEnumValueA);
  42. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegEnumValueW(HKEY a0, DWORD a1, LPWSTR a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPBYTE a6, LPDWORD a7), RegEnumValueW);
  43. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegOpenKeyA(HKEY a0, LPCSTR a1, PHKEY a2), RegOpenKeyA);
  44. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegOpenKeyW(HKEY a0, LPCWSTR a1, PHKEY a2), RegOpenKeyW);
  45. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegOpenKeyExA(HKEY a0, LPCSTR a1, DWORD a2, REGSAM a3, PHKEY a4), RegOpenKeyExA);
  46. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegOpenKeyExW(HKEY a0, LPCWSTR a1, DWORD a2, REGSAM a3, PHKEY a4), RegOpenKeyExW);
  47. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryInfoKeyA(HKEY a0, LPSTR a1, LPDWORD a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPDWORD a6, LPDWORD a7, LPDWORD a8, LPDWORD a9, LPDWORD a10, struct _FILETIME* a11), RegQueryInfoKeyA);
  48. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryInfoKeyW(HKEY a0, LPWSTR a1, LPDWORD a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPDWORD a6, LPDWORD a7, LPDWORD a8, LPDWORD a9, LPDWORD a10, struct _FILETIME* a11), RegQueryInfoKeyW);
  49. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryValueA(HKEY a0, LPCSTR a1, LPSTR a2, PLONG a3), RegQueryValueA);
  50. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryValueW(HKEY a0, LPCWSTR a1, LPWSTR a2, PLONG a3), RegQueryValueW);
  51. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryValueExA(HKEY a0, LPCSTR a1, LPDWORD a2, LPDWORD a3, LPBYTE a4, LPDWORD a5), RegQueryValueExA);
  52. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegQueryValueExW(HKEY a0, LPCWSTR a1, LPDWORD a2, LPDWORD a3, LPBYTE a4, LPDWORD a5), RegQueryValueExW);
  53. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegSetValueA(HKEY a0, LPCSTR a1, DWORD a2, LPCSTR a3, DWORD a4), RegSetValueA);
  54. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegSetValueW(HKEY a0, LPCWSTR a1, DWORD a2, LPCWSTR a3, DWORD a4), RegSetValueW);
  55. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegSetValueExA(HKEY a0, LPCSTR a1, DWORD a2, DWORD a3, BYTE* a4, DWORD a5), RegSetValueExA);
  56. DETOUR_TRAMPOLINE(LONG WINAPI Real_RegSetValueExW(HKEY a0, LPCWSTR a1, DWORD a2, DWORD a3, BYTE* a4, DWORD a5), RegSetValueExW);
  57. HRESULT WINAPI Mine_CoCreateInstance(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter,
  58.                     IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID FAR* ppv)
  59. {
  60. if(CFilterMapper2::m_pFilterMapper2)
  61. {
  62. CheckPointer(ppv, E_POINTER);
  63. if(rclsid == CLSID_FilterMapper)
  64. {
  65. ASSERT(0);
  66. return REGDB_E_CLASSNOTREG; // sorry...
  67. }
  68. if(rclsid == CLSID_FilterMapper2)
  69. {
  70. if(pUnkOuter) return CLASS_E_NOAGGREGATION;
  71. if(riid == __uuidof(IUnknown))
  72. {
  73. CFilterMapper2::m_pFilterMapper2->AddRef();
  74. *ppv = (IUnknown*)CFilterMapper2::m_pFilterMapper2;
  75. return S_OK;
  76. }
  77. else if(riid == __uuidof(IFilterMapper2))
  78. {
  79. CFilterMapper2::m_pFilterMapper2->AddRef();
  80. *ppv = (IFilterMapper2*)CFilterMapper2::m_pFilterMapper2;
  81. return S_OK;
  82. }
  83. else
  84. {
  85. return E_NOINTERFACE;
  86. }
  87. }
  88. }
  89. /* else
  90. {
  91. if(rclsid == CLSID_FilterMapper2)
  92. {
  93. CFilterMapper2* pFM2 = new CFilterMapper2(true, false, pUnkOuter);
  94. CComPtr<IUnknown> pUnk = (IUnknown*)pFM2;
  95. return pUnk->QueryInterface(riid, ppv);
  96. }
  97. }
  98. */
  99. if(!pUnkOuter)
  100. if(rclsid == CLSID_VideoMixingRenderer || rclsid == CLSID_VideoMixingRenderer9
  101. || rclsid == CLSID_VideoRenderer || rclsid == CLSID_VideoRendererDefault
  102. || rclsid == CLSID_OverlayMixer)// || rclsid == CLSID_OverlayMixer2 - where is this declared?)
  103. {
  104. CMacrovisionKicker* pMK = new CMacrovisionKicker(NAME("CMacrovisionKicker"), NULL);
  105. CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK;
  106. CComPtr<IUnknown> pInner;
  107. HRESULT hr;
  108. if(SUCCEEDED(hr = Real_CoCreateInstance(rclsid, pUnk, dwClsContext, __uuidof(IUnknown), (void**)&pInner)))
  109. {
  110. pMK->SetInner(pInner);
  111. return pUnk->QueryInterface(riid, ppv);
  112. }
  113. }
  114. return Real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
  115. }
  116. #define FAKEHKEY (HKEY)0x12345678
  117. LONG WINAPI Mine_RegCloseKey(HKEY a0)
  118. {
  119. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_SUCCESS;}
  120. return Real_RegCloseKey(a0);
  121. }
  122. LONG WINAPI Mine_RegFlushKey(HKEY a0)
  123. {
  124. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_SUCCESS;}
  125. return Real_RegFlushKey(a0);
  126. }
  127. LONG WINAPI Mine_RegCreateKeyA(HKEY a0, LPCSTR a1, PHKEY a2)
  128. {
  129. if(CFilterMapper2::m_pFilterMapper2) {*a2 = FAKEHKEY; return ERROR_SUCCESS;}
  130. return Real_RegCreateKeyA(a0, a1, a2);
  131. }
  132. LONG WINAPI Mine_RegCreateKeyW(HKEY a0, LPCWSTR a1, PHKEY a2)
  133. {
  134. if(CFilterMapper2::m_pFilterMapper2) {*a2 = FAKEHKEY; return ERROR_SUCCESS;}
  135. return Real_RegCreateKeyW(a0, a1, a2);
  136. }
  137. LONG WINAPI Mine_RegCreateKeyExA(HKEY a0, LPCSTR a1, DWORD a2, LPSTR a3, DWORD a4, REGSAM a5, LPSECURITY_ATTRIBUTES a6, PHKEY a7, LPDWORD a8)
  138. {
  139. if(CFilterMapper2::m_pFilterMapper2) {*a7 = FAKEHKEY; return ERROR_SUCCESS;}
  140. return Real_RegCreateKeyExA(a0, a1, a2, a3, a4, a5, a6, a7, a8);
  141. }
  142. LONG WINAPI Mine_RegCreateKeyExW(HKEY a0, LPCWSTR a1, DWORD a2, LPWSTR a3, DWORD a4, REGSAM a5, LPSECURITY_ATTRIBUTES a6, PHKEY a7, LPDWORD a8)
  143. {
  144. if(CFilterMapper2::m_pFilterMapper2) {*a7 = FAKEHKEY; return ERROR_SUCCESS;}
  145. return Real_RegCreateKeyExW(a0, a1, a2, a3, a4, a5, a6, a7, a8);
  146. }
  147. LONG WINAPI Mine_RegDeleteKeyA(HKEY a0, LPCSTR a1)
  148. {
  149. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  150. return Real_RegDeleteKeyA(a0, a1);
  151. }
  152. LONG WINAPI Mine_RegDeleteKeyW(HKEY a0, LPCWSTR a1)
  153. {
  154. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  155. return Real_RegDeleteKeyW(a0, a1);
  156. }
  157. LONG WINAPI Mine_RegDeleteValueA(HKEY a0, LPCSTR a1)
  158. {
  159. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  160.     return Real_RegDeleteValueA(a0, a1);
  161. }
  162. LONG WINAPI Mine_RegDeleteValueW(HKEY a0, LPCWSTR a1)
  163. {
  164. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  165.     return Real_RegDeleteValueW(a0, a1);
  166. }
  167. LONG WINAPI Mine_RegEnumKeyExA(HKEY a0, DWORD a1, LPSTR a2, LPDWORD a3, LPDWORD a4, LPSTR a5, LPDWORD a6, struct _FILETIME* a7)
  168. {
  169. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_NO_MORE_ITEMS;}
  170.     return Real_RegEnumKeyExA(a0, a1, a2, a3, a4, a5, a6, a7);
  171. }
  172. LONG WINAPI Mine_RegEnumKeyExW(HKEY a0, DWORD a1, LPWSTR a2, LPDWORD a3, LPDWORD a4, LPWSTR a5, LPDWORD a6, struct _FILETIME* a7)
  173. {
  174. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_NO_MORE_ITEMS;}
  175.     return Real_RegEnumKeyExW(a0, a1, a2, a3, a4, a5, a6, a7);
  176. }
  177. LONG WINAPI Mine_RegEnumValueA(HKEY a0, DWORD a1, LPSTR a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPBYTE a6, LPDWORD a7)
  178. {
  179. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_NO_MORE_ITEMS;}
  180.     return Real_RegEnumValueA(a0, a1, a2, a3, a4, a5, a6, a7);
  181. }
  182. LONG WINAPI Mine_RegEnumValueW(HKEY a0, DWORD a1, LPWSTR a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPBYTE a6, LPDWORD a7)
  183. {
  184. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_NO_MORE_ITEMS;}
  185.     return Real_RegEnumValueW(a0, a1, a2, a3, a4, a5, a6, a7);
  186. }
  187. LONG WINAPI Mine_RegOpenKeyA(HKEY a0, LPCSTR a1, PHKEY a2)
  188. {
  189. if(CFilterMapper2::m_pFilterMapper2) {*a2 = FAKEHKEY; return ERROR_SUCCESS;}
  190. return Real_RegOpenKeyA(a0, a1, a2);
  191. }
  192. LONG WINAPI Mine_RegOpenKeyW(HKEY a0, LPCWSTR a1, PHKEY a2)
  193. {
  194. if(CFilterMapper2::m_pFilterMapper2) {*a2 = FAKEHKEY; return ERROR_SUCCESS;}
  195. return Real_RegOpenKeyW(a0, a1, a2);
  196. }
  197. LONG WINAPI Mine_RegOpenKeyExA(HKEY a0, LPCSTR a1, DWORD a2, REGSAM a3, PHKEY a4)
  198. {
  199. if(CFilterMapper2::m_pFilterMapper2 && (a3&(KEY_SET_VALUE|KEY_CREATE_SUB_KEY))) {*a4 = FAKEHKEY; return ERROR_SUCCESS;}
  200. return Real_RegOpenKeyExA(a0, a1, a2, a3, a4);
  201. }
  202. LONG WINAPI Mine_RegOpenKeyExW(HKEY a0, LPCWSTR a1, DWORD a2, REGSAM a3, PHKEY a4)
  203. {
  204. if(CFilterMapper2::m_pFilterMapper2 && (a3&(KEY_SET_VALUE|KEY_CREATE_SUB_KEY))) {*a4 = FAKEHKEY; return ERROR_SUCCESS;}
  205. return Real_RegOpenKeyExW(a0, a1, a2, a3, a4);
  206. }
  207. LONG WINAPI Mine_RegQueryInfoKeyA(HKEY a0, LPSTR a1, LPDWORD a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPDWORD a6, LPDWORD a7, LPDWORD a8, LPDWORD a9, LPDWORD a10, struct _FILETIME* a11)
  208. {
  209. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_INVALID_HANDLE;}
  210. return Real_RegQueryInfoKeyA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
  211. }
  212. LONG WINAPI Mine_RegQueryInfoKeyW(HKEY a0, LPWSTR a1, LPDWORD a2, LPDWORD a3, LPDWORD a4, LPDWORD a5, LPDWORD a6, LPDWORD a7, LPDWORD a8, LPDWORD a9, LPDWORD a10, struct _FILETIME* a11)
  213. {
  214. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {return ERROR_INVALID_HANDLE;}
  215. return Real_RegQueryInfoKeyW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
  216. }
  217. LONG WINAPI Mine_RegQueryValueA(HKEY a0, LPCSTR a1, LPSTR a2, PLONG a3)
  218. {
  219. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {*a3 = 0; return ERROR_SUCCESS;}
  220.     return Real_RegQueryValueA(a0, a1, a2, a3);
  221. }
  222. LONG WINAPI Mine_RegQueryValueW(HKEY a0, LPCWSTR a1, LPWSTR a2, PLONG a3)
  223. {
  224. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {*a3 = 0; return ERROR_SUCCESS;}
  225.     return Real_RegQueryValueW(a0, a1, a2, a3);
  226. }
  227. LONG WINAPI Mine_RegQueryValueExA(HKEY a0, LPCSTR a1, LPDWORD a2, LPDWORD a3, LPBYTE a4, LPDWORD a5)
  228. {
  229. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {*a5 = 0; return ERROR_SUCCESS;}
  230.     return Real_RegQueryValueExA(a0, a1, a2, a3, a4, a5);
  231. }
  232. LONG WINAPI Mine_RegQueryValueExW(HKEY a0, LPCWSTR a1, LPDWORD a2, LPDWORD a3, LPBYTE a4, LPDWORD a5)
  233. {
  234. if(CFilterMapper2::m_pFilterMapper2 && a0 == FAKEHKEY) {*a5 = 0; return ERROR_SUCCESS;}
  235.     return Real_RegQueryValueExW(a0, a1, a2, a3, a4, a5);
  236. }
  237. LONG WINAPI Mine_RegSetValueA(HKEY a0, LPCSTR a1, DWORD a2, LPCSTR a3, DWORD a4)
  238. {
  239. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  240.     return Real_RegSetValueA(a0, a1, a2, a3, a4);
  241. }
  242. LONG WINAPI Mine_RegSetValueW(HKEY a0, LPCWSTR a1, DWORD a2, LPCWSTR a3, DWORD a4)
  243. {
  244. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  245.     return Real_RegSetValueW(a0, a1, a2, a3, a4);
  246. }
  247. LONG WINAPI Mine_RegSetValueExA(HKEY a0, LPCSTR a1, DWORD a2, DWORD a3, BYTE* a4, DWORD a5)
  248. {
  249. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  250.     return Real_RegSetValueExA(a0, a1, a2, a3, a4, a5);
  251. }
  252. LONG WINAPI Mine_RegSetValueExW(HKEY a0, LPCWSTR a1, DWORD a2, DWORD a3, BYTE* a4, DWORD a5)
  253. {
  254. if(CFilterMapper2::m_pFilterMapper2 && (a0 == FAKEHKEY || (int)a0 < 0)) {return ERROR_SUCCESS;}
  255.     return Real_RegSetValueExW(a0, a1, a2, a3, a4, a5);
  256. }
  257. //
  258. // CFilterMapper2
  259. //
  260. IFilterMapper2* CFilterMapper2::m_pFilterMapper2 = NULL;
  261. bool CFilterMapper2::fInitialized = false;
  262. void CFilterMapper2::Init()
  263. {
  264. if(!fInitialized)
  265. {
  266. DetourFunctionWithTrampoline((PBYTE)Real_CoCreateInstance, (PBYTE)Mine_CoCreateInstance);
  267. DetourFunctionWithTrampoline((PBYTE)Real_RegCloseKey, (PBYTE)Mine_RegCloseKey);
  268. DetourFunctionWithTrampoline((PBYTE)Real_RegFlushKey, (PBYTE)Mine_RegFlushKey);
  269. DetourFunctionWithTrampoline((PBYTE)Real_RegCreateKeyA, (PBYTE)Mine_RegCreateKeyA);
  270. DetourFunctionWithTrampoline((PBYTE)Real_RegCreateKeyW, (PBYTE)Mine_RegCreateKeyW);
  271. DetourFunctionWithTrampoline((PBYTE)Real_RegCreateKeyExA, (PBYTE)Mine_RegCreateKeyExA);
  272. DetourFunctionWithTrampoline((PBYTE)Real_RegCreateKeyExW, (PBYTE)Mine_RegCreateKeyExW);
  273. DetourFunctionWithTrampoline((PBYTE)Real_RegDeleteKeyA, (PBYTE)Mine_RegDeleteKeyA);
  274. DetourFunctionWithTrampoline((PBYTE)Real_RegDeleteKeyW, (PBYTE)Mine_RegDeleteKeyW);
  275. DetourFunctionWithTrampoline((PBYTE)Real_RegDeleteValueA, (PBYTE)Mine_RegDeleteValueA);
  276. DetourFunctionWithTrampoline((PBYTE)Real_RegDeleteValueW, (PBYTE)Mine_RegDeleteValueW);
  277. DetourFunctionWithTrampoline((PBYTE)Real_RegEnumKeyExA, (PBYTE)Mine_RegEnumKeyExA);
  278. DetourFunctionWithTrampoline((PBYTE)Real_RegEnumKeyExW, (PBYTE)Mine_RegEnumKeyExW);
  279. DetourFunctionWithTrampoline((PBYTE)Real_RegEnumValueA, (PBYTE)Mine_RegEnumValueA);
  280. DetourFunctionWithTrampoline((PBYTE)Real_RegEnumValueW, (PBYTE)Mine_RegEnumValueW);
  281. DetourFunctionWithTrampoline((PBYTE)Real_RegOpenKeyA, (PBYTE)Mine_RegOpenKeyA);
  282. DetourFunctionWithTrampoline((PBYTE)Real_RegOpenKeyW, (PBYTE)Mine_RegOpenKeyW);
  283. DetourFunctionWithTrampoline((PBYTE)Real_RegOpenKeyExA, (PBYTE)Mine_RegOpenKeyExA);
  284. DetourFunctionWithTrampoline((PBYTE)Real_RegOpenKeyExW, (PBYTE)Mine_RegOpenKeyExW);
  285. DetourFunctionWithTrampoline((PBYTE)Real_RegQueryInfoKeyA, (PBYTE)Mine_RegQueryInfoKeyA);
  286. DetourFunctionWithTrampoline((PBYTE)Real_RegQueryInfoKeyW, (PBYTE)Mine_RegQueryInfoKeyW);
  287. DetourFunctionWithTrampoline((PBYTE)Real_RegQueryValueA, (PBYTE)Mine_RegQueryValueA);
  288. DetourFunctionWithTrampoline((PBYTE)Real_RegQueryValueW, (PBYTE)Mine_RegQueryValueW);
  289. DetourFunctionWithTrampoline((PBYTE)Real_RegQueryValueExA, (PBYTE)Mine_RegQueryValueExA);
  290. DetourFunctionWithTrampoline((PBYTE)Real_RegQueryValueExW, (PBYTE)Mine_RegQueryValueExW);
  291. DetourFunctionWithTrampoline((PBYTE)Real_RegSetValueA, (PBYTE)Mine_RegSetValueA);
  292. DetourFunctionWithTrampoline((PBYTE)Real_RegSetValueW, (PBYTE)Mine_RegSetValueW);
  293. DetourFunctionWithTrampoline((PBYTE)Real_RegSetValueExA, (PBYTE)Mine_RegSetValueExA);
  294. DetourFunctionWithTrampoline((PBYTE)Real_RegSetValueExW, (PBYTE)Mine_RegSetValueExW);
  295. fInitialized = true;
  296. }
  297. }
  298. CFilterMapper2::CFilterMapper2(bool fRefCounted, bool fAllowUnreg, LPUNKNOWN pUnkOuter)
  299. : CUnknown(NAME("CFilterMapper2"), pUnkOuter)
  300. , m_fRefCounted(fRefCounted), m_fAllowUnreg(fAllowUnreg)
  301. {
  302. m_cRef = fRefCounted ? 0 : 1;
  303. Init();
  304. HRESULT hr = Real_CoCreateInstance(
  305. CLSID_FilterMapper2, (IUnknown*)(INonDelegatingUnknown*)this, CLSCTX_ALL, 
  306. __uuidof(IUnknown), (void**)&m_pFM2);
  307. if(FAILED(hr) || !m_pFM2)
  308. {
  309. ASSERT(0);
  310. return;
  311. }
  312. }
  313. CFilterMapper2::~CFilterMapper2()
  314. {
  315. POSITION pos = m_filters.GetHeadPosition();
  316. while(pos) delete m_filters.GetNext(pos);
  317. }
  318. STDMETHODIMP CFilterMapper2::NonDelegatingQueryInterface(REFIID riid, void** ppv)
  319. {
  320. if(riid == __uuidof(IFilterMapper2))
  321. return GetInterface((IFilterMapper2*)this, ppv);
  322. HRESULT hr = m_pFM2 ? m_pFM2->QueryInterface(riid, ppv) : E_NOINTERFACE;
  323. return 
  324. SUCCEEDED(hr) ? hr :
  325. __super::NonDelegatingQueryInterface(riid, ppv);
  326. }
  327. void CFilterMapper2::Register(CString path)
  328. {
  329. if(HMODULE h = LoadLibrary(path))
  330. {
  331. typedef HRESULT (__stdcall * PDllRegisterServer)();
  332. if(PDllRegisterServer p = (PDllRegisterServer)GetProcAddress(h, "DllRegisterServer"))
  333. {
  334. ASSERT(CFilterMapper2::m_pFilterMapper2 == NULL);
  335. CFilterMapper2::m_pFilterMapper2 = this;
  336. m_path = path;
  337. p();
  338. m_path.Empty();
  339. CFilterMapper2::m_pFilterMapper2 = NULL;
  340. }
  341. FreeLibrary(h);
  342. }
  343. }
  344. // IFilterMapper2
  345. STDMETHODIMP CFilterMapper2::CreateCategory(REFCLSID clsidCategory, DWORD dwCategoryMerit, LPCWSTR Description)
  346. {
  347. if(!m_path.IsEmpty())
  348. {
  349. return S_OK;
  350. }
  351. else if(CComQIPtr<IFilterMapper2> pFM2 = m_pFM2)
  352. {
  353. return pFM2->CreateCategory(clsidCategory, dwCategoryMerit, Description);
  354. }
  355. return E_NOTIMPL;
  356. }
  357. STDMETHODIMP CFilterMapper2::UnregisterFilter(const CLSID* pclsidCategory, const OLECHAR* szInstance, REFCLSID Filter)
  358. {
  359. if(!m_path.IsEmpty())
  360. {
  361. return S_OK;
  362. }
  363. else if(CComQIPtr<IFilterMapper2> pFM2 = m_pFM2)
  364. {
  365. return m_fAllowUnreg 
  366. ? pFM2->UnregisterFilter(pclsidCategory, szInstance, Filter) 
  367. : S_OK;
  368. }
  369. return E_NOTIMPL;
  370. }
  371. STDMETHODIMP CFilterMapper2::RegisterFilter(REFCLSID clsidFilter, LPCWSTR Name, IMoniker** ppMoniker, const CLSID* pclsidCategory, const OLECHAR* szInstance, const REGFILTER2* prf2)
  372. {
  373. if(!m_path.IsEmpty())
  374. {
  375. if(Filter* f = new Filter)
  376. {
  377. f->fDisabled = false;
  378. f->type = Filter::EXTERNAL;
  379. f->path = m_path;
  380. f->name = CStringW(Name);
  381. f->clsid = clsidFilter;
  382. f->iLoadType = Filter::MERIT;
  383. f->dwMerit = prf2->dwMerit;
  384. if(prf2->dwVersion == 1)
  385. {
  386. for(ULONG i = 0; i < prf2->cPins; i++)
  387. {
  388. const REGFILTERPINS& rgPin = prf2->rgPins[i];
  389. if(rgPin.bOutput) continue;
  390. for(UINT i = 0; i < rgPin.nMediaTypes; i++)
  391. {
  392. if(!rgPin.lpMediaType[i].clsMajorType || !rgPin.lpMediaType[i].clsMinorType) break;
  393. f->guids.AddTail(*rgPin.lpMediaType[i].clsMajorType);
  394. f->guids.AddTail(*rgPin.lpMediaType[i].clsMinorType);
  395. }
  396. }
  397. }
  398. else if(prf2->dwVersion == 2)
  399. {
  400. for(ULONG i = 0; i < prf2->cPins2; i++)
  401. {
  402. const REGFILTERPINS2& rgPin = prf2->rgPins2[i];
  403. if(rgPin.dwFlags&REG_PINFLAG_B_OUTPUT) continue;
  404. for(UINT i = 0; i < rgPin.nMediaTypes; i++)
  405. {
  406. if(!rgPin.lpMediaType[i].clsMajorType || !rgPin.lpMediaType[i].clsMinorType) break;
  407. f->guids.AddTail(*rgPin.lpMediaType[i].clsMajorType);
  408. f->guids.AddTail(*rgPin.lpMediaType[i].clsMinorType);
  409. }
  410. }
  411. }
  412. f->backup.AddTail(&f->guids);
  413. m_filters.AddTail(f);
  414. }
  415. return S_OK;
  416. }
  417. else if(CComQIPtr<IFilterMapper2> pFM2 = m_pFM2)
  418. {
  419. return pFM2->RegisterFilter(clsidFilter, Name, ppMoniker, pclsidCategory, szInstance, prf2);
  420. }
  421. return E_NOTIMPL;
  422. }
  423. STDMETHODIMP CFilterMapper2::EnumMatchingFilters(IEnumMoniker** ppEnum, DWORD dwFlags, BOOL bExactMatch, DWORD dwMerit, 
  424. BOOL bInputNeeded, DWORD cInputTypes, const GUID* pInputTypes, const REGPINMEDIUM* pMedIn, const CLSID* pPinCategoryIn, BOOL bRender, 
  425. BOOL bOutputNeeded, DWORD cOutputTypes, const GUID* pOutputTypes, const REGPINMEDIUM* pMedOut, const CLSID* pPinCategoryOut)
  426. {
  427. if(CComQIPtr<IFilterMapper2> pFM2 = m_pFM2)
  428. {
  429. pFM2->EnumMatchingFilters(ppEnum, dwFlags, bExactMatch, dwMerit, 
  430. bInputNeeded, cInputTypes, pInputTypes, pMedIn, pPinCategoryIn, bRender, 
  431. bOutputNeeded, cOutputTypes, pOutputTypes, pMedOut, pPinCategoryOut);
  432. }
  433. return E_NOTIMPL;
  434. }