/*
  atsvc interface definition
*/

[ uuid("1ff70682-0a51-30e8-076d-740be8cee98b"),
  version(1.0),
  pointer_default(unique),
  helpstring("Microsoft AT-Scheduler Service"),
  endpoint("ncacn_np:[\\pipe\\atsvc]", "ncalrpc:")
] interface atsvc
{
	typedef [bitmap32bit] bitmap {
                First           =       0x00000001,
                Second          =       0x00000002,
                Third           =       0x00000004,
                Fourth          =       0x00000008,
                Fifth           =       0x00000010,
                Sixth           =       0x00000020,
                Seventh         =       0x00000040,
                Eight           =       0x00000080,
                Ninth           =       0x00000100,
                Tenth           =       0x00000200,
                Eleventh        =       0x00000400,
                Twelfth         =       0x00000800,
                Thitteenth      =       0x00001000,
                Fourteenth      =       0x00002000,
                Fifteenth       =       0x00004000,
                Sixteenth       =       0x00008000,
                Seventeenth     =       0x00010000,
                Eighteenth      =       0x00020000,
                Ninteenth       =       0x00040000,
                Twentyth        =       0x00080000,
                Twentyfirst     =       0x00100000,
                Twentysecond    =       0x00200000,
                Twentythird     =       0x00400000,
                Twentyfourth    =       0x00800000,
                Twentyfifth     =       0x01000000,
                Twentysixth     =       0x02000000,
                Twentyseventh   =       0x04000000,
                Twentyeighth    =       0x08000000,
                Twentyninth     =       0x10000000,
                Thirtieth       =       0x20000000,
                Thirtyfirst     =       0x40000000
        } atsvc_DaysOfMonth;

        typedef [bitmap8bit] bitmap {
                JOB_RUN_PERIODICALLY    = 0x01,
                JOB_EXEC_ERROR          = 0x02,
                JOB_RUNS_TODAY          = 0x04,
                JOB_ADD_CURRENT_DATE    = 0x08,
                JOB_NONINTERACTIVE      = 0x10
        } atsvc_Flags;

	typedef [bitmap8bit] bitmap {
		DAYSOFWEEK_MONDAY    = 0x01,
		DAYSOFWEEK_TUESDAY   = 0x02,
		DAYSOFWEEK_WEDNESDAY = 0x04,
		DAYSOFWEEK_THURSDAY  = 0x08,
		DAYSOFWEEK_FRIDAY    = 0x10,
		DAYSOFWEEK_SATURDAY  = 0x20,
		DAYSOFWEEK_SUNDAY    = 0x40
	} atsvc_DaysOfWeek;
	
	typedef struct {
		uint32 job_time;
		atsvc_DaysOfMonth days_of_month;
		atsvc_DaysOfWeek days_of_week;
		atsvc_Flags flags;
		[string,charset(UTF16)] uint16 *command;
	} atsvc_JobInfo;

	/******************/
	/* Function: 0x00 */
	[public] NTSTATUS atsvc_JobAdd(
		[in,unique,string,charset(UTF16)] uint16 *servername,
		[in] atsvc_JobInfo *job_info,
		[out,ref]	 uint32 *job_id
	);

	/******************/
	/* Function: 0x01 */
	[public] NTSTATUS atsvc_JobDel(
		[in,unique,string,charset(UTF16)] uint16 *servername,
		[in]	uint32 min_job_id,
		[in]	uint32 max_job_id
	);

	typedef struct {
		uint32 job_id;
		uint32 job_time;
		atsvc_DaysOfMonth days_of_month;
		atsvc_DaysOfWeek days_of_week;
		atsvc_Flags flags;
		[string,charset(UTF16)] uint16 *command;
	} atsvc_JobEnumInfo;

	typedef struct {
		uint32 entries_read;
		[size_is(entries_read)] atsvc_JobEnumInfo *first_entry;
	} atsvc_enum_ctr;

	/******************/
	/* Function: 0x02 */
	[public] NTSTATUS atsvc_JobEnum(
		[in,unique,string,charset(UTF16)] uint16 *servername,
		[in,out] 	 atsvc_enum_ctr *ctr,
		[in]	     uint32 preferred_max_len,
		[out,ref]	     uint32 *total_entries,
		[in,out,unique]     uint32 *resume_handle
	);

	/******************/
	/* Function: 0x03 */
	[public] NTSTATUS atsvc_JobGetInfo(
		[in,unique,string,charset(UTF16)]	uint16 *servername,
		[in]	uint32 job_id,
		[out]	atsvc_JobInfo **job_info
	);
}