mirror of
https://github.com/reactos/reactos.git
synced 2025-05-17 00:03:13 +00:00
[NTOSKRNL]: Implement NtSetInformationObject(ObjectSessionInformation).
[NTOSKRNL]: Implement NtQueryInformationProcess(ProcessLUIDDeviceMapsEnabled). svn path=/trunk/; revision=55603
This commit is contained in:
parent
95bb53eb1a
commit
a371650c63
3 changed files with 146 additions and 81 deletions
|
@ -137,6 +137,13 @@ PsReturnProcessNonPagedPoolQuota(
|
||||||
IN SIZE_T Amount
|
IN SIZE_T Amount
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTKERNELAPI
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
PsGetCurrentProcessSessionId(
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process Impersonation Functions
|
// Process Impersonation Functions
|
||||||
//
|
//
|
||||||
|
|
|
@ -1605,7 +1605,7 @@ NtQueryObject(IN HANDLE ObjectHandle,
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
/* Dereference the object if we had referenced it */
|
/* Dereference the object if we had referenced it */
|
||||||
if (Object) ObDereferenceObject (Object);
|
if (Object) ObDereferenceObject(Object);
|
||||||
|
|
||||||
/* Return status */
|
/* Return status */
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -1645,91 +1645,128 @@ NtSetInformationObject(IN HANDLE ObjectHandle,
|
||||||
OBP_SET_HANDLE_ATTRIBUTES_CONTEXT Context;
|
OBP_SET_HANDLE_ATTRIBUTES_CONTEXT Context;
|
||||||
PVOID ObjectTable;
|
PVOID ObjectTable;
|
||||||
KAPC_STATE ApcState;
|
KAPC_STATE ApcState;
|
||||||
|
POBJECT_DIRECTORY Directory;
|
||||||
|
KPROCESSOR_MODE PreviousMode;
|
||||||
BOOLEAN AttachedToProcess = FALSE;
|
BOOLEAN AttachedToProcess = FALSE;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Validate the information class */
|
/* Validate the information class */
|
||||||
if (ObjectInformationClass != ObjectHandleFlagInformation)
|
switch (ObjectInformationClass)
|
||||||
{
|
{
|
||||||
/* Invalid class */
|
case ObjectHandleFlagInformation:
|
||||||
return STATUS_INVALID_INFO_CLASS;
|
|
||||||
|
/* Validate the length */
|
||||||
|
if (Length != sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
|
||||||
|
{
|
||||||
|
/* Invalid length */
|
||||||
|
return STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save the previous mode */
|
||||||
|
Context.PreviousMode = ExGetPreviousMode();
|
||||||
|
|
||||||
|
/* Check if we were called from user mode */
|
||||||
|
if (Context.PreviousMode != KernelMode)
|
||||||
|
{
|
||||||
|
/* Enter SEH */
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
/* Probe and capture the attribute buffer */
|
||||||
|
ProbeForRead(ObjectInformation,
|
||||||
|
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
||||||
|
sizeof(BOOLEAN));
|
||||||
|
Context.Information = *(POBJECT_HANDLE_ATTRIBUTE_INFORMATION)
|
||||||
|
ObjectInformation;
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
/* Return the exception code */
|
||||||
|
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Just copy the buffer directly */
|
||||||
|
Context.Information = *(POBJECT_HANDLE_ATTRIBUTE_INFORMATION)
|
||||||
|
ObjectInformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if this is a kernel handle */
|
||||||
|
if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
|
||||||
|
{
|
||||||
|
/* Get the actual handle */
|
||||||
|
ObjectHandle = ObKernelHandleToHandle(ObjectHandle);
|
||||||
|
ObjectTable = ObpKernelHandleTable;
|
||||||
|
|
||||||
|
/* Check if we're not in the system process */
|
||||||
|
if (PsGetCurrentProcess() != PsInitialSystemProcess)
|
||||||
|
{
|
||||||
|
/* Attach to it */
|
||||||
|
KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState);
|
||||||
|
AttachedToProcess = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use the current table */
|
||||||
|
ObjectTable = PsGetCurrentProcess()->ObjectTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Change the handle attributes */
|
||||||
|
if (!ExChangeHandle(ObjectTable,
|
||||||
|
ObjectHandle,
|
||||||
|
ObpSetHandleAttributes,
|
||||||
|
(ULONG_PTR)&Context))
|
||||||
|
{
|
||||||
|
/* Some failure */
|
||||||
|
Status = STATUS_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We are done */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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))
|
||||||
|
{
|
||||||
|
/* Fail */
|
||||||
|
DPRINT1("Privilege not held\n");
|
||||||
|
Status = STATUS_PRIVILEGE_NOT_HELD;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Get the object directory */
|
||||||
|
Status = ObReferenceObjectByHandle(ObjectHandle,
|
||||||
|
0,
|
||||||
|
ObDirectoryType,
|
||||||
|
PreviousMode,
|
||||||
|
(PVOID*)&Directory,
|
||||||
|
NULL);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* FIXME: Missng locks */
|
||||||
|
/* Set its session ID */
|
||||||
|
Directory->SessionId = PsGetCurrentProcessSessionId();
|
||||||
|
ObDereferenceObject(Directory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Unsupported class */
|
||||||
|
Status = STATUS_INVALID_INFO_CLASS;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate the length */
|
|
||||||
if (Length != sizeof (OBJECT_HANDLE_ATTRIBUTE_INFORMATION))
|
|
||||||
{
|
|
||||||
/* Invalid length */
|
|
||||||
return STATUS_INFO_LENGTH_MISMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Save the previous mode */
|
|
||||||
Context.PreviousMode = ExGetPreviousMode();
|
|
||||||
|
|
||||||
/* Check if we were called from user mode */
|
|
||||||
if (Context.PreviousMode != KernelMode)
|
|
||||||
{
|
|
||||||
/* Enter SEH */
|
|
||||||
_SEH2_TRY
|
|
||||||
{
|
|
||||||
/* Probe and capture the attribute buffer */
|
|
||||||
ProbeForRead(ObjectInformation,
|
|
||||||
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
|
|
||||||
sizeof(BOOLEAN));
|
|
||||||
Context.Information = *(POBJECT_HANDLE_ATTRIBUTE_INFORMATION)
|
|
||||||
ObjectInformation;
|
|
||||||
}
|
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
|
||||||
{
|
|
||||||
/* Return the exception code */
|
|
||||||
_SEH2_YIELD(return _SEH2_GetExceptionCode());
|
|
||||||
}
|
|
||||||
_SEH2_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Just copy the buffer directly */
|
|
||||||
Context.Information = *(POBJECT_HANDLE_ATTRIBUTE_INFORMATION)
|
|
||||||
ObjectInformation;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if this is a kernel handle */
|
|
||||||
if (ObIsKernelHandle(ObjectHandle, Context.PreviousMode))
|
|
||||||
{
|
|
||||||
/* Get the actual handle */
|
|
||||||
ObjectHandle = ObKernelHandleToHandle(ObjectHandle);
|
|
||||||
ObjectTable = ObpKernelHandleTable;
|
|
||||||
|
|
||||||
/* Check if we're not in the system process */
|
|
||||||
if (PsGetCurrentProcess() != PsInitialSystemProcess)
|
|
||||||
{
|
|
||||||
/* Attach to it */
|
|
||||||
KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState);
|
|
||||||
AttachedToProcess = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Use the current table */
|
|
||||||
ObjectTable = PsGetCurrentProcess()->ObjectTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Change the handle attributes */
|
|
||||||
if (!ExChangeHandle(ObjectTable,
|
|
||||||
ObjectHandle,
|
|
||||||
ObpSetHandleAttributes,
|
|
||||||
(ULONG_PTR)&Context))
|
|
||||||
{
|
|
||||||
/* Some failure */
|
|
||||||
Status = STATUS_ACCESS_DENIED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We are done */
|
|
||||||
Status = STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* De-attach if we were attached, and return status */
|
|
||||||
if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -835,8 +835,29 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ProcessLUIDDeviceMapsEnabled:
|
case ProcessLUIDDeviceMapsEnabled:
|
||||||
DPRINT1("LUID Device Maps Not implemented: %lx\n", ProcessInformationClass);
|
/* Set the return length */
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Length = sizeof(ULONG);
|
||||||
|
if (ProcessInformationLength != Length)
|
||||||
|
{
|
||||||
|
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Indicate success */
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* Protect write in SEH */
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
/* Return the count of handles */
|
||||||
|
*(PULONG)ProcessInformation = FALSE;
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
/* Get the exception code */
|
||||||
|
Status = _SEH2_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ProcessExecuteFlags:
|
case ProcessExecuteFlags:
|
||||||
|
|
Loading…
Reference in a new issue