implemented IsProcessInJob(), AssignProcessToJobObject(), QueryInformationJobObject(), SetInformationJobObject() and TerminateJobObject(), all untested though

svn path=/trunk/; revision=11005
This commit is contained in:
Thomas Bluemel 2004-09-23 18:02:19 +00:00
parent 04c8adbef9
commit b85ef6c64a
3 changed files with 253 additions and 79 deletions

View file

@ -1,4 +1,4 @@
# $Id: makefile,v 1.85 2004/09/21 19:17:26 weiden Exp $
# $Id: makefile,v 1.86 2004/09/23 18:02:19 weiden Exp $
PATH_TO_TOP = ../..
@ -62,6 +62,7 @@ PROCESS_OBJECTS = \
process/proc.o \
process/cmdline.o \
process/create.o \
process/job.o \
process/session.o
STRING_OBJECTS = string/lstring.o

View file

@ -1,4 +1,4 @@
/* $Id: stubs.c,v 1.89 2004/09/22 10:58:06 weiden Exp $
/* $Id: stubs.c,v 1.90 2004/09/23 18:02:19 weiden Exp $
*
* KERNEL32.DLL stubs (STUB functions)
* Remove from this file, if you implement them.
@ -571,20 +571,6 @@ AllocateUserPhysicalPages(
return 0;
}
/*
* @unimplemented
*/
BOOL
STDCALL
AssignProcessToJobObject(
HANDLE hJob,
HANDLE hProcess
)
{
STUB;
return 0;
}
/*
* @unimplemented
*/
@ -870,21 +856,6 @@ HeapSetInformation (
return 0;
}
/*
* @unimplemented
*/
BOOL
STDCALL
IsProcessInJob (
HANDLE ProcessHandle,
HANDLE JobHandle,
PBOOL Result
)
{
STUB;
return 0;
}
/*
* @unimplemented
*/
@ -961,23 +932,6 @@ QueryActCtxW(
return 0;
}
/*
* @unimplemented
*/
BOOL
STDCALL
QueryInformationJobObject(
HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
LPVOID lpJobObjectInformation,
DWORD cbJobObjectInformationLength,
LPDWORD lpReturnLength
)
{
STUB;
return 0;
}
/*
* @unimplemented
*/
@ -1157,23 +1111,6 @@ RestoreLastError(
STUB;
}
/*
* @unimplemented
*/
BOOL
STDCALL
SetInformationJobObject(
HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
LPVOID lpJobObjectInformation,
DWORD cbJobObjectInformationLength
)
{
STUB;
return 0;
}
/*
* @unimplemented
*/
@ -1201,20 +1138,6 @@ SetThreadExecutionState(
return 0;
}
/*
* @unimplemented
*/
BOOL
STDCALL
TerminateJobObject(
HANDLE hJob,
UINT uExitCode
)
{
STUB;
return 0;
}
/*
* @unimplemented
*/

View file

@ -0,0 +1,250 @@
/* $Id: job.c,v 1.1 2004/09/23 18:02:19 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/kernel32/process/job.c
* PURPOSE: Job functions
* PROGRAMMER: Thomas Weidenmueller
* UPDATE HISTORY:
* Created 9/23/2004
*/
/* INCLUDES ****************************************************************/
#include <k32.h>
#define NDEBUG
#include "../include/debug.h"
/* FUNCTIONS ****************************************************************/
/*
* @implemented
*/
BOOL
STDCALL
IsProcessInJob(HANDLE ProcessHandle,
HANDLE JobHandle,
PBOOL Result)
{
NTSTATUS Status;
Status = NtIsProcessInJob(ProcessHandle, JobHandle);
if(NT_SUCCESS(Status))
{
*Result = (Status == STATUS_PROCESS_IN_JOB);
return TRUE;
}
SetLastErrorByStatus(Status);
return FALSE;
}
/*
* @implemented
*/
BOOL
STDCALL
AssignProcessToJobObject(HANDLE hJob,
HANDLE hProcess)
{
NTSTATUS Status;
Status = NtAssignProcessToJobObject(hJob, hProcess);
if(!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
return TRUE;
}
/*
* @implemented
*/
BOOL
STDCALL
QueryInformationJobObject(HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
LPVOID lpJobObjectInformation,
DWORD cbJobObjectInformationLength,
LPDWORD lpReturnLength)
{
NTSTATUS Status;
Status = NtQueryInformationJobObject(hJob,
JobObjectInformationClass,
lpJobObjectInformation,
cbJobObjectInformationLength,
lpReturnLength);
if(NT_SUCCESS(Status))
{
PJOBOBJECT_BASIC_LIMIT_INFORMATION BasicInfo;
switch(JobObjectInformationClass)
{
case JobObjectBasicLimitInformation:
BasicInfo = (PJOBOBJECT_BASIC_LIMIT_INFORMATION)lpJobObjectInformation;
break;
case JobObjectExtendedLimitInformation:
BasicInfo = &((PJOBOBJECT_EXTENDED_LIMIT_INFORMATION)lpJobObjectInformation)->BasicLimitInformation;
break;
default:
BasicInfo = NULL;
break;
}
if(BasicInfo != NULL)
{
/* we need to convert the process priority classes in the
JOBOBJECT_BASIC_LIMIT_INFORMATION structure the same way as
GetPriorityClass() converts it! */
switch(BasicInfo->PriorityClass)
{
case PROCESS_PRIORITY_CLASS_IDLE:
BasicInfo->PriorityClass = IDLE_PRIORITY_CLASS;
break;
case PROCESS_PRIORITY_CLASS_BELOW_NORMAL:
BasicInfo->PriorityClass = BELOW_NORMAL_PRIORITY_CLASS;
break;
case PROCESS_PRIORITY_CLASS_NORMAL:
BasicInfo->PriorityClass = NORMAL_PRIORITY_CLASS;
break;
case PROCESS_PRIORITY_CLASS_ABOVE_NORMAL:
BasicInfo->PriorityClass = ABOVE_NORMAL_PRIORITY_CLASS;
break;
case PROCESS_PRIORITY_CLASS_HIGH:
BasicInfo->PriorityClass = HIGH_PRIORITY_CLASS;
break;
case PROCESS_PRIORITY_CLASS_REALTIME:
BasicInfo->PriorityClass = REALTIME_PRIORITY_CLASS;
break;
default:
BasicInfo->PriorityClass = NORMAL_PRIORITY_CLASS;
break;
}
}
return TRUE;
}
SetLastErrorByStatus(Status);
return FALSE;
}
/*
* @implemented
*/
BOOL
STDCALL
SetInformationJobObject(HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
LPVOID lpJobObjectInformation,
DWORD cbJobObjectInformationLength)
{
JOBOBJECT_EXTENDED_LIMIT_INFORMATION ExtendedLimitInfo;
PJOBOBJECT_BASIC_LIMIT_INFORMATION BasicInfo;
PVOID ObjectInfo;
NTSTATUS Status;
switch(JobObjectInformationClass)
{
case JobObjectBasicLimitInformation:
if(cbJobObjectInformationLength != sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION))
{
SetLastError(ERROR_BAD_LENGTH);
return FALSE;
}
ObjectInfo = &ExtendedLimitInfo.BasicLimitInformation;
BasicInfo = (PJOBOBJECT_BASIC_LIMIT_INFORMATION)ObjectInfo;
RtlCopyMemory(ObjectInfo, lpJobObjectInformation, cbJobObjectInformationLength);
break;
case JobObjectExtendedLimitInformation:
if(cbJobObjectInformationLength != sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION))
{
SetLastError(ERROR_BAD_LENGTH);
return FALSE;
}
ObjectInfo = &ExtendedLimitInfo;
BasicInfo = &ExtendedLimitInfo.BasicLimitInformation;
RtlCopyMemory(ObjectInfo, lpJobObjectInformation, cbJobObjectInformationLength);
break;
default:
ObjectInfo = lpJobObjectInformation;
BasicInfo = NULL;
break;
}
if(BasicInfo != NULL)
{
/* we need to convert the process priority classes in the
JOBOBJECT_BASIC_LIMIT_INFORMATION structure the same way as
SetPriorityClass() converts it! */
switch(BasicInfo->PriorityClass)
{
case IDLE_PRIORITY_CLASS:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_IDLE;
break;
case BELOW_NORMAL_PRIORITY_CLASS:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_BELOW_NORMAL;
break;
case NORMAL_PRIORITY_CLASS:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL;
break;
case ABOVE_NORMAL_PRIORITY_CLASS:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_ABOVE_NORMAL;
break;
case HIGH_PRIORITY_CLASS:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_HIGH;
break;
case REALTIME_PRIORITY_CLASS:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_REALTIME;
break;
default:
BasicInfo->PriorityClass = PROCESS_PRIORITY_CLASS_NORMAL;
break;
}
}
Status = NtSetInformationJobObject(hJob,
JobObjectInformationClass,
ObjectInfo,
cbJobObjectInformationLength);
if(!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
return TRUE;
}
/*
* @implemented
*/
BOOL
STDCALL
TerminateJobObject(HANDLE hJob,
UINT uExitCode)
{
NTSTATUS Status;
Status = NtTerminateJobObject(hJob, uExitCode);
if(!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
return TRUE;
}
/* EOF */