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.

730 lines
16 KiB

  1. /*++
  2. 1998 Seagate Software, Inc. All rights reserved.
  3. Module Name:
  4. hsmcrit.cpp
  5. Abstract:
  6. This component represents the criteria that can be used to determine
  7. whether a given scanItem should have a policy applied to it.
  8. Author:
  9. Chuck Bardeen [cbardeen] 29-Oct-1996
  10. Revision History:
  11. --*/
  12. #include "resource.h" // main symbols
  13. #include "wsb.h"
  14. #ifndef _HSMCRIT_
  15. #define _HSMCRIT_
  16. // Abstract Classes
  17. /*++
  18. Class Name:
  19. CHsmCriteria
  20. Class Description:
  21. An abstract class that represents the criteria that can be used to determine
  22. whether a given FsaScanItem should have a policy applied to it. These criteria
  23. are based upon properties of an FsaScanItem.
  24. --*/
  25. class CHsmCriteria :
  26. public CWsbObject,
  27. public IHsmCriteria
  28. {
  29. // CComObjectRoot
  30. public:
  31. STDMETHOD(FinalConstruct)(void);
  32. // IPersistStream
  33. public:
  34. STDMETHOD(GetSizeMax)(ULARGE_INTEGER* pSize);
  35. STDMETHOD(Load)(IStream* pStream);
  36. STDMETHOD(Save)(IStream* pStream, BOOL clearDirty);
  37. // IWsbTestable
  38. STDMETHOD(Test)(USHORT *passed, USHORT* failed);
  39. // IHsmCriteria
  40. public:
  41. STDMETHOD(GetName)(OLECHAR** pName, ULONG bufferSize);
  42. STDMETHOD(IsIgnored)(void);
  43. STDMETHOD(IsNegated)(void);
  44. STDMETHOD(SetIsIgnored)(BOOL isIgnored);
  45. STDMETHOD(SetIsNegated)(BOOL isNegated);
  46. protected:
  47. ULONG m_nameId;
  48. BOOL m_isIgnored;
  49. BOOL m_isNegated;
  50. };
  51. /*++
  52. Class Name:
  53. CHsmRelativeCriteria
  54. Class Description:
  55. An abstract class that represents the criteria that compare the properties
  56. of the FsaScanItem to another value (or values) to determine whether the
  57. FsaScanItem matches.
  58. --*/
  59. class CHsmRelativeCriteria :
  60. public CHsmCriteria,
  61. public IHsmRelativeCriteria
  62. {
  63. // CComObjectRoot
  64. public:
  65. STDMETHOD(FinalConstruct)(void);
  66. void FinalRelease(void);
  67. // IPersistStream
  68. public:
  69. STDMETHOD(GetSizeMax)(ULARGE_INTEGER* pSize);
  70. STDMETHOD(Load)(IStream* pStream);
  71. STDMETHOD(Save)(IStream* pStream, BOOL clearDirty);
  72. // IHsmRelativeCriteria
  73. public:
  74. STDMETHOD(ComparatorAsString)(OLECHAR** pComparator, ULONG bufferSize);
  75. STDMETHOD(ComparatorIsBinary)(void);
  76. STDMETHOD(GetArg1)(OLECHAR** pArg, ULONG bufferSize);
  77. STDMETHOD(GetArg2)(OLECHAR** pArg, ULONG bufferSize);
  78. STDMETHOD(GetComparator)(HSM_CRITERIACOMPARATOR* pComparator);
  79. STDMETHOD(SetComparator)(HSM_CRITERIACOMPARATOR comparator);
  80. STDMETHOD(SetArg1)(OLECHAR* arg);
  81. STDMETHOD(SetArg2)(OLECHAR* arg);
  82. protected:
  83. HSM_CRITERIACOMPARATOR m_comparator;
  84. OLECHAR* m_arg1;
  85. OLECHAR* m_arg2;
  86. };
  87. // Concrete Classes : Inheriting from CHsmAction
  88. /*++
  89. Class Name:
  90. CHsmCritAlways
  91. Class Description:
  92. A criteria that matches all FsaScanItems.
  93. --*/
  94. class CHsmCritAlways :
  95. public CHsmCriteria,
  96. public CComCoClass<CHsmCritAlways,&CLSID_CHsmCritAlways>
  97. {
  98. public:
  99. CHsmCritAlways() {}
  100. BEGIN_COM_MAP(CHsmCritAlways)
  101. COM_INTERFACE_ENTRY(IHsmCriteria)
  102. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  103. COM_INTERFACE_ENTRY(IPersistStream)
  104. COM_INTERFACE_ENTRY(IWsbCollectable)
  105. COM_INTERFACE_ENTRY(IWsbTestable)
  106. END_COM_MAP()
  107. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritAlways)
  108. // CComRootObject
  109. public:
  110. STDMETHOD(FinalConstruct)(void);
  111. // IPersist
  112. public:
  113. STDMETHOD(GetClassID)(LPCLSID pClsid);
  114. // IWsbTestable
  115. STDMETHOD(Test)(USHORT *passed, USHORT* failed);
  116. // IHsmCriteria
  117. public:
  118. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  119. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  120. };
  121. /*++
  122. Class Name:
  123. CHsmCritCompressed
  124. Class Description:
  125. A criteria that matches an FsaScanItems that is compressed.
  126. --*/
  127. class CHsmCritCompressed :
  128. public CHsmCriteria,
  129. public CComCoClass<CHsmCritCompressed,&CLSID_CHsmCritCompressed>
  130. {
  131. public:
  132. CHsmCritCompressed() {}
  133. BEGIN_COM_MAP(CHsmCritCompressed)
  134. COM_INTERFACE_ENTRY(IHsmCriteria)
  135. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  136. COM_INTERFACE_ENTRY(IPersistStream)
  137. COM_INTERFACE_ENTRY(IWsbCollectable)
  138. COM_INTERFACE_ENTRY(IWsbTestable)
  139. END_COM_MAP()
  140. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritCompressed)
  141. // CComRootObject
  142. public:
  143. STDMETHOD(FinalConstruct)(void);
  144. // IPersist
  145. public:
  146. STDMETHOD(GetClassID)(LPCLSID pClsid);
  147. // IHsmCriteria
  148. public:
  149. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  150. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  151. };
  152. /*++
  153. Class Name:
  154. CHsmCritLinked
  155. Class Description:
  156. A criteria that matches an FsaScanItem that is a symbolic link or mount
  157. point.
  158. --*/
  159. class CHsmCritLinked :
  160. public CHsmCriteria,
  161. public CComCoClass<CHsmCritLinked,&CLSID_CHsmCritLinked>
  162. {
  163. public:
  164. CHsmCritLinked() {}
  165. BEGIN_COM_MAP(CHsmCritLinked)
  166. COM_INTERFACE_ENTRY(IHsmCriteria)
  167. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  168. COM_INTERFACE_ENTRY(IPersistStream)
  169. COM_INTERFACE_ENTRY(IWsbCollectable)
  170. COM_INTERFACE_ENTRY(IWsbTestable)
  171. END_COM_MAP()
  172. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritLinked)
  173. // CComRootObject
  174. public:
  175. STDMETHOD(FinalConstruct)(void);
  176. // IPersist
  177. public:
  178. STDMETHOD(GetClassID)(LPCLSID pClsid);
  179. // IHsmCriteria
  180. public:
  181. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  182. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  183. };
  184. /*++
  185. Class Name:
  186. CHsmCritMbit
  187. Class Description:
  188. A criteria that matches an FsaScanItem whose mbit (modify bit) is set.
  189. --*/
  190. class CHsmCritMbit :
  191. public CHsmCriteria,
  192. public CComCoClass<CHsmCritMbit,&CLSID_CHsmCritMbit>
  193. {
  194. public:
  195. CHsmCritMbit() {}
  196. BEGIN_COM_MAP(CHsmCritMbit)
  197. COM_INTERFACE_ENTRY(IHsmCriteria)
  198. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  199. COM_INTERFACE_ENTRY(IPersistStream)
  200. COM_INTERFACE_ENTRY(IWsbCollectable)
  201. COM_INTERFACE_ENTRY(IWsbTestable)
  202. END_COM_MAP()
  203. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritMbit)
  204. // CComRootObject
  205. public:
  206. STDMETHOD(FinalConstruct)(void);
  207. // IPersist
  208. public:
  209. STDMETHOD(GetClassID)(LPCLSID pClsid);
  210. // IHsmCriteria
  211. public:
  212. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  213. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  214. };
  215. /*++
  216. Class Name:
  217. CHsmCritManageable
  218. Class Description:
  219. A criteria that matches an FsaScanItem that the Fsa thinks is capable of
  220. migrated.
  221. --*/
  222. class CHsmCritManageable :
  223. public CHsmCriteria,
  224. public CComCoClass<CHsmCritManageable,&CLSID_CHsmCritManageable>
  225. {
  226. public:
  227. CHsmCritManageable() {}
  228. BEGIN_COM_MAP(CHsmCritManageable)
  229. COM_INTERFACE_ENTRY(IHsmCriteria)
  230. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  231. COM_INTERFACE_ENTRY(IPersistStream)
  232. COM_INTERFACE_ENTRY(IWsbCollectable)
  233. COM_INTERFACE_ENTRY(IWsbTestable)
  234. END_COM_MAP()
  235. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritManageable)
  236. // CComRootObject
  237. public:
  238. STDMETHOD(FinalConstruct)(void);
  239. // IPersist
  240. public:
  241. STDMETHOD(GetClassID)(LPCLSID pClsid);
  242. // IHsmCriteria
  243. public:
  244. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  245. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  246. };
  247. /*++
  248. Class Name:
  249. CHsmCritMigrated
  250. Class Description:
  251. A criteria that matches an FsaScanItem that has been migrated.
  252. --*/
  253. class CHsmCritMigrated :
  254. public CHsmCriteria,
  255. public CComCoClass<CHsmCritMigrated,&CLSID_CHsmCritMigrated>
  256. {
  257. public:
  258. CHsmCritMigrated() {}
  259. BEGIN_COM_MAP(CHsmCritMigrated)
  260. COM_INTERFACE_ENTRY(IHsmCriteria)
  261. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  262. COM_INTERFACE_ENTRY(IPersistStream)
  263. COM_INTERFACE_ENTRY(IWsbCollectable)
  264. COM_INTERFACE_ENTRY(IWsbTestable)
  265. END_COM_MAP()
  266. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritMigrated)
  267. // CComRootObject
  268. public:
  269. STDMETHOD(FinalConstruct)(void);
  270. // IPersist
  271. public:
  272. STDMETHOD(GetClassID)(LPCLSID pClsid);
  273. // IHsmCriteria
  274. public:
  275. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  276. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  277. };
  278. /*++
  279. Class Name:
  280. CHsmCritPremigrated
  281. Class Description:
  282. A criteria that matches an FsaScanItem that has been premigrated.
  283. --*/
  284. class CHsmCritPremigrated :
  285. public CHsmCriteria,
  286. public CComCoClass<CHsmCritPremigrated,&CLSID_CHsmCritPremigrated>
  287. {
  288. public:
  289. CHsmCritPremigrated() {}
  290. BEGIN_COM_MAP(CHsmCritPremigrated)
  291. COM_INTERFACE_ENTRY(IHsmCriteria)
  292. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  293. COM_INTERFACE_ENTRY(IPersistStream)
  294. COM_INTERFACE_ENTRY(IWsbCollectable)
  295. COM_INTERFACE_ENTRY(IWsbTestable)
  296. END_COM_MAP()
  297. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritPremigrated)
  298. // CComRootObject
  299. public:
  300. STDMETHOD(FinalConstruct)(void);
  301. // IPersist
  302. public:
  303. STDMETHOD(GetClassID)(LPCLSID pClsid);
  304. // IHsmCriteria
  305. public:
  306. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  307. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  308. };
  309. /*++
  310. Class Name:
  311. CHsmCritAccessTime
  312. Class Description:
  313. A criteria that compares the configured time (either absolute or relative)
  314. to the FsaScanItem's last access time to determine if it matches.
  315. --*/
  316. class CHsmCritAccessTime :
  317. public CHsmRelativeCriteria,
  318. public CComCoClass<CHsmCritAccessTime,&CLSID_CHsmCritAccessTime>
  319. {
  320. public:
  321. CHsmCritAccessTime() {}
  322. BEGIN_COM_MAP(CHsmCritAccessTime)
  323. COM_INTERFACE_ENTRY(IHsmCriteria)
  324. COM_INTERFACE_ENTRY(IHsmRelativeCriteria)
  325. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  326. COM_INTERFACE_ENTRY(IPersistStream)
  327. COM_INTERFACE_ENTRY(IWsbCollectable)
  328. COM_INTERFACE_ENTRY(IWsbTestable)
  329. END_COM_MAP()
  330. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritAccessTime)
  331. // CComRootObject
  332. public:
  333. STDMETHOD(FinalConstruct)(void);
  334. // IPersist
  335. public:
  336. STDMETHOD(GetClassID)(LPCLSID pClsid);
  337. // IHsmCriteria
  338. public:
  339. STDMETHOD(SetArg1)(OLECHAR* arg);
  340. STDMETHOD(SetArg2)(OLECHAR* arg);
  341. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  342. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  343. protected:
  344. BOOL m_isRelative;
  345. FILETIME m_value1;
  346. FILETIME m_value2;
  347. };
  348. /*++
  349. Class Name:
  350. CHsmCritGroup
  351. Class Description:
  352. A criteria that compares the group specified to the group indicated being
  353. the owner of the FsaScanItem.
  354. --*/
  355. class CHsmCritGroup :
  356. public CHsmRelativeCriteria,
  357. public CComCoClass<CHsmCritGroup,&CLSID_CHsmCritGroup>
  358. {
  359. public:
  360. CHsmCritGroup() {}
  361. BEGIN_COM_MAP(CHsmCritGroup)
  362. COM_INTERFACE_ENTRY(IHsmCriteria)
  363. COM_INTERFACE_ENTRY(IHsmRelativeCriteria)
  364. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  365. COM_INTERFACE_ENTRY(IPersistStream)
  366. COM_INTERFACE_ENTRY(IWsbCollectable)
  367. COM_INTERFACE_ENTRY(IWsbTestable)
  368. END_COM_MAP()
  369. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritGroup)
  370. // CComRootObject
  371. public:
  372. STDMETHOD(FinalConstruct)(void);
  373. // IPersist
  374. public:
  375. STDMETHOD(GetClassID)(LPCLSID pClsid);
  376. // IHsmCriteria
  377. public:
  378. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  379. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  380. };
  381. /*++
  382. Class Name:
  383. CHsmCritLogicalSize
  384. Class Description:
  385. A criteria that compares the logical size (uncompressed, not migrated, ...)
  386. of the FsaScanItem to the configured values.
  387. --*/
  388. class CHsmCritLogicalSize :
  389. public CHsmRelativeCriteria,
  390. public CComCoClass<CHsmCritLogicalSize,&CLSID_CHsmCritLogicalSize>
  391. {
  392. public:
  393. CHsmCritLogicalSize() {}
  394. BEGIN_COM_MAP(CHsmCritLogicalSize)
  395. COM_INTERFACE_ENTRY(IHsmCriteria)
  396. COM_INTERFACE_ENTRY(IHsmRelativeCriteria)
  397. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  398. COM_INTERFACE_ENTRY(IPersistStream)
  399. COM_INTERFACE_ENTRY(IWsbCollectable)
  400. COM_INTERFACE_ENTRY(IWsbTestable)
  401. END_COM_MAP()
  402. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritLogicalSize)
  403. // CComRootObject
  404. public:
  405. STDMETHOD(FinalConstruct)(void);
  406. // IPersist
  407. public:
  408. STDMETHOD(GetClassID)(LPCLSID pClsid);
  409. // IHsmCriteria
  410. public:
  411. STDMETHOD(SetArg1)(OLECHAR* arg);
  412. STDMETHOD(SetArg2)(OLECHAR* arg);
  413. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  414. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  415. protected:
  416. LONGLONG m_value1;
  417. LONGLONG m_value2;
  418. };
  419. /*++
  420. Class Name:
  421. CHsmCritModifyTime
  422. Class Description:
  423. A criteria that compares the configured time (either absolute or relative)
  424. to the FsaScanItem's last modification time to determine if it matches.
  425. --*/
  426. // Class: CHsmCritModifyTime
  427. class CHsmCritModifyTime :
  428. public CHsmRelativeCriteria,
  429. public CComCoClass<CHsmCritModifyTime,&CLSID_CHsmCritModifyTime>
  430. {
  431. public:
  432. CHsmCritModifyTime() {}
  433. BEGIN_COM_MAP(CHsmCritModifyTime)
  434. COM_INTERFACE_ENTRY(IHsmCriteria)
  435. COM_INTERFACE_ENTRY(IHsmRelativeCriteria)
  436. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  437. COM_INTERFACE_ENTRY(IPersistStream)
  438. COM_INTERFACE_ENTRY(IWsbCollectable)
  439. COM_INTERFACE_ENTRY(IWsbTestable)
  440. END_COM_MAP()
  441. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritModifyTime)
  442. // CComRootObject
  443. public:
  444. STDMETHOD(FinalConstruct)(void);
  445. // IPersist
  446. public:
  447. STDMETHOD(GetClassID)(LPCLSID pClsid);
  448. // IHsmCriteria
  449. public:
  450. STDMETHOD(SetArg1)(OLECHAR* arg);
  451. STDMETHOD(SetArg2)(OLECHAR* arg);
  452. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  453. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  454. protected:
  455. BOOL m_isRelative;
  456. FILETIME m_value1;
  457. FILETIME m_value2;
  458. };
  459. /*++
  460. Class Name:
  461. CHsmCritOwner
  462. Class Description:
  463. A criteria that compares the owner specified to the owner of the FsaScanItem.
  464. --*/
  465. class CHsmCritOwner :
  466. public CHsmRelativeCriteria,
  467. public CComCoClass<CHsmCritOwner,&CLSID_CHsmCritOwner>
  468. {
  469. public:
  470. CHsmCritOwner() {}
  471. BEGIN_COM_MAP(CHsmCritOwner)
  472. COM_INTERFACE_ENTRY(IHsmCriteria)
  473. COM_INTERFACE_ENTRY(IHsmRelativeCriteria)
  474. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  475. COM_INTERFACE_ENTRY(IPersistStream)
  476. COM_INTERFACE_ENTRY(IWsbCollectable)
  477. COM_INTERFACE_ENTRY(IWsbTestable)
  478. END_COM_MAP()
  479. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritOwner)
  480. // CComRootObject
  481. public:
  482. STDMETHOD(FinalConstruct)(void);
  483. // IPersist
  484. public:
  485. STDMETHOD(GetClassID)(LPCLSID pClsid);
  486. // IHsmCriteria
  487. public:
  488. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  489. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  490. };
  491. /*++
  492. Class Name:
  493. CHsmCritPhysicalSize
  494. Class Description:
  495. A criteria that compares the physical size (compressed, migrated, ...)
  496. of the FsaScanItem to the configured values.
  497. --*/
  498. class CHsmCritPhysicalSize :
  499. public CHsmRelativeCriteria,
  500. public CComCoClass<CHsmCritPhysicalSize,&CLSID_CHsmCritPhysicalSize>
  501. {
  502. public:
  503. CHsmCritPhysicalSize() {}
  504. BEGIN_COM_MAP(CHsmCritPhysicalSize)
  505. COM_INTERFACE_ENTRY(IHsmCriteria)
  506. COM_INTERFACE_ENTRY(IHsmRelativeCriteria)
  507. COM_INTERFACE_ENTRY2(IPersist, IPersistStream)
  508. COM_INTERFACE_ENTRY(IPersistStream)
  509. COM_INTERFACE_ENTRY(IWsbCollectable)
  510. COM_INTERFACE_ENTRY(IWsbTestable)
  511. END_COM_MAP()
  512. DECLARE_REGISTRY_RESOURCEID(IDR_CHsmCritPhysicalSize)
  513. // CComRootObject
  514. public:
  515. STDMETHOD(FinalConstruct)(void);
  516. // IPersist
  517. public:
  518. STDMETHOD(GetClassID)(LPCLSID pClsid);
  519. // IHsmCriteria
  520. public:
  521. STDMETHOD(SetArg1)(OLECHAR* arg);
  522. STDMETHOD(SetArg2)(OLECHAR* arg);
  523. STDMETHOD(ShouldDo)(IFsaScanItem* pScanItem, USHORT scale);
  524. STDMETHOD(Value)(IFsaScanItem* pScanItem, OLECHAR** pName, ULONG bufferSize);
  525. protected:
  526. LONGLONG m_value1;
  527. LONGLONG m_value2;
  528. };
  529. #endif // _HSMCRIT_