You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
9.6 KiB
389 lines
9.6 KiB
//____________________________________________________________________________
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1996.
|
|
//
|
|
// File: jobs.h
|
|
//
|
|
// Contents: Definition of the shell IDLIST type for Jobs
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 1/5/1996 RaviR Created
|
|
//
|
|
//____________________________________________________________________________
|
|
|
|
#include <mstask.h>
|
|
|
|
#ifndef _JOBIDL_HXX__
|
|
#define _JOBIDL_HXX__
|
|
|
|
#include <common.hxx>
|
|
#include <StrSafe.h>
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Job folder details view columns enumeration.
|
|
//____________________________________________________________________________
|
|
|
|
enum COLUMNS
|
|
{
|
|
COLUMN_NAME,
|
|
COLUMN_SCHEDULE,
|
|
COLUMN_NEXTRUNTIME,
|
|
COLUMN_LASTRUNTIME,
|
|
COLUMN_STATUS,
|
|
COLUMN_LASTEXITCODE,
|
|
COLUMN_CREATOR,
|
|
COLUMN_COUNT
|
|
};
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// class: CJobID
|
|
//
|
|
// synopsis: IDLIST type struct for Jobs
|
|
//____________________________________________________________________________
|
|
//
|
|
|
|
#define IDJOB_BUFFER_SIZE (MAX_PATH * 3)
|
|
|
|
#define MASK_BITS (0xFFF0)
|
|
#define VALID_ID (0x00A0)
|
|
#define ID_JOB (0x00A1)
|
|
#define ID_QUEUE (0x00A2)
|
|
#define ID_NEWJOB (0x00A3)
|
|
#define ID_NEWQUEUE (0x00A4)
|
|
#define ID_TEMPLATE (0x00A5) // create new task template object
|
|
|
|
|
|
enum EJobStatus
|
|
{
|
|
ejsRunning = 1,
|
|
ejsNotScheduled,
|
|
ejsMissed,
|
|
ejsWouldNotStart,
|
|
ejsBadAcct,
|
|
ejsResAcct
|
|
};
|
|
|
|
class CJobID
|
|
{
|
|
public:
|
|
|
|
CJobID();
|
|
|
|
HRESULT Load(LPCTSTR pszFolderPath, LPTSTR pszJobPath);
|
|
HRESULT Rename(CJobID &jidIn, LPCOLESTR lpszName);
|
|
CJobID *Clone(void);
|
|
void LoadDummy(LPTSTR pszJobName);
|
|
void InitToTemplate();
|
|
|
|
LPTSTR GetNextRunTimeString(TCHAR tcBuff[], UINT cchBuff,
|
|
BOOL fForComparison,
|
|
LPSHELLDETAILS lpDetails=NULL);
|
|
|
|
|
|
ULONG GetSize() { return _cb; }
|
|
|
|
BOOL IsJob() { return _id == ID_JOB; }
|
|
BOOL IsTemplate() { return _id == ID_TEMPLATE; }
|
|
|
|
LPTSTR GetExtension()
|
|
{
|
|
switch (_id)
|
|
{
|
|
case ID_JOB: return TSZ_DOTJOB;
|
|
// case ID_QUEUE: return g_szDotQue;
|
|
default: return TEXT("");
|
|
}
|
|
}
|
|
|
|
BOOL IsRunning() { return _status == ejsRunning; }
|
|
BOOL IsJobNotScheduled() { return _status == ejsNotScheduled; }
|
|
BOOL WasRunMissed() { return _status == ejsMissed; }
|
|
BOOL DidJobStartFail() { return _status == ejsWouldNotStart; }
|
|
BOOL DidJobBadAcct() { return _status == ejsBadAcct; }
|
|
BOOL DidJobRestAcct() { return _status == ejsResAcct; }
|
|
|
|
|
|
ULONG GetJobFlags() { return _ulJobFlags; }
|
|
BOOL IsJobFlagOn(ULONG flag) { return (_ulJobFlags & flag) ? TRUE : FALSE; }
|
|
|
|
|
|
TASK_TRIGGER & GetTrigger() { return _sJobTrigger; }
|
|
TASK_TRIGGER_TYPE GetTriggerType() { return _sJobTrigger.TriggerType; }
|
|
BOOL IsTriggerFlagOn(ULONG flag)
|
|
{ return (_sJobTrigger.rgFlags & flag) ? TRUE : FALSE; }
|
|
USHORT GetTriggerCount() { return _cTriggers; }
|
|
|
|
|
|
SYSTEMTIME & GetLastRunTime() { return _stLastRunTime; }
|
|
SYSTEMTIME & GetNextRunTime() { return _stNextRunTime; }
|
|
DWORD & GetExitCode() { return _dwExitCode; }
|
|
|
|
|
|
LPTSTR GetAppName() { return _cBuf; }
|
|
LPTSTR GetCreator() { return &_cBuf[_oCreator]; }
|
|
LPTSTR GetPath() { return &_cBuf[_oPath];; }
|
|
LPTSTR GetName() { return &_cBuf[_oName]; }
|
|
|
|
|
|
size_t GetAppNameOffset()
|
|
{ return offsetof(CJobID, _cBuf); }
|
|
size_t GetCreatorOffset()
|
|
{ return (offsetof(CJobID, _cBuf) + _oCreator * sizeof(TCHAR)); }
|
|
size_t GetPathOffset()
|
|
{ return (offsetof(CJobID, _cBuf) + _oPath * sizeof(TCHAR)); }
|
|
size_t GetNameOffset()
|
|
{ return (offsetof(CJobID, _cBuf) + _oName * sizeof(TCHAR)); }
|
|
|
|
#if (DBG == 1)
|
|
VOID Validate();
|
|
#endif // (DBG == 1)
|
|
|
|
USHORT _cb; // This must be a USHORT & be the first member,
|
|
// as dictated by the idlist definition.
|
|
|
|
USHORT _id; // To validate that the given pidl is indeed
|
|
// one of our own. And also to determine
|
|
// if it is a Job/NewJob/Queue/NewQueue
|
|
|
|
USHORT _status; // 1 => running, 0 => idle status
|
|
USHORT _oCreator;
|
|
USHORT _oPath;
|
|
USHORT _oName;
|
|
ULONG _ulJobFlags;
|
|
SYSTEMTIME _stLastRunTime;
|
|
SYSTEMTIME _stNextRunTime;
|
|
FILETIME _ftCreation;
|
|
FILETIME _ftLastWrite;
|
|
DWORD _dwExitCode;
|
|
USHORT _cTriggers;
|
|
TASK_TRIGGER _sJobTrigger; // structure job trigger
|
|
|
|
//
|
|
// The contents of the buffer are as follows:
|
|
// _cBuf[0] = application name
|
|
// _cBuf[_oCreator] = creator name
|
|
// _cBuf[_oPath] = job object path
|
|
// _cBuf[_oName] = job object name
|
|
//
|
|
|
|
TCHAR _cBuf[IDJOB_BUFFER_SIZE];
|
|
|
|
private:
|
|
|
|
void
|
|
_NullTerminate();
|
|
|
|
};
|
|
|
|
typedef CJobID UNALIGNED * PJOBID;
|
|
typedef CJobID UNALIGNED * UNALIGNED * PPJOBID;
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CJobID::CJobID
|
|
//
|
|
// Synopsis: ctor
|
|
//
|
|
// History: 12-08-1997 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
inline
|
|
CJobID::CJobID():
|
|
_cb(0)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CJobID::_NullTerminate
|
|
//
|
|
// Synopsis: Ensure that the two bytes just past the declared size of
|
|
// this object are zero.
|
|
//
|
|
// History: 05-30-1997 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
inline void
|
|
CJobID::_NullTerminate()
|
|
{
|
|
// Sanity check that we won't write outside of this
|
|
Win4Assert(_cb + sizeof(USHORT) <= sizeof(CJobID));
|
|
|
|
if (_cb + sizeof(USHORT) <= sizeof(CJobID))
|
|
{
|
|
UNALIGNED USHORT *pusNextCB = (UNALIGNED USHORT *)(((BYTE *)this) + _cb);
|
|
*pusNextCB = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void
|
|
CJobID::LoadDummy(
|
|
LPTSTR pszJobName)
|
|
{
|
|
_id = ID_JOB;
|
|
_oPath = _oName = 0;
|
|
|
|
// lstrcpy(_cBuf, PathFindFileName(pszJobName));
|
|
StringCchCopy(_cBuf, IDJOB_BUFFER_SIZE, PathFindFileName(pszJobName));
|
|
|
|
TCHAR * ptcExtn = PathFindExtension(_cBuf);
|
|
|
|
if (ptcExtn)
|
|
{
|
|
*ptcExtn = TEXT('\0');
|
|
}
|
|
|
|
_cb = offsetof(CJobID, _cBuf) + (lstrlen(_cBuf) + 1) * sizeof(TCHAR);
|
|
_NullTerminate();
|
|
}
|
|
|
|
#define JOBID_MIN_SIZE (sizeof(CJobID) - IDJOB_BUFFER_SIZE * sizeof(TCHAR))
|
|
|
|
inline
|
|
BOOL
|
|
JF_IsValidID(LPCITEMIDLIST pidl)
|
|
{
|
|
if (pidl)
|
|
{
|
|
if (pidl->mkid.cb >= JOBID_MIN_SIZE)
|
|
{
|
|
return ((((PJOBID)pidl)->_id & MASK_BITS) == VALID_ID);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// class: CJob CIDA
|
|
//
|
|
// synopsis: format of CF_JOBIDLIST
|
|
//____________________________________________________________________________
|
|
//
|
|
|
|
typedef HGLOBAL HJOBIDA;
|
|
|
|
class CJobIDA
|
|
{
|
|
public:
|
|
PJOBID GetItem(UINT i) {
|
|
return (i >= cidl) ? NULL : (PJOBID)(((LPBYTE)this) + aoffset[i]);
|
|
}
|
|
|
|
PJOBID operator [](UINT i) {
|
|
return (i >= cidl) ? NULL : (PJOBID)(((LPBYTE)this) + aoffset[i]);
|
|
}
|
|
|
|
UINT cidl; // number of CJobIDs
|
|
UINT aoffset[1]; // offset to the CJobIDs
|
|
};
|
|
|
|
typedef CJobIDA * PJOBIDA;
|
|
|
|
|
|
HJOBIDA
|
|
HJOBIDA_Create(
|
|
UINT cidl,
|
|
PJOBID * apjidl);
|
|
|
|
void
|
|
HJOBIDA_Free(
|
|
HJOBIDA hJobIDA);
|
|
|
|
HDROP
|
|
HDROPFromJobIDList(
|
|
LPCTSTR pszFolderPath,
|
|
UINT cidl,
|
|
PJOBID * apjidl);
|
|
|
|
HGLOBAL
|
|
CreateIDListArray(
|
|
LPCITEMIDLIST pidlFolder,
|
|
UINT cidl,
|
|
PJOBID *apjidl);
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Functions to clone and free a LPCITEMIDLIST array.
|
|
//____________________________________________________________________________
|
|
|
|
LPITEMIDLIST*
|
|
ILA_Clone(
|
|
UINT cidl,
|
|
LPCITEMIDLIST* apidl);
|
|
|
|
|
|
VOID
|
|
ILA_Free(
|
|
UINT cidl,
|
|
LPITEMIDLIST* apidl);
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Functions to access the CJob & CSchedule
|
|
//____________________________________________________________________________
|
|
|
|
HRESULT
|
|
JFGetJobScheduler(
|
|
LPTSTR pszMachine,
|
|
ITaskScheduler ** ppJobScheduler,
|
|
LPCTSTR * ppszFolderPath);
|
|
|
|
|
|
HRESULT
|
|
JFCopyJob(
|
|
HWND hwndOwner,
|
|
TCHAR szFileFrom[],
|
|
LPCTSTR pszFolderPath,
|
|
BOOL fMove);
|
|
|
|
|
|
HRESULT
|
|
GetTriggerStringFromTrigger(
|
|
TASK_TRIGGER * pJobTrigger,
|
|
LPTSTR psTrigger,
|
|
UINT cchTrigger,
|
|
LPSHELLDETAILS lpDetails);
|
|
|
|
|
|
BOOL
|
|
IsAScheduleObject(
|
|
TCHAR szFile[]);
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Misc functions.
|
|
//____________________________________________________________________________
|
|
|
|
LPITEMIDLIST *
|
|
SHIDLFromJobIDL(
|
|
UINT cidl,
|
|
PJOBID * apjidl);
|
|
|
|
|
|
|
|
#endif // _JOBIDL_HXX__
|