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.

271 lines
6.5 KiB

  1. //----------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 2000.
  5. //
  6. // File: policy-w.c
  7. //
  8. // Contents: Policy management for WMI.
  9. //
  10. //
  11. // History: KrishnaG.
  12. // AbhisheV.
  13. // t-hhsu
  14. //
  15. //----------------------------------------------------------------------------
  16. #include "precomp.h"
  17. //extern LPWSTR PolicyDNAttributes[];
  18. DWORD
  19. WMIEnumPolicyDataEx(
  20. IWbemServices *pWbemServices,
  21. PIPSEC_POLICY_DATA ** pppIpsecPolicyData,
  22. PDWORD pdwNumPolicyObjects
  23. )
  24. {
  25. DWORD dwError = 0;
  26. PIPSEC_POLICY_OBJECT * ppIpsecPolicyObjects = NULL;
  27. PIPSEC_POLICY_DATA pIpsecPolicyData = NULL;
  28. PIPSEC_POLICY_DATA * ppIpsecPolicyData = NULL;
  29. DWORD dwNumPolicyObjects = 0;
  30. DWORD i = 0;
  31. DWORD j = 0;
  32. dwError = WMIEnumPolicyObjectsEx(
  33. pWbemServices,
  34. &ppIpsecPolicyObjects,
  35. &dwNumPolicyObjects
  36. );
  37. BAIL_ON_WIN32_ERROR(dwError);
  38. if (dwNumPolicyObjects) {
  39. ppIpsecPolicyData = (PIPSEC_POLICY_DATA *) AllocPolMem(
  40. dwNumPolicyObjects*sizeof(PIPSEC_POLICY_DATA));
  41. if (!ppIpsecPolicyData) {
  42. dwError = ERROR_OUTOFMEMORY;
  43. BAIL_ON_WIN32_ERROR(dwError);
  44. }
  45. }
  46. for (i = 0; i < dwNumPolicyObjects; i++) {
  47. dwError = WMIUnmarshallPolicyData(
  48. *(ppIpsecPolicyObjects + i),
  49. &pIpsecPolicyData
  50. );
  51. if (!dwError) {
  52. *(ppIpsecPolicyData + j) = pIpsecPolicyData;
  53. j++;
  54. }
  55. }
  56. if (j == 0) {
  57. if (ppIpsecPolicyData) {
  58. FreePolMem(ppIpsecPolicyData);
  59. ppIpsecPolicyData = NULL;
  60. }
  61. }
  62. *pppIpsecPolicyData = ppIpsecPolicyData;
  63. *pdwNumPolicyObjects = j;
  64. dwError = ERROR_SUCCESS;
  65. cleanup:
  66. if (ppIpsecPolicyObjects) {
  67. FreeIpsecPolicyObjects(
  68. ppIpsecPolicyObjects,
  69. dwNumPolicyObjects
  70. );
  71. }
  72. return(dwError);
  73. error:
  74. if (ppIpsecPolicyData) {
  75. FreeMulIpsecPolicyData(
  76. ppIpsecPolicyData,
  77. i
  78. );
  79. }
  80. *pppIpsecPolicyData = NULL;
  81. *pdwNumPolicyObjects = 0;
  82. goto cleanup;
  83. }
  84. DWORD
  85. WMIEnumPolicyObjectsEx(
  86. IWbemServices *pWbemServices,
  87. PIPSEC_POLICY_OBJECT ** pppIpsecPolicyObjects,
  88. PDWORD pdwNumPolicyObjects
  89. )
  90. {
  91. DWORD dwError = 0;
  92. HRESULT hr = S_OK;
  93. DWORD dwNumPolicyObjectsReturned = 0;
  94. PIPSEC_POLICY_OBJECT pIpsecPolicyObject = NULL;
  95. PIPSEC_POLICY_OBJECT * ppIpsecPolicyObjects = NULL;
  96. ///wbem
  97. IEnumWbemClassObject *pEnum = NULL;
  98. IWbemClassObject *pObj = NULL;
  99. ULONG uReturned = 0;
  100. VARIANT var;
  101. LPWSTR tmpStr = NULL;
  102. BSTR bstrTmp = NULL;
  103. *pppIpsecPolicyObjects = NULL;
  104. *pdwNumPolicyObjects = 0;
  105. VariantInit(&var);
  106. bstrTmp = SysAllocString(L"RSOP_IPSECPolicySetting");
  107. if(!bstrTmp) {
  108. dwError = ERROR_OUTOFMEMORY;
  109. BAIL_ON_WIN32_ERROR(dwError);
  110. }
  111. //get enum
  112. hr = IWbemServices_CreateInstanceEnum(
  113. pWbemServices,
  114. bstrTmp, //L"RSOP_IPSECPolicySetting"
  115. WBEM_FLAG_FORWARD_ONLY,
  116. 0,
  117. &pEnum
  118. );
  119. SysFreeString(bstrTmp);
  120. BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
  121. //process
  122. uReturned = 1;
  123. while (SUCCEEDED(hr) && (uReturned == 1))
  124. {
  125. hr = IEnumWbemClassObject_Next(pEnum, WBEM_INFINITE, 1, &pObj, &uReturned);
  126. if (SUCCEEDED(hr) && (uReturned == 1))
  127. {
  128. hr = IWbemClassObject_Get(
  129. pObj,
  130. L"id",
  131. 0,
  132. &var,
  133. 0,
  134. 0
  135. );
  136. BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
  137. tmpStr = var.bstrVal;
  138. if (!wcsstr(tmpStr, L"ipsecPolicy")) {
  139. IWbemClassObject_Release(pObj);
  140. VariantClear(&var);
  141. continue;
  142. }
  143. pIpsecPolicyObject = NULL;
  144. dwError = UnMarshallWMIPolicyObject(
  145. pObj,
  146. &pIpsecPolicyObject
  147. );
  148. if (dwError == ERROR_SUCCESS) {
  149. dwError = ReallocatePolMem(
  150. (LPVOID *) &ppIpsecPolicyObjects,
  151. sizeof(PIPSEC_POLICY_OBJECT)*(dwNumPolicyObjectsReturned),
  152. sizeof(PIPSEC_POLICY_OBJECT)*(dwNumPolicyObjectsReturned + 1)
  153. );
  154. BAIL_ON_WIN32_ERROR(dwError);
  155. *(ppIpsecPolicyObjects + dwNumPolicyObjectsReturned) = pIpsecPolicyObject;
  156. dwNumPolicyObjectsReturned++;
  157. }
  158. //free
  159. IWbemClassObject_Release(pObj);
  160. pObj = NULL;
  161. VariantClear(&var);
  162. } else {
  163. BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
  164. //
  165. // Even if SUCCEEDED(hr), loop will still terminate since uReturned != 1
  166. //
  167. }
  168. }
  169. *pppIpsecPolicyObjects = ppIpsecPolicyObjects;
  170. *pdwNumPolicyObjects = dwNumPolicyObjectsReturned;
  171. dwError = ERROR_SUCCESS;
  172. cleanup:
  173. if(pEnum)
  174. IEnumWbemClassObject_Release(pEnum);
  175. return(dwError);
  176. error:
  177. if (pObj) {
  178. IWbemClassObject_Release(pObj);
  179. pObj = NULL;
  180. }
  181. VariantClear(&var);
  182. if (ppIpsecPolicyObjects) {
  183. FreeIpsecPolicyObjects(
  184. ppIpsecPolicyObjects,
  185. dwNumPolicyObjectsReturned
  186. );
  187. }
  188. if (pIpsecPolicyObject) {
  189. FreeIpsecPolicyObject(
  190. pIpsecPolicyObject
  191. );
  192. }
  193. *pppIpsecPolicyObjects = NULL;
  194. *pdwNumPolicyObjects = 0;
  195. goto cleanup;
  196. }
  197. DWORD
  198. WMIUnmarshallPolicyData(
  199. PIPSEC_POLICY_OBJECT pIpsecPolicyObject,
  200. PIPSEC_POLICY_DATA * ppIpsecPolicyData
  201. )
  202. {
  203. DWORD dwError = 0;
  204. dwError = UnmarshallPolicyObject(
  205. pIpsecPolicyObject,
  206. IPSEC_WMI_PROVIDER, //(procrule.h)
  207. ppIpsecPolicyData
  208. );
  209. BAIL_ON_WIN32_ERROR(dwError);
  210. if (*ppIpsecPolicyData) {
  211. (*ppIpsecPolicyData)->dwFlags |= POLSTORE_READONLY;
  212. }
  213. error:
  214. return(dwError);
  215. }