Leaked source code of windows server 2003
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.
 
 
 
 
 
 

261 lines
6.9 KiB

/*****************************************************************************\
Author: Corey Morgan (coreym)
Copyright (c) 1998-2000 Microsoft Corporation
\*****************************************************************************/
#ifndef _VARG_H_012599_
#define _VARG_H_012599_
#define MAXSTR 1025
//Class CToken
//It represents a Single Token.
class CToken
{
public:
CToken();
~CToken();
DWORD Init(LPWSTR psz, BOOL bQuote);
LPWSTR GetToken();
BOOL IsSwitch();
BOOL IsSlash();
private:
LPWSTR m_pszToken;
BOOL m_bInitQuote;
};
typedef CToken * LPTOKEN;
#define ARG_TYPE_INT 0
#define ARG_TYPE_BOOL 1
#define ARG_TYPE_STR 2
#define ARG_TYPE_HELP 3
#define ARG_TYPE_DEBUG 4
#define ARG_TYPE_MSZ 5
#define ARG_TYPE_INTSTR 6
#define ARG_TYPE_PASSWORD 7 //Password is input at commandline as string. It is
//stored in ARG_RECORD in vValue member where vValue
//is a pointer to encrypted data_blob
#define ARG_TYPE_LAST 8
#define ARG_FLAG_OPTIONAL 0x00000001
#define ARG_FLAG_REQUIRED 0x00000002
#define ARG_FLAG_DEFAULTABLE 0x00000004
#define ARG_FLAG_NOFLAG 0x00000008 //For parameters like target name
#define ARG_FLAG_HIDDEN 0x00000010
#define ARG_FLAG_VERB 0x00000020
#define ARG_FLAG_STDIN 0x00000040 //This must be Required. If not sepcified read from standard input
#define ARG_FLAG_ATLEASTONE 0x00000080 //If this flag is specified on one or more switch, at
//least one of those switches must be defined
#define ARG_FLAG_DN 0x00000100 //JonN 4/26/01 256583 add ADSI escaping
#define ARG_TERMINATOR 0,NULL,0,NULL,ARG_TYPE_LAST,0,(CMD_TYPE)0,FALSE,NULL
#define ID_ARG2_NULL (LONG)-1
#define CMD_TYPE void*
typedef struct _ARG_RECORD
{
LONG idArg1;
LPTSTR strArg1;
LONG idArg2;
LPTSTR strArg2;
int fType;
DWORD fFlag;
union{
void* vValue;
LPTSTR strValue;
int nValue;
BOOL bValue;
DATA_BLOB encryptedDataBlob;
};
BOOL bDefined;
DWORD (*fntValidation)(PVOID pArg);
} ARG_RECORD, *PARG_RECORD;
//Error Source
#define ERROR_FROM_PARSER 1
#define ERROR_FROM_VLDFN 2
#define ERROR_WIN32_ERROR 3
//Parse Errors for when ERROR_SOURCE is ERROR_FROM_PARSER
/*
SWITCH value is incorrect.
ArgRecIndex is index of record.
ArgvIndex is index of token.
*/
#define PARSE_ERROR_SWITCH_VALUE 1
/*No Value is given for a swich when one is expected.
ArgRecIndex is index of record.
ArgvIndex is -1.
*/
#define PARSE_ERROR_SWICH_NO_VALUE 2
/*
Invalid Input
ArgRecIndex is -1,
ArgvIndex is index of token.
*/
#define PARSE_ERROR_UNKNOWN_INPUT_PARAMETER 3
/*
Required switch is not defined.
ArgRecIndex is index of record.
ArgvIndex is -1.
*/
#define PARSE_ERROR_SWITCH_NOTDEFINED 4
/*
Switch or Parameter is defined twice.
ArgRecIndex is index of record.
ArgvIndex is -1
*/
#define PARSE_ERROR_MULTIPLE_DEF 5
/*
Error Reading From STDIN.
ArgRecIndex is -1.
ArgvIndex is -1.
*/
#define ERROR_READING_FROM_STDIN 6
/*
Parser Encountered Help Switch
ArgRecIndex is index of record.
ArgvIndex is -1
*/
#define PARSE_ERROR_HELP_SWITCH 7
/*
The ARG_FLAG_ATLEASTONE flag was
defined on one or more switch yet
none of these switches were defined
ArgRecIndex is -1
ArgvIndex is -1
*/
#define PARSE_ERROR_ATLEASTONE_NOTDEFINED 8
/*
The value read from STDIN appears to be
in UNICODE, but the -uc and -uci switches
were not defined.
*/
#define PARSE_ERROR_UNICODE_NOTDEFINED 9
/*
The value read from STDIN appears to be
in ANSI, but the -uc and/or -uci switches
were defined.
*/
#define PARSE_ERROR_UNICODE_DEFINED 10
// 603157-2002/04/23-JonN
/*
A parse error occurred which has already
been reported.
*/
#define PARSE_ERROR_ALREADY_DISPLAYED 11
//Parse Errors for when ERROR_SOURCE is VLDFN
/*
Use this error code when Validation Function has handled the error and
Shown appropriate error message.
*/
#define VLDFN_ERROR_NO_ERROR 1
//Error is returned by Parser in PARSE_ERROR structure
//ErrorSource: Source of Error. Parser or Validation Function
//Error This is the actual error code. Its value depend on ErrorSource value.
// if( ErrorSource == PARSE_ERROR )
// possible values are ERROR_FROM_PARSER ERROR_FROM_VLDFN
// if( ErrorSource == ERROR_FROM_VLDFN )
// depends on the function
// ArgRecIndex is appropriate index in the ARG_RECORD, if applicable else -1
// ArgvIndex is approproate index in the agrv array, if applicable else -1
typedef struct _PARSE_ERROR
{
INT ErrorSource;
DWORD Error;
INT ArgRecIndex;
INT ArgvIndex;
BOOL MessageShown;
} PARSE_ERROR, *PPARSE_ERROR;
extern BOOL g_fUnicodeInput;
extern BOOL g_fUnicodeOutput;
BOOL ParseCmd(IN LPCTSTR pszCommandName,
IN ARG_RECORD *Commands,
IN int argc,
IN CToken *pToken,
IN UINT* pUsageMessageTable,
OUT PPARSE_ERROR pError,
IN BOOL bValidate = TRUE);
void FreeCmd(ARG_RECORD *Commands);
DWORD GetCommandInput(OUT int *pargc, //Number of Tokens
OUT LPTOKEN *ppToken); //Array of CToken
DWORD Tokenize(IN LPWSTR pBuf,
IN LONG BufLen,
IN LPWSTR pszDelimiters,
OUT CToken **ppToken,
OUT int *argc);
LONG GetToken(IN LPWSTR pBuf,
IN LONG BufLen,
IN LPWSTR pszDelimiters,
OUT BOOL *bQuote,
OUT LPWSTR *ppToken);
BOOL DisplayParseError(IN LPCTSTR pszCommandName,
IN PPARSE_ERROR pError,
IN ARG_RECORD *Commands,
IN CToken *pToken);
//Function to display string to STDERR
VOID DisplayError(IN LPWSTR pszError);
//Function to display string to STDOUT, appending newline
VOID DisplayOutput(IN LPWSTR pszOut);
//Function to display string to STDOUT, without newline
VOID DisplayOutputNoNewline(IN LPWSTR pszOut);
//Function to display Usage Message .
VOID DisplayMessage(UINT *pUsageTable,
BOOL bUseStdOut = FALSE);
#define USAGE_END 0xffffffff
// Copied from JSchwart on 2/19/2001
void
MyWriteConsole(
HANDLE fp,
LPWSTR lpBuffer,
DWORD cchBuffer
);
void
WriteStandardOut(PCWSTR pszFormat, ...);
void
WriteStandardError(PCWSTR pszFormat, ...);
BOOL
IsTokenHelpSwitch(LPTOKEN pToken);
void
DisplayUsageHelp( LPCWSTR pszCommand);
#endif //_VARG_H_012599_