[NTOSKRNL]

Implement ObSetHandleAttributes. Rename the ObIsKernelHandle macro to ObpIsKernelHandle to avoid ambiguities (ObIsKernelHandle is a public Vista+ API). Check for NtCurrentProcess and NtCurrentThread in ObpIsKernelHandle, since those are always non-kernel handles.

svn path=/trunk/; revision=61037
This commit is contained in:
Timo Kreuzer 2013-11-18 14:27:01 +00:00
parent 10ec38c1a9
commit 91105c7915
5 changed files with 71 additions and 26 deletions

View file

@ -61,9 +61,11 @@
#else
#define KERNEL_HANDLE_FLAG 0x80000000
#endif
#define ObIsKernelHandle(Handle, ProcessorMode) \
(((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \
((ProcessorMode) == KernelMode))
#define ObpIsKernelHandle(Handle, ProcessorMode) \
((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \
((ProcessorMode) == KernelMode) && \
((Handle) != NtCurrentProcess()) && \
((Handle) != NtCurrentThread()))
//
// Converts to and from a Kernel Handle to a normal handle

View file

@ -1714,7 +1714,7 @@ ObpCloseHandle(IN HANDLE Handle,
return STATUS_INVALID_HANDLE;
/* Check if we're dealing with a kernel handle */
if (ObIsKernelHandle(Handle, AccessMode))
if (ObpIsKernelHandle(Handle, AccessMode))
{
/* Use the kernel table and convert the handle */
HandleTable = ObpKernelHandleTable;
@ -2490,7 +2490,7 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
PassedAccessState->SecurityDescriptor =
TempBuffer->ObjectCreateInfo.SecurityDescriptor;
}
/* Validate the access mask */
Status = ObpValidateAccessMask(PassedAccessState);
if (!NT_SUCCESS(Status))
@ -3197,8 +3197,52 @@ ObSetHandleAttributes(IN HANDLE Handle,
IN POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags,
IN KPROCESSOR_MODE PreviousMode)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
OBP_SET_HANDLE_ATTRIBUTES_CONTEXT SetHandleAttributesContext;
BOOLEAN Result, AttachedToSystemProcess = FALSE;
PHANDLE_TABLE HandleTable;
KAPC_STATE ApcState;
PAGED_CODE();
/* Check if this is a kernel handle */
if (ObpIsKernelHandle(Handle, PreviousMode))
{
/* Use the kernel table and convert the handle */
HandleTable = ObpKernelHandleTable;
Handle = ObKernelHandleToHandle(Handle);
/* Check if we're not in the system process */
if (PsGetCurrentProcess() != PsInitialSystemProcess)
{
/* Attach to the system process */
KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState);
AttachedToSystemProcess = TRUE;
}
}
else
{
/* Get the current process' handle table */
HandleTable = PsGetCurrentProcess()->ObjectTable;
}
/* Initialize the handle attribute context */
SetHandleAttributesContext.PreviousMode = PreviousMode;
SetHandleAttributesContext.Information = *HandleFlags;
/* Invoke the ObpSetHandleAttributes callback */
Result = ExChangeHandle(HandleTable,
Handle,
ObpSetHandleAttributes,
(ULONG_PTR)&SetHandleAttributesContext);
/* Did we attach to the system process? */
if (AttachedToSystemProcess)
{
/* Detach from it */
KeUnstackDetachProcess(&ApcState);
}
/* Return the result as an NTSTATUS value */
return Result ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
}
/*++
@ -3364,13 +3408,12 @@ NtDuplicateObject(IN HANDLE SourceProcessHandle,
return Status;
}
#undef ObIsKernelHandle
BOOLEAN
NTAPI
ObIsKernelHandle(IN HANDLE Handle)
{
/* We know we're kernel mode, so just check for the kernel handle flag */
return (BOOLEAN)(((ULONG_PTR)Handle & KERNEL_HANDLE_FLAG) != 0);
/* Use the inlined version. We know we are in kernel mode. */
return ObpIsKernelHandle(Handle, KernelMode);
}
/* EOF */

View file

@ -1675,14 +1675,14 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
switch (ObjectInformationClass)
{
case ObjectHandleFlagInformation:
/* Validate the length */
if (Length != sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
{
/* Invalid length */
return STATUS_INFO_LENGTH_MISMATCH;
}
/* Save the previous mode */
Context.PreviousMode = ExGetPreviousMode();
@ -1714,7 +1714,7 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
}
/* Check if this is a kernel handle */
if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
if (ObpIsKernelHandle(ObjectHandle, Context.PreviousMode))
{
/* Get the actual handle */
ObjectHandle = ObKernelHandleToHandle(ObjectHandle);
@ -1752,9 +1752,9 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
/* De-attach if we were attached, and return status */
if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
break;
case ObjectSessionInformation:
/* Only a system process can do this */
PreviousMode = ExGetPreviousMode();
if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode))
@ -1766,8 +1766,8 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
else
{
/* Get the object directory */
Status = ObReferenceObjectByHandle(ObjectHandle,
0,
Status = ObReferenceObjectByHandle(ObjectHandle,
0,
ObDirectoryType,
PreviousMode,
(PVOID*)&Directory,
@ -1781,7 +1781,7 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
}
}
break;
default:
/* Unsupported class */
Status = STATUS_INVALID_INFO_CLASS;

View file

@ -62,17 +62,17 @@ ObDeassignSecurity(IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor)
EX_FAST_REF FastRef;
ULONG Count;
PSECURITY_DESCRIPTOR OldSecurityDescriptor;
/* Get the fast reference and capture it */
FastRef = *(PEX_FAST_REF)SecurityDescriptor;
/* Don't free again later */
*SecurityDescriptor = NULL;
/* Get the descriptor and reference count */
OldSecurityDescriptor = ExGetObjectFastReference(FastRef);
Count = ExGetCountFastReference(FastRef);
/* Dereference the descriptor */
ObDereferenceSecurityDescriptor(OldSecurityDescriptor, Count + 1);
@ -162,11 +162,11 @@ ObSetSecurityDescriptorInfo(IN PVOID Object,
OldValue = ExCompareSwapFastReference(FastRef,
CachedDescriptor,
OldDescriptor);
/* Get the security descriptor */
SecurityDescriptor = ExGetObjectFastReference(OldValue);
Count = ExGetCountFastReference(OldValue);
/* Make sure the swap worked */
if (SecurityDescriptor == OldDescriptor)
{
@ -1010,7 +1010,7 @@ ObQueryObjectAuditingByHandle(IN HANDLE Handle,
PAGED_CODE();
/* Check if we're dealing with a kernel handle */
if (ObIsKernelHandle(Handle, ExGetPreviousMode()))
if (ObpIsKernelHandle(Handle, ExGetPreviousMode()))
{
/* Use the kernel table and convert the handle */
HandleTable = ObpKernelHandleTable;

View file

@ -142,7 +142,7 @@ NtWaitForMultipleObjects(IN ULONG ObjectCount,
do
{
/* Use the right Executive Handle */
if (ObIsKernelHandle(Handles[i], PreviousMode))
if (ObpIsKernelHandle(Handles[i], PreviousMode))
{
/* Use the System Handle Table and decode */
HandleTable = ObpKernelHandleTable;