ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

job.c
Go to the documentation of this file.
00001 /* $Id: job.c 54306 2011-11-06 00:09:33Z pschweitzer $
00002  *
00003  * COPYRIGHT:       See COPYING in the top level directory
00004  * PROJECT:         ReactOS system libraries
00005  * FILE:            lib/kernel32/process/job.c
00006  * PURPOSE:         Job functions
00007  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
00008  * UPDATE HISTORY:
00009  *                  Created 9/23/2004
00010  */
00011 
00012 /* INCLUDES *******************************************************************/
00013 
00014 #include <k32.h>
00015 
00016 #define NDEBUG
00017 #include <debug.h>
00018 
00019 /* FUNCTIONS ******************************************************************/
00020 
00021 /*
00022  * @implemented
00023  */
00024 HANDLE
00025 WINAPI
00026 CreateJobObjectA(IN LPSECURITY_ATTRIBUTES lpJobAttributes,
00027                  IN LPCSTR lpName)
00028 {
00029     /* Call the W(ide) function */
00030     ConvertWin32AnsiObjectApiToUnicodeApi(JobObject, lpName, lpJobAttributes);
00031 }
00032 
00033 /*
00034  * @implemented
00035  */
00036 HANDLE
00037 WINAPI
00038 CreateJobObjectW(IN LPSECURITY_ATTRIBUTES lpJobAttributes,
00039                  IN LPCWSTR lpName)
00040 {
00041     /* Create the NT object */
00042     CreateNtObjectFromWin32Api(JobObject, JobObject, JOB, lpJobAttributes, lpName);
00043 }
00044 
00045 /*
00046  * @implemented
00047  */
00048 HANDLE
00049 WINAPI
00050 OpenJobObjectW(IN DWORD dwDesiredAccess,
00051                IN BOOL bInheritHandle,
00052                IN LPCWSTR lpName)
00053 {
00054     /* Open the NT object */
00055     OpenNtObjectFromWin32Api(JobObject, dwDesiredAccess, bInheritHandle, lpName);
00056 }
00057 
00058 
00059 /*
00060  * @implemented
00061  */
00062 HANDLE
00063 WINAPI
00064 OpenJobObjectA(IN DWORD dwDesiredAccess,
00065                IN BOOL bInheritHandle,
00066                IN LPCSTR lpName)
00067 {
00068     /* Call the W(ide) function */
00069     ConvertOpenWin32AnsiObjectApiToUnicodeApi(JobObject, dwDesiredAccess, bInheritHandle, lpName);
00070 }
00071 
00072 /*
00073  * @implemented
00074  */
00075 BOOL
00076 WINAPI
00077 IsProcessInJob(IN HANDLE ProcessHandle,
00078                IN HANDLE JobHandle,
00079                OUT PBOOL Result)
00080 {
00081     NTSTATUS Status;
00082 
00083     Status = NtIsProcessInJob(ProcessHandle, JobHandle);
00084     if (NT_SUCCESS(Status))
00085     {
00086         *Result = (Status == STATUS_PROCESS_IN_JOB);
00087         return TRUE;
00088     }
00089 
00090     BaseSetLastNTError(Status);
00091     return FALSE;
00092 }
00093 
00094 /*
00095  * @implemented
00096  */
00097 BOOL
00098 WINAPI
00099 AssignProcessToJobObject(IN HANDLE hJob,
00100                          IN HANDLE hProcess)
00101 {
00102     NTSTATUS Status;
00103 
00104     Status = NtAssignProcessToJobObject(hJob, hProcess);
00105     if (!NT_SUCCESS(Status))
00106     {
00107         BaseSetLastNTError(Status);
00108         return FALSE;
00109     }
00110 
00111     return TRUE;
00112 }
00113 
00114 /*
00115  * @implemented
00116  */
00117 BOOL
00118 WINAPI
00119 QueryInformationJobObject(IN HANDLE hJob,
00120                           IN JOBOBJECTINFOCLASS JobObjectInformationClass,
00121                           IN LPVOID lpJobObjectInformation,
00122                           IN DWORD cbJobObjectInformationLength,
00123                           OUT LPDWORD lpReturnLength)
00124 {
00125     NTSTATUS Status;
00126     PVOID JobInfo;
00127     JOBOBJECT_EXTENDED_LIMIT_INFORMATION LocalInfo;
00128     ULONG ExpectedSize;
00129 
00130     if (JobObjectInformationClass == JobObjectBasicLimitInformation)
00131     {
00132         ExpectedSize = sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION);
00133         JobInfo = &LocalInfo;
00134     }
00135     else if (JobObjectInformationClass == JobObjectExtendedLimitInformation)
00136     {
00137         ExpectedSize = sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION);
00138         JobInfo = &LocalInfo;
00139     }
00140     else
00141     {
00142         ExpectedSize = cbJobObjectInformationLength;
00143         JobInfo = lpJobObjectInformation;
00144     }
00145 
00146     if (cbJobObjectInformationLength != ExpectedSize)
00147     {
00148         BaseSetLastNTError(STATUS_INFO_LENGTH_MISMATCH);
00149         return FALSE;
00150     }
00151 
00152     Status = NtQueryInformationJobObject(hJob,
00153                                          JobObjectInformationClass,
00154                                          JobInfo,
00155                                          ExpectedSize,
00156                                          lpReturnLength);
00157     if (NT_SUCCESS(Status))
00158     {
00159         if (JobInfo != &LocalInfo) return TRUE;
00160 
00161         switch (LocalInfo.BasicLimitInformation.PriorityClass)
00162         {
00163             case PROCESS_PRIORITY_CLASS_IDLE:
00164                 LocalInfo.BasicLimitInformation.PriorityClass =
00165                 IDLE_PRIORITY_CLASS;
00166                 break;
00167 
00168             case PROCESS_PRIORITY_CLASS_BELOW_NORMAL:
00169                 LocalInfo.BasicLimitInformation.PriorityClass =
00170                 BELOW_NORMAL_PRIORITY_CLASS;
00171                 break;
00172 
00173             case PROCESS_PRIORITY_CLASS_NORMAL:
00174                 LocalInfo.BasicLimitInformation.PriorityClass =
00175                 NORMAL_PRIORITY_CLASS;
00176                 break;
00177 
00178             case PROCESS_PRIORITY_CLASS_ABOVE_NORMAL:
00179                 LocalInfo.BasicLimitInformation.PriorityClass =
00180                 ABOVE_NORMAL_PRIORITY_CLASS;
00181                 break;
00182 
00183             case PROCESS_PRIORITY_CLASS_HIGH:
00184                 LocalInfo.BasicLimitInformation.PriorityClass =
00185                 HIGH_PRIORITY_CLASS;
00186                 break;
00187 
00188             case PROCESS_PRIORITY_CLASS_REALTIME:
00189                 LocalInfo.BasicLimitInformation.PriorityClass =
00190                 REALTIME_PRIORITY_CLASS;
00191                 break;
00192 
00193             default:
00194                 LocalInfo.BasicLimitInformation.PriorityClass =
00195                 NORMAL_PRIORITY_CLASS;
00196                 break;
00197         }
00198 
00199         RtlCopyMemory(lpJobObjectInformation, &LocalInfo, ExpectedSize);
00200         return TRUE;
00201     }
00202 
00203     BaseSetLastNTError(Status);
00204     return FALSE;
00205 }
00206 
00207 /*
00208  * @implemented
00209  */
00210 BOOL
00211 WINAPI
00212 SetInformationJobObject(IN HANDLE hJob,
00213                         IN JOBOBJECTINFOCLASS JobObjectInformationClass,
00214                         IN LPVOID lpJobObjectInformation,
00215                         IN DWORD cbJobObjectInformationLength)
00216 {
00217     NTSTATUS Status;
00218     PVOID JobInfo;
00219     JOBOBJECT_EXTENDED_LIMIT_INFORMATION LocalInfo;
00220     ULONG ExpectedSize;
00221     PVOID State = NULL;
00222     ULONG Privilege = SE_INC_BASE_PRIORITY_PRIVILEGE;
00223 
00224     if (JobObjectInformationClass == JobObjectBasicLimitInformation)
00225     {
00226         ExpectedSize = sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION);
00227         JobInfo = &LocalInfo;
00228     }
00229     else if (JobObjectInformationClass == JobObjectExtendedLimitInformation)
00230     {
00231         ExpectedSize = sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION);
00232         JobInfo = &LocalInfo;
00233     }
00234     else
00235     {
00236         ExpectedSize = cbJobObjectInformationLength;
00237         JobInfo = lpJobObjectInformation;
00238     }
00239 
00240     if (cbJobObjectInformationLength != ExpectedSize)
00241     {
00242         BaseSetLastNTError(STATUS_INFO_LENGTH_MISMATCH);
00243         return FALSE;
00244     }
00245 
00246     if (JobInfo == &LocalInfo)
00247     {
00248         RtlCopyMemory(&LocalInfo, lpJobObjectInformation, ExpectedSize);
00249 
00250         if (LocalInfo.BasicLimitInformation.LimitFlags &
00251             JOB_OBJECT_LIMIT_PRIORITY_CLASS)
00252         {
00253             switch (LocalInfo.BasicLimitInformation.PriorityClass)
00254             {
00255                 case IDLE_PRIORITY_CLASS:
00256                     LocalInfo.BasicLimitInformation.PriorityClass =
00257                     PROCESS_PRIORITY_CLASS_IDLE;
00258                     break;
00259 
00260                 case BELOW_NORMAL_PRIORITY_CLASS:
00261                     LocalInfo.BasicLimitInformation.PriorityClass =
00262                     PROCESS_PRIORITY_CLASS_BELOW_NORMAL;
00263                     break;
00264 
00265                 case NORMAL_PRIORITY_CLASS:
00266                     LocalInfo.BasicLimitInformation.PriorityClass =
00267                     PROCESS_PRIORITY_CLASS_NORMAL;
00268                     break;
00269 
00270                 case ABOVE_NORMAL_PRIORITY_CLASS:
00271                     LocalInfo.BasicLimitInformation.PriorityClass =
00272                     PROCESS_PRIORITY_CLASS_ABOVE_NORMAL;
00273                     break;
00274 
00275                 case HIGH_PRIORITY_CLASS:
00276                     LocalInfo.BasicLimitInformation.PriorityClass =
00277                     PROCESS_PRIORITY_CLASS_HIGH;
00278                     break;
00279 
00280                 case REALTIME_PRIORITY_CLASS:
00281                     LocalInfo.BasicLimitInformation.PriorityClass =
00282                     PROCESS_PRIORITY_CLASS_REALTIME;
00283                     break;
00284 
00285                 default:
00286                     LocalInfo.BasicLimitInformation.PriorityClass =
00287                     PROCESS_PRIORITY_CLASS_NORMAL;
00288                     break;
00289             }
00290         }
00291 
00292         if (LocalInfo.BasicLimitInformation.LimitFlags &
00293             JOB_OBJECT_LIMIT_WORKINGSET)
00294         {
00295             Status = RtlAcquirePrivilege(&Privilege, TRUE, FALSE, &State);
00296         }
00297     }
00298 
00299     Status = NtSetInformationJobObject(hJob,
00300                                        JobObjectInformationClass,
00301                                        JobInfo,
00302                                        ExpectedSize);
00303     if (NT_SUCCESS(Status))
00304     {
00305         if (State != NULL) RtlReleasePrivilege(State);
00306         return TRUE;
00307     }
00308 
00309     BaseSetLastNTError(Status);
00310     return FALSE;
00311 }
00312 
00313 /*
00314  * @implemented
00315  */
00316 BOOL
00317 WINAPI
00318 TerminateJobObject(IN HANDLE hJob,
00319                    IN UINT uExitCode)
00320 {
00321     NTSTATUS Status;
00322 
00323     Status = NtTerminateJobObject(hJob, uExitCode);
00324     if (!NT_SUCCESS(Status))
00325     {
00326         BaseSetLastNTError(Status);
00327         return FALSE;
00328     }
00329 
00330     return TRUE;
00331 }
00332 
00333 /*
00334  * @implemented
00335  */
00336 BOOL
00337 WINAPI
00338 CreateJobSet(IN ULONG NumJob,
00339              IN PJOB_SET_ARRAY UserJobSet,
00340              IN ULONG Flags)
00341 {
00342     NTSTATUS Status;
00343 
00344     Status = NtCreateJobSet(NumJob, UserJobSet, Flags);
00345     if (!NT_SUCCESS(Status))
00346     {
00347         BaseSetLastNTError(Status);
00348         return FALSE;
00349     }
00350 
00351     return TRUE;
00352 }
00353 
00354 /* EOF */

Generated on Sat May 26 2012 04:23:00 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.