Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenjob.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
1.7.6.1
|