channelhook.cpp
上传用户:bjlvip
上传日期:2010-02-08
资源大小:744k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // ChannelHook.cpp
  2. #define _WIN32_DCOM
  3. #include <iostream.h>
  4. #include "ChannelHookchannelhook.h" // Generated by MIDL
  5. #include "registry.h" // For the registration functions
  6. const GUID EXTENTID_MyHook = {0x12345678, 0xABCD, 0xABCD, {0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99}};
  7. struct MYHOOK_THIS
  8. {
  9. char computer_name[MAX_COMPUTERNAME_LENGTH + 1];
  10. } g_MYHOOK_THIS, g_mhtClientComputerName;
  11. HINSTANCE g_hInstance;
  12. class CClientInfo : public IClientInfo
  13. {
  14. public:
  15. // IUnknown
  16. ULONG __stdcall AddRef();
  17. ULONG __stdcall Release();
  18. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  19. // IClientInfo
  20. HRESULT __stdcall GetClientComputerName(BSTR* bstr);
  21. };
  22. HRESULT CClientInfo::GetClientComputerName(BSTR* bstr)
  23. {
  24. int length = strlen(g_MYHOOK_THIS.computer_name);
  25. *bstr = SysAllocStringLen(0, length+1);
  26. strcpy((char*)*bstr, g_MYHOOK_THIS.computer_name);
  27. return S_OK;
  28. }
  29. ULONG CClientInfo::AddRef()
  30. {
  31. return 2;
  32. }
  33. ULONG CClientInfo::Release()
  34. {
  35. return 1;
  36. }
  37. HRESULT CClientInfo::QueryInterface(REFIID riid, void** ppv)
  38. {
  39. if(riid == IID_IUnknown || riid == IID_IClientInfo)
  40. *ppv = (IClientInfo*)this;
  41. else 
  42. {
  43. *ppv = NULL;
  44. return E_NOINTERFACE;
  45. }
  46. return S_OK;
  47. }
  48. class CChannelHook : public IChannelHook
  49. {
  50. public:
  51. // IUnknown
  52. ULONG __stdcall AddRef();
  53. ULONG __stdcall Release();
  54. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  55. // IChannelHook
  56.     void __stdcall ClientGetSize(REFGUID uExtent, REFIID riid, ULONG* pDataSize);
  57.     void __stdcall ClientFillBuffer(REFGUID uExtent, REFIID riid, ULONG* pDataSize, void* pDataBuffer);
  58.     void __stdcall ClientNotify(REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep, HRESULT hrFault);
  59.     void __stdcall ServerNotify(REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep);
  60.     void __stdcall ServerGetSize(REFGUID uExtent, REFIID riid, HRESULT hrFault, ULONG* pDataSize);
  61.     void __stdcall ServerFillBuffer(REFGUID uExtent, REFIID riid, ULONG *pDataSize, void *pDataBuffer, HRESULT hrFault);
  62. };
  63. ULONG CChannelHook::AddRef()
  64. {
  65. return 2;
  66. }
  67. ULONG CChannelHook::Release()
  68. {
  69. return 1;
  70. }
  71. HRESULT CChannelHook::QueryInterface(REFIID riid, void** ppv)
  72. {
  73. if(riid == IID_IUnknown || riid == IID_IChannelHook)
  74. *ppv = (IChannelHook*)this;
  75. else 
  76. {
  77. *ppv = NULL;
  78. return E_NOINTERFACE;
  79. }
  80. return S_OK;
  81. }
  82. // How big is your extent?
  83. void CChannelHook::ClientGetSize(REFGUID uExtent, REFIID riid, ULONG* pDataSize)
  84. {
  85. if(uExtent == EXTENTID_MyHook)
  86. *pDataSize = sizeof(MYHOOK_THIS);
  87. }
  88. // Give me the data to pass in the channel
  89. void CChannelHook::ClientFillBuffer(REFGUID uExtent, REFIID riid, ULONG* pDataSize, void* pDataBuffer)
  90. {
  91. if(uExtent == EXTENTID_MyHook)
  92. {
  93.     MYHOOK_THIS *data = (MYHOOK_THIS*)pDataBuffer;
  94.     *data = g_mhtClientComputerName;
  95.     *pDataSize = sizeof(MYHOOK_THIS);
  96. }
  97. }
  98. // Called in client just after a call completes
  99. void CChannelHook::ClientNotify(REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep, HRESULT hrFault)
  100. {
  101. }
  102. // Called in server just before a method is invoked
  103. void CChannelHook::ServerNotify(REFGUID uExtent, REFIID riid, ULONG cbDataSize, void* pDataBuffer, DWORD lDataRep)
  104. {
  105. if(uExtent == EXTENTID_MyHook && lDataRep == NDR_LOCAL_DATA_REPRESENTATION)
  106. {
  107. MYHOOK_THIS* data = (MYHOOK_THIS*)pDataBuffer;
  108. strcpy(g_MYHOOK_THIS.computer_name, data->computer_name);
  109. }
  110. }
  111. // Called in server just after a method is invoked
  112. void CChannelHook::ServerGetSize(REFGUID uExtent, REFIID riid, HRESULT hrFault, ULONG* pDataSize)
  113. {
  114. }
  115. // Called in server just after a method is invoked
  116. void CChannelHook::ServerFillBuffer(REFGUID uExtent, REFIID riid, ULONG *pDataSize, void *pDataBuffer, HRESULT hrFault)
  117. {
  118. }
  119. class CFactory : public IClassFactory
  120. {
  121. public:
  122. // IUnknown
  123. ULONG __stdcall AddRef();
  124. ULONG __stdcall Release();
  125. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  126. // IClassFactory
  127. HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter, REFIID riid, void** ppv);
  128. HRESULT __stdcall LockServer(BOOL bLock);
  129. };
  130. ULONG __stdcall CFactory::AddRef()
  131. {
  132. return 2;
  133. }
  134. ULONG __stdcall CFactory::Release()
  135. {
  136. return 1;
  137. }
  138. HRESULT __stdcall CFactory::QueryInterface(REFIID riid, void** ppv)
  139. {
  140. if(riid == IID_IUnknown || riid == IID_IClassFactory)
  141. *ppv = (IClassFactory*)this;
  142. else
  143. {
  144. *ppv = NULL;
  145. return E_NOINTERFACE;
  146. }
  147. return S_OK;
  148. }
  149. HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknownOuter, REFIID riid, void** ppv)
  150. {
  151. if(pUnknownOuter != NULL)
  152. return CLASS_E_NOAGGREGATION;
  153. static CClientInfo ClientInfo;
  154. return ClientInfo.QueryInterface(riid, ppv);
  155. }
  156. HRESULT __stdcall CFactory::LockServer(BOOL bLock)
  157. {
  158. return S_OK;
  159. }
  160. HRESULT __stdcall DllCanUnloadNow()
  161. {
  162. return S_FALSE;
  163. }
  164. HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID riid, void** ppv)
  165. {
  166. if(clsid != CLSID_ClientChannelHook)
  167. return CLASS_E_CLASSNOTAVAILABLE;
  168. static CFactory Factory;
  169. return Factory.QueryInterface(riid, ppv);
  170. }
  171. HRESULT __stdcall DllRegisterServer()
  172. {
  173. char DllPath[256];
  174. OLECHAR wDllPath[256];
  175. GetModuleFileName(g_hInstance, DllPath, 256);
  176. mbstowcs(wDllPath, DllPath, 256);
  177. ITypeLib* pTypeLib;
  178. HRESULT hr = LoadTypeLibEx(wDllPath, REGKIND_REGISTER, &pTypeLib);
  179. if(FAILED(hr))
  180. return hr;
  181. pTypeLib->Release();
  182. return RegisterServer("ChannelHook.dll", CLSID_ClientChannelHook, "Channel Hook Sample", "MyChannel.Hook", "MyChannel.Hook.1", "Both");
  183. }
  184. HRESULT __stdcall DllUnregisterServer()
  185. {
  186. HRESULT hr = UnRegisterTypeLib(LIBID_ChannelHook, 1, 0, LANG_NEUTRAL, SYS_WIN32);
  187. if(FAILED(hr))
  188. return hr;
  189. return UnregisterServer(CLSID_ClientChannelHook, "MyChannel.Hook", "MyChannel.Hook.1");
  190. }
  191. BOOL WINAPI DllMain(HINSTANCE h, DWORD dwReason, void* pv)
  192. {
  193. g_hInstance = h;
  194. static CChannelHook ChannelHook;
  195.     if(dwReason == DLL_PROCESS_ATTACH)
  196. {
  197. if(FAILED(CoRegisterChannelHook(EXTENTID_MyHook, &ChannelHook)))
  198. {
  199. cout << "CoRegisterChannelHook failed" << endl;
  200. return FALSE;
  201. }
  202. ULONG length = MAX_COMPUTERNAME_LENGTH + 1;
  203. GetComputerName(g_mhtClientComputerName.computer_name, &length);
  204. }
  205. return TRUE;
  206. }