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

Windows编程

开发平台:

Visual C++

  1. // local.cpp
  2. #define _WIN32_DCOM
  3. #include <windows.h>
  4. #include <stdio.h>
  5. #include <conio.h>
  6. #include <iaccess.h>   // IAccessControl
  7. #include <iostream.h>  // For cout
  8. #include "registry.h"  // For registry functions
  9. #include "Component Bcomponent.h" // Generated by MIDL
  10. const IID IID_IAccessControl = {0xEEDD23E0,0x8410,0x11CE,{0xA1,0xC3,0x08,0x00,0x2B,0x2B,0x8D,0x8F}};
  11. long g_cComponents = 0;
  12. long g_cServerLocks = 0;
  13. HANDLE g_hEvent;
  14. #define MB_SERVICE_NOTIFICATION          0x00200000L
  15. class CInsideCOM : public ISum
  16. {
  17. public:
  18. // IUnknown
  19. ULONG __stdcall AddRef();
  20. ULONG __stdcall Release();
  21. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  22. // ISum
  23. HRESULT __stdcall Sum(int x, int y, int* retval);
  24. CInsideCOM() : m_cRef(1) { g_cComponents++; }
  25. ~CInsideCOM() { cout << "Component: CInsideCOM::~CInsideCOM()" << endl, g_cComponents--; }
  26. private:
  27. ULONG m_cRef;
  28. };
  29. ULONG CInsideCOM::AddRef()
  30. {
  31. cout << "Component: CInsideCOM::AddRef() m_cRef = " << m_cRef + 1 << endl;
  32. return ++m_cRef;
  33. }
  34. ULONG CInsideCOM::Release()
  35. {
  36. cout << "Component: CInsideCOM::Release() m_cRef = " << m_cRef - 1 << endl;
  37. if(--m_cRef != 0)
  38. return m_cRef;
  39. SetEvent(g_hEvent); // ADD THIS!!!
  40. delete this;
  41. return 0;
  42. }
  43. HRESULT CInsideCOM::QueryInterface(REFIID riid, void** ppv)
  44. {
  45. if(riid == IID_IUnknown)
  46. {
  47. cout << "Component: CInsideCOM::QueryInterface() for IUnknown returning " << this << endl;
  48. *ppv = reinterpret_cast<IUnknown*>(this);
  49. }
  50. else if(riid == IID_ISum)
  51. {
  52. cout << "Component: CInsideCOM::QueryInterface() for ISum returning " << this << endl;
  53. *ppv = (ISum*)this;
  54. }
  55. else 
  56. {
  57. *ppv = NULL;
  58. return E_NOINTERFACE;
  59. }
  60. AddRef();
  61. return S_OK;
  62. }
  63. HRESULT CInsideCOM::Sum(int x, int y, int* retval)
  64. {
  65. ISum* pSum = 0;
  66. IUnknown* pUnknown = 0;
  67. HRESULT hr;
  68. IServerSecurity* pServerSecurity;
  69. hr = CoGetCallContext(IID_IServerSecurity, (void**)&pServerSecurity);
  70. if(FAILED(hr))
  71. cout << "CoGetCallContext failed" << endl;
  72. DWORD AuthnSvc;
  73. DWORD AuthzSvc;
  74. OLECHAR* ServerPrincNam;
  75. DWORD AuthnLevel;
  76. RPC_AUTHZ_HANDLE Privs;
  77. DWORD Capabilities;
  78. // AuthzSvc is ignored when using the RPC_C_AUTHN_WINNT authentication service.
  79. //                             RPC_C_AUTHN_WINNT, ignored,    Administrator, RPC_C_AUTHN_LEVEL_PKT, Thing4Administrator, EOAC_NONE
  80. hr = pServerSecurity->QueryBlanket(&AuthnSvc, &AuthzSvc, &ServerPrincNam, &AuthnLevel, NULL, &Privs, &Capabilities);
  81. //                                                                       impersonation level is never returned
  82. if(FAILED(hr))
  83. cout << "QueryBlanket failed" << endl;
  84. pServerSecurity->Release();
  85. switch(AuthnSvc)
  86. {
  87. case RPC_C_AUTHN_NONE:
  88. cout << "RPC_C_AUTHN_NONE ";
  89. break;
  90. case RPC_C_AUTHN_GSS_NEGOTIATE  :
  91. cout << "RPC_C_AUTHN_GSS_NEGOTIATE   ";
  92. break;
  93. case RPC_C_AUTHN_GSS_KERBEROS :
  94. cout << "RPC_C_AUTHN_GSS_KERBEROS  ";
  95. break;
  96. case RPC_C_AUTHN_WINNT:
  97. cout << "RPC_C_AUTHN_WINNT ";
  98. break;
  99. case RPC_C_AUTHN_DEFAULT:
  100. cout << "RPC_C_AUTHN_DEFAULT ";
  101. break;
  102. }
  103. switch(AuthzSvc)
  104. {
  105. case RPC_C_AUTHZ_NONE:
  106. cout << "RPC_C_AUTHZ_NONE ";
  107. break;
  108. case RPC_C_AUTHZ_NAME:
  109. cout << "RPC_C_AUTHZ_NAME ";
  110. break;
  111. case RPC_C_AUTHZ_DCE:
  112. cout << "RPC_C_AUTHZ_DCE ";
  113. break;
  114. }
  115. MessageBoxW(NULL, ServerPrincNam, L"ServerPrincName", MB_SERVICE_NOTIFICATION|MB_SETFOREGROUND|MB_OK);
  116. wprintf(L"ServerPrincNam %sn", ServerPrincNam);
  117. switch(AuthnLevel)
  118. {
  119. case RPC_C_AUTHN_LEVEL_NONE:
  120. cout << "RPC_C_AUTHN_LEVEL_NONE ";
  121. break;
  122. case RPC_C_AUTHN_LEVEL_CONNECT:
  123. cout << "RPC_C_AUTHN_LEVEL_CONNECT ";
  124. break;
  125. case RPC_C_AUTHN_LEVEL_CALL:
  126. cout << "RPC_C_AUTHN_LEVEL_CALL ";
  127. break;
  128. case RPC_C_AUTHN_LEVEL_PKT:
  129. cout << "RPC_C_AUTHN_LEVEL_PKT ";
  130. break;
  131. case RPC_C_AUTHN_LEVEL_PKT_INTEGRITY:
  132. cout << "RPC_C_AUTHN_LEVEL_PKT_INTEGRITY ";
  133. break;
  134. case RPC_C_AUTHN_LEVEL_PKT_PRIVACY:
  135. cout << "RPC_C_AUTHN_LEVEL_PKT_PRIVACY ";
  136. break;
  137. }
  138. wprintf(L"Privs %sn", Privs);
  139. MessageBoxW(NULL, (OLECHAR*)Privs, L"Privs", MB_SERVICE_NOTIFICATION|MB_SETFOREGROUND|MB_OK);
  140. if(Capabilities == EOAC_NONE)
  141. cout << "EOAC_NONE" << endl;
  142. CoTaskMemFree(ServerPrincNam);
  143. CoImpersonateClient();
  144. HANDLE handle = 0;
  145. handle = CreateFile("C:\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  146. if(handle != INVALID_HANDLE_VALUE)
  147. {
  148. char buffer[25];
  149. DWORD bytes_read = 0;
  150. ReadFile(handle, buffer, 25, &bytes_read, NULL);
  151. CloseHandle(handle);
  152. buffer[bytes_read] = 0;
  153. MessageBox(NULL, buffer, "Read from file", MB_SERVICE_NOTIFICATION|MB_SETFOREGROUND|MB_OK);
  154. }
  155. else
  156. {
  157. DWORD error = GetLastError();
  158. MessageBoxW(NULL, L"access denied to file", L"Read from file", MB_SERVICE_NOTIFICATION|MB_SETFOREGROUND|MB_OK);
  159. printf("Last error = %0xn", error);
  160. cout << "Last error = " << error << endl;
  161. _getch();
  162. }
  163. CoRevertToSelf();
  164. cout << "Component: CInsideCOM::Sum() " << x << " + " << y << " = " << x + y << endl;
  165. *retval = x + y;
  166. // _getch();
  167. return S_OK;
  168. }
  169. class CFactory : public IClassFactory
  170. {
  171. public:
  172. // IUnknown
  173. ULONG __stdcall AddRef();
  174. ULONG __stdcall Release();
  175. HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
  176. // IClassFactory
  177. HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv);
  178. HRESULT __stdcall LockServer(BOOL bLock);
  179. CFactory() : m_cRef(1) { }
  180. ~CFactory() { }
  181. private:
  182. ULONG m_cRef;
  183. };
  184. ULONG CFactory::AddRef()
  185. {
  186. cout << "Component: CFactory::AddRef() m_cRef = " << m_cRef + 1 << endl;
  187. return ++m_cRef;
  188. }
  189. ULONG CFactory::Release()
  190. {
  191. cout << "Component: CFactory::Release() m_cRef = " << m_cRef - 1 << endl;
  192. if(--m_cRef != 0)
  193. return m_cRef;
  194. delete this;
  195. return 0;
  196. }
  197. HRESULT CFactory::QueryInterface(REFIID riid, void** ppv)
  198. {
  199. if((riid == IID_IUnknown) || (riid == IID_IClassFactory))
  200. {
  201. cout << "Component: CFactory::QueryInteface() for IUnknown or IClassFactory " << this << endl;
  202. *ppv = (IClassFactory*)this;
  203. }
  204. else
  205. {
  206. *ppv = NULL;
  207. return E_NOINTERFACE;
  208. }
  209. AddRef();
  210. return S_OK;
  211. }
  212. HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv)
  213. {
  214. if(pUnknownOuter != NULL)
  215. return CLASS_E_NOAGGREGATION;
  216. CInsideCOM *pInsideCOM = new CInsideCOM;
  217. cout << "Component: CFactory::CreateInstance() " << pInsideCOM << endl;
  218. if(pInsideCOM == NULL)
  219. return E_OUTOFMEMORY;
  220. // QueryInterface probably for IID_IUNKNOWN
  221. HRESULT hr = pInsideCOM->QueryInterface(riid, ppv);
  222. pInsideCOM->Release();
  223. return hr;
  224. }
  225. HRESULT CFactory::LockServer(BOOL bLock)
  226. {
  227. if(bLock)
  228. g_cServerLocks++;
  229. else
  230. g_cServerLocks--;
  231. return S_OK;
  232. }
  233. void RegisterComponent()
  234. {
  235. ITypeLib* pTypeLib;
  236. LoadTypeLibEx(L"component C.exe", REGKIND_DEFAULT, &pTypeLib);
  237. pTypeLib->Release();
  238. RegisterServer("component C.exe", CLSID_InsideCOM_C, "Inside COM+", "Component.InsideCOM_C", "Component.InsideCOM_C.1", NULL);
  239. }
  240. void CommandLineParameters(int argc, char** argv)
  241. {
  242. RegisterComponent();
  243. if(argc < 2)
  244. {
  245. cout << "No parameter, but registered anyway" << endl;
  246. exit(false);
  247. }
  248. char* szToken = strtok(argv[1], "-/"); 
  249. if(_stricmp(szToken, "RegServer") == 0)
  250. {
  251. RegisterComponent();
  252. cout << "RegServer" << endl;
  253. exit(true);
  254. }
  255. if(_stricmp(szToken, "UnregServer") == 0)
  256. {
  257. UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
  258. UnregisterServer(CLSID_InsideCOM_C, "Component.InsideCOM_C", "Component.InsideCOM_C.1");
  259. cout << "UnregServer" << endl;
  260. exit(true);
  261. }
  262. if(_stricmp(szToken, "Embedding") != 0)
  263. {
  264. cout << "Invalid parameter" << endl;
  265. exit(false);
  266. }
  267. }
  268. void main(int argc, char** argv)
  269. {
  270. HRESULT hr;
  271. CommandLineParameters(argc, argv);
  272. cout << "Component: CoInitializeEx()" << endl;
  273. hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  274. if(FAILED(hr))
  275. cout << "CoInitializeEx Failed" << endl;
  276. SOLE_AUTHENTICATION_SERVICE service;
  277. service.dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS;
  278. service.dwAuthzSvc = RPC_C_AUTHZ_NONE;
  279. service.hr = 0;
  280. service.pPrincipalName = L"GuysDomain\Administrator";
  281. hr = CoInitializeSecurity(0, 1, &service, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_DELEGATE, 
  282. NULL, EOAC_APPID, NULL);
  283. if(FAILED(hr))
  284. {
  285. printf("CoInitializeSecurity Failed = %0xn", hr);
  286. _getch();
  287. }
  288. printf("CoInitializeSecurity service.hr = %0xn", service.hr);
  289. IClassFactory *pClassFactory = new CFactory();
  290. cout << "Component: CoRegisterClassObject()" << endl;
  291. DWORD dwRegister;
  292. CoRegisterClassObject(CLSID_InsideCOM_C, pClassFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
  293. g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  294. WaitForSingleObject(g_hEvent, INFINITE);
  295. CoRevokeClassObject(dwRegister);
  296. pClassFactory->Release();
  297. CoUninitialize();
  298. // _getch();
  299. }