Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

388 lines
7.5 KiB

  1. #include <pch.cpp>
  2. #pragma hdrstop
  3. #include "csdisp.h"
  4. #include "csprop.h"
  5. #define __dwFILE__ __dwFILE_CERTLIB_POLDISP_CPP__
  6. //+------------------------------------------------------------------------
  7. // ICertPolicy dispatch support
  8. //+------------------------------------
  9. // VerifyRequest method:
  10. OLECHAR *_apszVerifyRequest[] = {
  11. TEXT("VerifyRequest"),
  12. TEXT("strConfig"),
  13. TEXT("Context"),
  14. TEXT("bNewRequest"),
  15. TEXT("Flags")
  16. };
  17. //+------------------------------------
  18. // GetDescription method:
  19. OLECHAR *_apszGetDescription[] = {
  20. TEXT("GetDescription"),
  21. };
  22. //+------------------------------------
  23. // Initialize method:
  24. OLECHAR *_apszInitialize[] = {
  25. TEXT("Initialize"),
  26. TEXT("strConfig"),
  27. };
  28. //+------------------------------------
  29. // ShutDown method:
  30. OLECHAR *_apszShutDown[] = {
  31. TEXT("ShutDown"),
  32. };
  33. //+------------------------------------
  34. // GetManageModule method:
  35. OLECHAR *_apszGetManageModule[] = {
  36. TEXT("GetManageModule"),
  37. };
  38. //+------------------------------------
  39. // Dispatch Table:
  40. DISPATCHTABLE g_adtPolicy[] =
  41. {
  42. DECLARE_DISPATCH_ENTRY(_apszVerifyRequest)
  43. DECLARE_DISPATCH_ENTRY(_apszGetDescription)
  44. DECLARE_DISPATCH_ENTRY(_apszInitialize)
  45. DECLARE_DISPATCH_ENTRY(_apszShutDown)
  46. DECLARE_DISPATCH_ENTRY(_apszGetManageModule)
  47. };
  48. DWORD CPOLICYDISPATCH = (ARRAYSIZE(g_adtPolicy));
  49. DWORD s_acPolicyDispatch[2] = {
  50. CPOLICYDISPATCH_V2,
  51. CPOLICYDISPATCH_V1,
  52. };
  53. IID const *s_apPolicyiid[2] = {
  54. &IID_ICertPolicy2,
  55. &IID_ICertPolicy,
  56. };
  57. HRESULT
  58. PolicyVerifyVersion(
  59. IN DISPATCHINTERFACE *pdiPolicy,
  60. IN DWORD RequiredVersion)
  61. {
  62. HRESULT hr;
  63. CSASSERT(NULL != pdiPolicy && NULL != pdiPolicy->pDispatchTable);
  64. switch (pdiPolicy->m_dwVersion)
  65. {
  66. case 1:
  67. CSASSERT(
  68. NULL == pdiPolicy->pDispatch ||
  69. CPOLICYDISPATCH_V1 == pdiPolicy->m_cDispatchTable);
  70. break;
  71. case 2:
  72. CSASSERT(
  73. NULL == pdiPolicy->pDispatch ||
  74. CPOLICYDISPATCH_V2 == pdiPolicy->m_cDispatchTable);
  75. break;
  76. default:
  77. hr = HRESULT_FROM_WIN32(ERROR_INTERNAL_ERROR);
  78. _JumpError(hr, error, "m_dwVersion");
  79. }
  80. if (pdiPolicy->m_dwVersion < RequiredVersion)
  81. {
  82. hr = E_NOTIMPL;
  83. _JumpError(hr, error, "old interface");
  84. }
  85. hr = S_OK;
  86. error:
  87. return(hr);
  88. }
  89. HRESULT
  90. Policy_Init(
  91. IN DWORD Flags,
  92. IN LPCWSTR pcwszProgID,
  93. IN CLSID const *pclsid,
  94. OUT DISPATCHINTERFACE *pdi)
  95. {
  96. HRESULT hr;
  97. hr = DispatchSetup2(
  98. Flags,
  99. CLSCTX_INPROC_SERVER,
  100. pcwszProgID, // g_wszRegKeyCIPolicyClsid,
  101. pclsid,
  102. ARRAYSIZE(s_acPolicyDispatch),
  103. s_apPolicyiid,
  104. s_acPolicyDispatch,
  105. g_adtPolicy,
  106. pdi);
  107. _JumpIfError(hr, error, "DispatchSetup");
  108. pdi->pDispatchTable = g_adtPolicy;
  109. error:
  110. return(hr);
  111. }
  112. VOID
  113. Policy_Release(
  114. IN OUT DISPATCHINTERFACE *pdiManage)
  115. {
  116. DispatchRelease(pdiManage);
  117. }
  118. HRESULT
  119. Policy_Initialize(
  120. IN DISPATCHINTERFACE *pdiPolicy,
  121. IN WCHAR const *pwszConfig)
  122. {
  123. HRESULT hr;
  124. BSTR strConfig = NULL;
  125. if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
  126. {
  127. hr = E_OUTOFMEMORY;
  128. goto error;
  129. }
  130. hr = S_OK;
  131. __try
  132. {
  133. if (NULL != pdiPolicy->pDispatch)
  134. {
  135. VARIANT avar[1];
  136. CSASSERT(NULL != pdiPolicy->pDispatchTable);
  137. avar[0].vt = VT_BSTR;
  138. avar[0].bstrVal = strConfig;
  139. hr = DispatchInvoke(
  140. pdiPolicy,
  141. POLICY_INITIALIZE,
  142. ARRAYSIZE(avar),
  143. avar,
  144. 0,
  145. NULL);
  146. _LeaveIfError(hr, "Invoke(Initialize)");
  147. }
  148. else
  149. {
  150. hr = ((ICertPolicy *) pdiPolicy->pUnknown)->Initialize(strConfig);
  151. _LeaveIfError(hr, "ICertPolicy::Initialize");
  152. }
  153. }
  154. _finally
  155. {
  156. if (NULL != strConfig)
  157. {
  158. SysFreeString(strConfig);
  159. }
  160. }
  161. error:
  162. return(hr);
  163. }
  164. HRESULT
  165. Policy_ShutDown(
  166. IN DISPATCHINTERFACE *pdiPolicy)
  167. {
  168. HRESULT hr;
  169. if (NULL != pdiPolicy->pDispatch)
  170. {
  171. CSASSERT(NULL != pdiPolicy->pDispatchTable);
  172. hr = DispatchInvoke(
  173. pdiPolicy,
  174. POLICY_SHUTDOWN,
  175. 0,
  176. NULL,
  177. 0,
  178. NULL);
  179. _JumpIfError(hr, error, "Invoke(ShutDown)");
  180. }
  181. else
  182. {
  183. hr = ((ICertPolicy *) pdiPolicy->pUnknown)->ShutDown();
  184. _JumpIfError(hr, error, "ICertPolicy::ShutDown");
  185. }
  186. error:
  187. return(hr);
  188. }
  189. HRESULT
  190. Policy_VerifyRequest(
  191. IN DISPATCHINTERFACE *pdiPolicy,
  192. IN WCHAR const *pwszConfig,
  193. IN LONG Context,
  194. IN LONG bNewRequest,
  195. IN LONG Flags,
  196. OUT LONG *pResult)
  197. {
  198. HRESULT hr;
  199. BSTR strConfig = NULL;
  200. if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
  201. {
  202. hr = E_OUTOFMEMORY;
  203. goto error;
  204. }
  205. hr = S_OK;
  206. __try
  207. {
  208. if (NULL != pdiPolicy->pDispatch)
  209. {
  210. VARIANT avar[4];
  211. CSASSERT(NULL != pdiPolicy->pDispatchTable);
  212. avar[0].vt = VT_BSTR;
  213. avar[0].bstrVal = strConfig;
  214. avar[1].vt = VT_I4;
  215. avar[1].lVal = Context;
  216. avar[2].vt = VT_I4;
  217. avar[2].lVal = bNewRequest;
  218. avar[3].vt = VT_I4;
  219. avar[3].lVal = Flags;
  220. hr = DispatchInvoke(
  221. pdiPolicy,
  222. POLICY_VERIFYREQUEST,
  223. ARRAYSIZE(avar),
  224. avar,
  225. VT_I4,
  226. pResult);
  227. _PrintIfError(hr, "Invoke(VerifyRequest)");
  228. // Emulate the way C++ Policy Modules overload *pRequest with
  229. // a FAILED HRESULT:
  230. if (FAILED(hr))
  231. {
  232. *pResult = hr;
  233. hr = S_OK;
  234. }
  235. _LeaveIfError(hr, "Invoke(VerifyRequest)");
  236. }
  237. else
  238. {
  239. hr = ((ICertPolicy *) pdiPolicy->pUnknown)->VerifyRequest(
  240. strConfig,
  241. Context,
  242. bNewRequest,
  243. Flags,
  244. pResult);
  245. _LeaveIfError(hr, "ICertPolicy::VerifyRequest");
  246. }
  247. }
  248. _finally
  249. {
  250. if (NULL != strConfig)
  251. {
  252. SysFreeString(strConfig);
  253. }
  254. }
  255. error:
  256. return(hr);
  257. }
  258. HRESULT
  259. Policy_GetDescription(
  260. IN DISPATCHINTERFACE *pdiPolicy,
  261. OUT BSTR *pstrDescription)
  262. {
  263. HRESULT hr;
  264. if (NULL != pdiPolicy->pDispatch)
  265. {
  266. CSASSERT(NULL != pdiPolicy->pDispatchTable);
  267. hr = DispatchInvoke(
  268. pdiPolicy,
  269. POLICY_GETDESCRIPTION,
  270. 0,
  271. NULL,
  272. VT_BSTR,
  273. pstrDescription);
  274. _JumpIfError(hr, error, "Invoke(GetDescription)");
  275. }
  276. else
  277. {
  278. hr = ((ICertPolicy *) pdiPolicy->pUnknown)->GetDescription(
  279. pstrDescription);
  280. _JumpIfError(hr, error, "ICertPolicy::GetDescription");
  281. }
  282. error:
  283. return(hr);
  284. }
  285. HRESULT
  286. Policy2_GetManageModule(
  287. IN DISPATCHINTERFACE *pdiPolicy,
  288. OUT DISPATCHINTERFACE *pdiManageModule)
  289. {
  290. HRESULT hr;
  291. ICertManageModule *pManageModule = NULL;
  292. hr = PolicyVerifyVersion(pdiPolicy, 2);
  293. _JumpIfError(hr, error, "PolicyVerifyVersion");
  294. if (NULL != pdiPolicy->pDispatch)
  295. {
  296. CSASSERT(NULL != pdiPolicy->pDispatchTable);
  297. hr = DispatchInvoke(
  298. pdiPolicy,
  299. POLICY2_GETMANAGEMODULE,
  300. 0,
  301. NULL,
  302. VT_DISPATCH,
  303. &pManageModule);
  304. _JumpIfError(hr, error, "Invoke(GetManageModule)");
  305. }
  306. else
  307. {
  308. hr = ((ICertPolicy2 *) pdiPolicy->pUnknown)->GetManageModule(
  309. &pManageModule);
  310. _JumpIfError(hr, error, "ICertPolicy::GetManageModule");
  311. }
  312. hr = ManageModule_Init2(
  313. NULL != pdiPolicy->pDispatch,
  314. pManageModule,
  315. pdiManageModule);
  316. _JumpIfError(hr, error, "ManageModule_Init2");
  317. error:
  318. return(hr);
  319. }