[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;
@ -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

@ -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);

View file

@ -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;