[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 #else
#define KERNEL_HANDLE_FLAG 0x80000000 #define KERNEL_HANDLE_FLAG 0x80000000
#endif #endif
#define ObIsKernelHandle(Handle, ProcessorMode) \ #define ObpIsKernelHandle(Handle, ProcessorMode) \
(((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \ ((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \
((ProcessorMode) == KernelMode)) ((ProcessorMode) == KernelMode) && \
((Handle) != NtCurrentProcess()) && \
((Handle) != NtCurrentThread()))
// //
// Converts to and from a Kernel Handle to a normal handle // 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; return STATUS_INVALID_HANDLE;
/* Check if we're dealing with a kernel 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 */ /* Use the kernel table and convert the handle */
HandleTable = ObpKernelHandleTable; HandleTable = ObpKernelHandleTable;
@ -2490,7 +2490,7 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes,
PassedAccessState->SecurityDescriptor = PassedAccessState->SecurityDescriptor =
TempBuffer->ObjectCreateInfo.SecurityDescriptor; TempBuffer->ObjectCreateInfo.SecurityDescriptor;
} }
/* Validate the access mask */ /* Validate the access mask */
Status = ObpValidateAccessMask(PassedAccessState); Status = ObpValidateAccessMask(PassedAccessState);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -3197,8 +3197,52 @@ ObSetHandleAttributes(IN HANDLE Handle,
IN POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags, IN POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleFlags,
IN KPROCESSOR_MODE PreviousMode) IN KPROCESSOR_MODE PreviousMode)
{ {
UNIMPLEMENTED; OBP_SET_HANDLE_ATTRIBUTES_CONTEXT SetHandleAttributesContext;
return STATUS_NOT_IMPLEMENTED; 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; return Status;
} }
#undef ObIsKernelHandle
BOOLEAN BOOLEAN
NTAPI NTAPI
ObIsKernelHandle(IN HANDLE Handle) ObIsKernelHandle(IN HANDLE Handle)
{ {
/* We know we're kernel mode, so just check for the kernel handle flag */ /* Use the inlined version. We know we are in kernel mode. */
return (BOOLEAN)(((ULONG_PTR)Handle & KERNEL_HANDLE_FLAG) != 0); return ObpIsKernelHandle(Handle, KernelMode);
} }
/* EOF */ /* EOF */

View file

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

View file

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

View file

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