mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 01:45:40 +00:00
- Use SeQuerySecurityDescriptorInfo() to retrieve an objects security descriptor.
- Disable debug messages. svn path=/trunk/; revision=10806
This commit is contained in:
parent
9071fcfe51
commit
a3105b78bf
1 changed files with 17 additions and 115 deletions
|
@ -11,6 +11,7 @@
|
||||||
/* INCLUDES *****************************************************************/
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
#include <ntoskrnl.h>
|
||||||
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
@ -154,19 +155,10 @@ NtQuerySecurityObject(IN HANDLE Handle,
|
||||||
{
|
{
|
||||||
POBJECT_HEADER Header;
|
POBJECT_HEADER Header;
|
||||||
PVOID Object;
|
PVOID Object;
|
||||||
PSECURITY_DESCRIPTOR ObjectSd;
|
|
||||||
PSID Owner = 0;
|
|
||||||
PSID Group = 0;
|
|
||||||
PACL Dacl = 0;
|
|
||||||
PACL Sacl = 0;
|
|
||||||
ULONG OwnerLength = 0;
|
|
||||||
ULONG GroupLength = 0;
|
|
||||||
ULONG DaclLength = 0;
|
|
||||||
ULONG SaclLength = 0;
|
|
||||||
ULONG Control = 0;
|
|
||||||
ULONG_PTR Current;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
DPRINT("NtQuerySecurityObject() called\n");
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(Handle,
|
Status = ObReferenceObjectByHandle(Handle,
|
||||||
(SecurityInformation & SACL_SECURITY_INFORMATION) ? ACCESS_SYSTEM_SECURITY : 0,
|
(SecurityInformation & SACL_SECURITY_INFORMATION) ? ACCESS_SYSTEM_SECURITY : 0,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -175,128 +167,34 @@ NtQuerySecurityObject(IN HANDLE Handle,
|
||||||
NULL);
|
NULL);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
DPRINT1("ObReferenceObjectByHandle() failed (Status %lx)\n", Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Header = BODY_TO_HEADER(Object);
|
Header = BODY_TO_HEADER(Object);
|
||||||
if (Header->ObjectType == NULL)
|
if (Header->ObjectType == NULL)
|
||||||
{
|
{
|
||||||
|
DPRINT1("Invalid object type\n");
|
||||||
ObDereferenceObject(Object);
|
ObDereferenceObject(Object);
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Header->ObjectType->Security != NULL)
|
if (Header->ObjectType->Security != NULL)
|
||||||
{
|
{
|
||||||
|
*ResultLength = Length;
|
||||||
Status = Header->ObjectType->Security(Object,
|
Status = Header->ObjectType->Security(Object,
|
||||||
QuerySecurityDescriptor,
|
QuerySecurityDescriptor,
|
||||||
SecurityInformation,
|
SecurityInformation,
|
||||||
SecurityDescriptor,
|
SecurityDescriptor,
|
||||||
&Length);
|
ResultLength);
|
||||||
*ResultLength = Length;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ObjectSd = Header->SecurityDescriptor;
|
*ResultLength = Length;
|
||||||
|
Status = SeQuerySecurityDescriptorInfo(&SecurityInformation,
|
||||||
if (ObjectSd != NULL)
|
SecurityDescriptor,
|
||||||
{
|
ResultLength,
|
||||||
Control = SE_SELF_RELATIVE;
|
&Header->SecurityDescriptor);
|
||||||
if ((SecurityInformation & OWNER_SECURITY_INFORMATION) &&
|
|
||||||
(ObjectSd->Owner != NULL))
|
|
||||||
{
|
|
||||||
Owner = (PSID)((ULONG_PTR)ObjectSd->Owner + (ULONG_PTR)ObjectSd);
|
|
||||||
OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4);
|
|
||||||
Control |= (ObjectSd->Control & SE_OWNER_DEFAULTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((SecurityInformation & GROUP_SECURITY_INFORMATION) &&
|
|
||||||
(ObjectSd->Group != NULL))
|
|
||||||
{
|
|
||||||
Group = (PSID)((ULONG_PTR)ObjectSd->Group + (ULONG_PTR)ObjectSd);
|
|
||||||
GroupLength = ROUND_UP(RtlLengthSid(Group), 4);
|
|
||||||
Control |= (ObjectSd->Control & SE_GROUP_DEFAULTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((SecurityInformation & DACL_SECURITY_INFORMATION) &&
|
|
||||||
(ObjectSd->Control & SE_DACL_PRESENT))
|
|
||||||
{
|
|
||||||
if (ObjectSd->Dacl != NULL)
|
|
||||||
{
|
|
||||||
Dacl = (PACL)((ULONG_PTR)ObjectSd->Dacl + (ULONG_PTR)ObjectSd);
|
|
||||||
DaclLength = ROUND_UP((ULONG)Dacl->AclSize, 4);
|
|
||||||
}
|
|
||||||
Control |= (ObjectSd->Control & (SE_DACL_DEFAULTED | SE_DACL_PRESENT));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((SecurityInformation & SACL_SECURITY_INFORMATION) &&
|
|
||||||
(ObjectSd->Control & SE_SACL_PRESENT))
|
|
||||||
{
|
|
||||||
if (ObjectSd->Sacl != NULL)
|
|
||||||
{
|
|
||||||
Sacl = (PACL)((ULONG_PTR)ObjectSd->Sacl + (ULONG_PTR)ObjectSd);
|
|
||||||
SaclLength = ROUND_UP(Sacl->AclSize, 4);
|
|
||||||
}
|
|
||||||
Control |= (ObjectSd->Control & (SE_SACL_DEFAULTED | SE_SACL_PRESENT));
|
|
||||||
}
|
|
||||||
|
|
||||||
*ResultLength = OwnerLength + GroupLength +
|
|
||||||
DaclLength + SaclLength + sizeof(SECURITY_DESCRIPTOR);
|
|
||||||
if (Length >= *ResultLength)
|
|
||||||
{
|
|
||||||
RtlCreateSecurityDescriptor(SecurityDescriptor,
|
|
||||||
SECURITY_DESCRIPTOR_REVISION1);
|
|
||||||
SecurityDescriptor->Control = Control;
|
|
||||||
|
|
||||||
Current = (ULONG_PTR)SecurityDescriptor + sizeof(SECURITY_DESCRIPTOR);
|
|
||||||
|
|
||||||
if (OwnerLength != 0)
|
|
||||||
{
|
|
||||||
RtlCopyMemory((PVOID)Current,
|
|
||||||
Owner,
|
|
||||||
OwnerLength);
|
|
||||||
SecurityDescriptor->Owner = (PSID)(Current - (ULONG_PTR)SecurityDescriptor);
|
|
||||||
Current += OwnerLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GroupLength != 0)
|
|
||||||
{
|
|
||||||
RtlCopyMemory((PVOID)Current,
|
|
||||||
Group,
|
|
||||||
GroupLength);
|
|
||||||
SecurityDescriptor->Group = (PSID)(Current - (ULONG_PTR)SecurityDescriptor);
|
|
||||||
Current += GroupLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DaclLength != 0)
|
|
||||||
{
|
|
||||||
RtlCopyMemory((PVOID)Current,
|
|
||||||
Dacl,
|
|
||||||
DaclLength);
|
|
||||||
SecurityDescriptor->Dacl = (PACL)(Current - (ULONG_PTR)SecurityDescriptor);
|
|
||||||
Current += DaclLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SaclLength != 0)
|
|
||||||
{
|
|
||||||
RtlCopyMemory((PVOID)Current,
|
|
||||||
Sacl,
|
|
||||||
SaclLength);
|
|
||||||
SecurityDescriptor->Sacl = (PACL)(Current - (ULONG_PTR)SecurityDescriptor);
|
|
||||||
Current += SaclLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Status = STATUS_BUFFER_TOO_SMALL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*ResultLength = 0;
|
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ObDereferenceObject(Object);
|
ObDereferenceObject(Object);
|
||||||
|
@ -329,6 +227,8 @@ NtSetSecurityObject(IN HANDLE Handle,
|
||||||
ULONG_PTR Current;
|
ULONG_PTR Current;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
DPRINT("NtSetSecurityObject() called\n");
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(Handle,
|
Status = ObReferenceObjectByHandle(Handle,
|
||||||
(SecurityInformation & SACL_SECURITY_INFORMATION) ? ACCESS_SYSTEM_SECURITY : 0,
|
(SecurityInformation & SACL_SECURITY_INFORMATION) ? ACCESS_SYSTEM_SECURITY : 0,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -337,12 +237,14 @@ NtSetSecurityObject(IN HANDLE Handle,
|
||||||
NULL);
|
NULL);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
DPRINT1("ObReferenceObjectByHandle() failed (Status %lx)\n", Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Header = BODY_TO_HEADER(Object);
|
Header = BODY_TO_HEADER(Object);
|
||||||
if (Header->ObjectType != NULL)
|
if (Header->ObjectType == NULL)
|
||||||
{
|
{
|
||||||
|
DPRINT1("Invalid object type\n");
|
||||||
ObDereferenceObject(Object);
|
ObDereferenceObject(Object);
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue