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.

2461 lines
60 KiB

  1. #include "precomp.h"
  2. LPWSTR gpszRegLocalContainer = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Local";
  3. LPWSTR gpszRegPersistentContainer = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Persistent";
  4. LPWSTR gpszIpsecFileRootContainer = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Save";
  5. LPWSTR gpszIPsecDirContainer = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\GPTIPSECPolicy";
  6. LPWSTR gpActivePolicyKey = L"ActivePolicy";
  7. LPWSTR gpDirectoryPolicyPointerKey = L"DSIPSECPolicyPath";
  8. DWORD
  9. IPSecEnumPolicyData(
  10. HANDLE hPolicyStore,
  11. PIPSEC_POLICY_DATA ** pppIpsecPolicyData,
  12. PDWORD pdwNumPolicyObjects
  13. )
  14. {
  15. DWORD dwError = 0;
  16. DWORD dwProvider = 0;
  17. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  18. IWbemServices *pWbemServices = NULL;
  19. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  20. switch (pPolicyStore->dwProvider) {
  21. case IPSEC_REGISTRY_PROVIDER:
  22. dwError = RegEnumPolicyData(
  23. (pPolicyStore->hRegistryKey),
  24. pPolicyStore->pszIpsecRootContainer,
  25. pppIpsecPolicyData,
  26. pdwNumPolicyObjects
  27. );
  28. break;
  29. case IPSEC_DIRECTORY_PROVIDER:
  30. dwError = DirEnumPolicyData(
  31. (pPolicyStore->hLdapBindHandle),
  32. pPolicyStore->pszIpsecRootContainer,
  33. pppIpsecPolicyData,
  34. pdwNumPolicyObjects
  35. );
  36. break;
  37. case IPSEC_WMI_PROVIDER:
  38. dwError = CreateIWbemServices(
  39. pPolicyStore->pszLocationName,
  40. &pWbemServices
  41. );
  42. if(dwError == ERROR_SUCCESS) {
  43. dwError = WMIEnumPolicyDataEx(
  44. pWbemServices,
  45. pppIpsecPolicyData,
  46. pdwNumPolicyObjects
  47. );
  48. IWbemServices_Release(pWbemServices);
  49. }
  50. break;
  51. default:
  52. dwError = ERROR_INVALID_PARAMETER;
  53. break;
  54. }
  55. return(dwError);
  56. }
  57. DWORD
  58. IPSecSetPolicyData(
  59. HANDLE hPolicyStore,
  60. PIPSEC_POLICY_DATA pIpsecPolicyData
  61. )
  62. {
  63. DWORD dwError = 0;
  64. DWORD dwProvider = 0;
  65. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  66. dwError = ValidatePolicyData(
  67. hPolicyStore,
  68. pIpsecPolicyData
  69. );
  70. BAIL_ON_WIN32_ERROR(dwError);
  71. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  72. switch (pPolicyStore->dwProvider) {
  73. case IPSEC_REGISTRY_PROVIDER:
  74. dwError = RegSetPolicyData(
  75. (pPolicyStore->hRegistryKey),
  76. pPolicyStore->pszIpsecRootContainer,
  77. pPolicyStore->pszLocationName,
  78. pIpsecPolicyData
  79. );
  80. break;
  81. case IPSEC_DIRECTORY_PROVIDER:
  82. dwError = DirSetPolicyData(
  83. (pPolicyStore->hLdapBindHandle),
  84. pPolicyStore->pszIpsecRootContainer,
  85. pIpsecPolicyData
  86. );
  87. break;
  88. case IPSEC_WMI_PROVIDER:
  89. dwError = ERROR_NOT_SUPPORTED;
  90. break;
  91. default:
  92. dwError = ERROR_INVALID_PARAMETER;
  93. break;
  94. }
  95. error:
  96. return(dwError);
  97. }
  98. DWORD
  99. IPSecCreatePolicyData(
  100. HANDLE hPolicyStore,
  101. PIPSEC_POLICY_DATA pIpsecPolicyData
  102. )
  103. {
  104. DWORD dwError = 0;
  105. DWORD dwProvider = 0;
  106. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  107. dwError = ValidatePolicyData(
  108. hPolicyStore,
  109. pIpsecPolicyData
  110. );
  111. BAIL_ON_WIN32_ERROR(dwError);
  112. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  113. switch (pPolicyStore->dwProvider) {
  114. case IPSEC_REGISTRY_PROVIDER:
  115. dwError = RegCreatePolicyData(
  116. (pPolicyStore->hRegistryKey),
  117. pPolicyStore->pszIpsecRootContainer,
  118. pIpsecPolicyData
  119. );
  120. break;
  121. case IPSEC_DIRECTORY_PROVIDER:
  122. dwError = DirCreatePolicyData(
  123. (pPolicyStore->hLdapBindHandle),
  124. pPolicyStore->pszIpsecRootContainer,
  125. pIpsecPolicyData
  126. );
  127. break;
  128. case IPSEC_WMI_PROVIDER:
  129. dwError = ERROR_NOT_SUPPORTED;
  130. break;
  131. default:
  132. dwError = ERROR_INVALID_PARAMETER;
  133. break;
  134. }
  135. error:
  136. return(dwError);
  137. }
  138. DWORD
  139. IPSecDeletePolicyData(
  140. HANDLE hPolicyStore,
  141. PIPSEC_POLICY_DATA pIpsecPolicyData
  142. )
  143. {
  144. DWORD dwError = 0;
  145. DWORD dwProvider = 0;
  146. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  147. dwError = ValidatePolicyDataDeletion(
  148. hPolicyStore,
  149. pIpsecPolicyData
  150. );
  151. BAIL_ON_WIN32_ERROR(dwError);
  152. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  153. switch (pPolicyStore->dwProvider) {
  154. case IPSEC_REGISTRY_PROVIDER:
  155. dwError = RegDeletePolicyData(
  156. (pPolicyStore->hRegistryKey),
  157. pPolicyStore->pszIpsecRootContainer,
  158. pIpsecPolicyData
  159. );
  160. break;
  161. case IPSEC_DIRECTORY_PROVIDER:
  162. dwError = DirDeletePolicyData(
  163. (pPolicyStore->hLdapBindHandle),
  164. pPolicyStore->pszIpsecRootContainer,
  165. pIpsecPolicyData
  166. );
  167. break;
  168. case IPSEC_WMI_PROVIDER:
  169. dwError = ERROR_NOT_SUPPORTED;
  170. break;
  171. default:
  172. dwError = ERROR_INVALID_PARAMETER;
  173. break;
  174. }
  175. error:
  176. return(dwError);
  177. }
  178. DWORD
  179. IPSecEnumFilterData(
  180. HANDLE hPolicyStore,
  181. PIPSEC_FILTER_DATA ** pppIpsecFilterData,
  182. PDWORD pdwNumFilterObjects
  183. )
  184. {
  185. DWORD dwError = 0;
  186. DWORD dwProvider = 0;
  187. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  188. IWbemServices *pWbemServices = NULL;
  189. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  190. switch (pPolicyStore->dwProvider) {
  191. case IPSEC_REGISTRY_PROVIDER:
  192. dwError = RegEnumFilterData(
  193. (pPolicyStore->hRegistryKey),
  194. pPolicyStore->pszIpsecRootContainer,
  195. pppIpsecFilterData,
  196. pdwNumFilterObjects
  197. );
  198. break;
  199. case IPSEC_DIRECTORY_PROVIDER:
  200. dwError = DirEnumFilterData(
  201. (pPolicyStore->hLdapBindHandle),
  202. (pPolicyStore->pszIpsecRootContainer),
  203. pppIpsecFilterData,
  204. pdwNumFilterObjects
  205. );
  206. break;
  207. case IPSEC_WMI_PROVIDER:
  208. dwError = CreateIWbemServices(
  209. pPolicyStore->pszLocationName,
  210. &pWbemServices
  211. );
  212. if(dwError == ERROR_SUCCESS) {
  213. dwError = WMIEnumFilterDataEx(
  214. pWbemServices,
  215. pppIpsecFilterData,
  216. pdwNumFilterObjects
  217. );
  218. IWbemServices_Release(pWbemServices);
  219. }
  220. break;
  221. default:
  222. dwError = ERROR_INVALID_PARAMETER;
  223. break;
  224. }
  225. return(dwError);
  226. }
  227. DWORD
  228. IPSecSetFilterData(
  229. HANDLE hPolicyStore,
  230. PIPSEC_FILTER_DATA pIpsecFilterData
  231. )
  232. {
  233. DWORD dwError = 0;
  234. DWORD dwProvider = 0;
  235. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  236. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  237. switch (pPolicyStore->dwProvider) {
  238. case IPSEC_REGISTRY_PROVIDER:
  239. dwError = RegSetFilterData(
  240. (pPolicyStore->hRegistryKey),
  241. pPolicyStore->pszIpsecRootContainer,
  242. pPolicyStore->pszLocationName,
  243. pIpsecFilterData
  244. );
  245. break;
  246. case IPSEC_DIRECTORY_PROVIDER:
  247. dwError = DirSetFilterData(
  248. (pPolicyStore->hLdapBindHandle),
  249. (pPolicyStore->pszIpsecRootContainer),
  250. pIpsecFilterData
  251. );
  252. break;
  253. case IPSEC_WMI_PROVIDER:
  254. dwError = ERROR_NOT_SUPPORTED;
  255. break;
  256. default:
  257. dwError = ERROR_INVALID_PARAMETER;
  258. break;
  259. }
  260. return(dwError);
  261. }
  262. DWORD
  263. IPSecCreateFilterData(
  264. HANDLE hPolicyStore,
  265. PIPSEC_FILTER_DATA pIpsecFilterData
  266. )
  267. {
  268. DWORD dwError = 0;
  269. DWORD dwProvider = 0;
  270. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  271. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  272. switch (pPolicyStore->dwProvider) {
  273. case IPSEC_REGISTRY_PROVIDER:
  274. dwError = RegCreateFilterData(
  275. (pPolicyStore->hRegistryKey),
  276. pPolicyStore->pszIpsecRootContainer,
  277. pIpsecFilterData
  278. );
  279. break;
  280. case IPSEC_DIRECTORY_PROVIDER:
  281. dwError = DirCreateFilterData(
  282. (pPolicyStore->hLdapBindHandle),
  283. (pPolicyStore->pszIpsecRootContainer),
  284. pIpsecFilterData
  285. );
  286. break;
  287. case IPSEC_WMI_PROVIDER:
  288. dwError = ERROR_NOT_SUPPORTED;
  289. break;
  290. default:
  291. dwError = ERROR_INVALID_PARAMETER;
  292. break;
  293. }
  294. return(dwError);
  295. }
  296. DWORD
  297. IPSecDeleteFilterData(
  298. HANDLE hPolicyStore,
  299. GUID FilterIdentifier
  300. )
  301. {
  302. DWORD dwError = 0;
  303. DWORD dwProvider = 0;
  304. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  305. dwError = ValidateFilterDataDeletion(
  306. hPolicyStore,
  307. FilterIdentifier
  308. );
  309. BAIL_ON_WIN32_ERROR(dwError);
  310. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  311. switch (pPolicyStore->dwProvider) {
  312. case IPSEC_REGISTRY_PROVIDER:
  313. dwError = RegDeleteFilterData(
  314. (pPolicyStore->hRegistryKey),
  315. pPolicyStore->pszIpsecRootContainer,
  316. FilterIdentifier
  317. );
  318. break;
  319. case IPSEC_DIRECTORY_PROVIDER:
  320. dwError = DirDeleteFilterData(
  321. (pPolicyStore->hLdapBindHandle),
  322. (pPolicyStore->pszIpsecRootContainer),
  323. FilterIdentifier
  324. );
  325. break;
  326. case IPSEC_WMI_PROVIDER:
  327. dwError = ERROR_NOT_SUPPORTED;
  328. break;
  329. default:
  330. dwError = ERROR_INVALID_PARAMETER;
  331. break;
  332. }
  333. error:
  334. return(dwError);
  335. }
  336. DWORD
  337. IPSecEnumNegPolData(
  338. HANDLE hPolicyStore,
  339. PIPSEC_NEGPOL_DATA ** pppIpsecNegPolData,
  340. PDWORD pdwNumNegPolObjects
  341. )
  342. {
  343. DWORD dwError = 0;
  344. DWORD dwProvider = 0;
  345. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  346. IWbemServices *pWbemServices = NULL;
  347. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  348. switch (pPolicyStore->dwProvider) {
  349. case IPSEC_REGISTRY_PROVIDER:
  350. dwError = RegEnumNegPolData(
  351. (pPolicyStore->hRegistryKey),
  352. pPolicyStore->pszIpsecRootContainer,
  353. pppIpsecNegPolData,
  354. pdwNumNegPolObjects
  355. );
  356. break;
  357. case IPSEC_DIRECTORY_PROVIDER:
  358. dwError = DirEnumNegPolData(
  359. (pPolicyStore->hLdapBindHandle),
  360. pPolicyStore->pszIpsecRootContainer,
  361. pppIpsecNegPolData,
  362. pdwNumNegPolObjects
  363. );
  364. break;
  365. case IPSEC_WMI_PROVIDER:
  366. dwError = CreateIWbemServices(
  367. pPolicyStore->pszLocationName,
  368. &pWbemServices
  369. );
  370. if(dwError == ERROR_SUCCESS) {
  371. dwError = WMIEnumNegPolDataEx(
  372. pWbemServices,
  373. pppIpsecNegPolData,
  374. pdwNumNegPolObjects
  375. );
  376. IWbemServices_Release(pWbemServices);
  377. }
  378. break;
  379. default:
  380. dwError = ERROR_INVALID_PARAMETER;
  381. break;
  382. }
  383. return(dwError);
  384. }
  385. DWORD
  386. IPSecSetNegPolData(
  387. HANDLE hPolicyStore,
  388. PIPSEC_NEGPOL_DATA pIpsecNegPolData
  389. )
  390. {
  391. DWORD dwError = 0;
  392. DWORD dwProvider = 0;
  393. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  394. dwError = ValidateNegPolData(
  395. pIpsecNegPolData
  396. );
  397. BAIL_ON_WIN32_ERROR(dwError);
  398. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  399. switch (pPolicyStore->dwProvider) {
  400. case IPSEC_REGISTRY_PROVIDER:
  401. dwError = RegSetNegPolData(
  402. (pPolicyStore->hRegistryKey),
  403. pPolicyStore->pszIpsecRootContainer,
  404. pPolicyStore->pszLocationName,
  405. pIpsecNegPolData
  406. );
  407. break;
  408. case IPSEC_DIRECTORY_PROVIDER:
  409. dwError = DirSetNegPolData(
  410. (pPolicyStore->hLdapBindHandle),
  411. pPolicyStore->pszIpsecRootContainer,
  412. pIpsecNegPolData
  413. );
  414. break;
  415. case IPSEC_WMI_PROVIDER:
  416. dwError = ERROR_NOT_SUPPORTED;
  417. break;
  418. default:
  419. dwError = ERROR_INVALID_PARAMETER;
  420. break;
  421. }
  422. error:
  423. return(dwError);
  424. }
  425. DWORD
  426. IPSecCreateNegPolData(
  427. HANDLE hPolicyStore,
  428. PIPSEC_NEGPOL_DATA pIpsecNegPolData
  429. )
  430. {
  431. DWORD dwError = 0;
  432. DWORD dwProvider = 0;
  433. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  434. dwError = ValidateNegPolData(
  435. pIpsecNegPolData
  436. );
  437. BAIL_ON_WIN32_ERROR(dwError);
  438. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  439. switch (pPolicyStore->dwProvider) {
  440. case IPSEC_REGISTRY_PROVIDER:
  441. dwError = RegCreateNegPolData(
  442. (pPolicyStore->hRegistryKey),
  443. pPolicyStore->pszIpsecRootContainer,
  444. pIpsecNegPolData
  445. );
  446. break;
  447. case IPSEC_DIRECTORY_PROVIDER:
  448. dwError = DirCreateNegPolData(
  449. (pPolicyStore->hLdapBindHandle),
  450. pPolicyStore->pszIpsecRootContainer,
  451. pIpsecNegPolData
  452. );
  453. break;
  454. case IPSEC_WMI_PROVIDER:
  455. dwError = ERROR_NOT_SUPPORTED;
  456. break;
  457. default:
  458. dwError = ERROR_INVALID_PARAMETER;
  459. break;
  460. }
  461. error:
  462. return(dwError);
  463. }
  464. DWORD
  465. IPSecDeleteNegPolData(
  466. HANDLE hPolicyStore,
  467. GUID NegPolIdentifier
  468. )
  469. {
  470. DWORD dwError = 0;
  471. DWORD dwProvider = 0;
  472. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  473. dwError = ValidateNegPolDataDeletion(
  474. hPolicyStore,
  475. NegPolIdentifier
  476. );
  477. BAIL_ON_WIN32_ERROR(dwError);
  478. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  479. switch (pPolicyStore->dwProvider) {
  480. case IPSEC_REGISTRY_PROVIDER:
  481. dwError = RegDeleteNegPolData(
  482. (pPolicyStore->hRegistryKey),
  483. pPolicyStore->pszIpsecRootContainer,
  484. NegPolIdentifier
  485. );
  486. break;
  487. case IPSEC_DIRECTORY_PROVIDER:
  488. dwError = DirDeleteNegPolData(
  489. (pPolicyStore->hLdapBindHandle),
  490. pPolicyStore->pszIpsecRootContainer,
  491. NegPolIdentifier
  492. );
  493. break;
  494. case IPSEC_WMI_PROVIDER:
  495. dwError = ERROR_NOT_SUPPORTED;
  496. break;
  497. default:
  498. dwError = ERROR_INVALID_PARAMETER;
  499. break;
  500. }
  501. error:
  502. return(dwError);
  503. }
  504. DWORD
  505. IPSecCreateNFAData(
  506. HANDLE hPolicyStore,
  507. GUID PolicyIdentifier,
  508. PIPSEC_NFA_DATA pIpsecNFAData
  509. )
  510. {
  511. DWORD dwError = 0;
  512. DWORD dwProvider = 0;
  513. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  514. dwError = ValidateNFAData(
  515. hPolicyStore,
  516. PolicyIdentifier,
  517. pIpsecNFAData
  518. );
  519. BAIL_ON_WIN32_ERROR(dwError);
  520. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  521. switch(pPolicyStore->dwProvider) {
  522. case IPSEC_REGISTRY_PROVIDER:
  523. dwError = RegCreateNFAData(
  524. (pPolicyStore->hRegistryKey),
  525. pPolicyStore->pszIpsecRootContainer,
  526. PolicyIdentifier,
  527. pPolicyStore->pszLocationName,
  528. pIpsecNFAData
  529. );
  530. break;
  531. case IPSEC_DIRECTORY_PROVIDER:
  532. dwError = DirCreateNFAData(
  533. (pPolicyStore->hLdapBindHandle),
  534. pPolicyStore->pszIpsecRootContainer,
  535. PolicyIdentifier,
  536. pIpsecNFAData
  537. );
  538. break;
  539. case IPSEC_WMI_PROVIDER:
  540. dwError = ERROR_NOT_SUPPORTED;
  541. break;
  542. default:
  543. dwError = ERROR_INVALID_PARAMETER;
  544. break;
  545. }
  546. error:
  547. return(dwError);
  548. }
  549. DWORD
  550. IPSecSetNFAData(
  551. HANDLE hPolicyStore,
  552. GUID PolicyIdentifier,
  553. PIPSEC_NFA_DATA pIpsecNFAData
  554. )
  555. {
  556. DWORD dwError = 0;
  557. DWORD dwProvider = 0;
  558. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  559. dwError = ValidateNFAData(
  560. hPolicyStore,
  561. PolicyIdentifier,
  562. pIpsecNFAData
  563. );
  564. BAIL_ON_WIN32_ERROR(dwError);
  565. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  566. switch (pPolicyStore->dwProvider) {
  567. case IPSEC_REGISTRY_PROVIDER:
  568. dwError = RegSetNFAData(
  569. (pPolicyStore->hRegistryKey),
  570. pPolicyStore->pszIpsecRootContainer,
  571. PolicyIdentifier,
  572. pPolicyStore->pszLocationName,
  573. pIpsecNFAData
  574. );
  575. break;
  576. case IPSEC_DIRECTORY_PROVIDER:
  577. dwError = DirSetNFAData(
  578. (pPolicyStore->hLdapBindHandle),
  579. pPolicyStore->pszIpsecRootContainer,
  580. PolicyIdentifier,
  581. pIpsecNFAData
  582. );
  583. break;
  584. case IPSEC_WMI_PROVIDER:
  585. dwError = ERROR_NOT_SUPPORTED;
  586. break;
  587. default:
  588. dwError = ERROR_INVALID_PARAMETER;
  589. break;
  590. }
  591. error:
  592. return(dwError);
  593. }
  594. DWORD
  595. IPSecDeleteNFAData(
  596. HANDLE hPolicyStore,
  597. GUID PolicyIdentifier,
  598. PIPSEC_NFA_DATA pIpsecNFAData
  599. )
  600. {
  601. DWORD dwError = 0;
  602. DWORD dwProvider = 0;
  603. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  604. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  605. switch (pPolicyStore->dwProvider) {
  606. case IPSEC_REGISTRY_PROVIDER:
  607. dwError = RegDeleteNFAData(
  608. (pPolicyStore->hRegistryKey),
  609. (pPolicyStore->pszIpsecRootContainer),
  610. PolicyIdentifier,
  611. pPolicyStore->pszLocationName,
  612. pIpsecNFAData
  613. );
  614. break;
  615. case IPSEC_DIRECTORY_PROVIDER:
  616. dwError = DirDeleteNFAData(
  617. (pPolicyStore->hLdapBindHandle),
  618. pPolicyStore->pszIpsecRootContainer,
  619. PolicyIdentifier,
  620. pIpsecNFAData
  621. );
  622. break;
  623. case IPSEC_WMI_PROVIDER:
  624. dwError = ERROR_NOT_SUPPORTED;
  625. break;
  626. default:
  627. dwError = ERROR_INVALID_PARAMETER;
  628. break;
  629. }
  630. return(dwError);
  631. }
  632. DWORD
  633. IPSecEnumNFAData(
  634. HANDLE hPolicyStore,
  635. GUID PolicyIdentifier,
  636. PIPSEC_NFA_DATA ** pppIpsecNFAData,
  637. PDWORD pdwNumNFAObjects
  638. )
  639. {
  640. DWORD dwError = 0;
  641. DWORD dwProvider = 0;
  642. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  643. IWbemServices *pWbemServices = NULL;
  644. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  645. switch (pPolicyStore->dwProvider) {
  646. case IPSEC_REGISTRY_PROVIDER:
  647. dwError = RegEnumNFAData(
  648. (pPolicyStore->hRegistryKey),
  649. pPolicyStore->pszIpsecRootContainer,
  650. PolicyIdentifier,
  651. pppIpsecNFAData,
  652. pdwNumNFAObjects
  653. );
  654. break;
  655. case IPSEC_DIRECTORY_PROVIDER:
  656. dwError = DirEnumNFAData(
  657. (pPolicyStore->hLdapBindHandle),
  658. pPolicyStore->pszIpsecRootContainer,
  659. PolicyIdentifier,
  660. pppIpsecNFAData,
  661. pdwNumNFAObjects
  662. );
  663. break;
  664. case IPSEC_WMI_PROVIDER:
  665. dwError = CreateIWbemServices(
  666. pPolicyStore->pszLocationName,
  667. &pWbemServices
  668. );
  669. if(dwError == ERROR_SUCCESS) {
  670. dwError = WMIEnumNFADataEx(
  671. pWbemServices,
  672. PolicyIdentifier,
  673. pppIpsecNFAData,
  674. pdwNumNFAObjects
  675. );
  676. IWbemServices_Release(pWbemServices);
  677. }
  678. break;
  679. default:
  680. dwError = ERROR_INVALID_PARAMETER;
  681. break;
  682. }
  683. return(dwError);
  684. }
  685. DWORD
  686. IPSecGetFilterData(
  687. HANDLE hPolicyStore,
  688. GUID FilterGUID,
  689. PIPSEC_FILTER_DATA * ppIpsecFilterData
  690. )
  691. {
  692. DWORD dwError = 0;
  693. DWORD dwProvider = 0;
  694. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  695. IWbemServices *pWbemServices = NULL;
  696. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  697. switch (pPolicyStore->dwProvider) {
  698. case IPSEC_REGISTRY_PROVIDER:
  699. dwError = RegGetFilterData(
  700. (pPolicyStore->hRegistryKey),
  701. pPolicyStore->pszIpsecRootContainer,
  702. FilterGUID,
  703. ppIpsecFilterData
  704. );
  705. break;
  706. case IPSEC_DIRECTORY_PROVIDER:
  707. dwError = DirGetFilterData(
  708. (pPolicyStore->hLdapBindHandle),
  709. (pPolicyStore->pszIpsecRootContainer),
  710. FilterGUID,
  711. ppIpsecFilterData
  712. );
  713. break;
  714. case IPSEC_WMI_PROVIDER:
  715. dwError = CreateIWbemServices(
  716. pPolicyStore->pszLocationName,
  717. &pWbemServices
  718. );
  719. if(dwError == ERROR_SUCCESS) {
  720. dwError = WMIGetFilterDataEx(
  721. pWbemServices,
  722. FilterGUID,
  723. ppIpsecFilterData
  724. );
  725. IWbemServices_Release(pWbemServices);
  726. }
  727. break;
  728. default:
  729. dwError = ERROR_INVALID_PARAMETER;
  730. break;
  731. }
  732. return(dwError);
  733. }
  734. DWORD
  735. IPSecGetNegPolData(
  736. HANDLE hPolicyStore,
  737. GUID NegPolGUID,
  738. PIPSEC_NEGPOL_DATA * ppIpsecNegPolData
  739. )
  740. {
  741. DWORD dwError = 0;
  742. DWORD dwProvider = 0;
  743. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  744. IWbemServices *pWbemServices = NULL;
  745. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  746. switch (pPolicyStore->dwProvider) {
  747. case IPSEC_REGISTRY_PROVIDER:
  748. dwError = RegGetNegPolData(
  749. (pPolicyStore->hRegistryKey),
  750. pPolicyStore->pszIpsecRootContainer,
  751. NegPolGUID,
  752. ppIpsecNegPolData
  753. );
  754. break;
  755. case IPSEC_DIRECTORY_PROVIDER:
  756. dwError = DirGetNegPolData(
  757. (pPolicyStore->hLdapBindHandle),
  758. pPolicyStore->pszIpsecRootContainer,
  759. NegPolGUID,
  760. ppIpsecNegPolData
  761. );
  762. break;
  763. case IPSEC_WMI_PROVIDER:
  764. dwError = CreateIWbemServices(
  765. pPolicyStore->pszLocationName,
  766. &pWbemServices
  767. );
  768. if(dwError == ERROR_SUCCESS) {
  769. dwError = WMIGetNegPolDataEx(
  770. pWbemServices,
  771. NegPolGUID,
  772. ppIpsecNegPolData
  773. );
  774. IWbemServices_Release(pWbemServices);
  775. }
  776. break;
  777. default:
  778. dwError = ERROR_INVALID_PARAMETER;
  779. break;
  780. }
  781. return(dwError);
  782. }
  783. DWORD
  784. IPSecEnumISAKMPData(
  785. HANDLE hPolicyStore,
  786. PIPSEC_ISAKMP_DATA ** pppIpsecISAKMPData,
  787. PDWORD pdwNumISAKMPObjects
  788. )
  789. {
  790. DWORD dwError = 0;
  791. DWORD dwProvider = 0;
  792. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  793. IWbemServices *pWbemServices = NULL;
  794. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  795. switch (pPolicyStore->dwProvider) {
  796. case IPSEC_REGISTRY_PROVIDER:
  797. dwError = RegEnumISAKMPData(
  798. (pPolicyStore->hRegistryKey),
  799. pPolicyStore->pszIpsecRootContainer,
  800. pppIpsecISAKMPData,
  801. pdwNumISAKMPObjects
  802. );
  803. break;
  804. case IPSEC_DIRECTORY_PROVIDER:
  805. dwError = DirEnumISAKMPData(
  806. (pPolicyStore->hLdapBindHandle),
  807. pPolicyStore->pszIpsecRootContainer,
  808. pppIpsecISAKMPData,
  809. pdwNumISAKMPObjects
  810. );
  811. break;
  812. case IPSEC_WMI_PROVIDER:
  813. dwError = CreateIWbemServices(
  814. pPolicyStore->pszLocationName,
  815. &pWbemServices
  816. );
  817. if(dwError == ERROR_SUCCESS) {
  818. dwError = WMIEnumISAKMPDataEx(
  819. pWbemServices,
  820. pppIpsecISAKMPData,
  821. pdwNumISAKMPObjects
  822. );
  823. IWbemServices_Release(pWbemServices);
  824. }
  825. break;
  826. default:
  827. dwError = ERROR_INVALID_PARAMETER;
  828. break;
  829. }
  830. return(dwError);
  831. }
  832. DWORD
  833. IPSecSetISAKMPData(
  834. HANDLE hPolicyStore,
  835. PIPSEC_ISAKMP_DATA pIpsecISAKMPData
  836. )
  837. {
  838. DWORD dwError = 0;
  839. DWORD dwProvider = 0;
  840. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  841. dwError = ValidateISAKMPData(
  842. pIpsecISAKMPData
  843. );
  844. BAIL_ON_WIN32_ERROR(dwError);
  845. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  846. switch (pPolicyStore->dwProvider) {
  847. case IPSEC_REGISTRY_PROVIDER:
  848. dwError = RegSetISAKMPData(
  849. (pPolicyStore->hRegistryKey),
  850. pPolicyStore->pszIpsecRootContainer,
  851. pPolicyStore->pszLocationName,
  852. pIpsecISAKMPData
  853. );
  854. break;
  855. case IPSEC_DIRECTORY_PROVIDER:
  856. dwError = DirSetISAKMPData(
  857. (pPolicyStore->hLdapBindHandle),
  858. pPolicyStore->pszIpsecRootContainer,
  859. pIpsecISAKMPData
  860. );
  861. break;
  862. case IPSEC_WMI_PROVIDER:
  863. dwError = ERROR_NOT_SUPPORTED;
  864. break;
  865. default:
  866. dwError = ERROR_INVALID_PARAMETER;
  867. break;
  868. }
  869. error:
  870. return(dwError);
  871. }
  872. DWORD
  873. IPSecCreateISAKMPData(
  874. HANDLE hPolicyStore,
  875. PIPSEC_ISAKMP_DATA pIpsecISAKMPData
  876. )
  877. {
  878. DWORD dwError = 0;
  879. DWORD dwProvider = 0;
  880. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  881. dwError = ValidateISAKMPData(
  882. pIpsecISAKMPData
  883. );
  884. BAIL_ON_WIN32_ERROR(dwError);
  885. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  886. switch (pPolicyStore->dwProvider) {
  887. case IPSEC_REGISTRY_PROVIDER:
  888. dwError = RegCreateISAKMPData(
  889. (pPolicyStore->hRegistryKey),
  890. pPolicyStore->pszIpsecRootContainer,
  891. pIpsecISAKMPData
  892. );
  893. break;
  894. case IPSEC_DIRECTORY_PROVIDER:
  895. dwError = DirCreateISAKMPData(
  896. (pPolicyStore->hLdapBindHandle),
  897. pPolicyStore->pszIpsecRootContainer,
  898. pIpsecISAKMPData
  899. );
  900. break;
  901. case IPSEC_WMI_PROVIDER:
  902. dwError = ERROR_NOT_SUPPORTED;
  903. break;
  904. default:
  905. dwError = ERROR_INVALID_PARAMETER;
  906. break;
  907. }
  908. error:
  909. return(dwError);
  910. }
  911. DWORD
  912. IPSecDeleteISAKMPData(
  913. HANDLE hPolicyStore,
  914. GUID ISAKMPIdentifier
  915. )
  916. {
  917. DWORD dwError = 0;
  918. DWORD dwProvider = 0;
  919. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  920. dwError = ValidateISAKMPDataDeletion(
  921. hPolicyStore,
  922. ISAKMPIdentifier
  923. );
  924. BAIL_ON_WIN32_ERROR(dwError);
  925. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  926. switch (pPolicyStore->dwProvider) {
  927. case IPSEC_REGISTRY_PROVIDER:
  928. dwError = RegDeleteISAKMPData(
  929. (pPolicyStore->hRegistryKey),
  930. pPolicyStore->pszIpsecRootContainer,
  931. ISAKMPIdentifier
  932. );
  933. break;
  934. case IPSEC_DIRECTORY_PROVIDER:
  935. dwError = DirDeleteISAKMPData(
  936. (pPolicyStore->hLdapBindHandle),
  937. pPolicyStore->pszIpsecRootContainer,
  938. ISAKMPIdentifier
  939. );
  940. break;
  941. case IPSEC_WMI_PROVIDER:
  942. dwError = ERROR_NOT_SUPPORTED;
  943. break;
  944. default:
  945. dwError = ERROR_INVALID_PARAMETER;
  946. break;
  947. }
  948. error:
  949. return(dwError);
  950. }
  951. DWORD
  952. IPSecGetISAKMPData(
  953. HANDLE hPolicyStore,
  954. GUID ISAKMPGUID,
  955. PIPSEC_ISAKMP_DATA * ppIpsecISAKMPData
  956. )
  957. {
  958. DWORD dwError = 0;
  959. DWORD dwProvider = 0;
  960. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  961. IWbemServices *pWbemServices = NULL;
  962. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  963. switch (pPolicyStore->dwProvider) {
  964. case IPSEC_REGISTRY_PROVIDER:
  965. dwError = RegGetISAKMPData(
  966. (pPolicyStore->hRegistryKey),
  967. pPolicyStore->pszIpsecRootContainer,
  968. ISAKMPGUID,
  969. ppIpsecISAKMPData
  970. );
  971. break;
  972. case IPSEC_DIRECTORY_PROVIDER:
  973. dwError = DirGetISAKMPData(
  974. (pPolicyStore->hLdapBindHandle),
  975. pPolicyStore->pszIpsecRootContainer,
  976. ISAKMPGUID,
  977. ppIpsecISAKMPData
  978. );
  979. break;
  980. case IPSEC_WMI_PROVIDER:
  981. dwError = CreateIWbemServices(
  982. pPolicyStore->pszLocationName,
  983. &pWbemServices
  984. );
  985. if(dwError == ERROR_SUCCESS) {
  986. dwError = WMIGetISAKMPDataEx(
  987. pWbemServices,
  988. ISAKMPGUID,
  989. ppIpsecISAKMPData
  990. );
  991. IWbemServices_Release(pWbemServices);
  992. }
  993. break;
  994. default:
  995. dwError = ERROR_INVALID_PARAMETER;
  996. break;
  997. }
  998. return(dwError);
  999. }
  1000. DWORD
  1001. IPSecOpenPolicyStore(
  1002. LPWSTR pszMachineName,
  1003. DWORD dwTypeOfStore,
  1004. LPWSTR pszFileName,
  1005. HANDLE * phPolicyStore
  1006. )
  1007. {
  1008. DWORD dwError = 0;
  1009. switch (dwTypeOfStore) {
  1010. case IPSEC_REGISTRY_PROVIDER:
  1011. dwError = RegOpenPolicyStore(
  1012. pszMachineName,
  1013. IPSEC_STORE_LOCAL,
  1014. phPolicyStore
  1015. );
  1016. break;
  1017. case IPSEC_DIRECTORY_PROVIDER:
  1018. dwError = DirOpenPolicyStore(
  1019. pszMachineName,
  1020. phPolicyStore
  1021. );
  1022. break;
  1023. case IPSEC_FILE_PROVIDER:
  1024. dwError = FileOpenPolicyStore(
  1025. pszMachineName,
  1026. pszFileName,
  1027. phPolicyStore
  1028. );
  1029. break;
  1030. case IPSEC_WMI_PROVIDER:
  1031. dwError = WMIOpenPolicyStore(
  1032. pszMachineName,
  1033. phPolicyStore
  1034. );
  1035. break;
  1036. case IPSEC_PERSISTENT_PROVIDER:
  1037. dwError = RegOpenPolicyStore(
  1038. pszMachineName,
  1039. IPSEC_STORE_PERSISTENT,
  1040. phPolicyStore
  1041. );
  1042. break;
  1043. default:
  1044. dwError = ERROR_INVALID_PARAMETER;
  1045. break;
  1046. }
  1047. return (dwError);
  1048. }
  1049. DWORD
  1050. RegOpenPolicyStore(
  1051. LPWSTR pszMachineName,
  1052. IN DWORD dwStore,
  1053. HANDLE * phPolicyStore
  1054. )
  1055. {
  1056. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1057. DWORD dwError = 0;
  1058. HKEY hParentRegistryKey = NULL;
  1059. HKEY hRegistryKey = NULL;
  1060. WCHAR szName[MAX_PATH];
  1061. LPWSTR pszLocationName = NULL;
  1062. LPWSTR pszIpsecRootContainer = NULL;
  1063. switch (dwStore)
  1064. {
  1065. case IPSEC_STORE_LOCAL:
  1066. pszIpsecRootContainer = AllocPolStr(gpszRegLocalContainer);
  1067. break;
  1068. case IPSEC_STORE_PERSISTENT:
  1069. pszIpsecRootContainer = AllocPolStr(gpszRegPersistentContainer);
  1070. break;
  1071. default:
  1072. dwError = ERROR_INVALID_PARAMETER;
  1073. break;
  1074. }
  1075. BAIL_ON_WIN32_ERROR(dwError);
  1076. if (!pszIpsecRootContainer) {
  1077. dwError = ERROR_OUTOFMEMORY;
  1078. BAIL_ON_WIN32_ERROR(dwError);
  1079. }
  1080. szName[0] = L'\0';
  1081. if (!pszMachineName || !*pszMachineName) {
  1082. dwError = RegOpenKeyExW(
  1083. HKEY_LOCAL_MACHINE,
  1084. (LPCWSTR) pszIpsecRootContainer,
  1085. 0,
  1086. KEY_ALL_ACCESS,
  1087. &hRegistryKey
  1088. );
  1089. BAIL_ON_WIN32_ERROR(dwError);
  1090. pszLocationName = NULL;
  1091. }
  1092. else {
  1093. wcscpy(szName, L"\\\\");
  1094. wcscat(szName, pszMachineName);
  1095. dwError = RegConnectRegistryW(
  1096. szName,
  1097. HKEY_LOCAL_MACHINE,
  1098. &hParentRegistryKey
  1099. );
  1100. BAIL_ON_WIN32_ERROR(dwError);
  1101. dwError = RegOpenKeyExW(
  1102. hParentRegistryKey,
  1103. (LPCWSTR) pszIpsecRootContainer,
  1104. 0,
  1105. KEY_ALL_ACCESS,
  1106. &hRegistryKey
  1107. );
  1108. BAIL_ON_WIN32_ERROR(dwError);
  1109. pszLocationName = AllocPolStr(szName);
  1110. if (!pszLocationName) {
  1111. dwError = ERROR_OUTOFMEMORY;
  1112. BAIL_ON_WIN32_ERROR(dwError);
  1113. }
  1114. }
  1115. pPolicyStore = (PIPSEC_POLICY_STORE)AllocPolMem(
  1116. sizeof(IPSEC_POLICY_STORE)
  1117. );
  1118. if (!pPolicyStore) {
  1119. dwError = ERROR_OUTOFMEMORY;
  1120. BAIL_ON_WIN32_ERROR(dwError);
  1121. }
  1122. pPolicyStore->dwProvider = IPSEC_REGISTRY_PROVIDER;
  1123. pPolicyStore->hParentRegistryKey = hParentRegistryKey;
  1124. pPolicyStore->hRegistryKey = hRegistryKey;
  1125. pPolicyStore->pszLocationName = pszLocationName;
  1126. pPolicyStore->hLdapBindHandle = NULL;
  1127. pPolicyStore->pszIpsecRootContainer = pszIpsecRootContainer;
  1128. pPolicyStore->pszFileName = NULL;
  1129. *phPolicyStore = pPolicyStore;
  1130. return(dwError);
  1131. error:
  1132. if (pszIpsecRootContainer) {
  1133. FreePolStr(pszIpsecRootContainer);
  1134. }
  1135. if (hRegistryKey) {
  1136. RegCloseKey(hRegistryKey);
  1137. }
  1138. if (hParentRegistryKey) {
  1139. RegCloseKey(hParentRegistryKey);
  1140. }
  1141. if (pszLocationName) {
  1142. FreePolStr(pszLocationName);
  1143. }
  1144. if (pPolicyStore) {
  1145. FreePolMem(pPolicyStore);
  1146. }
  1147. *phPolicyStore = NULL;
  1148. return(dwError);
  1149. }
  1150. DWORD
  1151. WMIOpenPolicyStore(
  1152. LPWSTR pszMachineName,
  1153. HANDLE * phPolicyStore
  1154. )
  1155. {
  1156. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1157. DWORD dwError = 0;
  1158. LPWSTR pszLocationName = NULL;
  1159. pPolicyStore = (PIPSEC_POLICY_STORE)AllocPolMem(
  1160. sizeof(IPSEC_POLICY_STORE)
  1161. );
  1162. if (!pPolicyStore) {
  1163. dwError = ERROR_OUTOFMEMORY;
  1164. BAIL_ON_WIN32_ERROR(dwError);
  1165. }
  1166. pszLocationName = AllocPolStr(pszMachineName);
  1167. if (!pszLocationName) {
  1168. dwError = ERROR_OUTOFMEMORY;
  1169. BAIL_ON_WIN32_ERROR(dwError);
  1170. }
  1171. pPolicyStore->dwProvider = IPSEC_WMI_PROVIDER;
  1172. pPolicyStore->hParentRegistryKey = NULL;
  1173. pPolicyStore->hRegistryKey = NULL;
  1174. pPolicyStore->pszLocationName = pszLocationName;
  1175. pPolicyStore->hLdapBindHandle = NULL;
  1176. pPolicyStore->pszIpsecRootContainer = NULL;
  1177. pPolicyStore->pszFileName = NULL;
  1178. *phPolicyStore = pPolicyStore;
  1179. cleanup:
  1180. return(dwError);
  1181. error:
  1182. if (pPolicyStore) {
  1183. FreePolMem(pPolicyStore);
  1184. }
  1185. *phPolicyStore = NULL;
  1186. goto cleanup;
  1187. }
  1188. DWORD
  1189. DirOpenPolicyStore(
  1190. LPWSTR pszDomain,
  1191. HANDLE * phPolicyStore
  1192. )
  1193. {
  1194. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1195. DWORD dwError = 0;
  1196. LPWSTR pszIpsecRootContainer = NULL;
  1197. HLDAP hLdapBindHandle = NULL;
  1198. LPWSTR pszDefaultDirectory = NULL;
  1199. LPWSTR pszCrackedDirectory = NULL;
  1200. BOOL bCracked = FALSE;
  1201. if (!pszDomain || !*pszDomain) {
  1202. dwError = ComputeDefaultDirectory(
  1203. &pszDefaultDirectory
  1204. );
  1205. BAIL_ON_WIN32_ERROR(dwError);
  1206. dwError = OpenDirectoryServerHandle(
  1207. pszDefaultDirectory,
  1208. 389,
  1209. &hLdapBindHandle
  1210. );
  1211. BAIL_ON_WIN32_ERROR(dwError);
  1212. dwError = ComputeDirLocationName(
  1213. pszDefaultDirectory,
  1214. &pszIpsecRootContainer
  1215. );
  1216. BAIL_ON_WIN32_ERROR(dwError);
  1217. }
  1218. else {
  1219. // Discover the domain name in the form ldap expects.
  1220. //
  1221. // If cracking the name fails, then try to connect using the caller
  1222. // supplied domain name anyway before failing altogether.
  1223. //
  1224. dwError = CrackDomainName(pszDomain, &bCracked, &pszCrackedDirectory);
  1225. if (dwError == ERROR_SUCCESS) {
  1226. if (bCracked) {
  1227. pszDomain = pszCrackedDirectory;
  1228. }
  1229. }
  1230. dwError = ERROR_SUCCESS;
  1231. dwError = OpenDirectoryServerHandle(
  1232. pszDomain,
  1233. 389,
  1234. &hLdapBindHandle
  1235. );
  1236. BAIL_ON_WIN32_ERROR(dwError);
  1237. dwError = ComputeDirLocationName(
  1238. pszDomain,
  1239. &pszIpsecRootContainer
  1240. );
  1241. BAIL_ON_WIN32_ERROR(dwError);
  1242. }
  1243. pPolicyStore = (PIPSEC_POLICY_STORE)AllocPolMem(
  1244. sizeof(IPSEC_POLICY_STORE)
  1245. );
  1246. if (!pPolicyStore) {
  1247. dwError = ERROR_OUTOFMEMORY;
  1248. BAIL_ON_WIN32_ERROR(dwError);
  1249. }
  1250. pPolicyStore->dwProvider = IPSEC_DIRECTORY_PROVIDER;
  1251. pPolicyStore->hParentRegistryKey = NULL;
  1252. pPolicyStore->hRegistryKey = NULL;
  1253. pPolicyStore->pszLocationName = NULL;
  1254. pPolicyStore->hLdapBindHandle = hLdapBindHandle;
  1255. pPolicyStore->pszIpsecRootContainer = pszIpsecRootContainer;
  1256. pPolicyStore->pszFileName = NULL;
  1257. *phPolicyStore = pPolicyStore;
  1258. cleanup:
  1259. if (pszDefaultDirectory) {
  1260. FreePolStr(pszDefaultDirectory);
  1261. }
  1262. if (pszCrackedDirectory) {
  1263. NsuFree(&pszCrackedDirectory);
  1264. }
  1265. return(dwError);
  1266. error:
  1267. if (hLdapBindHandle) {
  1268. CloseDirectoryServerHandle(hLdapBindHandle);
  1269. }
  1270. if (pszIpsecRootContainer) {
  1271. FreePolStr(pszIpsecRootContainer);
  1272. }
  1273. if (pPolicyStore) {
  1274. FreePolMem(pPolicyStore);
  1275. }
  1276. *phPolicyStore = NULL;
  1277. goto cleanup;
  1278. }
  1279. DWORD
  1280. FileOpenPolicyStore(
  1281. LPWSTR pszMachineName,
  1282. LPWSTR pszFileName,
  1283. HANDLE * phPolicyStore
  1284. )
  1285. {
  1286. DWORD dwError = 0;
  1287. LPWSTR pszIpsecRootContainer = NULL;
  1288. HKEY hRegistryKey = NULL;
  1289. LPWSTR pszTempFileName = NULL;
  1290. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1291. DWORD dwDisposition = 0;
  1292. pszIpsecRootContainer = AllocPolStr(gpszIpsecFileRootContainer);
  1293. if (!pszIpsecRootContainer) {
  1294. dwError = ERROR_OUTOFMEMORY;
  1295. BAIL_ON_WIN32_ERROR(dwError);
  1296. }
  1297. if (!pszMachineName || !*pszMachineName) {
  1298. dwError = RegCreateKeyExW(
  1299. HKEY_LOCAL_MACHINE,
  1300. (LPCWSTR) gpszIpsecFileRootContainer,
  1301. 0,
  1302. NULL,
  1303. 0,
  1304. KEY_ALL_ACCESS,
  1305. NULL,
  1306. &hRegistryKey,
  1307. &dwDisposition
  1308. );
  1309. BAIL_ON_WIN32_ERROR(dwError);
  1310. }
  1311. else {
  1312. dwError = ERROR_INVALID_DATA;
  1313. BAIL_ON_WIN32_ERROR(dwError);
  1314. }
  1315. if (!pszFileName || !*pszFileName) {
  1316. dwError = ERROR_INVALID_DATA;
  1317. BAIL_ON_WIN32_ERROR(dwError);
  1318. }
  1319. pszTempFileName = AllocPolStr(pszFileName);
  1320. if (!pszTempFileName) {
  1321. dwError = ERROR_OUTOFMEMORY;
  1322. BAIL_ON_WIN32_ERROR(dwError);
  1323. }
  1324. pPolicyStore = (PIPSEC_POLICY_STORE)AllocPolMem(
  1325. sizeof(IPSEC_POLICY_STORE)
  1326. );
  1327. if (!pPolicyStore) {
  1328. dwError = ERROR_OUTOFMEMORY;
  1329. BAIL_ON_WIN32_ERROR(dwError);
  1330. }
  1331. pPolicyStore->dwProvider = IPSEC_FILE_PROVIDER;
  1332. pPolicyStore->hParentRegistryKey = NULL;
  1333. pPolicyStore->hRegistryKey = hRegistryKey;
  1334. pPolicyStore->pszLocationName = NULL;
  1335. pPolicyStore->hLdapBindHandle = NULL;
  1336. pPolicyStore->pszIpsecRootContainer = pszIpsecRootContainer;
  1337. pPolicyStore->pszFileName = pszTempFileName;
  1338. *phPolicyStore = pPolicyStore;
  1339. return(dwError);
  1340. error:
  1341. if (pszIpsecRootContainer) {
  1342. FreePolStr(pszIpsecRootContainer);
  1343. }
  1344. if (hRegistryKey) {
  1345. RegCloseKey(hRegistryKey);
  1346. }
  1347. if (pszTempFileName) {
  1348. FreePolStr(pszTempFileName);
  1349. }
  1350. *phPolicyStore = NULL;
  1351. return(dwError);
  1352. }
  1353. DWORD
  1354. IPSecClosePolicyStore(
  1355. HANDLE hPolicyStore
  1356. )
  1357. {
  1358. DWORD dwError = 0;
  1359. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1360. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  1361. switch (pPolicyStore->dwProvider) {
  1362. case IPSEC_REGISTRY_PROVIDER:
  1363. if (pPolicyStore->hRegistryKey) {
  1364. dwError = RegCloseKey(
  1365. pPolicyStore->hRegistryKey
  1366. );
  1367. BAIL_ON_WIN32_ERROR(dwError);
  1368. }
  1369. if (pPolicyStore->hParentRegistryKey) {
  1370. dwError = RegCloseKey(
  1371. pPolicyStore->hParentRegistryKey
  1372. );
  1373. BAIL_ON_WIN32_ERROR(dwError);
  1374. }
  1375. if (pPolicyStore->pszLocationName) {
  1376. FreePolStr(pPolicyStore->pszLocationName);
  1377. }
  1378. if (pPolicyStore->pszIpsecRootContainer) {
  1379. FreePolStr(pPolicyStore->pszIpsecRootContainer);
  1380. }
  1381. break;
  1382. case IPSEC_DIRECTORY_PROVIDER:
  1383. if (pPolicyStore->hLdapBindHandle) {
  1384. CloseDirectoryServerHandle(
  1385. pPolicyStore->hLdapBindHandle
  1386. );
  1387. }
  1388. if (pPolicyStore->pszIpsecRootContainer) {
  1389. FreePolStr(pPolicyStore->pszIpsecRootContainer);
  1390. }
  1391. break;
  1392. case IPSEC_FILE_PROVIDER:
  1393. if (pPolicyStore->hRegistryKey) {
  1394. dwError = RegCloseKey(
  1395. pPolicyStore->hRegistryKey
  1396. );
  1397. BAIL_ON_WIN32_ERROR(dwError);
  1398. }
  1399. if (pPolicyStore->pszIpsecRootContainer) {
  1400. FreePolStr(pPolicyStore->pszIpsecRootContainer);
  1401. }
  1402. if (pPolicyStore->pszFileName) {
  1403. FreePolStr(pPolicyStore->pszFileName);
  1404. }
  1405. break;
  1406. case IPSEC_WMI_PROVIDER:
  1407. if(pPolicyStore->pszLocationName) {
  1408. FreePolStr(pPolicyStore->pszLocationName);
  1409. }
  1410. break;
  1411. default:
  1412. dwError = ERROR_INVALID_PARAMETER;
  1413. BAIL_ON_WIN32_ERROR(dwError);
  1414. break;
  1415. }
  1416. if (pPolicyStore) {
  1417. FreePolMem(pPolicyStore);
  1418. }
  1419. error:
  1420. return(dwError);
  1421. }
  1422. DWORD
  1423. IPSecAssignPolicy(
  1424. HANDLE hPolicyStore,
  1425. GUID PolicyGUID
  1426. )
  1427. {
  1428. DWORD dwError = 0;
  1429. DWORD dwProvider = 0;
  1430. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1431. HKEY hHKLMKey = 0;
  1432. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  1433. switch (pPolicyStore->dwProvider) {
  1434. case IPSEC_REGISTRY_PROVIDER:
  1435. if (pPolicyStore->hParentRegistryKey) {
  1436. hHKLMKey = pPolicyStore->hParentRegistryKey;
  1437. } else {
  1438. hHKLMKey = HKEY_LOCAL_MACHINE;
  1439. }
  1440. dwError = RegAssignPolicy(
  1441. hHKLMKey,
  1442. (pPolicyStore->hRegistryKey),
  1443. pPolicyStore->pszIpsecRootContainer,
  1444. PolicyGUID,
  1445. pPolicyStore->pszLocationName
  1446. );
  1447. break;
  1448. case IPSEC_WMI_PROVIDER:
  1449. dwError = ERROR_NOT_SUPPORTED;
  1450. break;
  1451. default:
  1452. dwError = ERROR_INVALID_PARAMETER;
  1453. break;
  1454. }
  1455. return(dwError);
  1456. }
  1457. DWORD
  1458. IPSecUnassignPolicy(
  1459. HANDLE hPolicyStore,
  1460. GUID PolicyGUID
  1461. )
  1462. {
  1463. DWORD dwError = 0;
  1464. DWORD dwProvider = 0;
  1465. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1466. HKEY hHKLMKey = 0;
  1467. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  1468. switch (pPolicyStore->dwProvider) {
  1469. case IPSEC_REGISTRY_PROVIDER:
  1470. if (pPolicyStore->hParentRegistryKey) {
  1471. hHKLMKey = pPolicyStore->hParentRegistryKey;
  1472. } else {
  1473. hHKLMKey = HKEY_LOCAL_MACHINE;
  1474. }
  1475. dwError = RegUnassignPolicy(
  1476. hHKLMKey,
  1477. (pPolicyStore->hRegistryKey),
  1478. pPolicyStore->pszIpsecRootContainer,
  1479. PolicyGUID,
  1480. pPolicyStore->pszLocationName
  1481. );
  1482. break;
  1483. case IPSEC_WMI_PROVIDER:
  1484. dwError = ERROR_NOT_SUPPORTED;
  1485. break;
  1486. default:
  1487. dwError = ERROR_INVALID_PARAMETER;
  1488. break;
  1489. }
  1490. return(dwError);
  1491. }
  1492. DWORD
  1493. ComputeDirLocationName(
  1494. LPWSTR pszDirDomainName,
  1495. LPWSTR * ppszDirFQPathName
  1496. )
  1497. {
  1498. DWORD dwError = 0;
  1499. WCHAR szName[MAX_PATH];
  1500. LPWSTR pszDotBegin = NULL;
  1501. LPWSTR pszDotEnd = NULL;
  1502. LPWSTR pszDirFQPathName = NULL;
  1503. LPWSTR pszDirName = NULL;
  1504. szName[0] = L'\0';
  1505. wcscpy(szName, L"CN=IP Security,CN=System");
  1506. pszDirName = AllocPolStr(pszDirDomainName);
  1507. if (!pszDirName) {
  1508. dwError = ERROR_OUTOFMEMORY;
  1509. BAIL_ON_WIN32_ERROR(dwError);
  1510. }
  1511. pszDotBegin = pszDirName;
  1512. pszDotEnd = wcschr(pszDirName, L'.');
  1513. while (pszDotEnd) {
  1514. *pszDotEnd = L'\0';
  1515. wcscat(szName, L",DC=");
  1516. wcscat(szName, pszDotBegin);
  1517. *pszDotEnd = L'.';
  1518. pszDotEnd += 1;
  1519. pszDotBegin = pszDotEnd;
  1520. pszDotEnd = wcschr(pszDotEnd, L'.');
  1521. }
  1522. wcscat(szName, L",DC=");
  1523. wcscat(szName, pszDotBegin);
  1524. pszDirFQPathName = AllocPolStr(szName);
  1525. if (!pszDirFQPathName) {
  1526. dwError = ERROR_OUTOFMEMORY;
  1527. BAIL_ON_WIN32_ERROR(dwError);
  1528. }
  1529. *ppszDirFQPathName = pszDirFQPathName;
  1530. cleanup:
  1531. if (pszDirName) {
  1532. FreePolStr(pszDirName);
  1533. }
  1534. return (dwError);
  1535. error:
  1536. *ppszDirFQPathName = NULL;
  1537. goto cleanup;
  1538. }
  1539. DWORD
  1540. IPSecGetAssignedPolicyData(
  1541. HANDLE hPolicyStore,
  1542. PIPSEC_POLICY_DATA * ppIpsecPolicyData
  1543. )
  1544. {
  1545. DWORD dwError = 0;
  1546. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1547. pPolicyStore = (PIPSEC_POLICY_STORE)hPolicyStore;
  1548. switch (pPolicyStore->dwProvider) {
  1549. case IPSEC_REGISTRY_PROVIDER:
  1550. dwError = RegGetAssignedPolicyData(
  1551. (pPolicyStore->hRegistryKey),
  1552. pPolicyStore->pszIpsecRootContainer,
  1553. ppIpsecPolicyData
  1554. );
  1555. break;
  1556. case IPSEC_WMI_PROVIDER:
  1557. ////*ppIpsecPolicyData = NULL;
  1558. ////dwError = ERROR_NOT_SUPPORTED;
  1559. dwError = ERROR_INVALID_PARAMETER;
  1560. break;
  1561. default:
  1562. dwError = ERROR_INVALID_PARAMETER;
  1563. break;
  1564. }
  1565. return(dwError);
  1566. }
  1567. DWORD
  1568. IPSecExportPolicies(
  1569. HANDLE hSrcPolicyStore,
  1570. HANDLE hDesPolicyStore
  1571. )
  1572. {
  1573. DWORD dwError = 0;
  1574. PIPSEC_POLICY_STORE pSrcPolicyStore = NULL;
  1575. PIPSEC_POLICY_STORE pDesPolicyStore = NULL;
  1576. pSrcPolicyStore = (PIPSEC_POLICY_STORE) hSrcPolicyStore;
  1577. switch (pSrcPolicyStore->dwProvider) {
  1578. case IPSEC_REGISTRY_PROVIDER:
  1579. case IPSEC_DIRECTORY_PROVIDER:
  1580. break;
  1581. case IPSEC_WMI_PROVIDER:
  1582. ////dwError = ERROR_NOT_SUPPORTED;
  1583. ////BAIL_ON_WIN32_ERROR(dwError);
  1584. break;
  1585. default:
  1586. dwError = ERROR_INVALID_PARAMETER;
  1587. BAIL_ON_WIN32_ERROR(dwError);
  1588. break;
  1589. }
  1590. pDesPolicyStore = (PIPSEC_POLICY_STORE) hDesPolicyStore;
  1591. switch (pDesPolicyStore->dwProvider) {
  1592. case IPSEC_FILE_PROVIDER:
  1593. dwError = ExportPoliciesToFile(
  1594. hSrcPolicyStore,
  1595. hDesPolicyStore
  1596. );
  1597. BAIL_ON_WIN32_ERROR(dwError);
  1598. break;
  1599. default:
  1600. dwError = ERROR_INVALID_PARAMETER;
  1601. BAIL_ON_WIN32_ERROR(dwError);
  1602. break;
  1603. }
  1604. error:
  1605. return(dwError);
  1606. }
  1607. DWORD
  1608. IPSecImportPolicies(
  1609. HANDLE hSrcPolicyStore,
  1610. HANDLE hDesPolicyStore
  1611. )
  1612. {
  1613. DWORD dwError = 0;
  1614. PIPSEC_POLICY_STORE pSrcPolicyStore = NULL;
  1615. PIPSEC_POLICY_STORE pDesPolicyStore = NULL;
  1616. pSrcPolicyStore = (PIPSEC_POLICY_STORE) hSrcPolicyStore;
  1617. switch (pSrcPolicyStore->dwProvider) {
  1618. case IPSEC_FILE_PROVIDER:
  1619. break;
  1620. default:
  1621. dwError = ERROR_INVALID_PARAMETER;
  1622. BAIL_ON_WIN32_ERROR(dwError);
  1623. break;
  1624. }
  1625. pDesPolicyStore = (PIPSEC_POLICY_STORE) hDesPolicyStore;
  1626. switch (pDesPolicyStore->dwProvider) {
  1627. case IPSEC_REGISTRY_PROVIDER:
  1628. case IPSEC_DIRECTORY_PROVIDER:
  1629. dwError = ImportPoliciesFromFile(
  1630. hSrcPolicyStore,
  1631. hDesPolicyStore
  1632. );
  1633. BAIL_ON_WIN32_ERROR(dwError);
  1634. break;
  1635. case IPSEC_WMI_PROVIDER:
  1636. dwError = ERROR_NOT_SUPPORTED;
  1637. break;
  1638. default:
  1639. dwError = ERROR_INVALID_PARAMETER;
  1640. BAIL_ON_WIN32_ERROR(dwError);
  1641. break;
  1642. }
  1643. error:
  1644. return(dwError);
  1645. }
  1646. DWORD
  1647. IPSecRestoreDefaultPolicies(
  1648. HANDLE hPolicyStore
  1649. )
  1650. {
  1651. DWORD dwError = 0;
  1652. PIPSEC_POLICY_STORE pPolicyStore = NULL;
  1653. pPolicyStore = (PIPSEC_POLICY_STORE) hPolicyStore;
  1654. switch (pPolicyStore->dwProvider) {
  1655. case IPSEC_REGISTRY_PROVIDER:
  1656. dwError = RegRestoreDefaults(
  1657. hPolicyStore,
  1658. pPolicyStore->hRegistryKey,
  1659. pPolicyStore->pszIpsecRootContainer,
  1660. pPolicyStore->pszLocationName
  1661. );
  1662. BAIL_ON_WIN32_ERROR(dwError);
  1663. break;
  1664. case IPSEC_DIRECTORY_PROVIDER:
  1665. dwError = ERROR_INVALID_PARAMETER;
  1666. break;
  1667. case IPSEC_WMI_PROVIDER:
  1668. dwError = ERROR_NOT_SUPPORTED;
  1669. break;
  1670. default:
  1671. dwError = ERROR_INVALID_PARAMETER;
  1672. break;
  1673. }
  1674. error:
  1675. return(dwError);
  1676. }
  1677. HRESULT
  1678. WriteDirectoryPolicyToWMI(
  1679. LPWSTR pszMachineName,
  1680. LPWSTR pszPolicyDN,
  1681. PGPO_INFO pGPOInfo,
  1682. IWbemServices *pWbemServices
  1683. )
  1684. {
  1685. DWORD dwError = 0;
  1686. HRESULT hr = S_OK;
  1687. PIPSEC_POLICY_OBJECT pIpsecPolicyObject = NULL;
  1688. BOOL bDeepRead;
  1689. if (!pGPOInfo || !pWbemServices) {
  1690. hr = E_INVALIDARG;
  1691. BAIL_ON_HRESULT_ERROR(hr);
  1692. }
  1693. bDeepRead = (pGPOInfo->uiPrecedence == 1);
  1694. hr = ReadPolicyObjectFromDirectoryEx(
  1695. pszMachineName,
  1696. pszPolicyDN,
  1697. bDeepRead,
  1698. &pIpsecPolicyObject
  1699. );
  1700. BAIL_ON_HRESULT_ERROR(hr);
  1701. hr = WritePolicyObjectDirectoryToWMI(
  1702. pWbemServices,
  1703. pIpsecPolicyObject,
  1704. pGPOInfo
  1705. );
  1706. BAIL_ON_HRESULT_ERROR(hr);
  1707. error:
  1708. if (pIpsecPolicyObject) {
  1709. FreeIpsecPolicyObject(pIpsecPolicyObject);
  1710. }
  1711. return(hr);
  1712. }
  1713. HRESULT
  1714. IPSecClearWMIStore(
  1715. IWbemServices *pWbemServices
  1716. )
  1717. {
  1718. HRESULT hr = S_OK;
  1719. if (!pWbemServices) {
  1720. hr = E_INVALIDARG;
  1721. BAIL_ON_HRESULT_ERROR(hr);
  1722. }
  1723. hr = DeleteWMIClassObject(
  1724. pWbemServices,
  1725. IPSEC_RSOP_CLASSNAME
  1726. );
  1727. BAIL_ON_HRESULT_ERROR(hr);
  1728. error:
  1729. return(hr);
  1730. }
  1731. DWORD
  1732. IPSecChooseDriverBootMode(
  1733. HKEY hHKLMKey,
  1734. DWORD dwStore,
  1735. DWORD dwAction
  1736. )
  1737. {
  1738. BOOL bRegPolicyAssigned = FALSE;
  1739. BOOL bPersistentPolicyAssigned = FALSE;
  1740. BOOL bDirectoryPolicyAssigned = FALSE;
  1741. BOOL bComplementaryPolicyAssigned = FALSE;
  1742. BOOL bBootmodeValueExists = FALSE;
  1743. DWORD dwError = ERROR_SUCCESS;
  1744. dwError = IsRegvalueExist(
  1745. hHKLMKey,
  1746. gpszRegLocalContainer,
  1747. gpActivePolicyKey,
  1748. &bRegPolicyAssigned
  1749. );
  1750. BAIL_ON_WIN32_ERROR(dwError);
  1751. dwError = IsRegvalueExist(
  1752. hHKLMKey,
  1753. gpszRegPersistentContainer,
  1754. gpActivePolicyKey,
  1755. &bPersistentPolicyAssigned
  1756. );
  1757. BAIL_ON_WIN32_ERROR(dwError);
  1758. dwError = IsRegvalueExist(
  1759. hHKLMKey,
  1760. gpszIPsecDirContainer,
  1761. gpDirectoryPolicyPointerKey,
  1762. &bDirectoryPolicyAssigned
  1763. );
  1764. BAIL_ON_WIN32_ERROR(dwError);
  1765. bComplementaryPolicyAssigned =
  1766. (dwStore == IPSEC_REGISTRY_PROVIDER && (bPersistentPolicyAssigned || bDirectoryPolicyAssigned))
  1767. || (dwStore == IPSEC_DIRECTORY_PROVIDER && (bPersistentPolicyAssigned || bRegPolicyAssigned))
  1768. || (dwStore == IPSEC_PERSISTENT_PROVIDER && (bDirectoryPolicyAssigned || bRegPolicyAssigned));
  1769. if (dwAction == POL_ACTION_ASSIGN &&
  1770. !bComplementaryPolicyAssigned)
  1771. {
  1772. dwError = IsRegvalueExist(
  1773. hHKLMKey,
  1774. REG_KEY_IPSEC_DRIVER_SERVICE,
  1775. REG_VAL_IPSEC_OPERATIONMODE,
  1776. &bBootmodeValueExists
  1777. );
  1778. BAIL_ON_WIN32_ERROR(dwError);
  1779. if (!bBootmodeValueExists) {
  1780. dwError = IPSecSetDriverOperationMode(
  1781. hHKLMKey,
  1782. REG_IPSEC_DRIVER_STATEFULMODE
  1783. );
  1784. BAIL_ON_WIN32_ERROR(dwError);
  1785. }
  1786. }
  1787. else if (dwAction == POL_ACTION_UNASSIGN &&
  1788. !bComplementaryPolicyAssigned)
  1789. {
  1790. dwError = IPSecRegDeleteValue(
  1791. hHKLMKey,
  1792. REG_KEY_IPSEC_DRIVER_SERVICE,
  1793. REG_VAL_IPSEC_OPERATIONMODE
  1794. );
  1795. BAIL_ON_WIN32_ERROR(dwError);
  1796. }
  1797. return dwError;
  1798. error:
  1799. return dwError;
  1800. }
  1801. DWORD
  1802. IPSecSetDriverOperationMode(
  1803. HKEY hHKLMKey,
  1804. DWORD dwNewOperationMode
  1805. )
  1806. {
  1807. DWORD dwError = 0;
  1808. HKEY hKey = NULL;
  1809. dwError = RegOpenKeyExW(
  1810. hHKLMKey,
  1811. (LPCWSTR) REG_KEY_IPSEC_DRIVER_SERVICE,
  1812. 0,
  1813. KEY_ALL_ACCESS,
  1814. &hKey
  1815. );
  1816. BAIL_ON_WIN32_ERROR(dwError);
  1817. dwError = RegSetValueExW(
  1818. hKey,
  1819. REG_VAL_IPSEC_OPERATIONMODE,
  1820. 0,
  1821. REG_DWORD,
  1822. (LPBYTE) &dwNewOperationMode,
  1823. sizeof(DWORD)
  1824. );
  1825. BAIL_ON_WIN32_ERROR(dwError);
  1826. error:
  1827. if (hKey) {
  1828. RegCloseKey(hKey);
  1829. }
  1830. return (dwError);
  1831. }
  1832. DWORD
  1833. IsRegvalueExist(
  1834. HKEY hHKLMKey,
  1835. LPWSTR pszKey,
  1836. LPWSTR pszValue,
  1837. BOOL * pbValueExists
  1838. )
  1839. {
  1840. DWORD dwError = 0;
  1841. HKEY hKey = NULL;
  1842. DWORD dwtype = 0;
  1843. BOOL bValueExists = FALSE;
  1844. dwError = RegOpenKeyExW(
  1845. hHKLMKey,
  1846. (LPCWSTR) pszKey,
  1847. 0,
  1848. KEY_ALL_ACCESS,
  1849. &hKey
  1850. );
  1851. if (dwError == ERROR_FILE_NOT_FOUND) {
  1852. // Container key doesn't exist so value doesn't exist anyway...
  1853. //
  1854. dwError = ERROR_SUCCESS;
  1855. bValueExists = FALSE;
  1856. } else {
  1857. BAIL_ON_WIN32_ERROR(dwError);
  1858. dwError = RegQueryValueExW(
  1859. hKey,
  1860. pszValue,
  1861. 0,
  1862. &dwtype,
  1863. NULL,
  1864. NULL
  1865. );
  1866. if (dwError == ERROR_FILE_NOT_FOUND) {
  1867. dwError = ERROR_SUCCESS;
  1868. bValueExists = FALSE;
  1869. } else {
  1870. BAIL_ON_WIN32_ERROR(dwError);
  1871. // ERROR_SUCCESS means registry key found
  1872. //
  1873. bValueExists = TRUE;
  1874. }
  1875. }
  1876. *pbValueExists = bValueExists;
  1877. error:
  1878. if (hKey) {
  1879. RegCloseKey(hKey);
  1880. }
  1881. return dwError;
  1882. }
  1883. DWORD
  1884. IPSecRegDeleteValue(
  1885. HKEY hHKLMKey,
  1886. LPWSTR pszKey,
  1887. LPWSTR pszValue
  1888. )
  1889. {
  1890. HKEY hKey = NULL;
  1891. DWORD dwtype = 0;
  1892. DWORD dwError = 0;
  1893. dwError = RegOpenKeyExW(
  1894. hHKLMKey,
  1895. (LPCWSTR) pszKey,
  1896. 0,
  1897. KEY_ALL_ACCESS,
  1898. &hKey
  1899. );
  1900. BAIL_ON_WIN32_ERROR(dwError);
  1901. dwError = RegDeleteValueW(
  1902. hKey,
  1903. pszValue
  1904. );
  1905. if (dwError == ERROR_FILE_NOT_FOUND) {
  1906. dwError = ERROR_SUCCESS;
  1907. }
  1908. BAIL_ON_WIN32_ERROR(dwError);
  1909. error:
  1910. if (hKey) {
  1911. RegCloseKey(hKey);
  1912. }
  1913. return (dwError);
  1914. }
  1915. DWORD
  1916. IsAnyPolicyAssigned (
  1917. HKEY hHKLMKey,
  1918. BOOL * pbAnyPolicyAssigned
  1919. )
  1920. {
  1921. BOOL bAnyPolicyAssigned = FALSE;
  1922. BOOL bRegPolicyAssigned = FALSE;
  1923. BOOL bPersistentPolicyAssigned = FALSE;
  1924. BOOL bDirectoryPolicyAssigned = FALSE;
  1925. DWORD dwError = ERROR_SUCCESS;
  1926. dwError = IsRegvalueExist(
  1927. hHKLMKey,
  1928. gpszRegLocalContainer,
  1929. gpActivePolicyKey,
  1930. &bRegPolicyAssigned
  1931. );
  1932. BAIL_ON_WIN32_ERROR(dwError);
  1933. if (!bRegPolicyAssigned) {
  1934. dwError = IsRegvalueExist(
  1935. hHKLMKey,
  1936. gpszRegPersistentContainer,
  1937. gpActivePolicyKey,
  1938. &bPersistentPolicyAssigned
  1939. );
  1940. BAIL_ON_WIN32_ERROR(dwError);
  1941. if (!bPersistentPolicyAssigned) {
  1942. dwError = IsRegvalueExist(
  1943. hHKLMKey,
  1944. gpszIPsecDirContainer,
  1945. gpDirectoryPolicyPointerKey,
  1946. &bDirectoryPolicyAssigned
  1947. );
  1948. BAIL_ON_WIN32_ERROR(dwError);
  1949. }
  1950. }
  1951. bAnyPolicyAssigned = bRegPolicyAssigned ||
  1952. bPersistentPolicyAssigned ||
  1953. bDirectoryPolicyAssigned;
  1954. *pbAnyPolicyAssigned = bAnyPolicyAssigned;
  1955. error:
  1956. return dwError;
  1957. }