mirror of
https://github.com/reactos/reactos.git
synced 2025-07-25 00:33:38 +00:00
[NTOSKRNL]
- Implement SeAppendPrivileges(). svn path=/trunk/; revision=47384
This commit is contained in:
parent
f0910f33d3
commit
f9cd9b9a5b
1 changed files with 64 additions and 5 deletions
|
@ -281,15 +281,74 @@ SeReleaseLuidAndAttributesArray(PLUID_AND_ATTRIBUTES Privilege,
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SeAppendPrivileges(PACCESS_STATE AccessState,
|
SeAppendPrivileges(IN OUT PACCESS_STATE AccessState,
|
||||||
PPRIVILEGE_SET Privileges)
|
IN PPRIVILEGE_SET Privileges)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PAUX_ACCESS_DATA AuxData;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
ULONG OldPrivilegeSetSize;
|
||||||
|
ULONG NewPrivilegeSetSize;
|
||||||
|
PPRIVILEGE_SET PrivilegeSet;
|
||||||
|
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
/* Get the Auxiliary Data */
|
||||||
|
AuxData = AccessState->AuxData;
|
||||||
|
|
||||||
|
/* Calculate the size of the old privilege set */
|
||||||
|
OldPrivilegeSetSize = sizeof(PRIVILEGE_SET) +
|
||||||
|
(AuxData->PrivilegeSet->PrivilegeCount - 1) * sizeof(LUID_AND_ATTRIBUTES);
|
||||||
|
|
||||||
|
if (AuxData->PrivilegeSet->PrivilegeCount +
|
||||||
|
Privileges->PrivilegeCount > INITIAL_PRIVILEGE_COUNT)
|
||||||
|
{
|
||||||
|
/* Calculate the size of the new privilege set */
|
||||||
|
NewPrivilegeSetSize = OldPrivilegeSetSize +
|
||||||
|
Privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES);
|
||||||
|
|
||||||
|
/* Allocate a new privilege set */
|
||||||
|
PrivilegeSet = ExAllocatePool(PagedPool, NewPrivilegeSetSize);
|
||||||
|
if (PrivilegeSet == NULL)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* Copy original privileges from the acess state */
|
||||||
|
RtlCopyMemory(PrivilegeSet,
|
||||||
|
AuxData->PrivilegeSet,
|
||||||
|
OldPrivilegeSetSize);
|
||||||
|
|
||||||
|
/* Append privileges from the privilege set*/
|
||||||
|
RtlCopyMemory((PVOID)((ULONG_PTR)PrivilegeSet + OldPrivilegeSetSize),
|
||||||
|
(PVOID)((ULONG_PTR)Privileges + sizeof(PRIVILEGE_SET) - sizeof(LUID_AND_ATTRIBUTES)),
|
||||||
|
Privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
|
||||||
|
|
||||||
|
/* Adjust the number of privileges in the new privilege set */
|
||||||
|
PrivilegeSet->PrivilegeCount += Privileges->PrivilegeCount;
|
||||||
|
|
||||||
|
/* Free the old privilege set if it was allocated */
|
||||||
|
if (AccessState->PrivilegesAllocated == TRUE)
|
||||||
|
ExFreePool(AuxData->PrivilegeSet);
|
||||||
|
|
||||||
|
/* Now we are using an allocated privilege set */
|
||||||
|
AccessState->PrivilegesAllocated = TRUE;
|
||||||
|
|
||||||
|
/* Assign the new privileges to the access state */
|
||||||
|
AuxData->PrivilegeSet = PrivilegeSet;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Append privileges */
|
||||||
|
RtlCopyMemory((PVOID)((ULONG_PTR)AuxData->PrivilegeSet + OldPrivilegeSetSize),
|
||||||
|
(PVOID)((ULONG_PTR)Privileges + sizeof(PRIVILEGE_SET) - sizeof(LUID_AND_ATTRIBUTES)),
|
||||||
|
Privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES));
|
||||||
|
|
||||||
|
/* Adjust the number of privileges in the target privilege set */
|
||||||
|
AuxData->PrivilegeSet->PrivilegeCount += Privileges->PrivilegeCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue