#include "idl_types.h"

/*
	rap interface definition
*/

[
	pointer_default(unique),
	helper("../librpc/ndr/ndr_rap.h")
]
interface rap
{
	typedef [public,noprint] enum {
		NERR_Success = 0
	} rap_status;

	const int RAP_WshareEnum			= 0;
	const int RAP_WshareGetInfo			= 1;
	const int RAP_WshareSetInfo			= 2;
	const int RAP_WshareAdd				= 3;
	const int RAP_WshareDel				= 4;
	const int RAP_NetShareCheck			= 5;
	const int RAP_WsessionEnum			= 6;
	const int RAP_WsessionGetInfo			= 7;
	const int RAP_WsessionDel			= 8;
	const int RAP_WconnectionEnum			= 9;
	const int RAP_WfileEnum				= 10;
	const int RAP_WfileGetInfo			= 11;
	const int RAP_WfileClose			= 12;
	const int RAP_WserverGetInfo			= 13;
	const int RAP_WserverSetInfo			= 14;
	const int RAP_WserverDiskEnum			= 15;
	const int RAP_WserverAdminCommand		= 16;
	const int RAP_NetAuditOpen			= 17;
	const int RAP_WauditClear			= 18;
	const int RAP_NetErrorLogOpen			= 19;
	const int RAP_WerrorLogClear			= 20;
	const int RAP_NetCharDevEnum			= 21;
	const int RAP_NetCharDevGetInfo			= 22;
	const int RAP_WCharDevControl			= 23;
	const int RAP_NetCharDevQEnum			= 24;
	const int RAP_NetCharDevQGetInfo		= 25;
	const int RAP_WCharDevQSetInfo			= 26;
	const int RAP_WCharDevQPurge			= 27;
	const int RAP_WCharDevQPurgeSelf		= 28;
	const int RAP_WMessageNameEnum			= 29;
	const int RAP_WMessageNameGetInfo		= 30;
	const int RAP_WMessageNameAdd			= 31;
	const int RAP_WMessageNameDel			= 32;
	const int RAP_WMessageNameFwd			= 33;
	const int RAP_WMessageNameUnFwd			= 34;
	const int RAP_WMessageBufferSend		= 35;
	const int RAP_WMessageFileSend			= 36;
	const int RAP_WMessageLogFileSet		= 37;
	const int RAP_WMessageLogFileGet		= 38;
	const int RAP_WServiceEnum			= 39;
	const int RAP_WServiceInstall			= 40;
	const int RAP_WServiceControl			= 41;
	const int RAP_WAccessEnum			= 42;
	const int RAP_WAccessGetInfo			= 43;
	const int RAP_WAccessSetInfo			= 44;
	const int RAP_WAccessAdd			= 45;
	const int RAP_WAccessDel			= 46;
	const int RAP_WGroupEnum			= 47;
	const int RAP_WGroupAdd				= 48;
	const int RAP_WGroupDel				= 49;
	const int RAP_WGroupAddUser			= 50;
	const int RAP_WGroupDelUser			= 51;
	const int RAP_WGroupGetUsers			= 52;
	const int RAP_WUserEnum				= 53;
	const int RAP_WUserAdd				= 54;
	const int RAP_WUserDel				= 55;
	const int RAP_WUserGetInfo			= 56;
	const int RAP_WUserSetInfo			= 57;
	const int RAP_WUserPasswordSet			= 58;
	const int RAP_WUserGetGroups			= 59;
	const int RAP_WWkstaSetUID			= 62;
	const int RAP_WWkstaGetInfo			= 63;
	const int RAP_WWkstaSetInfo			= 64;
	const int RAP_WUseEnum				= 65;
	const int RAP_WUseAdd				= 66;
	const int RAP_WUseDel				= 67;
	const int RAP_WUseGetInfo			= 68;
	const int RAP_WPrintQEnum			= 69;
	const int RAP_WPrintQGetInfo			= 70;
	const int RAP_WPrintQSetInfo			= 71;
	const int RAP_WPrintQAdd			= 72;
	const int RAP_WPrintQDel			= 73;
	const int RAP_WPrintQPause			= 74;
	const int RAP_WPrintQContinue			= 75;
	const int RAP_WPrintJobEnum			= 76;
	const int RAP_WPrintJobGetInfo			= 77;
	const int RAP_WPrintJobSetInfo_OLD		= 78;
	const int RAP_WPrintJobDel			= 81;
	const int RAP_WPrintJobPause			= 82;
	const int RAP_WPrintJobContinue			= 83;
	const int RAP_WPrintDestEnum			= 84;
	const int RAP_WPrintDestGetInfo			= 85;
	const int RAP_WPrintDestControl			= 86;
	const int RAP_WProfileSave			= 87;
	const int RAP_WProfileLoad			= 88;
	const int RAP_WStatisticsGet			= 89;
	const int RAP_WStatisticsClear			= 90;
	const int RAP_NetRemoteTOD			= 91;
	const int RAP_WNetBiosEnum			= 92;
	const int RAP_WNetBiosGetInfo			= 93;
	const int RAP_NetServerEnum			= 94;
	const int RAP_I_NetServerEnum			= 95;
	const int RAP_WServiceGetInfo			= 96;
	const int RAP_WPrintQPurge			= 103;
	const int RAP_NetServerEnum2			= 104;
	const int RAP_WAccessGetUserPerms		= 105;
	const int RAP_WGroupGetInfo			= 106;
	const int RAP_WGroupSetInfo			= 107;
	const int RAP_WGroupSetUsers			= 108;
	const int RAP_WUserSetGroups			= 109;
	const int RAP_WUserModalsGet			= 110;
	const int RAP_WUserModalsSet			= 111;
	const int RAP_WFileEnum2			= 112;
	const int RAP_WUserAdd2				= 113;
	const int RAP_WUserSetInfo2			= 114;
	const int RAP_WUserPasswordSet2			= 115;
	const int RAP_I_NetServerEnum2			= 116;
	const int RAP_WConfigGet2			= 117;
	const int RAP_WConfigGetAll2			= 118;
	const int RAP_WGetDCName			= 119;
	const int RAP_NetHandleGetInfo			= 120;
	const int RAP_NetHandleSetInfo			= 121;
	const int RAP_WStatisticsGet2			= 122;
	const int RAP_WBuildGetInfo			= 123;
	const int RAP_WFileGetInfo2			= 124;
	const int RAP_WFileClose2			= 125;
	const int RAP_WNetServerReqChallenge		= 126;
	const int RAP_WNetServerAuthenticate		= 127;
	const int RAP_WNetServerPasswordSet		= 128;
	const int RAP_WNetAccountDeltas			= 129;
	const int RAP_WNetAccountSync			= 130;
	const int RAP_WUserEnum2			= 131;
	const int RAP_WWkstaUserLogon			= 132;
	const int RAP_WWkstaUserLogoff			= 133;
	const int RAP_WLogonEnum			= 134;
	const int RAP_WErrorLogRead			= 135;
	const int RAP_NetPathType			= 136;
	const int RAP_NetPathCanonicalize		= 137;
	const int RAP_NetPathCompare			= 138;
	const int RAP_NetNameValidate			= 139;
	const int RAP_NetNameCanonicalize		= 140;
	const int RAP_NetNameCompare			= 141;
	const int RAP_WAuditRead			= 142;
	const int RAP_WPrintDestAdd			= 143;
	const int RAP_WPrintDestSetInfo			= 144;
	const int RAP_WPrintDestDel			= 145;
	const int RAP_WUserValidate2			= 146;
	const int RAP_WPrintJobSetInfo			= 147;
	const int RAP_TI_NetServerDiskEnum		= 148;
	const int RAP_TI_NetServerDiskGetInfo		= 149;
	const int RAP_TI_FTVerifyMirror			= 150;
	const int RAP_TI_FTAbortVerify			= 151;
	const int RAP_TI_FTGetInfo			= 152;
	const int RAP_TI_FTSetInfo			= 153;
	const int RAP_TI_FTLockDisk			= 154;
	const int RAP_TI_FTFixError			= 155;
	const int RAP_TI_FTAbortFix			= 156;
	const int RAP_TI_FTDiagnoseError		= 157;
	const int RAP_TI_FTGetDriveStats		= 158;
	const int RAP_TI_FTErrorGetInfo			= 160;
	const int RAP_NetAccessCheck			= 163;
	const int RAP_NetAlertRaise			= 164;
	const int RAP_NetAlertStart			= 165;
	const int RAP_NetAlertStop			= 166;
	const int RAP_NetAuditWrite			= 167;
	const int RAP_NetIRemoteAPI			= 168;
	const int RAP_NetServiceStatus			= 169;
	const int RAP_NetServerRegister			= 170;
	const int RAP_NetServerDeregister		= 171;
	const int RAP_NetSessionEntryMake		= 172;
	const int RAP_NetSessionEntryClear		= 173;
	const int RAP_NetSessionEntryGetInfo		= 174;
	const int RAP_NetSessionEntrySetInfo		= 175;
	const int RAP_NetConnectionEntryMake		= 176;
	const int RAP_NetConnectionEntryClear		= 177;
	const int RAP_NetConnectionEntrySetInfo		= 178;
	const int RAP_NetConnectionEntryGetInfo		= 179;
	const int RAP_NetFileEntryMake			= 180;
	const int RAP_NetFileEntryClear			= 181;
	const int RAP_NetFileEntrySetInfo		= 182;
	const int RAP_NetFileEntryGetInfo		= 183;
	const int RAP_AltSrvMessageBufferSend		= 184;
	const int RAP_AltSrvMessageFileSend		= 185;
	const int RAP_wI_NetRplWkstaEnum		= 186;
	const int RAP_wI_NetRplWkstaGetInfo		= 187;
	const int RAP_wI_NetRplWkstaSetInfo		= 188;
	const int RAP_wI_NetRplWkstaAdd			= 189;
	const int RAP_wI_NetRplWkstaDel			= 190;
	const int RAP_wI_NetRplProfileEnum		= 191;
	const int RAP_wI_NetRplProfileGetInfo		= 192;
	const int RAP_wI_NetRplProfileSetInfo		= 193;
	const int RAP_wI_NetRplProfileAdd		= 194;
	const int RAP_wI_NetRplProfileDel		= 195;
	const int RAP_wI_NetRplProfileClone		= 196;
	const int RAP_wI_NetRplBaseProfileEnum		= 197;
	const int RAP_WIServerSetInfo			= 201;
	const int RAP_WPrintDriverEnum			= 205;
	const int RAP_WPrintQProcessorEnum		= 206;
	const int RAP_WPrintPortEnum			= 207;
	const int RAP_WNetWriteUpdateLog		= 208;
	const int RAP_WNetAccountUpdate			= 209;
	const int RAP_WNetAccountConfirmUpdate		= 210;
	const int RAP_WConfigSet			= 211;
	const int RAP_WAccountsReplicate		= 212;
	const int RAP_SamOEMChgPasswordUser2_P		= 214;
	const int RAP_NetServerEnum3			= 215;
	const int RAP_WprintDriverGetInfo		= 250;
	const int RAP_WprintDriverSetInfo		= 251;
	const int RAP_WaliasAdd				= 252;
	const int RAP_WaliasDel				= 253;
	const int RAP_WaliasGetInfo			= 254;
	const int RAP_WaliasSetInfo			= 255;
	const int RAP_WaliasEnum			= 256;
	const int RAP_WuserGetLogonAsn			= 257;
	const int RAP_WuserSetLogonAsn			= 258;
	const int RAP_WuserGetAppSel			= 259;
	const int RAP_WuserSetAppSel			= 260;
	const int RAP_WappAdd				= 261;
	const int RAP_WappDel				= 262;
	const int RAP_WappGetInfo			= 263;
	const int RAP_WappSetInfo			= 264;
	const int RAP_WappEnum				= 265;
	const int RAP_WUserDCDBInit			= 266;
	const int RAP_WDASDAdd				= 267;
	const int RAP_WDASDDel				= 268;
	const int RAP_WDASDGetInfo			= 269;
	const int RAP_WDASDSetInfo			= 270;
	const int RAP_WDASDEnum				= 271;
	const int RAP_WDASDCheck			= 272;
	const int RAP_WDASDCtl				= 273;
	const int RAP_WuserRemoteLogonCheck		= 274;
	const int RAP_WUserPasswordSet3			= 275;
	const int RAP_WCreateRIPLMachine		= 276;
	const int RAP_WDeleteRIPLMachine		= 277;
	const int RAP_WGetRIPLMachineInfo		= 278;
	const int RAP_WSetRIPLMachineInfo		= 279;
	const int RAP_WEnumRIPLMachine			= 280;
	const int RAP_I_ShareAdd			= 281;
	const int RAP_AliasEnum				= 282;
	const int RAP_WaccessApply			= 283;
	const int RAP_WPrt16Query			= 284;
	const int RAP_WPrt16Set				= 285;
	const int RAP_WUserDel100			= 286;
	const int RAP_WUserRemoteLogonCheck2		= 287;
	const int RAP_WRemoteTODSet			= 294;
	const int RAP_WprintJobMoveAll			= 295;
	const int RAP_W16AppParmAdd			= 296;
	const int RAP_W16AppParmDel			= 297;
	const int RAP_W16AppParmGet			= 298;
	const int RAP_W16AppParmSet			= 299;
	const int RAP_W16RIPLMachineCreate		= 300;
	const int RAP_W16RIPLMachineGetInfo		= 301;
	const int RAP_W16RIPLMachineSetInfo		= 302;
	const int RAP_W16RIPLMachineEnum		= 303;
	const int RAP_W16RIPLMachineListParmEnum	= 304;
	const int RAP_W16RIPLMachClassGetInfo		= 305;
	const int RAP_W16RIPLMachClassEnum		= 306;
	const int RAP_W16RIPLMachClassCreate		= 307;
	const int RAP_W16RIPLMachClassSetInfo		= 308;
	const int RAP_W16RIPLMachClassDelete		= 309;
	const int RAP_W16RIPLMachClassLPEnum		= 310;
	const int RAP_W16RIPLMachineDelete		= 311;
	const int RAP_W16WSLevelGetInfo			= 312;
	const int RAP_WserverNameAdd			= 313;
	const int RAP_WserverNameDel			= 314;
	const int RAP_WserverNameEnum			= 315;
	const int RAP_I_WDASDEnum			= 316;
	const int RAP_WDASDEnumTerminate		= 317;
	const int RAP_WDASDSetInfo2			= 318;
	const int MAX_API				= 318;

	/* sizes of fixed-length fields, including null terminator */
	const int RAP_GROUPNAME_LEN	= 21;
	const int RAP_USERNAME_LEN	= 21;
	const int RAP_SHARENAME_LEN	= 13;
	const int RAP_UPASSWD_LEN	= 16; /* user password */
	const int RAP_SPASSWD_LEN	= 9; /* share password */
	const int RAP_MACHNAME_LEN	= 16;
	const int RAP_SRVCNAME_LEN	= 16;
	const int RAP_SRVCCMNT_LEN	= 64;
	const int RAP_DATATYPE_LEN	= 10;

	typedef struct {
		uint8 group_name[21];
		char reserved1;
		astring *comment;
	} rap_group_info_1;

	typedef struct {
		uint8 user_name[21];
		char reserved1;
		uint8 passwrd[16];
		uint32 pwage;
		uint16 priv;
		astring *home_dir;
		astring *comment;
		uint16 userflags;
		astring *logon_script;
	} rap_user_info_1;

	typedef struct {
		uint8 service_name[16];
		uint16 status;
		uint32 installcode;
		uint16 process_num;
		astring *comment;
	} rap_service_info_2;

	typedef struct {
		uint8 share_name[13];
	} rap_share_info_0;

	typedef struct {
		uint8 share_name[13];
		char reserved1;
		uint16 share_type;
		astring *comment;
	} rap_share_info_1;

	typedef struct {
		uint8 share_name[13];
		char reserved1;
		uint16 share_type;
		astring *comment;
		uint16 perms;
		uint16 maximum_users;
		uint16 active_users;
		astring *path;
		uint8 password[9];
		char reserved2;
	} rap_share_info_2;

	typedef [nodiscriminant] union {
		[case(0)] rap_share_info_0 info0;
		[case(1)] rap_share_info_1 info1;
		[case(2)] rap_share_info_2 info2;
	} rap_share_info;

	[public] void rap_NetShareEnum(
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 count,
		[out] uint16 available,
		[out,switch_is(level)] rap_share_info *info
	);

	/* not documented in MS-RAP */
	[public] void rap_NetShareAdd(
		[in] uint16 level,
		[in] uint16 bufsize,
		[in,switch_is(level)] rap_share_info info,
		[out] rap_status status,
		[out] uint16 convert
	);

	typedef struct {
		uint8 name[16];
	} rap_server_info_0;

	typedef struct {
		uint8 name[16];
		uint8 version_major;
		uint8 version_minor;
		uint32 servertype;
		astring *comment;
	} rap_server_info_1;

	typedef [nodiscriminant] union {
		[case(0)] rap_server_info_0 info0;
		[case(1)] rap_server_info_1 info1;
	} rap_server_info;

	[public] void rap_NetServerEnum2(
		[in] uint16 level,
		[in] uint16 bufsize,
		[in] uint32 servertype,
		[in] astring *domain,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 count,
		[out] uint16 available,
		[out,switch_is(level)] rap_server_info info[count]
	);

	[public] void rap_WserverGetInfo(
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 available,
		[out,switch_is(level)] rap_server_info info
	);

	typedef [public] enum {
		PRJ_QS_QUEUED	= 0x0000,
		PRJ_QS_PAUSED	= 0x0001,
		PRJ_QS_SPOOLING	= 0x0002,
		PRJ_QS_PRINTING	= 0x0003,
		PRJ_QS_ERROR	= 0x0010
	} rap_PrintJStatusCode;

	typedef struct {
		uint16 JobID;
	} rap_PrintJobInfo0;

	typedef struct {
		uint16 JobID;
		[charset(DOS)] uint8 UserName[21];
		uint8 Pad;
		[charset(DOS)] uint8 NotifyName[16];
		[charset(DOS)] uint8 DataType[10];
		[relative_short] astring *PrintParameterString;
		uint16 PrintParameterStringHigh;
		uint16 JobPosition;
		rap_PrintJStatusCode JobStatus;
		[relative_short] astring *JobStatusString;
		uint16 JobStatusStringHigh;
		time_t TimeSubmitted;
		uint32 JobSize;
		[relative_short] astring *JobCommentString;
		uint16 JobCommentStringHigh;
	} rap_PrintJobInfo1;

	typedef struct {
		uint16 JobID;
		uint16 Priority;
		[relative_short] astring *UserName;
		uint16 UserNameHigh;
		uint16 JobPosition;
		rap_PrintJStatusCode JobStatus;
		time_t TimeSubmitted;
		uint32 JobSize;
		[relative_short] astring *JobCommentString;
		uint16 JobCommentStringHigh;
		[relative_short] astring *DocumentName;
		uint16 DocumentNameHigh;
	} rap_PrintJobInfo2;

	typedef struct {
		uint16 JobID;
		uint16 Priority;
		[relative_short] astring *UserName;
		uint16 UserNameHigh;
		uint16 JobPosition;
		rap_PrintJStatusCode JobStatus;
		time_t TimeSubmitted;
		uint32 JobSize;
		[relative_short] astring *JobCommentString;
		uint16 JobCommentStringHigh;
		[relative_short] astring *DocumentName;
		uint16 DocumentNameHigh;
		[relative_short] astring *NotifyName;
		uint16 NotifyNameHigh;
		[relative_short] astring *DataType;
		uint16 DataTypeHigh;
		[relative_short] astring *PrintParameterString;
		uint16 PrintParameterStringHigh;
		[relative_short] astring *StatusString;
		uint16 StatusStringHigh;
		[relative_short] astring *QueueName;
		uint16 QueueNameHigh;
		[relative_short] astring *PrintProcessorName;
		uint16 PrintProcessorNameHigh;
		[relative_short] astring *PrintProcessorParams;
		uint16 PrintProcessorParamsHigh;
		[relative_short] astring *DriverName;
		uint16 DriverNameHigh;
		[relative_short] astring *DriverDataOffset;
		uint16 DriverDataOffsetHigh;
		[relative_short] astring *PrinterNameOffset;
		uint16 PrinterNameOffsetHigh;
	} rap_PrintJobInfo3;

	typedef [public,nodiscriminant] union {
		[case(0)] rap_PrintJobInfo0 info0;
		[case(1)] rap_PrintJobInfo1 info1;
		[case(2)] rap_PrintJobInfo2 info2;
		[case(3)] rap_PrintJobInfo3 info3;
	} rap_printj_info;

	typedef [public] enum {
		PRQ_ACTIVE	= 0x0000,
		PRQ_PAUSE	= 0x0001,
		PRQ_ERROR	= 0x0002,
		PRQ_PENDING	= 0x0003
	} rap_PrintQStatusCode;

	typedef struct {
		[charset(DOS)] uint8 PrintQName[13];
	} rap_PrintQueue0;

	typedef struct {
		[charset(DOS)] uint8 PrintQName[13];
		uint8 Pad1;
		uint16 Priority;
		uint16 StartTime;
		uint16 UntilTime;
		[relative_short] astring *SeparatorPageFilename;
		uint16 SeparatorPageFilenameHigh;
		[relative_short] astring *PrintProcessorDllName;
		uint16 PrintProcessorDllNameHigh;
		[relative_short] astring *PrintDestinationsName;
		uint16 PrintDestinationsNameHigh;
		[relative_short] astring *PrintParameterString;
		uint16 PrintParameterStringHigh;
		[relative_short] astring *CommentString;
		uint16 CommentStringHigh;
		rap_PrintQStatusCode PrintQStatus;
		uint16 PrintJobCount;
	} rap_PrintQueue1;

	typedef struct {
		rap_PrintQueue1 queue;
		rap_PrintJobInfo1 job[queue.PrintJobCount];
	} rap_PrintQueue2;

	typedef [public] struct {
		[relative_short] astring *PrintQueueName;
		uint16 PrintQueueNameHigh;
		uint16 Priority;
		uint16 StartTime;
		uint16 UntilTime;
		uint16 Pad;
		[relative_short] astring *SeparatorPageFilename;
		uint16 SeparatorPageFilenameHigh;
		[relative_short] astring *PrintProcessorDllName;
		uint16 PrintProcessorDllNameHigh;
		[relative_short] astring *PrintParameterString;
		uint16 PrintParameterStringHigh;
		[relative_short] astring *CommentString;
		uint16 CommentStringHigh;
		rap_PrintQStatusCode PrintQStatus;
		uint16 PrintJobCount;
		[relative_short] astring *Printers;
		uint16 PrintersHigh;
		[relative_short] astring *DriverName;
		uint16 DriverNameHigh;
		[relative_short] astring *PrintDriverData;
		uint16 PrintDriverDataHigh;
	} rap_PrintQueue3;

	typedef struct {
		rap_PrintQueue3 queue;
		rap_PrintJobInfo2 job[queue.PrintJobCount];
	} rap_PrintQueue4;

	typedef struct {
		[relative_short] astring *PrintQueueName;
		uint16 PrintQueueNameHigh;
	} rap_PrintQueue5;

	typedef [public,nodiscriminant] union {
		[case(0)] rap_PrintQueue0 info0;
		[case(1)] rap_PrintQueue1 info1;
		[case(2)] rap_PrintQueue2 info2;
		[case(3)] rap_PrintQueue3 info3;
		[case(4)] rap_PrintQueue4 info4;
		[case(5)] rap_PrintQueue5 info5;
	} rap_printq_info;

	[public] void rap_NetPrintQEnum(
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 count,
		[out] uint16 available,
		[out,switch_is(level)] rap_printq_info info[count]
	);

	[public] void rap_NetPrintQGetInfo(
		[in] astring PrintQueueName,
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 available,
		[out,switch_is(level)] rap_printq_info info
	);

	[public] void rap_NetPrintJobPause(
		[in] uint16 JobID,
		[out] rap_status status,
		[out] uint16 convert
	);

	[public] void rap_NetPrintJobContinue(
		[in] uint16 JobID,
		[out] rap_status status,
		[out] uint16 convert
	);

	[public] void rap_NetPrintJobDelete(
		[in] uint16 JobID,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* not documented in MS-RAP */
	[public] void rap_NetPrintQueuePause(
		[in] astring PrintQueueName,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* not documented in MS-RAP */
	[public] void rap_NetPrintQueueResume(
		[in] astring PrintQueueName,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* not documented in MS-RAP */
	[public] void rap_NetPrintQueuePurge(
		[in] astring PrintQueueName,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* not documented in MS-RAP */
	[public] void rap_NetPrintJobEnum(
		[in] astring PrintQueueName,
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 count,
		[out] uint16 available,
		[out,switch_is(level)] rap_printj_info info[count]
	);

	[public] void rap_NetPrintJobGetInfo(
		[in] uint16 JobID,
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 available,
		[out,switch_is(level)] rap_printj_info info
	);

	typedef enum {
		RAP_PARAM_JOBNUM		= 0x0001,
		RAP_PARAM_USERNAME		= 0x0002,
		RAP_PARAM_NOTIFYNAME		= 0x0003,
		RAP_PARAM_DATATYPE		= 0x0004,
		RAP_PARAM_PARAMETERS_STRING	= 0x0005,
		RAP_PARAM_JOBPOSITION		= 0x0006,
		RAP_PARAM_JOBSTATUS		= 0x0007,
		RAP_PARAM_JOBSTATUSSTR		= 0x0008,
		RAP_PARAM_TIMESUBMITTED		= 0x0009,
		RAP_PARAM_JOBSIZE		= 0x000a,
		RAP_PARAM_JOBCOMMENT		= 0x000b
	} rap_JobInfoParamNum;

	typedef [nodiscriminant] union {
		[case (RAP_PARAM_JOBNUM)] uint16 value;
		[case (RAP_PARAM_USERNAME)] astring string;
		[case (RAP_PARAM_NOTIFYNAME)] astring string;
		[case (RAP_PARAM_DATATYPE)] astring string;
		[case (RAP_PARAM_PARAMETERS_STRING)] astring string;
		[case (RAP_PARAM_JOBPOSITION)] uint16 value;
		[case (RAP_PARAM_JOBSTATUS)] uint16 value;
		[case (RAP_PARAM_JOBSTATUSSTR)] astring string;
		[case (RAP_PARAM_TIMESUBMITTED)] uint32 value4;
		[case (RAP_PARAM_JOBSIZE)] uint32 value4;
		[case (RAP_PARAM_JOBCOMMENT)] astring string;
	} rap_JobInfoParam;

	[public] void rap_NetPrintJobSetInfo(
		[in] uint16 JobID,
		[in] uint16 level,
		[in] uint16 bufsize,
		[in] rap_JobInfoParamNum ParamNum,
		[in,switch_is(ParamNum)] rap_JobInfoParam Param,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* all not documented in MS-RAP */

	typedef struct {
		[charset(DOS)] uint8 PrintDestName[9];
	} rap_PrintDest0;

	typedef struct {
		[charset(DOS)] uint8 PrintDestName[9];
		[charset(DOS)] uint8 UserName[21];
		uint16 JobId;
		uint16 Status;
		[relative_short] astring *StatusStringName;
		uint16 PrintQueueNameHigh;
		uint16 Time;
	} rap_PrintDest1;

	typedef struct {
		[relative_short] astring *PrinterName;
		uint16 PrinterNameHigh;
	} rap_PrintDest2;

	typedef struct {
		[relative_short] astring *PrinterName;
		uint16 PrinterNameHigh;
		[relative_short] astring *UserName;
		uint16 UserNameHigh;
		[relative_short] astring *LogAddr;
		uint16 LogAddrHigh;
		uint16 JobId;
		uint16 Status;
		[relative_short] astring *StatusStringName;
		uint16 PrintQueueNameHigh;
		[relative_short] astring *Comment;
		uint16 CommentHigh;
		[relative_short] astring *Drivers;
		uint16 DriversHigh;
		uint16 Time;
		uint16 Pad1;
	} rap_PrintDest3;

	typedef [public,nodiscriminant] union {
		[case(0)] rap_PrintDest0 info0;
		[case(1)] rap_PrintDest1 info1;
		[case(2)] rap_PrintDest2 info2;
		[case(3)] rap_PrintDest3 info3;
	} rap_printdest_info;

	/* not documented in MS-RAP */
	[public] void rap_NetPrintDestEnum(
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 count,
		[out] uint16 available,
		[out,switch_is(level)] rap_printdest_info info[count]
	);

	/* not documented in MS-RAP */
	[public] void rap_NetPrintDestGetInfo(
		[in] astring PrintDestName,
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 available,
		[out,switch_is(level)] rap_printdest_info info
	);

	[public] void rap_NetUserPasswordSet2(
		[in] astring UserName,
		[in] uint8 OldPassword[16],
		[in] uint8 NewPassword[16],
		[in] uint16 EncryptedPassword,
		[in] uint16 RealPasswordLength,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* not documented in MS-RAP */
	[public] void rap_NetOEMChangePassword(
		[in] astring UserName,
		[in] uint8 crypt_password[516],
		[in] uint8 password_hash[16],
		[out] rap_status status,
		[out] uint16 convert
	);

	typedef struct {
		[charset(DOS)] uint8 Name[21];
	} rap_NetUserInfo0;

	typedef [public] enum {
		USER_PRIV_GUEST = 0,
		USER_PRIV_USER	= 1,
		USER_PRIV_ADMIN	= 2
	} rap_UserPriv;

	typedef struct {
		[charset(DOS)] uint8 Name[21];
		uint8 Pad;
		uint8 Password[16];
		time_t PasswordAge;
		rap_UserPriv Priv;
		[relative_short] astring *HomeDir;
		uint16 HomeDirHigh;
		[relative_short] astring *Comment;
		uint16 CommentHigh;
		uint16 Flags; /* FIXME */
		[relative_short] astring *ScriptPath;
		uint16 ScriptPathHigh;
	} rap_NetUserInfo1;

	typedef [public,v1_enum] enum {
		AF_OP_PRINT	= 0,
		AF_OP_COMM	= 1,
		AF_OP_SERVER	= 2,
		AF_OP_ACCOUNTS	= 3
	} rap_AuthFlags;

	typedef [public] struct {
		uint8 LogonHours[21];
	} rap_LogonHours;

	typedef struct {
		[charset(DOS)] uint8 Name[21];
		uint8 Pad;
		uint8 Password[16];
		time_t PasswordAge;
		rap_UserPriv Priv;
		[relative_short] astring *HomeDir;
		uint16 HomeDirHigh;
		[relative_short] astring *Comment;
		uint16 CommentHigh;
		uint16 Flags; /* FIXME */
		[relative_short] astring *ScriptPath;
		uint16 ScriptPathHigh;
		rap_AuthFlags AuthFlags;
		[relative_short] astring *FullName;
		uint16 FullNameHigh;
		[relative_short] astring *UsrComment;
		uint16 UsrCommentHigh;
		[relative_short] astring *pParms;
		uint16 pParmsHigh;
		[relative_short] astring *WorkStations;
		uint16 WorkStationsHigh;
		time_t LastLogon;
		time_t LastLogOff;
		time_t AcctExpires;
		uint32 MaxStorage;
		uint16 UnitsPerWeek;
		[relative_short] rap_LogonHours *LogonHours;
		uint16 LogonHoursHigh;
		uint16 BadPwCount;
		uint16 NumLogons;
		[relative_short] astring *LogonServer;
		uint16 LogonServerHigh;
		uint16 CountryCode;
		uint16 CodePage;
	} rap_NetUserInfo2;

	typedef struct {
		[charset(DOS)] uint8 Name[21];
		uint8 Pad;
		[relative_short] astring *Comment;
		uint16 CommentHigh;
		[relative_short] astring *UsrComment;
		uint16 UsrCommentHigh;
		[relative_short] astring *FullName;
		uint16 FullNameHigh;
	} rap_NetUserInfo10;

	typedef struct {
		[charset(DOS)] uint8 Name[21];
		uint8 Pad;
		[relative_short] astring *Comment;
		uint16 CommentHigh;
		[relative_short] astring *UsrComment;
		uint16 UsrCommentHigh;
		[relative_short] astring *FullName;
		uint16 FullNameHigh;
		rap_UserPriv Priv;
		rap_AuthFlags AuthFlags;
		time_t PasswordAge;
		[relative_short] astring *HomeDir;
		uint16 HomeDirHigh;
		[relative_short] astring *Parms;
		uint16 ParmsHigh;
		time_t LastLogon;
		time_t LastLogOff;
		uint16 BadPWCount;
		uint16 NumLogons;
		[relative_short] astring *LogonServer;
		uint16 LogonServerHigh;
		uint16 CountryCode;
		[relative_short] astring *WorkStations;
		uint16 WorkStationsHigh;
		uint32 MaxStorage;
		uint16 UnitsPerWeek;
		[relative_short] rap_LogonHours *LogonHours;
		uint16 LogonHoursHigh;
		uint16 CodePage;
	} rap_NetUserInfo11;

	typedef [public,nodiscriminant] union {
		[case(0)] rap_NetUserInfo0 info0;
		[case(1)] rap_NetUserInfo1 info1;
		[case(2)] rap_NetUserInfo2 info2;
		[case(10)] rap_NetUserInfo10 info10;
		[case(11)] rap_NetUserInfo11 info11;
	} rap_netuser_info;

	[public] void rap_NetUserGetInfo(
		[in] astring UserName,
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 available,
		[out,switch_is(level)] rap_netuser_info info
	);

	typedef struct {
		[relative_short] astring *ComputerName;
		uint16 ComputerNameHigh;
		[relative_short] astring *UserName;
		uint16 UserNameHigh;
		uint16 num_conns;
		uint16 num_opens;
		uint16 num_users;
		uint32 sess_time;
		uint32 idle_time;
		uint32 user_flags;
		[relative_short] astring *CliTypeName;
		uint16 CliTypeNameHigh;
	} rap_session_info_2;

	typedef [public,nodiscriminant] union {
		[case(2)] rap_session_info_2 info2;
	} rap_session_info;

	/* not documented in MS-RAP */
	[public] void rap_NetSessionEnum(
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 count,
		[out] uint16 available,
		[out,switch_is(level)] rap_session_info info[count]
	);

	/* not documented in MS-RAP */
	[public] void rap_NetSessionGetInfo(
		[in] astring SessionName,
		[in] uint16 level,
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] uint16 available,
		[out,switch_is(level)] rap_session_info info
	);

	/* not documented in MS-RAP */
	[public] void rap_NetUserAdd(
		[in] uint16 level,
		[in] uint16 bufsize,
		[in] uint16 pwdlength,
		[in] uint16 unknown,
		[in,switch_is(level)] rap_netuser_info info,
		[out] rap_status status,
		[out] uint16 convert
	);

	/* not documented in MS-RAP */
	[public] void rap_NetUserDelete(
		[in] astring UserName,
		[out] rap_status status,
		[out] uint16 convert
	);

	typedef [public] struct {
		uint32 TimeSinceJan11970;
		uint32 TimeSinceBoot;
		uint8 Hours;
		uint8 Minutes;
		uint8 Seconds;
		uint8 Hundreds;
		uint16 TimeZone;
		uint16 ClockFrequency;
		uint8 Day;
		uint8 Month;
		uint16 Year;
		uint8 Weekday;
	} rap_TimeOfDayInfo;

	[public] void rap_NetRemoteTOD(
		[in] uint16 bufsize,
		[out] rap_status status,
		[out] uint16 convert,
		[out] rap_TimeOfDayInfo tod
	);

	/* Parameter description strings for RAP calls   */
	/* Names are defined name for RAP call with _REQ */
	/* appended to end.                              */

	const string RAP_WFileEnum2_REQ			= "zzWrLehb8g8";
	const string RAP_WFileGetInfo2_REQ		= "DWrLh";
	const string RAP_WFileClose2_REQ     		= "D";

	const string RAP_NetGroupEnum_REQ		= "WrLeh";
	const string RAP_NetGroupAdd_REQ		= "WsT";
	const string RAP_NetGroupDel_REQ		= "z";
	const string RAP_NetGroupAddUser_REQ		= "zz";
	const string RAP_NetGroupDelUser_REQ		= "zz";
	const string RAP_NetGroupGetUsers_REQ		= "zWrLeh";
	const string RAP_NetGroupSetUsers_REQ		= "zWsTW";

	const string RAP_NetUserAdd2_REQ		= "WsTWW";
	const string RAP_NetUserEnum_REQ		= "WrLeh";
	const string RAP_NetUserEnum2_REQ		= "WrLDieh";
	const string RAP_NetUserGetGroups_REQ		= "zWrLeh";
	const string RAP_NetUserSetGroups_REQ		= "zWsTW";
	const string RAP_NetUserPasswordSet_REQ		= "zb16b16w";
	const string RAP_NetUserPasswordSet2_REQ	= "zb16b16WW";
	const string RAP_SAMOEMChgPasswordUser2_REQ	= "B516B16";
	const string RAP_NetUserValidate2_REQ		= "Wb62WWrLhWW";

	const string RAP_NetServerEnum2_REQ		= "WrLehDz";
	const string RAP_WserverGetInfo_REQ		= "WrLh";
	const string RAP_NetWkstatGetInfo		= "WrLh";

	const string RAP_WShareAdd_REQ			= "WsT";
	const string RAP_WShareEnum_REQ			= "WrLeh";
	const string RAP_WShareDel_REQ			= "zW";
	const string RAP_WWkstaGetInfo_REQ		= "WrLh";

	const string RAP_NetPrintQEnum_REQ		= "WrLeh";
	const string RAP_NetPrintQGetInfo_REQ		= "zWrLh";

	const string RAP_NetServerAdminCommand_REQ	= "zhrLeh";
	const string RAP_NetServiceEnum_REQ		= "WrLeh";
	const string RAP_NetServiceControl_REQ		= "zWWrL";
	const string RAP_NetServiceInstall_REQ		= "zF88sg88T";
	const string RAP_NetServiceGetInfo_REQ		= "zWrLh";
	const string RAP_NetSessionEnum_REQ		= "WrLeh";
	const string RAP_NetSessionGetInfo_REQ		= "zWrLh";
	const string RAP_NetSessionDel_REQ		= "zW";

	const string RAP_NetConnectionEnum_REQ		= "zWrLeh";

	const string RAP_NetWkstaUserLogoff_REQ		= "zzWb38WrLh";

	/* Description strings for returned data in RAP calls */
	/* I use all caps here in part to avoid accidental    */
	/* name collisions */

	const string RAP_FILE_INFO_L2			= "D";
	const string RAP_FILE_INFO_L3			= "DWWzz";
	const string  RAP_GROUP_INFO_L0			= "B21";
	const string RAP_GROUP_INFO_L1			= "B21Bz";
	const string RAP_GROUP_USERS_INFO_0		= "B21";
	const string RAP_GROUP_USERS_INFO_1		= "B21BN";

	const string RAP_USER_INFO_L0			= "B21";
	const string RAP_USER_INFO_L1			= "B21BB16DWzzWz";

	const string RAP_SERVER_INFO_L0			= "B16";
	const string RAP_SERVER_INFO_L1			= "B16BBDz";
	const string RAP_SERVER_INFO_L2			= "B16BBDzDDDWWzWWWWWWWB21BzWWWWWWWWWWWWWWWWWWWWWWz";
	const string RAP_SERVER_INFO_L3			= "B16BBDzDDDWWzWWWWWWWB21BzWWWWWWWWWWWWWWWWWWWWWWzDWz";
	const string RAP_SERVICE_INFO_L0		= "B16";
	const string RAP_SERVICE_INFO_L2		= "B16WDWB64";
	const string RAP_SHARE_INFO_L0			= "B13";
	const string RAP_SHARE_INFO_L1			= "B13BWz";
	const string RAP_SHARE_INFO_L2			= "B13BWzWWWzB9B";

	const string RAP_PRINTQ_INFO_L2			= "B13BWWWzzzzzWN";
	const string RAP_SMB_PRINT_JOB_L1		= "WB21BB16B10zWWzDDz";

	const string RAP_SESSION_INFO_L2		= "zzWWWDDDz";
	const string RAP_CONNECTION_INFO_L1		= "WWWWDzz";

	const string RAP_USER_LOGOFF_INFO_L1		= "WDW";

	const string RAP_WKSTA_INFO_L1			= "WDzzzzBBDWDWWWWWWWWWWWWWWWWWWWzzWzzW";
	const string RAP_WKSTA_INFO_L10			= "zzzBBzz";
};
