. JobMgt.c, .
, 6.4, Get JobNumber. , , . . , . , .
6.4. JobMgt:
/* . */
#include "EvryThng.h"
#include "JobMgt.h" /* . */
void GetJobMgtFileName (LPTSTR);
LONG GetJobNumber(PROCESS_INFORMATION *pProcessInfo, LPCTSTR Command)
/* . */
{
HANDLE hJobData, hProcess;
JM_JOB JobRecord;
DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;
TCHAR JobMgtFileName[MAX_PATH];
OVERLAPPED RegionStart;
if (!GetJobMgtFileName(JobMgtFileName)) return 1;
/* "\tmp\UserName.JobMgt" */
hJobData = CreateFile(JobMgtFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hJobData == INVALID_HANDLE_VALUE) return 1;
/* . */
RegionStart.Offset = 0;
RegionStart.OffsetHigh = 0;
RegionStart.hEvent = (HANDLE)0;
FsLow = GetFileSize(hJobData, &FsHigh);
LockFileEx(hJobData, LOCKFILE_EXCLUSIVE_LOCK, 0, FsLow + SJM_JOB, 0, &RegionStart);
__try {
/* . */
while(ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL) && (nXfer > 0)) {
if (JobRecord.ProcessId == 0) break;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, JobRecord.ProcessId);
if (hProcess == NULL) break;
if (GetExitCodeProcess(hProcess, &ExitCode) && (ExitCode!= STILL_ACTIVE)) break;
JobNumber++;
}
/* , . */
if (nXfer!= 0) /* . . */
SetFilePointer(hJobData, (LONG)SJM_JOB, NULL, FILE_CURRENT);
JobRecord.ProcessId = pProcessInfo->dwProcessId;
_tcsnccpy(JobRecord.CommandLine, Command, MAX_PATH);
WriteFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);
} /* try-. */
__finally {
UnlockFileEx(hJobData, 0, FsLow + SJM_JOB, 0, &RegionStart);
CloseHandle(hJobData);
}
return JobNumber + 1;
}