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.

660 lines
18 KiB

  1. /*++ BUILD Version: 0001 // Increment this if a change has global effects
  2. Copyright (c) 1993-1999, Microsoft Corporation
  3. Module Name:
  4. aclapi.h
  5. Abstract:
  6. Public
  7. Structure/constant definitions and typedefines for the Win32 Access
  8. Control APIs
  9. --*/
  10. #ifndef __ACCESS_CONTROL_API__
  11. #define __ACCESS_CONTROL_API__
  12. #include <windows.h>
  13. #include <accctrl.h>
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. //
  18. // Progress Function:
  19. // Caller of tree operation implements this Progress function, then
  20. // passes its function pointer to tree operation.
  21. // Tree operation invokes Progress function to provide progress and error
  22. // information to the caller during the potentially long execution
  23. // of the tree operation. Tree operation provides the name of the object
  24. // last processed and the error status of the operation on that object.
  25. // Tree operation also passes the current InvokeSetting value.
  26. // Caller may change the InvokeSetting value, for example, from "Always"
  27. // to "Only On Error."
  28. //
  29. typedef VOID (*FN_PROGRESS) (
  30. IN LPWSTR pObjectName, // name of object just processed
  31. IN DWORD Status, // status of operation on object
  32. IN OUT PPROG_INVOKE_SETTING pInvokeSetting, // Never, always,
  33. IN PVOID Args, // Caller specific data
  34. IN BOOL SecuritySet // Whether security was set
  35. );
  36. WINADVAPI
  37. DWORD
  38. WINAPI
  39. SetEntriesInAclA(
  40. IN ULONG cCountOfExplicitEntries,
  41. IN PEXPLICIT_ACCESS_A pListOfExplicitEntries,
  42. IN PACL OldAcl,
  43. OUT PACL * NewAcl
  44. );
  45. WINADVAPI
  46. DWORD
  47. WINAPI
  48. SetEntriesInAclW(
  49. IN ULONG cCountOfExplicitEntries,
  50. IN PEXPLICIT_ACCESS_W pListOfExplicitEntries,
  51. IN PACL OldAcl,
  52. OUT PACL * NewAcl
  53. );
  54. #ifdef UNICODE
  55. #define SetEntriesInAcl SetEntriesInAclW
  56. #else
  57. #define SetEntriesInAcl SetEntriesInAclA
  58. #endif // !UNICODE
  59. WINADVAPI
  60. DWORD
  61. WINAPI
  62. GetExplicitEntriesFromAclA(
  63. IN PACL pacl,
  64. OUT PULONG pcCountOfExplicitEntries,
  65. OUT PEXPLICIT_ACCESS_A * pListOfExplicitEntries
  66. );
  67. WINADVAPI
  68. DWORD
  69. WINAPI
  70. GetExplicitEntriesFromAclW(
  71. IN PACL pacl,
  72. OUT PULONG pcCountOfExplicitEntries,
  73. OUT PEXPLICIT_ACCESS_W * pListOfExplicitEntries
  74. );
  75. #ifdef UNICODE
  76. #define GetExplicitEntriesFromAcl GetExplicitEntriesFromAclW
  77. #else
  78. #define GetExplicitEntriesFromAcl GetExplicitEntriesFromAclA
  79. #endif // !UNICODE
  80. WINADVAPI
  81. DWORD
  82. WINAPI
  83. GetEffectiveRightsFromAclA(
  84. IN PACL pacl,
  85. IN PTRUSTEE_A pTrustee,
  86. OUT PACCESS_MASK pAccessRights
  87. );
  88. WINADVAPI
  89. DWORD
  90. WINAPI
  91. GetEffectiveRightsFromAclW(
  92. IN PACL pacl,
  93. IN PTRUSTEE_W pTrustee,
  94. OUT PACCESS_MASK pAccessRights
  95. );
  96. #ifdef UNICODE
  97. #define GetEffectiveRightsFromAcl GetEffectiveRightsFromAclW
  98. #else
  99. #define GetEffectiveRightsFromAcl GetEffectiveRightsFromAclA
  100. #endif // !UNICODE
  101. WINADVAPI
  102. DWORD
  103. WINAPI
  104. GetAuditedPermissionsFromAclA(
  105. IN PACL pacl,
  106. IN PTRUSTEE_A pTrustee,
  107. OUT PACCESS_MASK pSuccessfulAuditedRights,
  108. OUT PACCESS_MASK pFailedAuditRights
  109. );
  110. WINADVAPI
  111. DWORD
  112. WINAPI
  113. GetAuditedPermissionsFromAclW(
  114. IN PACL pacl,
  115. IN PTRUSTEE_W pTrustee,
  116. OUT PACCESS_MASK pSuccessfulAuditedRights,
  117. OUT PACCESS_MASK pFailedAuditRights
  118. );
  119. #ifdef UNICODE
  120. #define GetAuditedPermissionsFromAcl GetAuditedPermissionsFromAclW
  121. #else
  122. #define GetAuditedPermissionsFromAcl GetAuditedPermissionsFromAclA
  123. #endif // !UNICODE
  124. WINADVAPI
  125. DWORD
  126. WINAPI
  127. GetNamedSecurityInfoA(
  128. IN LPSTR pObjectName,
  129. IN SE_OBJECT_TYPE ObjectType,
  130. IN SECURITY_INFORMATION SecurityInfo,
  131. OUT PSID * ppsidOwner,
  132. OUT PSID * ppsidGroup,
  133. OUT PACL * ppDacl,
  134. OUT PACL * ppSacl,
  135. OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor
  136. );
  137. WINADVAPI
  138. DWORD
  139. WINAPI
  140. GetNamedSecurityInfoW(
  141. IN LPWSTR pObjectName,
  142. IN SE_OBJECT_TYPE ObjectType,
  143. IN SECURITY_INFORMATION SecurityInfo,
  144. OUT PSID * ppsidOwner,
  145. OUT PSID * ppsidGroup,
  146. OUT PACL * ppDacl,
  147. OUT PACL * ppSacl,
  148. OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor
  149. );
  150. #ifdef UNICODE
  151. #define GetNamedSecurityInfo GetNamedSecurityInfoW
  152. #else
  153. #define GetNamedSecurityInfo GetNamedSecurityInfoA
  154. #endif // !UNICODE
  155. WINADVAPI
  156. DWORD
  157. WINAPI
  158. GetSecurityInfo(
  159. IN HANDLE handle,
  160. IN SE_OBJECT_TYPE ObjectType,
  161. IN SECURITY_INFORMATION SecurityInfo,
  162. OUT PSID * ppsidOwner,
  163. OUT PSID * ppsidGroup,
  164. OUT PACL * ppDacl,
  165. OUT PACL * ppSacl,
  166. OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor
  167. );
  168. WINADVAPI
  169. DWORD
  170. WINAPI
  171. SetNamedSecurityInfoA(
  172. IN LPSTR pObjectName,
  173. IN SE_OBJECT_TYPE ObjectType,
  174. IN SECURITY_INFORMATION SecurityInfo,
  175. IN PSID psidOwner,
  176. IN PSID psidGroup,
  177. IN PACL pDacl,
  178. IN PACL pSacl
  179. );
  180. WINADVAPI
  181. DWORD
  182. WINAPI
  183. SetNamedSecurityInfoW(
  184. IN LPWSTR pObjectName,
  185. IN SE_OBJECT_TYPE ObjectType,
  186. IN SECURITY_INFORMATION SecurityInfo,
  187. IN PSID psidOwner,
  188. IN PSID psidGroup,
  189. IN PACL pDacl,
  190. IN PACL pSacl
  191. );
  192. #ifdef UNICODE
  193. #define SetNamedSecurityInfo SetNamedSecurityInfoW
  194. #else
  195. #define SetNamedSecurityInfo SetNamedSecurityInfoA
  196. #endif // !UNICODE
  197. WINADVAPI
  198. DWORD
  199. WINAPI
  200. SetSecurityInfo(
  201. IN HANDLE handle,
  202. IN SE_OBJECT_TYPE ObjectType,
  203. IN SECURITY_INFORMATION SecurityInfo,
  204. IN PSID psidOwner,
  205. IN PSID psidGroup,
  206. IN PACL pDacl,
  207. IN PACL pSacl
  208. );
  209. WINADVAPI
  210. DWORD
  211. WINAPI
  212. GetInheritanceSourceA(
  213. IN LPSTR pObjectName,
  214. IN SE_OBJECT_TYPE ObjectType,
  215. IN SECURITY_INFORMATION SecurityInfo,
  216. IN BOOL Container,
  217. IN GUID ** pObjectClassGuids OPTIONAL,
  218. IN DWORD GuidCount,
  219. IN PACL pAcl,
  220. IN PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL,
  221. IN PGENERIC_MAPPING pGenericMapping,
  222. OUT PINHERITED_FROMA pInheritArray
  223. );
  224. WINADVAPI
  225. DWORD
  226. WINAPI
  227. GetInheritanceSourceW(
  228. IN LPWSTR pObjectName,
  229. IN SE_OBJECT_TYPE ObjectType,
  230. IN SECURITY_INFORMATION SecurityInfo,
  231. IN BOOL Container,
  232. IN GUID ** pObjectClassGuids OPTIONAL,
  233. IN DWORD GuidCount,
  234. IN PACL pAcl,
  235. IN PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL,
  236. IN PGENERIC_MAPPING pGenericMapping,
  237. OUT PINHERITED_FROMW pInheritArray
  238. );
  239. #ifdef UNICODE
  240. #define GetInheritanceSource GetInheritanceSourceW
  241. #else
  242. #define GetInheritanceSource GetInheritanceSourceA
  243. #endif // !UNICODE
  244. WINADVAPI
  245. DWORD
  246. WINAPI
  247. FreeInheritedFromArray(
  248. IN PINHERITED_FROMW pInheritArray,
  249. IN USHORT AceCnt,
  250. IN PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL
  251. );
  252. WINADVAPI
  253. DWORD
  254. WINAPI
  255. TreeResetNamedSecurityInfoA(
  256. IN LPSTR pObjectName,
  257. IN SE_OBJECT_TYPE ObjectType,
  258. IN SECURITY_INFORMATION SecurityInfo,
  259. IN PSID pOwner,
  260. IN PSID pGroup,
  261. IN PACL pDacl,
  262. IN PACL pSacl,
  263. IN BOOL KeepExplicit,
  264. IN FN_PROGRESS fnProgress,
  265. IN PROG_INVOKE_SETTING ProgressInvokeSetting,
  266. IN PVOID Args
  267. );
  268. WINADVAPI
  269. DWORD
  270. WINAPI
  271. TreeResetNamedSecurityInfoW(
  272. IN LPWSTR pObjectName,
  273. IN SE_OBJECT_TYPE ObjectType,
  274. IN SECURITY_INFORMATION SecurityInfo,
  275. IN PSID pOwner,
  276. IN PSID pGroup,
  277. IN PACL pDacl,
  278. IN PACL pSacl,
  279. IN BOOL KeepExplicit,
  280. IN FN_PROGRESS fnProgress,
  281. IN PROG_INVOKE_SETTING ProgressInvokeSetting,
  282. IN PVOID Args
  283. );
  284. #ifdef UNICODE
  285. #define TreeResetNamedSecurityInfo TreeResetNamedSecurityInfoW
  286. #else
  287. #define TreeResetNamedSecurityInfo TreeResetNamedSecurityInfoA
  288. #endif // !UNICODE
  289. //----------------------------------------------------------------------------
  290. // The following API are provided for trusted servers to use to
  291. // implement access control on their own objects.
  292. //----------------------------------------------------------------------------
  293. WINADVAPI
  294. DWORD
  295. WINAPI
  296. BuildSecurityDescriptorA(
  297. IN PTRUSTEE_A pOwner,
  298. IN PTRUSTEE_A pGroup,
  299. IN ULONG cCountOfAccessEntries,
  300. IN PEXPLICIT_ACCESS_A pListOfAccessEntries,
  301. IN ULONG cCountOfAuditEntries,
  302. IN PEXPLICIT_ACCESS_A pListOfAuditEntries,
  303. IN PSECURITY_DESCRIPTOR pOldSD,
  304. OUT PULONG pSizeNewSD,
  305. OUT PSECURITY_DESCRIPTOR * pNewSD
  306. );
  307. WINADVAPI
  308. DWORD
  309. WINAPI
  310. BuildSecurityDescriptorW(
  311. IN PTRUSTEE_W pOwner,
  312. IN PTRUSTEE_W pGroup,
  313. IN ULONG cCountOfAccessEntries,
  314. IN PEXPLICIT_ACCESS_W pListOfAccessEntries,
  315. IN ULONG cCountOfAuditEntries,
  316. IN PEXPLICIT_ACCESS_W pListOfAuditEntries,
  317. IN PSECURITY_DESCRIPTOR pOldSD,
  318. OUT PULONG pSizeNewSD,
  319. OUT PSECURITY_DESCRIPTOR * pNewSD
  320. );
  321. #ifdef UNICODE
  322. #define BuildSecurityDescriptor BuildSecurityDescriptorW
  323. #else
  324. #define BuildSecurityDescriptor BuildSecurityDescriptorA
  325. #endif // !UNICODE
  326. WINADVAPI
  327. DWORD
  328. WINAPI
  329. LookupSecurityDescriptorPartsA(
  330. OUT PTRUSTEE_A * pOwner,
  331. OUT PTRUSTEE_A * pGroup,
  332. OUT PULONG cCountOfAccessEntries,
  333. OUT PEXPLICIT_ACCESS_A * pListOfAccessEntries,
  334. OUT PULONG cCountOfAuditEntries,
  335. OUT PEXPLICIT_ACCESS_A * pListOfAuditEntries,
  336. IN PSECURITY_DESCRIPTOR pSD
  337. );
  338. WINADVAPI
  339. DWORD
  340. WINAPI
  341. LookupSecurityDescriptorPartsW(
  342. OUT PTRUSTEE_W * pOwner,
  343. OUT PTRUSTEE_W * pGroup,
  344. OUT PULONG cCountOfAccessEntries,
  345. OUT PEXPLICIT_ACCESS_W * pListOfAccessEntries,
  346. OUT PULONG cCountOfAuditEntries,
  347. OUT PEXPLICIT_ACCESS_W * pListOfAuditEntries,
  348. IN PSECURITY_DESCRIPTOR pSD
  349. );
  350. #ifdef UNICODE
  351. #define LookupSecurityDescriptorParts LookupSecurityDescriptorPartsW
  352. #else
  353. #define LookupSecurityDescriptorParts LookupSecurityDescriptorPartsA
  354. #endif // !UNICODE
  355. //----------------------------------------------------------------------------
  356. // The following helper API are provided for building
  357. // access control structures.
  358. //----------------------------------------------------------------------------
  359. WINADVAPI
  360. VOID
  361. WINAPI
  362. BuildExplicitAccessWithNameA(
  363. IN OUT PEXPLICIT_ACCESS_A pExplicitAccess,
  364. IN LPSTR pTrusteeName,
  365. IN DWORD AccessPermissions,
  366. IN ACCESS_MODE AccessMode,
  367. IN DWORD Inheritance
  368. );
  369. WINADVAPI
  370. VOID
  371. WINAPI
  372. BuildExplicitAccessWithNameW(
  373. IN OUT PEXPLICIT_ACCESS_W pExplicitAccess,
  374. IN LPWSTR pTrusteeName,
  375. IN DWORD AccessPermissions,
  376. IN ACCESS_MODE AccessMode,
  377. IN DWORD Inheritance
  378. );
  379. #ifdef UNICODE
  380. #define BuildExplicitAccessWithName BuildExplicitAccessWithNameW
  381. #else
  382. #define BuildExplicitAccessWithName BuildExplicitAccessWithNameA
  383. #endif // !UNICODE
  384. WINADVAPI
  385. VOID
  386. WINAPI
  387. BuildImpersonateExplicitAccessWithNameA(
  388. IN OUT PEXPLICIT_ACCESS_A pExplicitAccess,
  389. IN LPSTR pTrusteeName,
  390. IN PTRUSTEE_A pTrustee,
  391. IN DWORD AccessPermissions,
  392. IN ACCESS_MODE AccessMode,
  393. IN DWORD Inheritance
  394. );
  395. WINADVAPI
  396. VOID
  397. WINAPI
  398. BuildImpersonateExplicitAccessWithNameW(
  399. IN OUT PEXPLICIT_ACCESS_W pExplicitAccess,
  400. IN LPWSTR pTrusteeName,
  401. IN PTRUSTEE_W pTrustee,
  402. IN DWORD AccessPermissions,
  403. IN ACCESS_MODE AccessMode,
  404. IN DWORD Inheritance
  405. );
  406. #ifdef UNICODE
  407. #define BuildImpersonateExplicitAccessWithName BuildImpersonateExplicitAccessWithNameW
  408. #else
  409. #define BuildImpersonateExplicitAccessWithName BuildImpersonateExplicitAccessWithNameA
  410. #endif // !UNICODE
  411. WINADVAPI
  412. VOID
  413. WINAPI
  414. BuildTrusteeWithNameA(
  415. IN OUT PTRUSTEE_A pTrustee,
  416. IN LPSTR pName
  417. );
  418. WINADVAPI
  419. VOID
  420. WINAPI
  421. BuildTrusteeWithNameW(
  422. IN OUT PTRUSTEE_W pTrustee,
  423. IN LPWSTR pName
  424. );
  425. #ifdef UNICODE
  426. #define BuildTrusteeWithName BuildTrusteeWithNameW
  427. #else
  428. #define BuildTrusteeWithName BuildTrusteeWithNameA
  429. #endif // !UNICODE
  430. WINADVAPI
  431. VOID
  432. WINAPI
  433. BuildImpersonateTrusteeA(
  434. IN OUT PTRUSTEE_A pTrustee,
  435. IN PTRUSTEE_A pImpersonateTrustee
  436. );
  437. WINADVAPI
  438. VOID
  439. WINAPI
  440. BuildImpersonateTrusteeW(
  441. IN OUT PTRUSTEE_W pTrustee,
  442. IN PTRUSTEE_W pImpersonateTrustee
  443. );
  444. #ifdef UNICODE
  445. #define BuildImpersonateTrustee BuildImpersonateTrusteeW
  446. #else
  447. #define BuildImpersonateTrustee BuildImpersonateTrusteeA
  448. #endif // !UNICODE
  449. WINADVAPI
  450. VOID
  451. WINAPI
  452. BuildTrusteeWithSidA(
  453. IN OUT PTRUSTEE_A pTrustee,
  454. IN PSID pSid
  455. );
  456. WINADVAPI
  457. VOID
  458. WINAPI
  459. BuildTrusteeWithSidW(
  460. IN OUT PTRUSTEE_W pTrustee,
  461. IN PSID pSid
  462. );
  463. #ifdef UNICODE
  464. #define BuildTrusteeWithSid BuildTrusteeWithSidW
  465. #else
  466. #define BuildTrusteeWithSid BuildTrusteeWithSidA
  467. #endif // !UNICODE
  468. WINADVAPI
  469. VOID
  470. WINAPI
  471. BuildTrusteeWithObjectsAndSidA(
  472. IN OUT PTRUSTEE_A pTrustee,
  473. IN POBJECTS_AND_SID pObjSid,
  474. IN GUID * pObjectGuid,
  475. IN GUID * pInheritedObjectGuid,
  476. IN PSID pSid
  477. );
  478. WINADVAPI
  479. VOID
  480. WINAPI
  481. BuildTrusteeWithObjectsAndSidW(
  482. IN OUT PTRUSTEE_W pTrustee,
  483. IN POBJECTS_AND_SID pObjSid,
  484. IN GUID * pObjectGuid,
  485. IN GUID * pInheritedObjectGuid,
  486. IN PSID pSid
  487. );
  488. #ifdef UNICODE
  489. #define BuildTrusteeWithObjectsAndSid BuildTrusteeWithObjectsAndSidW
  490. #else
  491. #define BuildTrusteeWithObjectsAndSid BuildTrusteeWithObjectsAndSidA
  492. #endif // !UNICODE
  493. WINADVAPI
  494. VOID
  495. WINAPI
  496. BuildTrusteeWithObjectsAndNameA(
  497. IN OUT PTRUSTEE_A pTrustee,
  498. IN POBJECTS_AND_NAME_A pObjName,
  499. IN SE_OBJECT_TYPE ObjectType,
  500. IN LPSTR ObjectTypeName,
  501. IN LPSTR InheritedObjectTypeName,
  502. IN LPSTR Name
  503. );
  504. WINADVAPI
  505. VOID
  506. WINAPI
  507. BuildTrusteeWithObjectsAndNameW(
  508. IN OUT PTRUSTEE_W pTrustee,
  509. IN POBJECTS_AND_NAME_W pObjName,
  510. IN SE_OBJECT_TYPE ObjectType,
  511. IN LPWSTR ObjectTypeName,
  512. IN LPWSTR InheritedObjectTypeName,
  513. IN LPWSTR Name
  514. );
  515. #ifdef UNICODE
  516. #define BuildTrusteeWithObjectsAndName BuildTrusteeWithObjectsAndNameW
  517. #else
  518. #define BuildTrusteeWithObjectsAndName BuildTrusteeWithObjectsAndNameA
  519. #endif // !UNICODE
  520. WINADVAPI
  521. LPSTR
  522. WINAPI
  523. GetTrusteeNameA(
  524. IN PTRUSTEE_A pTrustee
  525. );
  526. WINADVAPI
  527. LPWSTR
  528. WINAPI
  529. GetTrusteeNameW(
  530. IN PTRUSTEE_W pTrustee
  531. );
  532. #ifdef UNICODE
  533. #define GetTrusteeName GetTrusteeNameW
  534. #else
  535. #define GetTrusteeName GetTrusteeNameA
  536. #endif // !UNICODE
  537. WINADVAPI
  538. TRUSTEE_TYPE
  539. WINAPI
  540. GetTrusteeTypeA(
  541. IN PTRUSTEE_A pTrustee
  542. );
  543. WINADVAPI
  544. TRUSTEE_TYPE
  545. WINAPI
  546. GetTrusteeTypeW(
  547. IN PTRUSTEE_W pTrustee
  548. );
  549. #ifdef UNICODE
  550. #define GetTrusteeType GetTrusteeTypeW
  551. #else
  552. #define GetTrusteeType GetTrusteeTypeA
  553. #endif // !UNICODE
  554. WINADVAPI
  555. TRUSTEE_FORM
  556. WINAPI
  557. GetTrusteeFormA(
  558. IN PTRUSTEE_A pTrustee
  559. );
  560. WINADVAPI
  561. TRUSTEE_FORM
  562. WINAPI
  563. GetTrusteeFormW(
  564. IN PTRUSTEE_W pTrustee
  565. );
  566. #ifdef UNICODE
  567. #define GetTrusteeForm GetTrusteeFormW
  568. #else
  569. #define GetTrusteeForm GetTrusteeFormA
  570. #endif // !UNICODE
  571. WINADVAPI
  572. MULTIPLE_TRUSTEE_OPERATION
  573. WINAPI
  574. GetMultipleTrusteeOperationA(
  575. IN PTRUSTEE_A pTrustee
  576. );
  577. WINADVAPI
  578. MULTIPLE_TRUSTEE_OPERATION
  579. WINAPI
  580. GetMultipleTrusteeOperationW(
  581. IN PTRUSTEE_W pTrustee
  582. );
  583. #ifdef UNICODE
  584. #define GetMultipleTrusteeOperation GetMultipleTrusteeOperationW
  585. #else
  586. #define GetMultipleTrusteeOperation GetMultipleTrusteeOperationA
  587. #endif // !UNICODE
  588. WINADVAPI
  589. PTRUSTEE_A
  590. WINAPI
  591. GetMultipleTrusteeA(
  592. IN PTRUSTEE_A pTrustee
  593. );
  594. WINADVAPI
  595. PTRUSTEE_W
  596. WINAPI
  597. GetMultipleTrusteeW(
  598. IN PTRUSTEE_W pTrustee
  599. );
  600. #ifdef UNICODE
  601. #define GetMultipleTrustee GetMultipleTrusteeW
  602. #else
  603. #define GetMultipleTrustee GetMultipleTrusteeA
  604. #endif // !UNICODE
  605. //
  606. // Temporary requirement for the technology preview, no longer required
  607. //
  608. #define AccProvInit(err)
  609. #ifdef __cplusplus
  610. }
  611. #endif
  612. #endif // __ACCESS_CONTROL_API__