diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index e397f1d0a04..89757acb1d6 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -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 diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 0f1e01871b4..e5afd03a018 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -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 */ diff --git a/reactos/lib/kernel32/process/job.c b/reactos/lib/kernel32/process/job.c new file mode 100644 index 00000000000..c68935cef9f --- /dev/null +++ b/reactos/lib/kernel32/process/job.c @@ -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 + +#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 */