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.

1231 lines
32 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. authzp.h
  5. Abstract:
  6. Internal header file for authorization APIs.
  7. Author:
  8. Kedar Dubhashi - March 2000
  9. Environment:
  10. User mode only.
  11. Revision History:
  12. Created - March 2000
  13. --*/
  14. #ifndef __AUTHZP_H__
  15. #define __AUTHZP_H__
  16. #define _AUTHZ_
  17. #include <authz.h>
  18. #include <authzi.h>
  19. #if 0
  20. #define AUTHZ_DEBUG
  21. #define AUTHZ_DEBUG_QUEUE
  22. #define AUTHZ_DEBUG_MEMLEAK
  23. #else
  24. #define AUTHZ_PARAM_CHECK
  25. #define AUTHZ_AUDIT_COUNTER
  26. #endif
  27. #define AuthzpCloseHandleNonNull(h) if (NULL != (h)) { AuthzpCloseHandle((h)); }
  28. #define AuthzpCloseHandle(h) CloseHandle((h))
  29. //
  30. // Size of the local stack buffer used to save a kernel call as well as a memory
  31. // allocation.
  32. //
  33. #define AUTHZ_MAX_STACK_BUFFER_SIZE 1024
  34. #ifndef AUTHZ_DEBUG_MEMLEAK
  35. #define AuthzpAlloc(s) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (s))
  36. #define AuthzpFree(p) LocalFree((p))
  37. #else
  38. //
  39. // This is to be used for debugging memory leaks. Primitive method but works in
  40. // a small project like this.
  41. //
  42. PVOID
  43. AuthzpAlloc(IN DWORD Size);
  44. VOID
  45. AuthzpFree(PVOID l);
  46. #endif
  47. //
  48. // Given two sids and length of the first sid, compare the two sids.
  49. //
  50. #define AUTHZ_EQUAL_SID(s, d, l) ((*((DWORD*) s) == *((DWORD*) d)) && (RtlEqualMemory((s), (d), (l))))
  51. //
  52. // Compares a given sids with a well known constant PrincipalSelfSid.
  53. //
  54. #define AUTHZ_IS_PRINCIPAL_SELF_SID(s) (RtlEqualMemory(pAuthzPrincipalSelfSid, (s), 12))
  55. //
  56. // The client context is restricted if the restricted sid and attribute array is
  57. // present.
  58. //
  59. #define AUTHZ_TOKEN_RESTRICTED(t) (NULL != (t)->RestrictedSids)
  60. //
  61. // Two privileges are inportant for access check:
  62. // SeSecurityPrivilege
  63. // SeTakeOwnershipPrivilege
  64. // Both these are detected at the time of client context capture from token
  65. // and stored in the flags.
  66. //
  67. #define AUTHZ_PRIVILEGE_CHECK(t, f) (FLAG_ON((t)->Flags, (f)))
  68. //
  69. // Flags in the cached handle.
  70. //
  71. #define AUTHZ_DENY_ACE_PRESENT 0x00000001
  72. #define AUTHZ_PRINCIPAL_SELF_ACE_PRESENT 0x00000002
  73. #define AUTHZ_DYNAMIC_ALLOW_ACE_PRESENT 0x00000004
  74. #define AUTHZ_DYNAMIC_DENY_ACE_PRESENT 0x00000008
  75. #define AUTHZ_DYNAMIC_EVALUATION_PRESENT (AUTHZ_PRINCIPAL_SELF_ACE_PRESENT | \
  76. AUTHZ_DYNAMIC_ALLOW_ACE_PRESENT | \
  77. AUTHZ_DYNAMIC_DENY_ACE_PRESENT)
  78. //
  79. // There are only two valid attributes from access check point of view
  80. // SE_GROUP_ENABLED
  81. // SE_GROUP_USE_FOR_DENY_ONLY
  82. //
  83. #define AUTHZ_VALID_SID_ATTRIBUTES (SE_GROUP_ENABLED | SE_GROUP_USE_FOR_DENY_ONLY)
  84. #ifdef FLAG_ON
  85. #undef FLAG_ON
  86. #endif
  87. #define FLAG_ON(f, b) (0 != ((f) & (b)))
  88. #ifdef AUTHZ_NON_NULL_PTR
  89. #undef AUTHZ_NON_NULL_PTR
  90. #endif
  91. #define AUTHZ_NON_NULL_PTR(f) (NULL != (f))
  92. //
  93. // If the pointer is not null then free it. This will save us a function call in
  94. // cases when the pointer is null. Note that LocalFree would also take care null
  95. // pointer being freed.
  96. //
  97. #define AuthzpFreeNonNull(p) if (NULL != (p)) { AuthzpFree((p)); }
  98. //
  99. // Check to see if the memory allocation failed.
  100. //
  101. #define AUTHZ_ALLOCATION_FAILED(p) (NULL == (p))
  102. //
  103. // Macros to traverse the acl.
  104. // The first one gets the first ace in a given acl.
  105. // The second one gives the next ace given the current one.
  106. //
  107. #define FirstAce(Acl) ((PVOID)((PUCHAR)(Acl) + sizeof(ACL)))
  108. #define NextAce(Ace) ((PVOID)((PUCHAR)(Ace) + ((PACE_HEADER)(Ace))->AceSize))
  109. //
  110. // These do not need to be defined now since the decision was to put the burden
  111. // on the resource managers. There are disadvantages of making it thread safe.
  112. // Our choices are:
  113. // 1. Have exactly one lock in authz.dll and suffer heavy contention.
  114. // 2. Define one lock per client context which might be too expensive in
  115. // cases where the clients are too many.
  116. // 3. Let the resource manager decide whether they need locking - unlikely
  117. // that locks are needed since it is wrong design on part of the RM to
  118. // have one thread that changes the client context while the other one
  119. // is doing an access check.
  120. //
  121. #define AuthzpAcquireClientContextWriteLock(c)
  122. #define AuthzpAcquireClientContextReadLock(c)
  123. #define AuthzpReleaseClientContextLock(c)
  124. #define AuthzpAcquireClientCacheWriteLock(c)
  125. #define AuthzpReleaseClientCacheLock(c)
  126. #define AuthzpZeroMemory(p, s) RtlZeroMemory((p), (s))
  127. #define AuthzObjectAceSid(Ace) \
  128. ((PSID)(((PUCHAR)&(((PKNOWN_OBJECT_ACE)(Ace))->SidStart)) + \
  129. (RtlObjectAceObjectTypePresent(Ace) ? sizeof(GUID) : 0 ) + \
  130. (RtlObjectAceInheritedObjectTypePresent(Ace) ? sizeof(GUID) : 0 )))
  131. #define AuthzAceSid(Ace) ((PSID)&((PKNOWN_ACE)Ace)->SidStart)
  132. #define AuthzCallbackAceSid(Ace) AuthzAceSid(Ace)
  133. #define AuthzCallbackObjectAceSid(Ace) AuthzObjectAceSid(Ace)
  134. //
  135. // Internal structure of the object type list.
  136. //
  137. // Level - Level of the element in the tree. The level of the root is 0.
  138. // Flags - To be used for auditing. The valid ones are
  139. // AUTHZ_OBJECT_SUCCESS_AUDIT
  140. // AUTHZ_OBJECT_FAILURE_AUDIT
  141. // ObjectType - Pointer to the guid for this element.
  142. // ParentIndex - The index of the parent of this element in the array. The
  143. // parent index for the root is -1.
  144. // Remaining - Remaining access bits for this element, used during normal access
  145. // check algorithm.
  146. // CurrentGranted - Granted access bits so far for this element, used during
  147. // maximum allowed access check.
  148. // CurrentDenied - Explicitly denied access bits for this element, used during
  149. // maximum allowed access check.
  150. //
  151. typedef struct _IOBJECT_TYPE_LIST {
  152. USHORT Level;
  153. USHORT Flags;
  154. #define AUTHZ_OBJECT_SUCCESS_AUDIT 0x1
  155. #define AUTHZ_OBJECT_FAILURE_AUDIT 0x2
  156. GUID ObjectType;
  157. LONG ParentIndex;
  158. ACCESS_MASK Remaining;
  159. ACCESS_MASK CurrentGranted;
  160. ACCESS_MASK CurrentDenied;
  161. } IOBJECT_TYPE_LIST, *PIOBJECT_TYPE_LIST;
  162. typedef struct _AUTHZI_AUDIT_QUEUE
  163. {
  164. //
  165. // Flags defined in authz.h
  166. //
  167. DWORD Flags;
  168. //
  169. // High and low marks for the auditing queue
  170. //
  171. DWORD dwAuditQueueHigh;
  172. DWORD dwAuditQueueLow;
  173. //
  174. // CS for locking the audit queue
  175. //
  176. RTL_CRITICAL_SECTION AuthzAuditQueueLock;
  177. //
  178. // The audit queue and length.
  179. //
  180. LIST_ENTRY AuthzAuditQueue;
  181. ULONG AuthzAuditQueueLength;
  182. //
  183. // Handle to the thread that maintains the audit queue.
  184. //
  185. HANDLE hAuthzAuditThread;
  186. //
  187. // This event signals that an audit was placed on the queue.
  188. //
  189. HANDLE hAuthzAuditAddedEvent;
  190. //
  191. // This event signals that the queue is empty. Initially signalled.
  192. //
  193. HANDLE hAuthzAuditQueueEmptyEvent;
  194. //
  195. // This boolean indicates that the queue size has reached the RM-specified high water mark.
  196. //
  197. BOOL bAuthzAuditQueueHighEvent;
  198. //
  199. // This event signals that the queue size is at or below the RM-specified low water mark.
  200. //
  201. HANDLE hAuthzAuditQueueLowEvent;
  202. //
  203. // This boolean is set to TRUE during the life of the resource manager. When it turns to FALSE, the
  204. // dequeue thread knows that it should exit.
  205. //
  206. BOOL bWorker;
  207. } AUTHZI_AUDIT_QUEUE, *PAUTHZI_AUDIT_QUEUE;
  208. typedef struct _AUTHZI_RESOURCE_MANAGER
  209. {
  210. //
  211. // No valid flags have been defined yet.
  212. //
  213. DWORD Flags;
  214. //
  215. // Callback function registered by AuthzRegisterRMAccessCheckCallback, to be
  216. // used to interpret callback aces. If no such function is registered by the
  217. // RM then the default behavior is to return TRUE for a deny ACE, FALSE for
  218. // a grant ACE.
  219. //
  220. PFN_AUTHZ_DYNAMIC_ACCESS_CHECK pfnDynamicAccessCheck;
  221. //
  222. // Callback function registered by AuthzRegisterDynamicGroupsCallback, to be
  223. // used to compute groups to be added to the client context. If no such
  224. // function is registered by the RM then the default behavior is to return
  225. // no groups.
  226. //
  227. PFN_AUTHZ_COMPUTE_DYNAMIC_GROUPS pfnComputeDynamicGroups;
  228. //
  229. // Callback function registered by AuthzRegisterDynamicGroupsCallback, to be
  230. // used to free memory allocated by ComputeDynamicGroupsFn.
  231. //
  232. PFN_AUTHZ_FREE_DYNAMIC_GROUPS pfnFreeDynamicGroups;
  233. //
  234. // String name of resource manager. Appears in audits.
  235. //
  236. PWSTR szResourceManagerName;
  237. //
  238. // The user SID and Authentication ID of the RM process
  239. //
  240. PSID pUserSID;
  241. LUID AuthID;
  242. //
  243. // Default queue and audit events for the RM
  244. //
  245. #define AUTHZP_DEFAULT_RM_EVENTS 0x2
  246. AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAET;
  247. AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAETDS;
  248. AUTHZ_AUDIT_QUEUE_HANDLE hAuditQueue;
  249. } AUTHZI_RESOURCE_MANAGER, *PAUTHZI_RESOURCE_MANAGER;
  250. typedef struct _AUTHZI_CLIENT_CONTEXT AUTHZI_CLIENT_CONTEXT, *PAUTHZI_CLIENT_CONTEXT;
  251. typedef struct _AUTHZI_HANDLE AUTHZI_HANDLE, *PAUTHZI_HANDLE;
  252. //
  253. // The authz code inserts two parmeters in the AUDIT_PARAM array
  254. // before the user supplied parameters. The two parameters are:
  255. // -- SID of the client context
  256. // -- sub-system name (this is same as the RM name)
  257. //
  258. // To account for these two parameters, the authz code adds the following
  259. // offset to variables that hold parameter count.
  260. //
  261. #define AUTHZP_NUM_FIXED_HEADER_PARAMS 2
  262. //
  263. // number of parameters in SE_AUDITID_OBJECT_OPERATION
  264. //
  265. #define AUTHZP_NUM_PARAMS_FOR_SE_AUDITID_OBJECT_OPERATION 12
  266. //
  267. // the number of sids that we hash is equal to
  268. // the number of bits in AUTHZI_SID_HASH_ENTRY
  269. //
  270. #ifdef _WIN64_
  271. typedef ULONGLONG AUTHZI_SID_HASH_ENTRY, *PAUTHZI_SID_HASH_ENTRY;
  272. #else
  273. typedef DWORD AUTHZI_SID_HASH_ENTRY, *PAUTHZI_SID_HASH_ENTRY;
  274. #endif
  275. #define AUTHZI_SID_HASH_ENTRY_NUM_BITS (8*sizeof(AUTHZI_SID_HASH_ENTRY))
  276. //
  277. // the hash size is not related to the number of bits. it is the size
  278. // required to hold two 16 element arrays
  279. //
  280. #define AUTHZI_SID_HASH_SIZE 32
  281. struct _AUTHZI_CLIENT_CONTEXT
  282. {
  283. //
  284. // The client context structure is recursive to support delegated clients.
  285. // Not in the picture yet though.
  286. //
  287. PAUTHZI_CLIENT_CONTEXT Server;
  288. //
  289. // Context will always be created with Revision of AUTHZ_CURRENT_CONTEXT_REVISION.
  290. //
  291. #define AUTHZ_CURRENT_CONTEXT_REVISION 1
  292. DWORD Revision;
  293. //
  294. // Resource manager supplied identifier. We do not ever use this.
  295. //
  296. LUID Identifier;
  297. //
  298. // AuthenticationId captured from the token of the client. Needed for
  299. // auditing.
  300. //
  301. LUID AuthenticationId;
  302. //
  303. // Token expiration time. This one will be checked at the time of access check against
  304. // the current time.
  305. //
  306. LARGE_INTEGER ExpirationTime;
  307. //
  308. // Internal flags for the token.
  309. //
  310. #define AUTHZ_TAKE_OWNERSHIP_PRIVILEGE_ENABLED 0x00000001
  311. #define AUTHZ_SECURITY_PRIVILEGE_ENABLED 0x00000002
  312. DWORD Flags;
  313. //
  314. // Sids used for normal access checks.
  315. //
  316. DWORD SidCount;
  317. DWORD SidLength;
  318. PSID_AND_ATTRIBUTES Sids;
  319. AUTHZI_SID_HASH_ENTRY SidHash[AUTHZI_SID_HASH_SIZE];
  320. //
  321. // Sids used if the token is resticted. These will usually be 0 and NULL respectively.
  322. //
  323. DWORD RestrictedSidCount;
  324. DWORD RestrictedSidLength;
  325. PSID_AND_ATTRIBUTES RestrictedSids;
  326. AUTHZI_SID_HASH_ENTRY RestrictedSidHash[AUTHZI_SID_HASH_SIZE];
  327. //
  328. // Privileges used in access checks. Relevant ones are:
  329. // 1. SeSecurityPrivilege
  330. // 2. SeTakeOwnershipPrivilege
  331. // If there are no privileges associated with the client context then the PrivilegeCount = 0
  332. // and Privileges = NULL
  333. //
  334. DWORD PrivilegeCount;
  335. DWORD PrivilegeLength;
  336. PLUID_AND_ATTRIBUTES Privileges;
  337. //
  338. // Handles open for this client. When the client context is destroyed all the handles are
  339. // cleaned up.
  340. //
  341. PAUTHZI_HANDLE AuthzHandleHead;
  342. //
  343. // Pointer to the resource manager, needed to retrieve static auditing information.
  344. //
  345. PAUTHZI_RESOURCE_MANAGER pResourceManager;
  346. };
  347. struct _AUTHZI_HANDLE
  348. {
  349. //
  350. // Pointers to the next handle maintained by the AuthzClientContext object.
  351. //
  352. PAUTHZI_HANDLE next;
  353. //
  354. // Pointer to the security descriptors provided by the RM at the time of first access
  355. // check call. We do not make a copy of the security descriptors. The assumption
  356. // is that the SDs will be valid at least as long as the the handle is open.
  357. //
  358. PSECURITY_DESCRIPTOR pSecurityDescriptor;
  359. PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray;
  360. DWORD OptionalSecurityDescriptorCount;
  361. //
  362. // Flags for internal usage only.
  363. //
  364. DWORD Flags;
  365. //
  366. // Back pointer to the client context that created this handle, required if the static
  367. // access granted is insufficient and access check needs to be performed again.
  368. //
  369. PAUTHZI_CLIENT_CONTEXT pAuthzClientContext;
  370. //
  371. // Results of the maximum allowed static access.
  372. //
  373. DWORD ResultListLength;
  374. ACCESS_MASK GrantedAccessMask[ANYSIZE_ARRAY];
  375. };
  376. //
  377. // This structure stores per access audit information. The structure
  378. // is opaque and initialized with AuthzInitAuditInfo
  379. //
  380. typedef struct _AUTHZI_AUDIT_EVENT
  381. {
  382. //
  383. // size of allocated blob for this structure
  384. //
  385. DWORD dwSize;
  386. //
  387. // Flags are specified in authz.h, and this single private flag for DS callers.
  388. //
  389. DWORD Flags;
  390. //
  391. // AuditParams used for audit if available. If no AuditParams is available
  392. // and the audit id is SE_AUDITID_OBJECT_OPERATION then Authz will construct a
  393. // suitable structure.
  394. //
  395. PAUDIT_PARAMS pAuditParams;
  396. //
  397. // Structure defining the Audit Event category and id
  398. //
  399. AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAET;
  400. //
  401. // millisecond timeout value
  402. //
  403. DWORD dwTimeOut;
  404. //
  405. // RM specified strings describing this event.
  406. //
  407. PWSTR szOperationType;
  408. PWSTR szObjectType;
  409. PWSTR szObjectName;
  410. PWSTR szAdditionalInfo;
  411. PWSTR szAdditionalInfo2;
  412. AUTHZ_AUDIT_QUEUE_HANDLE hAuditQueue;
  413. } AUTHZI_AUDIT_EVENT, *PAUTHZI_AUDIT_EVENT;
  414. //
  415. // structure to maintain queue of audits to be sent to LSA
  416. //
  417. typedef struct _AUTHZ_AUDIT_QUEUE_ENTRY
  418. {
  419. LIST_ENTRY list;
  420. PAUTHZ_AUDIT_EVENT_TYPE_OLD pAAETO;
  421. DWORD Flags;
  422. AUDIT_PARAMS * pAuditParams;
  423. PVOID pReserved;
  424. } AUTHZ_AUDIT_QUEUE_ENTRY, *PAUTHZ_AUDIT_QUEUE_ENTRY;
  425. //
  426. // Enumeration type to be used to specify what type of coloring should be
  427. // passed on to the rest of the tree starting at a given node.
  428. // Deny gets propagted down the entire subtree as well as to all the
  429. // ancestors (but NOT to siblings and below)
  430. // Grants get propagated down the subtree. When a grant exists on all the
  431. // siblings the parent automatically gets it.
  432. // Remaining is propagated downwards. The remaining on the parent is a
  433. // logical OR of the remaining bits on all the children.
  434. //
  435. typedef enum {
  436. AuthzUpdateRemaining = 1,
  437. AuthzUpdateCurrentGranted,
  438. AuthzUpdateCurrentDenied
  439. } ACCESS_MASK_FIELD_TO_UPDATE;
  440. //
  441. // Enumeration type to be used to specify the kind of well known sid for context
  442. // changes. We are not going to support these unless we get a requirement.
  443. //
  444. typedef enum _AUTHZ_WELL_KNOWN_SID_TYPE
  445. {
  446. AuthzWorldSid = 1,
  447. AuthzUserSid,
  448. AuthzAdminSid,
  449. AuthzDomainAdminSid,
  450. AuthzAuthenticatedUsersSid,
  451. AuthzSystemSid
  452. } AUTHZ_WELL_KNOWN_SID_TYPE;
  453. BOOL
  454. AuthzpVerifyAccessCheckArguments(
  455. IN PAUTHZI_CLIENT_CONTEXT pCC,
  456. IN PAUTHZ_ACCESS_REQUEST pRequest,
  457. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  458. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  459. IN DWORD OptionalSecurityDescriptorCount,
  460. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  461. IN OUT PAUTHZ_ACCESS_CHECK_RESULTS_HANDLE phAccessCheckResults OPTIONAL
  462. );
  463. BOOL
  464. AuthzpVerifyOpenObjectArguments(
  465. IN PAUTHZI_CLIENT_CONTEXT pCC,
  466. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  467. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  468. IN DWORD OptionalSecurityDescriptorCount,
  469. IN PAUTHZI_AUDIT_EVENT pAuditEvent
  470. );
  471. BOOL
  472. AuthzpCaptureObjectTypeList(
  473. IN POBJECT_TYPE_LIST ObjectTypeList,
  474. IN DWORD ObjectTypeLocalTypeListLength,
  475. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  476. IN OUT PIOBJECT_TYPE_LIST LocalCachingTypeList OPTIONAL
  477. );
  478. VOID
  479. AuthzpFillReplyStructure(
  480. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  481. IN DWORD Error,
  482. IN ACCESS_MASK GrantedAccess
  483. );
  484. BOOL
  485. AuthzpMaximumAllowedAccessCheck(
  486. IN PAUTHZI_CLIENT_CONTEXT pCC,
  487. IN PAUTHZ_ACCESS_REQUEST pRequest,
  488. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  489. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  490. IN DWORD OptionalSecurityDescriptorCount,
  491. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  492. IN OUT PIOBJECT_TYPE_LIST LocalCachingTypeList OPTIONAL,
  493. IN DWORD LocalTypeListLength,
  494. IN BOOL ObjectTypeListPresent,
  495. OUT PDWORD pCachingFlags
  496. );
  497. BOOL
  498. AuthzpMaximumAllowedMultipleSDAccessCheck(
  499. IN PAUTHZI_CLIENT_CONTEXT pCC,
  500. IN PAUTHZ_ACCESS_REQUEST pRequest,
  501. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  502. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  503. IN DWORD OptionalSecurityDescriptorCount,
  504. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  505. IN OUT PIOBJECT_TYPE_LIST LocalCachingTypeList OPTIONAL,
  506. IN DWORD LocalTypeListLength,
  507. IN BOOL ObjectTypeListPresent,
  508. IN BOOL Restricted,
  509. OUT PDWORD pCachingFlags
  510. );
  511. BOOL
  512. AuthzpMaximumAllowedSingleAclAccessCheck(
  513. IN PAUTHZI_CLIENT_CONTEXT pCC,
  514. IN PSID_AND_ATTRIBUTES pSidAttr,
  515. IN DWORD SidCount,
  516. IN PAUTHZI_SID_HASH_ENTRY pHash,
  517. IN PAUTHZ_ACCESS_REQUEST pRequest,
  518. IN PACL pAcl,
  519. IN PSID pOwnerSid,
  520. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  521. IN OUT PIOBJECT_TYPE_LIST LocalCachingTypeList OPTIONAL,
  522. IN DWORD LocalTypeListLength,
  523. IN BOOL ObjectTypeListPresent,
  524. OUT PDWORD pCachingFlags
  525. );
  526. BOOL
  527. AuthzpSidApplicable(
  528. IN DWORD SidCount,
  529. IN PSID_AND_ATTRIBUTES pSidAttr,
  530. IN PAUTHZI_SID_HASH_ENTRY pHash,
  531. IN PSID pSid,
  532. IN PSID PrincipalSelfSid,
  533. IN PSID CreatorOwnerSid,
  534. IN BOOL DenyAce,
  535. OUT PDWORD pCachingFlags
  536. );
  537. BOOL
  538. AuthzpAccessCheckWithCaching(
  539. IN DWORD Flags,
  540. IN PAUTHZI_CLIENT_CONTEXT pCC,
  541. IN PAUTHZ_ACCESS_REQUEST pRequest,
  542. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  543. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  544. IN DWORD OptionalSecurityDescriptorCount,
  545. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  546. OUT PAUTHZ_ACCESS_CHECK_RESULTS_HANDLE phAccessCheckResults OPTIONAL,
  547. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  548. IN OUT PIOBJECT_TYPE_LIST LocalCachingTypeList OPTIONAL,
  549. IN DWORD LocalTypeListLength
  550. );
  551. BOOL
  552. AuthzpNormalAccessCheckWithoutCaching(
  553. IN PAUTHZI_CLIENT_CONTEXT pCC,
  554. IN PAUTHZ_ACCESS_REQUEST pRequest,
  555. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  556. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  557. IN DWORD OptionalSecurityDescriptorCount,
  558. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  559. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  560. IN DWORD LocalTypeListLength
  561. );
  562. BOOL
  563. AuthzpNormalMultipleSDAccessCheck(
  564. IN PAUTHZI_CLIENT_CONTEXT pCC,
  565. IN PSID_AND_ATTRIBUTES pSidAttr,
  566. IN DWORD SidCount,
  567. IN PAUTHZI_SID_HASH_ENTRY pSidHash,
  568. IN ACCESS_MASK Remaining,
  569. IN PAUTHZ_ACCESS_REQUEST pRequest,
  570. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  571. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  572. IN DWORD OptionalSecurityDescriptorCount,
  573. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  574. IN DWORD LocalTypeListLength
  575. );
  576. BOOL
  577. AuthzpOwnerSidInClientContext(
  578. IN PAUTHZI_CLIENT_CONTEXT pCC,
  579. IN PISECURITY_DESCRIPTOR pSecurityDescriptor
  580. );
  581. BOOL
  582. AuthzpNormalAccessCheck(
  583. IN PAUTHZI_CLIENT_CONTEXT pCC,
  584. IN PSID_AND_ATTRIBUTES pSidAttr,
  585. IN DWORD SidCount,
  586. IN PAUTHZI_SID_HASH_ENTRY pSidHash,
  587. IN ACCESS_MASK Remaining,
  588. IN PAUTHZ_ACCESS_REQUEST pRequest,
  589. IN PACL pAcl,
  590. IN PSID pOwnerSid,
  591. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  592. IN DWORD LocalTypeListLength
  593. );
  594. BOOL
  595. AuthzpQuickMaximumAllowedAccessCheck(
  596. IN PAUTHZI_CLIENT_CONTEXT pCC,
  597. IN PAUTHZI_HANDLE pAH,
  598. IN PAUTHZ_ACCESS_REQUEST pRequest,
  599. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  600. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  601. IN DWORD LocalTypeListLength
  602. );
  603. BOOL
  604. AuthzpQuickNormalAccessCheck(
  605. IN PAUTHZI_CLIENT_CONTEXT pCC,
  606. IN PAUTHZI_HANDLE pAH,
  607. IN PAUTHZ_ACCESS_REQUEST pRequest,
  608. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  609. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  610. IN DWORD LocalTypeListLength
  611. );
  612. BOOL
  613. AuthzpAllowOnlyNormalMultipleSDAccessCheck(
  614. IN PAUTHZI_CLIENT_CONTEXT pCC,
  615. IN PSID_AND_ATTRIBUTES pSidAttr,
  616. IN DWORD SidCount,
  617. IN PAUTHZI_SID_HASH_ENTRY pSidHash,
  618. IN ACCESS_MASK Remaining,
  619. IN PAUTHZ_ACCESS_REQUEST pRequest,
  620. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  621. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  622. IN DWORD OptionalSecurityDescriptorCount,
  623. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  624. IN DWORD LocalTypeListLength
  625. );
  626. BOOL
  627. AuthzpAllowOnlyNormalSingleAclAccessCheck(
  628. IN PAUTHZI_CLIENT_CONTEXT pCC,
  629. IN PSID_AND_ATTRIBUTES pSidAttr,
  630. IN DWORD SidCount,
  631. IN PAUTHZI_SID_HASH_ENTRY pSidHash,
  632. IN ACCESS_MASK Remaining,
  633. IN PAUTHZ_ACCESS_REQUEST pRequest,
  634. IN PACL pAcl,
  635. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  636. IN DWORD LocalTypeListLength
  637. );
  638. BOOL
  639. AuthzpAllowOnlySidApplicable(
  640. IN DWORD SidCount,
  641. IN PSID_AND_ATTRIBUTES pSidAttr,
  642. IN PAUTHZI_SID_HASH_ENTRY pSidHash,
  643. IN PSID pSid
  644. );
  645. VOID
  646. AuthzpAddAccessTypeList (
  647. IN PIOBJECT_TYPE_LIST ObjectTypeList,
  648. IN DWORD ObjectTypeListLength,
  649. IN DWORD StartIndex,
  650. IN ACCESS_MASK AccessMask,
  651. IN ACCESS_MASK_FIELD_TO_UPDATE FieldToUpdate
  652. );
  653. BOOL
  654. AuthzpObjectInTypeList (
  655. IN GUID *ObjectType,
  656. IN PIOBJECT_TYPE_LIST ObjectTypeList,
  657. IN DWORD ObjectTypeListLength,
  658. OUT PDWORD ReturnedIndex
  659. );
  660. BOOL
  661. AuthzpCacheResults(
  662. IN DWORD Flags,
  663. IN PAUTHZI_CLIENT_CONTEXT pCC,
  664. IN PIOBJECT_TYPE_LIST LocalCachingTypeList,
  665. IN DWORD LocalTypeListLength,
  666. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  667. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  668. IN DWORD OptionalSecurityDescriptorCount,
  669. IN DWORD CachingFlags,
  670. IN PAUTHZ_ACCESS_CHECK_RESULTS_HANDLE phAccessCheckResults
  671. );
  672. BOOL
  673. AuthzpVerifyCachedAccessCheckArguments(
  674. IN PAUTHZI_HANDLE pAH,
  675. IN PAUTHZ_ACCESS_REQUEST pRequest,
  676. IN OUT PAUTHZ_ACCESS_REPLY pReply
  677. );
  678. BOOL
  679. AuthzpAllowOnlyMaximumAllowedMultipleSDAccessCheck(
  680. IN PAUTHZI_CLIENT_CONTEXT pCC,
  681. IN PAUTHZ_ACCESS_REQUEST pRequest,
  682. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  683. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  684. IN DWORD OptionalSecurityDescriptorCount,
  685. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  686. IN DWORD LocalTypeListLength,
  687. IN BOOL ObjectTypeListPresent,
  688. IN BOOL Restricted
  689. );
  690. BOOL
  691. AuthzpAllowOnlyMaximumAllowedSingleAclAccessCheck(
  692. IN PAUTHZI_CLIENT_CONTEXT pCC,
  693. IN PSID_AND_ATTRIBUTES pSidAttr,
  694. IN DWORD SidCount,
  695. IN PAUTHZI_SID_HASH_ENTRY pSidHash,
  696. IN PAUTHZ_ACCESS_REQUEST pRequest,
  697. IN PACL pAcl,
  698. IN PSID pOwnerSid,
  699. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  700. IN DWORD LocalTypeListLength,
  701. IN BOOL ObjectTypeListPresent
  702. );
  703. VOID
  704. AuthzpAddAccessTypeList (
  705. IN OUT PIOBJECT_TYPE_LIST ObjectTypeList,
  706. IN DWORD ObjectTypeListLength,
  707. IN DWORD StartIndex,
  708. IN ACCESS_MASK AccessMask,
  709. IN ACCESS_MASK_FIELD_TO_UPDATE FieldToUpdate
  710. );
  711. VOID
  712. AuthzpUpdateParentTypeList(
  713. IN OUT PIOBJECT_TYPE_LIST ObjectTypeList,
  714. IN DWORD ObjectTypeListLength,
  715. IN DWORD StartIndex
  716. );
  717. BOOL
  718. AuthzpObjectInTypeList (
  719. IN GUID *ObjectType,
  720. IN PIOBJECT_TYPE_LIST ObjectTypeList,
  721. IN DWORD ObjectTypeListLength,
  722. OUT PDWORD ReturnedIndex
  723. );
  724. BOOL
  725. AuthzpGenerateAudit(
  726. IN PAUTHZI_CLIENT_CONTEXT pCC,
  727. IN PAUTHZ_ACCESS_REQUEST pRequest,
  728. IN PAUTHZI_AUDIT_EVENT pAuditEvent,
  729. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  730. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  731. IN DWORD OptionalSecurityDescriptorCount,
  732. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  733. IN OUT PIOBJECT_TYPE_LIST LocalTypeList
  734. );
  735. BOOL
  736. AuthzpCopySidsAndAttributes(
  737. IN OUT PSID_AND_ATTRIBUTES DestSidAttr,
  738. IN PSID_AND_ATTRIBUTES SidAttr1,
  739. IN DWORD Count1,
  740. IN PSID_AND_ATTRIBUTES SidAttr2,
  741. IN DWORD Count2
  742. );
  743. VOID
  744. AuthzpCopyLuidAndAttributes(
  745. IN PAUTHZI_CLIENT_CONTEXT pCC,
  746. IN PLUID_AND_ATTRIBUTES Source,
  747. IN DWORD Count,
  748. IN OUT PLUID_AND_ATTRIBUTES Destination
  749. );
  750. BOOL
  751. AuthzpDefaultAccessCheck(
  752. IN AUTHZ_CLIENT_CONTEXT_HANDLE hAuthzClientContext,
  753. IN PACE_HEADER pAce,
  754. IN PVOID pArgs OPTIONAL,
  755. IN OUT PBOOL pbAceApplicable
  756. );
  757. VOID
  758. AuthzPrintContext(
  759. IN PAUTHZI_CLIENT_CONTEXT pCC
  760. );
  761. VOID
  762. AuthzpFillReplyFromParameters(
  763. IN PAUTHZ_ACCESS_REQUEST pRequest,
  764. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  765. IN PIOBJECT_TYPE_LIST LocalTypeList
  766. );
  767. BOOL
  768. AuthzpGetAllGroupsBySid(
  769. IN PSID pUserSid,
  770. IN DWORD Flags,
  771. OUT PSID_AND_ATTRIBUTES *ppSidAttr,
  772. OUT PDWORD pSidCount,
  773. OUT PDWORD pSidLength
  774. );
  775. BOOL
  776. AuthzpGetAllGroupsByName(
  777. IN PUNICODE_STRING pusUserName,
  778. IN PUNICODE_STRING pusDomainName,
  779. IN DWORD Flags,
  780. OUT PSID_AND_ATTRIBUTES *ppSidAttr,
  781. OUT PDWORD pSidCount,
  782. OUT PDWORD pSidLength
  783. );
  784. BOOL
  785. AuthzpAllocateAndInitializeClientContext(
  786. OUT PAUTHZI_CLIENT_CONTEXT *ppCC,
  787. IN PAUTHZI_CLIENT_CONTEXT Server,
  788. IN DWORD Revision,
  789. IN LUID Identifier,
  790. IN LARGE_INTEGER ExpirationTime,
  791. IN DWORD Flags,
  792. IN DWORD SidCount,
  793. IN DWORD SidLength,
  794. IN PSID_AND_ATTRIBUTES Sids,
  795. IN DWORD RestrictedSidCount,
  796. IN DWORD RestrictedSidLength,
  797. IN PSID_AND_ATTRIBUTES RestrictedSids,
  798. IN DWORD PrivilegeCount,
  799. IN DWORD PrivilegeLength,
  800. IN PLUID_AND_ATTRIBUTES Privileges,
  801. IN LUID AuthenticationId,
  802. IN PAUTHZI_HANDLE AuthzHandleHead,
  803. IN PAUTHZI_RESOURCE_MANAGER pRM
  804. );
  805. BOOL
  806. AuthzpAddDynamicSidsToToken(
  807. IN PAUTHZI_CLIENT_CONTEXT pCC,
  808. IN PAUTHZI_RESOURCE_MANAGER pRM,
  809. IN PVOID DynamicGroupsArgs,
  810. IN PSID_AND_ATTRIBUTES Sids,
  811. IN DWORD SidLength,
  812. IN DWORD SidCount,
  813. IN PSID_AND_ATTRIBUTES RestrictedSids,
  814. IN DWORD RestrictedSidLength,
  815. IN DWORD RestrictedSidCount,
  816. IN PLUID_AND_ATTRIBUTES Privileges,
  817. IN DWORD PrivilegeLength,
  818. IN DWORD PrivilegeCount,
  819. IN BOOL bAllocated
  820. );
  821. BOOL
  822. AuthzpExamineSingleSacl(
  823. IN PAUTHZI_CLIENT_CONTEXT pCC,
  824. IN PAUTHZ_ACCESS_REQUEST pRequest,
  825. IN ACCESS_MASK AccessMask,
  826. IN PACL pAcl,
  827. IN PSID pOwnerSid,
  828. IN UCHAR AuditMaskType,
  829. IN BOOL bMaximumFailed,
  830. OUT PAUTHZ_ACCESS_REPLY pReply,
  831. OUT PBOOL pbGenerateAudit
  832. );
  833. BOOL
  834. AuthzpExamineSacl(
  835. IN PAUTHZI_CLIENT_CONTEXT pCC,
  836. IN PAUTHZ_ACCESS_REQUEST pRequest,
  837. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  838. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  839. IN DWORD OptionalSecurityDescriptorCount,
  840. IN PAUTHZ_ACCESS_REPLY pReply,
  841. OUT PBOOL pbGenerateAudit
  842. );
  843. BOOL
  844. AuthzpExamineSaclForObjectTypeList(
  845. IN PAUTHZI_CLIENT_CONTEXT pCC,
  846. IN PAUTHZ_ACCESS_REQUEST pRequest,
  847. IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
  848. IN PSECURITY_DESCRIPTOR *OptionalSecurityDescriptorArray OPTIONAL,
  849. IN DWORD OptionalSecurityDescriptorCount,
  850. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  851. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  852. OUT PBOOL pbGenerateSuccessAudit,
  853. OUT PBOOL pbGenerateFailureAudit
  854. );
  855. BOOL
  856. AuthzpExamineSingleSaclForObjectTypeList(
  857. IN PAUTHZI_CLIENT_CONTEXT pCC,
  858. IN PAUTHZ_ACCESS_REQUEST pRequest,
  859. IN PACL pAcl,
  860. IN PSID pOwnerSid,
  861. IN PAUTHZ_ACCESS_REPLY pReply,
  862. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  863. OUT PBOOL pbGenerateSuccessAudit,
  864. OUT PBOOL pbGenerateFailureAudit
  865. );
  866. VOID
  867. AuthzpSetAuditInfoForObjectType(
  868. IN PAUTHZ_ACCESS_REPLY pReply,
  869. IN OUT PIOBJECT_TYPE_LIST LocalTypeList,
  870. IN DWORD StartIndex,
  871. IN ACCESS_MASK AceAccessMask,
  872. IN ACCESS_MASK DesiredAccessMask,
  873. IN UCHAR AceFlags,
  874. OUT PBOOL pbGenerateSuccessAudit,
  875. OUT PBOOL pbGenerateFailureAudit
  876. );
  877. BOOL
  878. AuthzpCreateAndLogAudit(
  879. IN DWORD AuditTypeFlag,
  880. IN PAUTHZI_CLIENT_CONTEXT pAuthzClientContext,
  881. IN PAUTHZI_AUDIT_EVENT pAuditEvent,
  882. IN PAUTHZI_RESOURCE_MANAGER pRM,
  883. IN PIOBJECT_TYPE_LIST LocalTypeList,
  884. IN PAUTHZ_ACCESS_REQUEST pRequest,
  885. IN PAUTHZ_ACCESS_REPLY pReply
  886. );
  887. VOID
  888. AuthzpFillReplyStructureFromCachedGrantedAccessMask(
  889. IN OUT PAUTHZ_ACCESS_REPLY pReply,
  890. IN ACCESS_MASK DesiredAccess,
  891. IN PACCESS_MASK GrantedAccessMask
  892. );
  893. BOOL
  894. AuthzpSendAuditToLsa(
  895. IN AUDIT_HANDLE hAuditContext,
  896. IN DWORD Flags,
  897. IN PAUDIT_PARAMS pAuditParams,
  898. IN PVOID Reserved
  899. );
  900. BOOL
  901. AuthzpEnQueueAuditEvent(
  902. PAUTHZI_AUDIT_QUEUE pQueue,
  903. PAUTHZ_AUDIT_QUEUE_ENTRY pAudit
  904. );
  905. BOOL
  906. AuthzpEnQueueAuditEventMonitor(
  907. PAUTHZI_AUDIT_QUEUE pQueue,
  908. PAUTHZ_AUDIT_QUEUE_ENTRY pAudit
  909. );
  910. BOOL
  911. AuthzpMarshallAuditParams(
  912. OUT PAUDIT_PARAMS * ppMarshalledAuditParams,
  913. IN PAUDIT_PARAMS pAuditParams
  914. );
  915. ULONG
  916. AuthzpDeQueueThreadWorker(
  917. LPVOID lpParameter
  918. );
  919. #define AUTHZ_SID_HASH_LOW_MASK 0xf
  920. #define AUTHZ_SID_HASH_HIGH_MASK 0xf0
  921. #define AUTHZ_SID_HASH_HIGH 16
  922. #define AUTHZ_SID_HASH_LOOKUP(table, byte) (((table)[(byte) & 0xf]) & ((table)[AUTHZ_SID_HASH_HIGH + (((byte) & 0xf0) >> 4)]))
  923. VOID
  924. AuthzpInitSidHash(
  925. IN PSID_AND_ATTRIBUTES pSidAttr,
  926. IN ULONG SidCount,
  927. OUT PAUTHZI_SID_HASH_ENTRY pHash
  928. );
  929. BOOL
  930. AuthzpGetThreadTokenInfo(
  931. OUT PSID* pUserSid,
  932. OUT PLUID pAuthenticationId
  933. );
  934. BOOL
  935. AuthzpGetProcessTokenInfo(
  936. OUT PSID* ppUserSid,
  937. OUT PLUID pAuthenticationId
  938. );
  939. VOID
  940. AuthzpReferenceAuditEventType(
  941. IN AUTHZ_AUDIT_EVENT_TYPE_HANDLE
  942. );
  943. BOOL
  944. AuthzpDereferenceAuditEventType(
  945. IN OUT AUTHZ_AUDIT_EVENT_TYPE_HANDLE
  946. );
  947. BOOL
  948. AuthzpEveryoneIncludesAnonymous(
  949. );
  950. BOOL
  951. AuthzpComputeSkipFlagsForWellKnownSid(
  952. IN PSID UserSid,
  953. OUT PDWORD Flags
  954. );
  955. BOOL
  956. AuthzpConstructPolicyPerUserAuditing(
  957. IN ULONGLONG RawPolicy,
  958. OUT PTOKEN_AUDIT_POLICY pTokenPolicy,
  959. IN OUT PULONG TokenPolicyLength
  960. );
  961. BOOL
  962. AuthzpConstructRegistryPolicyPerUserAuditing(
  963. IN PTOKEN_AUDIT_POLICY pPolicy,
  964. OUT PULONGLONG pRegPolicy
  965. );
  966. #define AUTHZP_INIT_PARAMS_SKIP_HEADER 0x2
  967. #define AUTHZP_INIT_PARAMS_SOURCE_INFO 0x4
  968. #define AUTHZP_INIT_PARAMS_SOURCE_DS 0x8
  969. #define AUTHZP_PARAM_FREE_SID 0x80000000
  970. AUTHZAPI
  971. BOOL
  972. WINAPI
  973. AuthzpInitializeAuditParamsV(
  974. IN DWORD dwFlags,
  975. OUT PAUDIT_PARAMS pParams,
  976. IN OUT PSID* ppUserSid,
  977. IN PCWSTR SubsystemName,
  978. IN USHORT AuditId,
  979. IN USHORT NumParams,
  980. IN va_list arglist
  981. );
  982. BOOL
  983. AuthzpRegisterAuditEvent(
  984. IN PAUTHZ_AUDIT_EVENT_TYPE_OLD pAuditEventType,
  985. OUT PAUDIT_HANDLE phAuditContext
  986. );
  987. BOOL
  988. AuthzpUnregisterAuditEvent(
  989. IN OUT AUDIT_HANDLE* phAuditContext
  990. );
  991. #endif