/*****************************************************************************
* UTILSUB.H
*      This file contains the structure definitions and equtates for
*      communication between calling programs and functions in utilsub.lib.
*
* Copyright Citrix Systems Inc. 1990-1995
* Copyright (C) 1997-1999 Microsoft Corp.
*
*   $Author:   butchd  $
****************************************************************************/

#ifdef __cplusplus
extern "C" {
#endif

/*-----------------------------------------------------------------------------
 --   type-defs for File List Structure.
 ----------------------------------------------------------------------------*/
typedef struct _FILELIST {
   int	  argc;
   WCHAR  **argv;
} FILELIST, *PFILELIST;

/*-----------------------------------------------------------------------------
 --   type-defs for Token Map Structure.
 ----------------------------------------------------------------------------*/
// UNICODE version
typedef struct _TOKMAPW {
   PWCHAR tmToken;	   /* token; null pointer terminates list */
   USHORT tmFlag;	   /* flags for control communication */
   USHORT tmForm;	   /* format control string */
   USHORT tmDLen;	   /* length of data fields */
   PVOID  tmAddr;	   /* pointer to interpreted data */
} TOKMAPW, *PTOKMAPW;

// ANSI version
typedef struct _TOKMAPA {
   PCHAR  tmToken;	   /* token; null pointer terminates list */
   USHORT tmFlag;	   /* flags for control communication */
   USHORT tmForm;	   /* format control string */
   USHORT tmDLen;	   /* length of data fields */
   PVOID  tmAddr;	   /* pointer to interpreted data */
} TOKMAPA, *PTOKMAPA;

/*-----------------------------------------------------------------------------
 --   type-defs for Token Map Structure USE FOR CALLING SDM.DLL FUNCIONS
 ----------------------------------------------------------------------------*/
typedef struct _FILETOKMAP {
   PWCHAR tmToken;         /* token; null pointer terminates list */
   USHORT tmFlag;	   /* flags for control communication */
   USHORT tmForm;	   /* format control string */
   USHORT tmDLen;	   /* length of data fields */
   PVOID  tmAddr;	   /* pointer to interpreted data */
   USHORT tmLast;	   /* pointer for FindFirst FindNext junk */
} FILETOKMAP, FAR * PFILETOKMAP, NEAR * NPFILETOKMAP, * DPFILETOKMAP;

/*-----------------------------------------------------------------------------
 --   equates for _TOKMAP->tmFlag
 ----------------------------------------------------------------------------*/
#define TMFLAG_OPTIONAL       0x0000
#define TMFLAG_REQUIRED       0x0001
#define TMFLAG_PRESENT	      0x0002   /* was present in command line */
#define TMFLAG_MODIFIED       0x0004   /* was modified by app, request write */
#define TMFLAG_DELETE	      0x0008   /* request delete */

/*-----------------------------------------------------------------------------
 --   equates for _TOKMAP->tmForm
 ----------------------------------------------------------------------------*/
#define TMFORM_VOID	      0x0000
#define TMFORM_BOOLEAN	      0x0001
#define TMFORM_BYTE	      0x0002
#define TMFORM_CHAR	      0x0003
#define TMFORM_STRING	      0x0004
#define TMFORM_SHORT	      0x0005
#define TMFORM_USHORT	      0x0006
#define TMFORM_LONG	      0x0007
#define TMFORM_ULONG	      0x0008
#define TMFORM_HEX	      0x0009
#define TMFORM_LONGHEX	      0x000A
#define TMFORM_SERIAL	      0x000B
#define TMFORM_DATE	      0x000C
#define TMFORM_PHONE	      0x000D
#define TMFORM_X_STRING       0x000E
#define TMFORM_FILES	      0x000F
#define TMFORM_S_STRING       0x0010

/*-----------------------------------------------------------------------------
 --   equates for _TOKMAP->tmDLen
 ----------------------------------------------------------------------------*/
#define TMDLEN_VOID	      0x0000

/*-----------------------------------------------------------------------------
 --   prototype for Parse and setargv functions
 ----------------------------------------------------------------------------*/
// UNICODE prototypes
int WINAPI setargvW( LPWSTR szModuleName, LPWSTR szCmdLine, int *, WCHAR *** );
void WINAPI freeargvW( WCHAR ** );
USHORT WINAPI ParseCommandLineW(INT, WCHAR **, PTOKMAPW, USHORT);
BOOLEAN WINAPI IsTokenPresentW( PTOKMAPW, PWCHAR );
BOOLEAN WINAPI SetTokenPresentW( PTOKMAPW, PWCHAR );
BOOLEAN WINAPI SetTokenNotPresentW( PTOKMAPW, PWCHAR );

// ANSI prototypes
int WINAPI setargvA( LPSTR szModuleName, LPSTR szCmdLine, int *, char *** );
void WINAPI freeargvA( char ** );
USHORT WINAPI ParseCommandLineA(INT, CHAR **, PTOKMAPA, USHORT);
BOOLEAN WINAPI IsTokenPresentA( PTOKMAPA, PCHAR );
BOOLEAN WINAPI SetTokenPresentA( PTOKMAPA, PCHAR );
BOOLEAN WINAPI SetTokenNotPresentA( PTOKMAPA, PCHAR );

#ifdef UNICODE
#define setargv setargvW
#define freeargv freeargvW
#define ParseCommandLine ParseCommandLineW
#define IsTokenPresent IsTokenPresentW
#define SetTokenPresent SetTokenPresentW
#define SetTokenNotPresent SetTokenNotPresentW
#define TOKMAP TOKMAPW
#define PTOKMAP PTOKMAPW
#else
#define setargv setargvA
#define freeargv freeargvA
#define ParseCommandLine ParseCommandLineA
#define IsTokenPresent IsTokenPresentA
#define SetTokenPresent SetTokenPresentA
#define SetTokenNotPresent SetTokenNotPresentA
#define TOKMAP TOKMAPA
#define PTOKMAP PTOKMAPA
#endif /* UNICODE */

/*-----------------------------------------------------------------------------
 --   flags for ParseCommandLine().
 ----------------------------------------------------------------------------*/
#define PCL_FLAG_CONTINUE_ON_ERROR     0x0001
#define PCL_FLAG_RET_ON_FIRST_SUCCESS  0x0002
#define PCL_FLAG_IGNORE_INVALID        0x0004
#define PCL_FLAG_NO_CLEAR_MEMORY       0x0008
#define PCL_FLAG_NO_VERSION_CHECK      0x0010
#define PCL_FLAG_VERSION_CHK_UPWARD    0x0020

/*-----------------------------------------------------------------------------
 --   flags for rc=ParseCommandLine(),	PARSE_FLAG_* (BIT FLAGS)
 ----------------------------------------------------------------------------*/
#define PARSE_FLAG_NO_ERROR	       0x0000
#define PARSE_FLAG_MISSING_REQ_FIELD   0x0001
#define PARSE_FLAG_INVALID_PARM        0x0002
#define PARSE_FLAG_DUPLICATE_FIELD     0x0004
#define PARSE_FLAG_NO_PARMS	       0x0008
#define PARSE_FLAG_TOO_MANY_PARMS      0x0010
#define PARSE_FLAG_NOT_ENOUGH_MEMORY   0x0020

/*-----------------------------------------------------------------------------
 --   prototypes for WinStation utility functions
 ----------------------------------------------------------------------------*/

VOID WINAPI RefreshAllCaches();

VOID WINAPI RefreshWinStationCaches();

VOID WINAPI RefreshWinStationObjectCache();

VOID WINAPI RefreshWinStationNameCache();

ULONG WINAPI GetCurrentLogonId( );

VOID WINAPI GetCurrentWinStationName( PWCHAR, int );

BOOLEAN WINAPI GetWinStationNameFromId( ULONG, PWCHAR, int );

BOOLEAN WINAPI GetWinStationUserName( ULONG, PWCHAR, int );

VOID WINAPI GetCurrentUserName( PWCHAR, int );

BOOLEAN WINAPI WinStationObjectMatch( VOID *, PWCHAR );

/*-----------------------------------------------------------------------------
 --   prototypes for process/user utility functions
 ----------------------------------------------------------------------------*/

VOID WINAPI RefreshProcessObjectCaches();

VOID WINAPI RefreshUserSidCrcCache();

BOOLEAN WINAPI ProcessObjectMatch( ULONG, ULONG, int, PWCHAR, PWCHAR, PWCHAR, PWCHAR );

VOID WINAPI GetUserNameFromSid( VOID *, PWCHAR, PULONG );

/*-----------------------------------------------------------------------------
 --   prototypes for helper functions
 ----------------------------------------------------------------------------*/

USHORT WINAPI CalculateCrc16( PBYTE, USHORT );

INT WINAPI ExecProgram( PPROGRAMCALL, INT, WCHAR ** );

VOID WINAPI ProgramUsage( LPCWSTR, PPROGRAMCALL, BOOLEAN );

VOID WINAPI Message( int nResourceID, ... );

VOID WINAPI ErrorPrintf( int nErrorResourceID, ... );

VOID WINAPI TruncateString( PWCHAR pString, int MaxLength );

PPDPARAMS WINAPI EnumerateDevices(PDLLNAME pDllName, PULONG pEntries);

FILE * WINAPI wfopen( LPCWSTR filename, LPCWSTR mode );

PWCHAR WINAPI wfgets( PWCHAR Buffer, int Len, FILE *Stream);

int WINAPI PutStdErr(unsigned int MsgNum, unsigned int NumOfArgs, ...);

#ifdef __cplusplus
}
#endif