Source code of Windows XP (NT5)
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.

742 lines
22 KiB

  1. //+-------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1996.
  5. //
  6. // File: MARTAEXP.HXX
  7. //
  8. // Contents: Function definitions for exported helper functions
  9. //
  10. // History: 06-Sep-96 MacM Created
  11. //
  12. //--------------------------------------------------------------------
  13. #ifndef __MARTAEXP_HXX__
  14. #define __MARTAEXP_HXX__
  15. extern "C"
  16. {
  17. #include <nt.h>
  18. #include <ntrtl.h>
  19. #include <nturtl.h>
  20. }
  21. typedef enum _MARTA_KERNEL_TYPE
  22. {
  23. MARTA_UNKNOWN = 0,
  24. MARTA_EVENT,
  25. MARTA_EVENT_PAIR,
  26. MARTA_MUTANT,
  27. MARTA_PROCESS,
  28. MARTA_SECTION,
  29. MARTA_SEMAPHORE,
  30. MARTA_SYMBOLIC_LINK,
  31. MARTA_THREAD,
  32. MARTA_TIMER,
  33. MARTA_JOB,
  34. MARTA_WMI_GUID
  35. } MARTA_KERNEL_TYPE, *PMARTA_KERNEL_TYPE;
  36. //
  37. // Determines whether a bit flag is turned on or not
  38. //
  39. #define FLAG_ON(flags,bit) ((flags) & (bit))
  40. //
  41. // This macro will return the size, in bytes, of a buffer needed to hold
  42. // the given string
  43. //
  44. #define SIZE_PWSTR(wsz) (wsz == NULL ? 0 : (wcslen(wsz) + 1) * sizeof(WCHAR))
  45. //
  46. // This macro will copy the specified string to the new destination, after
  47. // allocating a buffer of sufficient size
  48. //
  49. #define ACC_ALLOC_AND_COPY_STRINGW(OldString, NewString, err) \
  50. NewString = (PWSTR)AccAlloc(SIZE_PWSTR(OldString)); \
  51. if(NewString == NULL) \
  52. { \
  53. err = ERROR_NOT_ENOUGH_MEMORY; \
  54. } \
  55. else \
  56. { \
  57. wcscpy((PWSTR)NewString, \
  58. OldString); \
  59. }
  60. //
  61. // Flags to pass in to AccConvertAccessToSD
  62. //
  63. #define ACCCONVERT_SELF_RELATIVE 0x00000001
  64. #define ACCCONVERT_DS_FORMAT 0x00000002
  65. //+-------------------------------------------------------------------------
  66. // helper.cxx
  67. //+-------------------------------------------------------------------------
  68. ULONG
  69. TrusteeAllocationSize(IN PTRUSTEE_W pTrustee);
  70. ULONG
  71. TrusteeAllocationSizeWToA(IN PTRUSTEE_W pTrustee);
  72. ULONG
  73. TrusteeAllocationSizeAToW(IN PTRUSTEE_A pTrustee);
  74. VOID
  75. SpecialCopyTrustee(VOID **pStuffPtr, PTRUSTEE pToTrustee, PTRUSTEE pFromTrustee);
  76. DWORD
  77. CopyTrusteeAToTrusteeW( IN OUT VOID ** ppStuffPtr,
  78. IN PTRUSTEE_A pFromTrusteeA,
  79. OUT PTRUSTEE_W pToTrusteeW );
  80. DWORD
  81. CopyTrusteeWToTrusteeA( IN OUT VOID ** ppStuffPtr,
  82. IN PTRUSTEE_W pFromTrusteeW,
  83. OUT PTRUSTEE_A pToTrusteeA );
  84. DWORD
  85. ExplicitAccessAToExplicitAccessW( IN ULONG cCountAccesses,
  86. IN PEXPLICIT_ACCESS_A paAccess,
  87. OUT PEXPLICIT_ACCESS_W * ppwAccess );
  88. DWORD
  89. ExplicitAccessWToExplicitAccessA( IN ULONG cCountAccesses,
  90. IN PEXPLICIT_ACCESS_W pwAccess,
  91. OUT PEXPLICIT_ACCESS_A * ppaAccess );
  92. DWORD
  93. DoTrusteesMatch(PWSTR pwszServer,
  94. PTRUSTEE pTrustee1,
  95. PTRUSTEE pTrustee2,
  96. PBOOL pfMatch);
  97. //+-------------------------------------------------------------------------
  98. // aclutil.cxx
  99. //+-------------------------------------------------------------------------
  100. extern "C"
  101. {
  102. DWORD
  103. AccGetSidFromToken(PWSTR pwszServer,
  104. HANDLE hToken,
  105. TOKEN_INFORMATION_CLASS TIC,
  106. PSID *ppSidFromToken);
  107. DWORD
  108. AccLookupAccountSid(IN PWSTR pwszServer,
  109. IN PTRUSTEE pName,
  110. OUT PSID *ppsid,
  111. OUT SID_NAME_USE *pSidType);
  112. DWORD
  113. AccLookupAccountTrustee(IN PWSTR pwszServer,
  114. IN PSID psid,
  115. OUT PTRUSTEE *ppTrustee);
  116. DWORD
  117. AccLookupAccountName(IN PWSTR pwszServer,
  118. IN PSID pSid,
  119. OUT LPWSTR *ppwszName,
  120. OUT LPWSTR *ppwszDomain,
  121. OUT SID_NAME_USE *pSidType);
  122. DWORD
  123. AccSetEntriesInAList(IN ULONG cEntries,
  124. IN PACTRL_ACCESS_ENTRYW pAccessEntryList,
  125. IN ACCESS_MODE AccessMode,
  126. IN SECURITY_INFORMATION SeInfo,
  127. IN LPCWSTR lpProperty,
  128. IN BOOL fDoOldStyleMerge,
  129. IN PACTRL_AUDITW pOldList,
  130. OUT PACTRL_AUDITW *ppNewList);
  131. DWORD
  132. AccConvertAccessToSecurityDescriptor(IN PACTRL_ACCESSW pAccessList,
  133. IN PACTRL_AUDITW pAuditList,
  134. IN LPCWSTR lpOwner,
  135. IN LPCWSTR lpGroup,
  136. OUT PSECURITY_DESCRIPTOR *ppSecDescriptor);
  137. DWORD
  138. AccConvertSDToAccess(IN SE_OBJECT_TYPE ObjectType,
  139. IN PSECURITY_DESCRIPTOR pSecDescriptor,
  140. OUT PACTRL_ACCESSW *ppAccessList,
  141. OUT PACTRL_AUDITW *ppAuditList,
  142. OUT LPWSTR *lppOwner,
  143. OUT LPWSTR *lppGroup);
  144. DWORD
  145. AccConvertAccessToSD(IN SE_OBJECT_TYPE ObjectType,
  146. IN SECURITY_INFORMATION SeInfo,
  147. IN PACTRL_ACCESSW pAccessList,
  148. IN PACTRL_AUDITW pAuditList,
  149. IN LPWSTR lpOwner,
  150. IN LPWSTR lpGroup,
  151. IN ULONG fOpts,
  152. OUT PSECURITY_DESCRIPTOR *ppSD,
  153. OUT PULONG pcSDSize);
  154. DWORD
  155. AccGetAccessForTrustee(IN PTRUSTEE pTrustee,
  156. IN PACL pAcl,
  157. IN SECURITY_INFORMATION SeInfo,
  158. IN PWSTR pwszProperty,
  159. OUT PACCESS_RIGHTS pAllowed,
  160. OUT PACCESS_RIGHTS pDenied);
  161. DWORD
  162. AccConvertAclToAccess(IN SE_OBJECT_TYPE ObjectType,
  163. IN PACL pAcl,
  164. OUT PACTRL_ACCESSW *ppAccessList);
  165. DWORD
  166. AccGetExplicitEntries(IN PTRUSTEE pTrustee,
  167. IN SE_OBJECT_TYPE ObjectType,
  168. IN PACL pAcl,
  169. IN PWSTR pwszProperty,
  170. OUT PULONG pcEntries,
  171. OUT PACTRL_ACCESS_ENTRYW *ppAEList);
  172. VOID
  173. AccConvertAccessMaskToActrlAccess(IN ACCESS_MASK Access,
  174. IN SE_OBJECT_TYPE ObjType,
  175. IN MARTA_KERNEL_TYPE KernelObjectType,
  176. IN PACTRL_ACCESS_ENTRY pAE);
  177. }
  178. typedef struct _CSLIST_NODE
  179. {
  180. PVOID pvData;
  181. struct _CSLIST_NODE *pNext;
  182. } CSLIST_NODE, *PCSLIST_NODE;
  183. #define LIST_INLINE
  184. #ifdef LIST_INLINE
  185. #define LINLINE inline
  186. #else
  187. #define LINLINE
  188. #endif
  189. //
  190. // Free function callback typedef. This function will delete the memory saved
  191. // as the data in a list node on list destruction
  192. //
  193. typedef VOID (*FreeFunc)(PVOID);
  194. //
  195. // This function returns TRUE if the two items are the same, or FALSE if they
  196. // are not
  197. //
  198. typedef BOOL (*CompFunc)(PVOID, PVOID);
  199. //+---------------------------------------------------------------------------
  200. //
  201. // Class: CSList
  202. //
  203. // Synopsis: Singly linked list class, single threaded
  204. //
  205. // Methods: Insert
  206. // InsertIfUnique
  207. // Find
  208. // Reset
  209. // NextData
  210. // Remove
  211. // QueryCount
  212. //
  213. //----------------------------------------------------------------------------
  214. class CSList
  215. {
  216. public:
  217. CSList(FreeFunc pfnFree = NULL) : _pfnFree (pfnFree),
  218. _pCurrent (NULL),
  219. _cItems (0)
  220. {
  221. _pHead = NULL;
  222. _pTail = NULL;
  223. };
  224. LINLINE ~CSList();
  225. DWORD QueryCount(void) { return(_cItems);};
  226. VOID Init(FreeFunc pfnFree = NULL)
  227. {
  228. if(_pHead == NULL)
  229. {
  230. _pfnFree = pfnFree;
  231. _pCurrent = NULL;
  232. _cItems = 0;
  233. }
  234. };
  235. LINLINE DWORD Insert(PVOID pvData);
  236. LINLINE DWORD InsertIfUnique(PVOID pvData,
  237. CompFunc pfnComp);
  238. LINLINE PVOID Find(PVOID pvData,
  239. CompFunc pfnComp);
  240. LINLINE PVOID NextData();
  241. VOID Reset() {_pCurrent = _pHead;};
  242. LINLINE DWORD Remove(PVOID pData);
  243. LINLINE VOID FreeList(FreeFunc pfnFree);
  244. protected:
  245. PCSLIST_NODE _pHead;
  246. PCSLIST_NODE _pCurrent;
  247. PCSLIST_NODE _pTail;
  248. DWORD _cItems;
  249. FreeFunc _pfnFree;
  250. LINLINE PCSLIST_NODE FindNode(PVOID pvData,
  251. CompFunc pfnComp);
  252. };
  253. //+------------------------------------------------------------------
  254. //
  255. // Member: CSList::~CSList
  256. //
  257. // Synopsis: Destructor for the CSList class
  258. //
  259. // Arguments: None
  260. //
  261. // Returns: void
  262. //
  263. //+------------------------------------------------------------------
  264. CSList::~CSList()
  265. {
  266. while(_pHead != NULL)
  267. {
  268. PCSLIST_NODE pNext = _pHead->pNext;
  269. if(_pfnFree != NULL)
  270. {
  271. (*_pfnFree)(_pHead->pvData);
  272. }
  273. LocalFree(_pHead);
  274. _pHead = pNext;
  275. }
  276. }
  277. //+------------------------------------------------------------------
  278. //
  279. // Member: CSList::Insert
  280. //
  281. // Synopsis: Creates a new node at the begining of the list and
  282. // inserts it into the list
  283. //
  284. //
  285. // Arguments: [IN pvData] -- Data to insert
  286. //
  287. // Returns: ERROR_SUCCESS -- Everything worked
  288. // ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
  289. //
  290. //+------------------------------------------------------------------
  291. DWORD CSList::Insert(PVOID pvData)
  292. {
  293. DWORD dwErr = ERROR_SUCCESS;
  294. PCSLIST_NODE pNew = (PCSLIST_NODE)LocalAlloc(LMEM_FIXED, sizeof(CSLIST_NODE));
  295. if(pNew == NULL)
  296. {
  297. dwErr = ERROR_NOT_ENOUGH_MEMORY;
  298. }
  299. else
  300. {
  301. pNew->pvData = pvData;
  302. pNew->pNext = NULL;
  303. if ( _pHead == NULL ) {
  304. _pHead = _pTail = pNew;
  305. } else {
  306. _pTail->pNext = pNew;
  307. _pTail = pNew;
  308. }
  309. _cItems++;
  310. }
  311. return(dwErr);
  312. }
  313. //+------------------------------------------------------------------
  314. //
  315. // Member: CSList::InsertIfUnique
  316. //
  317. // Synopsis: Creates a new node at the begining of the list and
  318. // inserts it into the list if the data does not already
  319. // exist in the list. If the data does exist, nothing
  320. // is done, but SUCCESS is returned
  321. //
  322. //
  323. // Arguments: [IN pvData] -- Data to insert
  324. //
  325. // Returns: ERROR_SUCCESS -- Everything worked
  326. // ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
  327. //
  328. //+------------------------------------------------------------------
  329. DWORD CSList::InsertIfUnique(PVOID pvData,
  330. CompFunc pfnComp)
  331. {
  332. DWORD dwErr = ERROR_SUCCESS;
  333. if(FindNode(pvData, pfnComp) == NULL)
  334. {
  335. dwErr = Insert(pvData);
  336. }
  337. return(dwErr);
  338. }
  339. //+------------------------------------------------------------------
  340. //
  341. // Member: CSList::FindNode
  342. //
  343. // Synopsis: Locates the node for the given data in the list, if it exists
  344. //
  345. // Arguments: [IN pvData] -- Data to find
  346. // [IN pfnComp] -- Pointer to a comparrison function
  347. //
  348. // Returns: ERROR_SUCCESS -- Everything worked
  349. // ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
  350. //
  351. //+------------------------------------------------------------------
  352. PCSLIST_NODE CSList::FindNode(PVOID pvData,
  353. CompFunc pfnComp)
  354. {
  355. PCSLIST_NODE pRet = _pHead;
  356. // for(ULONG i = 0; i < _cItems; i++)
  357. while (pRet != NULL)
  358. {
  359. if((pfnComp)(pvData, pRet->pvData) == TRUE)
  360. {
  361. break;
  362. }
  363. pRet = pRet->pNext;
  364. }
  365. return(pRet);
  366. }
  367. //+------------------------------------------------------------------
  368. //
  369. // Member: CSList::Find
  370. //
  371. // Synopsis: Locates the given data in the list, if it exists
  372. //
  373. // Arguments: [IN pvData] -- Data to insert
  374. //
  375. // Returns: ERROR_SUCCESS -- Everything worked
  376. // ERROR_NOT_ENOUGH_MEMORY A memory allocation failed
  377. //
  378. //+------------------------------------------------------------------
  379. PVOID CSList::Find(PVOID pvData,
  380. CompFunc pfnComp)
  381. {
  382. PCSLIST_NODE pNode = FindNode(pvData, pfnComp);
  383. return(pNode == NULL ? NULL : pNode->pvData);
  384. }
  385. //+------------------------------------------------------------------
  386. //
  387. // Member: CSList::NextData
  388. //
  389. // Synopsis: Returns the next data in the list
  390. //
  391. //
  392. // Arguments: None
  393. //
  394. // Returns: NULL -- No more items
  395. // Pointer to next data in list on success
  396. //
  397. //+------------------------------------------------------------------
  398. PVOID CSList::NextData()
  399. {
  400. PVOID pvRet = NULL;
  401. if(_pCurrent != NULL)
  402. {
  403. pvRet = _pCurrent->pvData;
  404. _pCurrent = _pCurrent->pNext;
  405. }
  406. return(pvRet);
  407. }
  408. //+------------------------------------------------------------------
  409. //
  410. // Member: CSList::Remove
  411. //
  412. // Synopsis: Removes the node that references the indicated data
  413. //
  414. // Arguments: pData -- The data in the node to remove
  415. //
  416. // Returns: ERROR_SUCCESS -- Success
  417. // ERROR_INVALID_PARAMETER Node not found
  418. //
  419. //+------------------------------------------------------------------
  420. DWORD CSList::Remove(PVOID pData)
  421. {
  422. DWORD dwErr = ERROR_INVALID_PARAMETER;
  423. PCSLIST_NODE pNode = _pHead, pPrev = NULL;
  424. for(ULONG i = 0; i < _cItems; i++)
  425. {
  426. if(pNode->pvData == pData)
  427. {
  428. //
  429. // We've got a match...
  430. //
  431. if(pPrev == NULL)
  432. {
  433. _pHead = _pHead->pNext;
  434. }
  435. else
  436. {
  437. pPrev->pNext = pNode->pNext;
  438. }
  439. if (NULL == pNode->pNext)
  440. {
  441. _pTail = pPrev;
  442. }
  443. LocalFree(pNode);
  444. _cItems--;
  445. break;
  446. }
  447. pPrev = pNode;
  448. pNode = pNode->pNext;
  449. }
  450. return(dwErr);
  451. }
  452. //+------------------------------------------------------------------
  453. //
  454. // Member: CSList::FreeList
  455. //
  456. // Synopsis: Frees the list
  457. //
  458. // Arguments: pfnFree -- Optional deletion routine to use for freeing
  459. // any allocated memory
  460. //
  461. // Returns: void
  462. //
  463. //+------------------------------------------------------------------
  464. VOID CSList::FreeList(FreeFunc pfnFree)
  465. {
  466. while(_pHead != NULL)
  467. {
  468. PCSLIST_NODE pNext = _pHead->pNext;
  469. if(pfnFree != NULL)
  470. {
  471. (*pfnFree)(_pHead->pvData);
  472. }
  473. LocalFree(_pHead);
  474. _pHead = pNext;
  475. }
  476. }
  477. //
  478. // Exported functions pointer definitions
  479. //
  480. typedef DWORD (*pfNTMartaLookupTrustee) (PWSTR pwszServer,
  481. PSID pSid,
  482. PTRUSTEE *ppTrustee);
  483. typedef DWORD (*pfNTMartaLookupName) (PWSTR pwszServer,
  484. PSID pSid,
  485. LPWSTR *ppwszName,
  486. LPWSTR *ppwszDomain,
  487. SID_NAME_USE *pSidType);
  488. typedef DWORD (*pfNTMartaLookupSid) (PWSTR pwszServer,
  489. PTRUSTEE pName,
  490. PSID *ppsid,
  491. SID_NAME_USE *pSidType);
  492. typedef DWORD (*pfNTMartaSetAList) (ULONG cEntries,
  493. PACTRL_ACCESS_ENTRYW pAccessEntryList,
  494. ACCESS_MODE AccessMode,
  495. SECURITY_INFORMATION SeInfo,
  496. LPCWSTR lpProperty,
  497. BOOL fDoOldStyleMerge,
  498. PACTRL_AUDITW pOldList,
  499. PACTRL_AUDITW *ppNewList);
  500. typedef DWORD (*pfNTMartaAToSD) (PACTRL_ACCESSW pAccessList,
  501. PACTRL_AUDITW pAuditList,
  502. LPCWSTR lpOwner,
  503. LPCWSTR lpGroup,
  504. PSECURITY_DESCRIPTOR *ppSecDescriptor);
  505. typedef DWORD (*pfNTMartaSDToA) (SE_OBJECT_TYPE ObjectType,
  506. PSECURITY_DESCRIPTOR pSecDescriptor,
  507. PACTRL_ACCESSW *ppAccessList,
  508. PACTRL_AUDITW *ppAuditList,
  509. LPWSTR *lppOwner,
  510. LPWSTR *lppGroup);
  511. typedef DWORD (*pfNTMartaAclToA)(SE_OBJECT_TYPE ObjectType,
  512. PACL pAcl,
  513. PACTRL_ACCESSW *ppAccessList);
  514. typedef DWORD (*pfNTMartaGetAccess) (PTRUSTEE pTrustee,
  515. PACL pAcl,
  516. SECURITY_INFORMATION SeInfo,
  517. PWSTR pwszProperty,
  518. PACCESS_RIGHTS pAllowed,
  519. PACCESS_RIGHTS pDenied);
  520. typedef DWORD (*pfNTMartaGetExplicit)(PTRUSTEE pTrustee,
  521. SE_OBJECT_TYPE ObjectType,
  522. PACL pAcl,
  523. PWSTR pwszProperty,
  524. PULONG pcEntries,
  525. PACTRL_ACCESS_ENTRYW *ppAEList);
  526. typedef VOID (*FN_PROGRESS) (
  527. IN LPWSTR pObjectName, // name of object just processed
  528. IN DWORD Status, // status of operation on object
  529. IN OUT PPROG_INVOKE_SETTING pInvokeSetting, // Never, always,
  530. IN PVOID Args, // Caller specific data
  531. IN BOOL SecuritySet // Whether security was set
  532. );
  533. typedef DWORD (*pfNTMartaTreeResetNamedSecurityInfo) (
  534. IN LPWSTR pObjectName,
  535. IN SE_OBJECT_TYPE ObjectType,
  536. IN SECURITY_INFORMATION SecurityInfo,
  537. IN PSID pOwner,
  538. IN PSID pGroup,
  539. IN PACL pDacl,
  540. IN PACL pSacl,
  541. IN BOOL KeepExplicit,
  542. IN FN_PROGRESS fnProgress,
  543. IN PROG_INVOKE_SETTING ProgressInvokeSetting,
  544. IN PVOID Args
  545. );
  546. // typedef PVOID PFN_OBJECT_MGR_FUNCTS;
  547. typedef DWORD (*pfNTMartaGetInheritanceSource) (
  548. IN LPWSTR pObjectName,
  549. IN SE_OBJECT_TYPE ObjectType,
  550. IN SECURITY_INFORMATION SecurityInfo,
  551. IN BOOL Container,
  552. IN GUID ** pObjectClassGuids OPTIONAL,
  553. IN DWORD GuidCount,
  554. IN PACL pAcl,
  555. IN PGENERIC_MAPPING pGenericMapping,
  556. IN PFN_OBJECT_MGR_FUNCTS pfnArray OPTIONAL,
  557. OUT PINHERITED_FROMW pInheritArray
  558. );
  559. typedef DWORD (*PFN_FREE) (IN PVOID Mem);
  560. typedef DWORD (*pfNTMartaFreeIndexArray) (
  561. IN OUT PINHERITED_FROMW pInheritArray,
  562. IN USHORT AceCnt,
  563. IN PFN_FREE pfnFree OPTIONAL
  564. );
  565. typedef DWORD (*pfNTMartaGetNamedRights) (
  566. IN LPWSTR pObjectName,
  567. IN SE_OBJECT_TYPE ObjectType,
  568. IN SECURITY_INFORMATION SecurityInfo,
  569. OUT PSID * ppSidOwner,
  570. OUT PSID * ppSidGroup,
  571. OUT PACL * ppDacl,
  572. OUT PACL * ppSacl,
  573. OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor);
  574. typedef DWORD (*pfNTMartaSetNamedRights) (
  575. IN LPWSTR pObjectName,
  576. IN SE_OBJECT_TYPE ObjectType,
  577. IN SECURITY_INFORMATION SecurityInfo,
  578. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  579. IN BOOL bSkipInheritanceComputation
  580. );
  581. typedef DWORD (*pfNTMartaGetHandleRights) (
  582. IN HANDLE Handle,
  583. IN SE_OBJECT_TYPE ObjectType,
  584. IN SECURITY_INFORMATION SecurityInfo,
  585. OUT PSID * ppSidOwner,
  586. OUT PSID * ppSidGroup,
  587. OUT PACL * ppDacl,
  588. OUT PACL * ppSacl,
  589. OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor);
  590. typedef DWORD (*pfNTMartaSetHandleRights) (
  591. IN HANDLE Handle,
  592. IN SE_OBJECT_TYPE ObjectType,
  593. IN SECURITY_INFORMATION SecurityInfo,
  594. IN PSECURITY_DESCRIPTOR pSecurityDescriptor
  595. );
  596. typedef DWORD (*pfNTMartaSetEntriesInAcl) (
  597. IN ULONG cCountOfExplicitEntries,
  598. IN PEXPLICIT_ACCESS_W pListOfExplicitEntries,
  599. IN PACL OldAcl,
  600. OUT PACL * pNewAcl
  601. );
  602. typedef DWORD (*pfNTMartaGetExplicitEntriesFromAcl) (
  603. IN PACL pacl,
  604. OUT PULONG pcCountOfExplicitEntries,
  605. OUT PEXPLICIT_ACCESS_W * pListOfExplicitEntries
  606. );
  607. #endif // ifdef __MARTAEXP_HXX__