mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 15:02:59 +00:00
[NTOSKRNL]
Implement TokenAuditPolicy case in NtSetInformationToken svn path=/trunk/; revision=62108
This commit is contained in:
parent
07871ff52a
commit
2650b7a979
1 changed files with 115 additions and 8 deletions
|
@ -17,6 +17,18 @@
|
||||||
#pragma alloc_text(INIT, SepInitializeTokenImplementation)
|
#pragma alloc_text(INIT, SepInitializeTokenImplementation)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <ntlsa.h>
|
||||||
|
|
||||||
|
typedef struct _TOKEN_AUDIT_POLICY_INFORMATION
|
||||||
|
{
|
||||||
|
ULONG PolicyCount;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ULONG Category;
|
||||||
|
UCHAR Value;
|
||||||
|
} Policies[1];
|
||||||
|
} TOKEN_AUDIT_POLICY_INFORMATION, *PTOKEN_AUDIT_POLICY_INFORMATION;
|
||||||
|
|
||||||
/* GLOBALS ********************************************************************/
|
/* GLOBALS ********************************************************************/
|
||||||
|
|
||||||
POBJECT_TYPE SeTokenObjectType = NULL;
|
POBJECT_TYPE SeTokenObjectType = NULL;
|
||||||
|
@ -39,11 +51,11 @@ static const INFORMATION_CLASS_INFO SeTokenInformationClass[] = {
|
||||||
ICI_SQ_SAME( 0, 0, 0),
|
ICI_SQ_SAME( 0, 0, 0),
|
||||||
|
|
||||||
/* TokenUser */
|
/* TokenUser */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_USER), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_USER), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenGroups */
|
/* TokenGroups */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_GROUPS), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_GROUPS), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenPrivileges */
|
/* TokenPrivileges */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_PRIVILEGES), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_PRIVILEGES), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenOwner */
|
/* TokenOwner */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_OWNER), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_OWNER), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenPrimaryGroup */
|
/* TokenPrimaryGroup */
|
||||||
|
@ -51,13 +63,13 @@ static const INFORMATION_CLASS_INFO SeTokenInformationClass[] = {
|
||||||
/* TokenDefaultDacl */
|
/* TokenDefaultDacl */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_DEFAULT_DACL), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_DEFAULT_DACL), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenSource */
|
/* TokenSource */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_SOURCE), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_SOURCE), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenType */
|
/* TokenType */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_TYPE), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_TYPE), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
||||||
/* TokenImpersonationLevel */
|
/* TokenImpersonationLevel */
|
||||||
ICI_SQ_SAME( sizeof(SECURITY_IMPERSONATION_LEVEL), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(SECURITY_IMPERSONATION_LEVEL), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
||||||
/* TokenStatistics */
|
/* TokenStatistics */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_STATISTICS), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_STATISTICS), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET_SIZE_VARIABLE ),
|
||||||
/* TokenRestrictedSids */
|
/* TokenRestrictedSids */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_GROUPS), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_GROUPS), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
||||||
/* TokenSessionId */
|
/* TokenSessionId */
|
||||||
|
@ -69,9 +81,9 @@ static const INFORMATION_CLASS_INFO SeTokenInformationClass[] = {
|
||||||
/* TokenSandBoxInert */
|
/* TokenSandBoxInert */
|
||||||
ICI_SQ_SAME( sizeof(ULONG), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(ULONG), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
||||||
/* TokenAuditPolicy */
|
/* TokenAuditPolicy */
|
||||||
ICI_SQ_SAME( /* FIXME */0, sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
ICI_SQ_SAME( /* FIXME */0, sizeof(ULONG), ICIF_QUERY | ICIF_SET | ICIF_QUERY_SIZE_VARIABLE ),
|
||||||
/* TokenOrigin */
|
/* TokenOrigin */
|
||||||
ICI_SQ_SAME( sizeof(TOKEN_ORIGIN), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE ),
|
ICI_SQ_SAME( sizeof(TOKEN_ORIGIN), sizeof(ULONG), ICIF_QUERY | ICIF_SET | ICIF_QUERY_SIZE_VARIABLE ),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
@ -1945,13 +1957,108 @@ NtSetInformationToken(IN HANDLE TokenHandle,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
|
case TokenAuditPolicy:
|
||||||
|
{
|
||||||
|
PTOKEN_AUDIT_POLICY_INFORMATION PolicyInformation =
|
||||||
|
(PTOKEN_AUDIT_POLICY_INFORMATION)TokenInformation;
|
||||||
|
SEP_AUDIT_POLICY AuditPolicy;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
ProbeForRead(PolicyInformation,
|
||||||
|
FIELD_OFFSET(TOKEN_AUDIT_POLICY_INFORMATION,
|
||||||
|
Policies[PolicyInformation->PolicyCount]),
|
||||||
|
sizeof(ULONG));
|
||||||
|
|
||||||
|
/* Loop all policies in the structure */
|
||||||
|
for (i = 0; i < PolicyInformation->PolicyCount; i++)
|
||||||
|
{
|
||||||
|
/* Set the corresponding bits in the packed structure */
|
||||||
|
switch (PolicyInformation->Policies[i].Category)
|
||||||
|
{
|
||||||
|
case AuditCategorySystem:
|
||||||
|
AuditPolicy.PolicyElements.System = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryLogon:
|
||||||
|
AuditPolicy.PolicyElements.Logon = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryObjectAccess:
|
||||||
|
AuditPolicy.PolicyElements.ObjectAccess = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryPrivilegeUse:
|
||||||
|
AuditPolicy.PolicyElements.PrivilegeUse = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryDetailedTracking:
|
||||||
|
AuditPolicy.PolicyElements.DetailedTracking = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryPolicyChange:
|
||||||
|
AuditPolicy.PolicyElements.PolicyChange = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryAccountManagement:
|
||||||
|
AuditPolicy.PolicyElements.AccountManagement = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryDirectoryServiceAccess:
|
||||||
|
AuditPolicy.PolicyElements.DirectoryServiceAccess = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AuditCategoryAccountLogon:
|
||||||
|
AuditPolicy.PolicyElements.AccountLogon = PolicyInformation->Policies[i].Value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
goto Cleanup;
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
if (!SeSinglePrivilegeCheck(SeTcbPrivilege,
|
||||||
|
PreviousMode))
|
||||||
|
{
|
||||||
|
Status = STATUS_PRIVILEGE_NOT_HELD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lock the token */
|
||||||
|
SepAcquireTokenLockExclusive(Token);
|
||||||
|
|
||||||
|
/* Set the new audit policy */
|
||||||
|
Token->AuditPolicy = AuditPolicy;
|
||||||
|
|
||||||
|
/* Unlock the token */
|
||||||
|
SepReleaseTokenLock(Token);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
case TokenOrigin:
|
||||||
{
|
{
|
||||||
DPRINT1("Unhandled TokenInformationClass: 0x%lx\n",
|
DPRINT1("Unhandled TokenInformationClass: 0x%lx\n",
|
||||||
TokenInformationClass);
|
TokenInformationClass);
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
DPRINT1("Invalid TokenInformationClass: 0x%lx\n",
|
||||||
|
TokenInformationClass);
|
||||||
|
Status = STATUS_INVALID_INFO_CLASS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Cleanup:
|
Cleanup:
|
||||||
ObDereferenceObject(Token);
|
ObDereferenceObject(Token);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue