#ifndef __BOOTINI_H
#define __BOOTINI_H
#endif // __BOOTINI_H




//
// constants / defines / enumerations
//

#define ADD_OFFSET(_p,_o) (PVOID)((PUCHAR)(_p) + (_p)->_o)

// Error constants
#define ERROR_CONNECT_SERVERNOTFOUND		0xFFFF0001
#define ERROR_CONNECT_LOGINFAIL				0xFFFF0002
#define ERROR_CONNECT_UNKNOWNERROR			0xFFFF0003
#define ERROR_FMT_INVALID_OPTIONVALUE       _T( "ERROR: Invalid value specified for the option '%s'.\n" ) 
#define ERROR_FMT_INVALIDOSENTRY            _T( "ERROR: Invalid OS entry line number specified.\nThere are only '%s' OS keys.\n" )

// Exit values
#define EXIT_SUCCESS                        0
#define EXIT_FAILURE                        1  
#define MALLOC_FAILURE						-1

// Null
#define NULL_STRING							_T( "\0" )
#define NULL_CHAR							_T( '\0' )

#define STRING20  20
#define STRING3 3

#define ON_OFF								_T("ON|OFF")

#define MAX_CMD_LENGTH							4096

// Options
#define CMDOPTION_QUERY						_T( "query" )
#define CMDOPTION_COPY						_T( "copy" )
#define CMDOPTION_DELETE				    _T( "delete" )
#define CMDOPTION_USAGE						_T( "?|h" )
#define CMDOPTION_DEFAULT					_T( "" )
#define CMDOPTION_RAW						_T("raw")
#define CMDOPTION_DEFAULTOS					_T("default")
#define CMDOPTION_TIMEOUT					_T("timeout")
#define CMDOPTION_DEBUG						_T("debug")
#define CMDOPTION_EMS						_T("ems")
#define CMDOPTION_DBG1394						_T("dbg1394")
#define CMDOPTION_ADDSW						_T("addsw")
#define CMDOPTION_RMSW						_T("rmsw")
#define CMDOPTION_APPEND					_T("a")
#define CMDOPTION_MIRROR					_T("mirror")
#define CMDOPTION_CHANNEL					_T("ch")
#define CMDOPTION_LIST						_T("list")
#define CMDOPTION_ADD						_T("add")
#define CMDOPTION_UPDATE					_T("update")



#define CMDOTHEROPTIONS                     _T( "s|server|u|user|p|password|description|descrip|defaultos|basevideo|baudrate|debugport|maxmem|nodebug|crashdebug|noserialmice|sos|redirect" )

#define BAUD_RATE_VALUES_EMS		  _T("9600|19200|57600|115200")
#define BAUD_RATE_VALUES_DEBUG		  _T("9600|19200|38400|57600|115200")

#define COM_PORT_RANGE			  _T("COM1|COM2|COM3|COM4")


#define EMS_PORT_VALUES			  _T("COM1|COM2|COM3|COM4|BIOSSET")				

#define CMDOPTION_DEBUG_VALUES    _T("ON|OFF|EDIT")
#define CMDOPTION_EMS_VALUES    _T("ON|OFF|EDIT")

#define CMDOPTION_EMS_VALUES_IA64    _T("ON|OFF")

#define TOKEN_ASTERIX   _T("*")

#define CMDRAWSTRING			    _T("raw")

#define DEBUGPORT_1394		_T("/debugport=1394")

#define DEBUGPORT		_T("/debugport=")

#define TOKEN_CHANNEL		_T("/channel")	

#define TOKEN_BACKSLASH4  _T("\\\\")
#define TOKEN_BACKSLASH6  _T("\\\\\\")


// Other switches or sub-options
#define SWITCH_SERVER                       _T( "s" )
#define SWITCH_USER			    _T( "u" )	
#define SWITCH_PASSWORD			    _T( "p" )
#define SWITCH_TIMEOUT			    _T( "to" )
#define SWITCH_DEFAULTOS		    _T( "do" )
#define SWITCH_BASEVIDEO		    _T( "bv" )
#define SWITCH_DEBUG			    _T( "dbg" )
#define SWITCH_BAUDRATE			    _T( "br" )
#define SWITCH_DEBUGPORT		    _T( "dp" )
#define SWITCH_MAXMEM			    _T( "mm" )
#define SWITCH_NODEBUG			    _T( "nd" )
#define SWITCH_CRASHDEBUG		    _T( "cd" )	
#define SWITCH_NOSERIALMICE		    _T( "ns" )
#define SWITCH_SOS			    _T( "so" )
#define SWITCH_REDIRECT			    _T( "re" )
#define SWITCH_DESCRIPTION		    _T( "d" )
#define SWITCH_RAWSTRING		    _T("raw")	
#define TIMEOUT_SWITCH 				_T("timeout")
#define SWITCH_PORT					_T("port")
#define	SWITCH_BAUD				  _T("baud")
#define SWITCH_NOGUIBOOT		  _T("ng")	


#define SWITCH_ID			    _T("id")	
#define SWITCH_EDIT				_T("edit")

// Strings
#define OFF_STRING							_T( "OFF" )
#define ON_STRING							_T( "ON" )
#define COM_STRING                          _T( "COM" )
#define INIPATH                             _T( "c:\\boottest.ini" )
#define OPERATINGSYSTEMSECTION              _T( "operating systems" )
#define BOOTLOADERSECTION		    _T( "boot loader" )

#define	 COL_FRIENDLYNAME		    			GetResString(IDS_COL_FRIENDLYNAME)	
#define	 COL_BOOTID		    	    			GetResString(IDS_COL_BOOTID)	
#define	 COL_BOOTOPTION		    	    			GetResString(IDS_COL_COL_BOOTOPTION)	
#define  COL_ARCPATH						GetResString(IDS_COL_ARCPATH)
#define  OS_HEADER  						GetResString(IDS_OS_HEADER)
#define  DASHES_OS	     					GetResString(IDS_DASHES_OS)
#define  BOOT_HEADER						GetResString(IDS_BOOT_HEADER)
#define  DASHES_BOOTOS						GetResString(IDS_DASHES_BOOTOS)
#define TIMEOUT_VAL						GetResString(IDS_TIMEOUT)
#define DEFAULT_OS						GetResString(IDS_DEFAULT_OS)
#define DEFAULT_ARC						GetResString(IDS_DEFAULT_ARC)

#define COL_FRIENDLYNAME_WIDTH			AsLong(GetResString(IDS_COL_FRIENDLYNAME_SIZE),10)		
#define COL_BOOTID_WIDTH			AsLong(GetResString(IDS_COL_BOOTID_SIZE),10)
#define COL_BOOTOPTION_WIDTH			AsLong(GetResString(IDS_COL_BOOTOPTION_SIZE),10)
#define COL_ARC_WIDTH				AsLong(GetResString(IDS_COL_ARCPATH_SIZE),10)

#define TIMEOUT_WIDTH				AsLong(GetResString(IDS_TIMEOUT_SIZE),10) 
#define DEFAULT_ARC_WIDTH			AsLong(GetResString(IDS_DEFAULT_ARC_SIZE),10)


#define PATH_BOOTINI                        _T("c:\\boot.ini")
#define KEY_DEFAULT                         _T("default")  
#define ONOFFVALUES                         _T(" on off ") 
#define KEY_REDIRECT						_T("redirect")




// Typedefs of standard string sizes
typedef TCHAR STRING100 [ 100 ];
typedef TCHAR STRING256 [ 256 ];

#define ID_DEL_HELP_BEGIN			IDS_DELETE_HELP_BEGIN
#define ID_DEL_HELP_END				IDS_DELETE_HELP_END

#define ID_CHANGE_HELP_BEGIN		IDS_CHANGE_HELP_BEGIN
#define ID_CHANGE_HELP_END			IDS_CHANGE_HELP_END

#define ID_QUERY_HELP_BEGIN			IDS_QUERY_HELP_BEGIN
#define ID_QUERY_HELP_END			IDS_QUERY_HELP_END

#define ID_COPY_HELP_BEGIN			IDS_COPY_HELP_BEGIN
#define ID_COPY_HELP_END			IDS_COPY_HELP_END

#define ID_MAIN_HELP_BEGIN			IDS_MAIN_HELP_BEGIN					
#define ID_MAIN_HELP_END			IDS_MAIN_HELP_END					


#define RAW_HELP_BEGIN				IDS_RAW_HELP_BEGIN
#define RAW_HELP_END      			IDS_RAW_HELP_END

#define TIMEOUT_HELP_BEGIN 			IDS_TIMOUTHELP_BEGIN
#define TIMEOUT_HELP_END			IDS_TIMOUTHELP_END			

#define DEFAULT_BEGIN 				IDS_DEFAULT_BEGIN
#define DEFAULT_END					IDS_DEFAULT_END

#define ID_MAIN_HELP_BEGIN1			IDS_MAIN_HELP_BEGIN1
#define ID_MAIN_HELP_END1			IDS_MAIN_HELP_END1

#define ID_MAIN_HELP_IA64_BEGIN		IDS_MAIN_HELP_IA64_BEGIN					
#define ID_MAIN_HELP_IA64_END		IDS_MAIN_HELP_IA64_END					
#define RAW_HELP_IA64_BEGIN			IDS_RAW_HELP_IA64_BEGIN
#define RAW_HELP_IA64_END      		IDS_RAW_HELP_IA64_END
#define ID_QUERY_HELP64_BEGIN 		IDS_QUERY_HELP64_BEGIN
#define ID_QUERY_HELP64_END 		IDS_QUERY_HELP64_END
#define ID_DEL_HELP_IA64_BEGIN		IDS_DELETE_HELP_IA64_BEGIN
#define ID_DEL_HELP_IA64_END      	IDS_DELETE_HELP_IA64_END
#define ID_COPY_HELP_IA64_BEGIN		IDS_COPY_HELP_IA64_BEGIN
#define ID_COPY_HELP_IA64_END		IDS_COPY_HELP_IA64_END
#define TIMEOUT_HELP_IA64_BEGIN 	IDS_TIMOUTHELP_IA64_BEGIN
#define TIMEOUT_HELP_IA64_END		IDS_TIMOUTHELP_IA64_END			
#define DEFAULT_IA64_BEGIN 			IDS_DEFAULT_IA64_BEGIN
#define DEFAULT_IA64_END			IDS_DEFAULT_IA64_END



#define SAFEFREE(pVal) \
if(pVal != NULL) \
{ \
	free(pVal); \
	pVal = NULL ;\
}

#define SAFECLOSE(stream) \
{ \
	if(stream != NULL)  \
	fclose(stream);\
	stream = NULL ; \
}



// function prototypes

// Main functions
DWORD ChangeBootIniSettings(DWORD argc, LPCTSTR argv[]);
DWORD CopyBootIniSettings(DWORD argc, LPCTSTR argv[]);
DWORD DeleteBootIniSettings(DWORD argc, LPCTSTR argv[]);
DWORD QueryBootIniSettings(DWORD argc, LPCTSTR argv[]);

DWORD ChangeTimeOut(DWORD argc,LPCTSTR argv[]);
DWORD ChangeDefaultOs(DWORD argc,LPCTSTR argv[]);


// Function used to get all the keys of a specified section in 
// the specified INI file
TARRAY getKeysOfINISection( LPTSTR szinifile, LPTSTR sziniSection );

// Function used to get all the key-value pairs of a specified section in 
// the specified INI file
TARRAY getKeyValueOfINISection( LPTSTR szinifile, LPTSTR sziniSection );

// Function used to delete a key from a specifed section of the
// specified ini file
BOOL deleteKeyFromINISection( LPTSTR szkey, LPTSTR szinifile, LPTSTR sziniSection );

// Function used to build the INI string containing all the key-value pairs.
LPTSTR stringFromDynamicArray( TARRAY arrKeyValuePairs );

// Function used to remove a sub-string from a given string
VOID removeSubString( LPTSTR szString, LPCTSTR szSubString );

// Function used to connect to the specified server with the given credentials
// and return the file pointer of the boot.ini file
BOOL openConnection(LPTSTR server, LPTSTR user,
					 LPTSTR password, LPTSTR filepath,BOOL bNeedPwd,FILE *stream,PBOOL pbConnFlag);

VOID FormHeader1(BOOL bHeader,TCOLUMNS *ResultHeader);

// Exit function
VOID properExit( DWORD dwExitCode, LPTSTR szFilePath );

// Usage functions
VOID displayChangeUsage();
VOID displayDeleteUsage();
VOID displayQueryUsage();
VOID displayRawUsage_X86();
VOID displayRawUsage_IA64();
DWORD displayMainUsage_X86();
VOID displayMainUsage_IA64();
VOID displayChangeOSUsage_X86();
VOID displayDefaultEntryUsage_IA64();
VOID displayRmSwUsage_X86();
VOID displayAddSwUsage_X86();

VOID displayQueryUsage_IA64();
VOID displayQueryUsage_X86();
VOID displayCopyUsage_IA64();
VOID displayCopyUsage_X86();
VOID displayChangeUsage_IA64();
VOID displayChangeUsage_X86();
VOID displayDeleteUsage_IA64();
VOID displayDeleteUsage_X86();
VOID displayTimeOutUsage_IA64();

VOID displayTimeOutUsage_X86();
VOID displayEmsUsage_X86();
VOID displayDebugUsage_X86();
VOID displayDebugUsage_IA64();
VOID displayEmsUsage_IA64();
VOID displayRmSwUsage_IA64();
VOID displayAddSwUsage_IA64();

VOID displayDbg1394Usage_X86();
VOID displayDbg1394Usage_IA64();
VOID displayMirrorUsage_IA64() ;

// Function used to process the main options

DWORD preProcessOptions( DWORD argc, LPCTSTR argv[],
					    PBOOL pbUsage, 
						PBOOL pbCopy, 
						PBOOL pbQuery,
						PBOOL pbDelete,
						PBOOL pbRawString,
						PBOOL pbDefault,
						PBOOL pbTimeOut,
						PBOOL pbDebug,
						PBOOL pbEms,
						PBOOL pbAddSw,
						PBOOL pbRmSw,
						PBOOL pbDbg1394,	
						PBOOL pbMirror	
						); 


BOOL resetFileAttrib( LPTSTR szFilePath );

BOOL stringFromDynamicArray1( TARRAY arrKeyValuePairs ,LPTSTR szFinalStr );

BOOL EnumerateOsEntries(PBOOT_ENTRY_LIST *ntBootEntries,PULONG ulLength );

VOID FormHeader(BOOL bHeader,TCOLUMNS *ResultHeader,BOOL bVerbose);

DWORD AppendRawString(  DWORD argc, LPCTSTR argv[] );

DWORD ProcessDebugSwitch(  DWORD argc, LPCTSTR argv[] );

DWORD ProcessEmsSwitch(  DWORD argc, LPCTSTR argv[] );

VOID GetComPortType(LPTSTR  szString,LPTSTR szTemp );

VOID GetBaudRateVal(LPTSTR  szString, LPTSTR szTemp);

DWORD getKeysOfSpecifiedINISection( LPTSTR sziniFile, LPTSTR sziniSection,LPCWSTR szKeyName ,LPTSTR szValue );

DWORD ValidateSwitches(PBOOT_ENTRY bootEntry, LPTSTR szNewFriendlyName ,LPTSTR szRawString);

DWORD ProcessAddSwSwitch(  DWORD argc, LPCTSTR argv[] );
DWORD ProcessRmSwSwitch(  DWORD argc, LPCTSTR argv[] );

DWORD GetSubString(LPTSTR szString,LPTSTR szPartString,LPTSTR szFullString);

DWORD ProcessDbg1394Switch(  DWORD argc, LPCTSTR argv[] );

BOOL IsWin64(void) ;

DWORD GetCPUInfo(LPTSTR szComputerName);
DWORD CheckSystemType(LPTSTR szServer);
VOID SafeCloseConnection(LPTSTR szServer,BOOL bFlag) ;


#define ERROR_TAG				GetResString(IDS_ERROR_TAG)
#define ERROR_LOAD_DLL				GetResString(IDS_ERROR_LOAD)
#define ERROR_NO_NVRAM				GetResString(IDS_ERROR_NO_NVRAM)
#define ERROR_UNEXPECTED			GetResString(IDS_UNEXPECTED_ERROR)
#define ERROR_NO_PRIVILAGE			GetResString(IDS_NO_PRIVILAGE)
#define DELETE_SUCCESS				GetResString(IDS_DELETE_SUCCESS)
#define DELETE_FAILURE				GetResString(IDS_DELETE_FAILURE)


#define IDENTIFIER_VALUE  _T("Identifier")
#define SUBKEY _T("HARDWARE\\DESCRIPTION\\SYSTEM\\CENTRALPROCESSOR\\0")

#define IDENTIFIER_VALUE2 _T("SystemPartition")
#define IDENTIFIER_VALUE3 _T("OsLoaderPath")


#define X86_MACHINE _T("x86")

#define SYSTEM_64_BIT 2
#define SYSTEM_32_BIT 3
#define ERROR_RETREIVE_REGISTRY	4



#define NODEBUG_SWITCH _T("/nodebug")
#define BASEVIDEO_SWITCH _T("/basevideo")
#define DEBUG_SWITCH _T("/debug")
#define DEBUG_SWITCH1 _T("/DEBUG")

#define COM_SWITCH _T("COM")
#define CRASHDEBUG_SWITCH _T("/crashdebug")
#define SOS_SWITCH _T("/sos")
#define REDIRECT_SWITCH _T("/redirect")
#define OS_FIELD _T( "operating systems" )

#define SOS_VALUE _T("/sos")
#define NOGUI_VALUE  _T("/noguiboot")
#define BASEVIDEO_VALUE _T("/basevideo")

#define MAXMEM_VALUE _T("/MAXMEM")
#define MAXMEM_VALUE1 _T("/maxmem")

#define NTDLL_FIELD _T("\\ntdll.dll")

#define TOKEN_EQUAL _T("=")
#define TOKEN_BACKSLASH _T("\"")
#define TOKEN_BRACKET _T('[') 
#define TOKEN_DELIM _T('\0')
#define TOKEN_EMPTYSPACE _T(" ")

#define TOKEN_SINGLEQUOTE _T("\"")

#define TOKEN_BACKSLASH4 _T("\\\\")
#define TOKEN_BACKSLASH2 _T("\\")
#define TOKEN_FWDSLASH1 _T("/")
#define TOKEN_C_DOLLAR _T("C$")
#define TOKEN_STAR    _T("*")

#define TOKEN_BOOTINI_PATH _T("boot.ini")
#define TOKEN_DOLLAR _T('$')
#define TOKEN_PATH _T("c:\\boot.ini")
#define TOKEN_COLON _T(':')
#define TOKEN_COLONSYMBOL _T(":")

#define TOKEN_50SPACES _T("                                                 ")
#define TOKEN_1394   _T("1394")

#define TOKEN_NA _T("N/A")
#define TOKEN_NEXTLINE _T("\n")
#define MAX_COLUMNS 4

#define TIMEOUT_MAX 999
#define TIMEOUT_MIN 0

#define READ_MODE  _T("r")
#define READWRITE_MODE _T("r+")

#define BOOT_COLUMNS 2

#define COL0	    0
#define COL1	    1
#define COL2	    2
#define COL3	    3
	
#define TABLE_FORMAT						GetResString(IDS_FORMAT_TABLE)
#define LIST_FORMAT						GetResString(IDS_FORMAT_LIST)
#define CSV_FORMAT						GetResString(IDS_FORMAT_CSV)

#define MAX_INI_LENGTH  2500
#define MAX_STRING_LENGTH1 5000


#define ON_OFF_EDIT _T("ON|OFF|EDIT")

#define TOKEN_DEBUGPORT _T("/debugport")


#define PORT_COM1  _T("/debugport=com1")
#define PORT_COM2  _T("/debugport=com2")
#define PORT_COM3  _T("/debugport=com3")
#define PORT_COM4  _T("/debugport=com4")
#define PORT_1394  _T("/debugport=1394")


#define BAUD_VAL6  _T("/baudrate=19200")
#define BAUD_VAL7  _T("/baudrate=38400")
#define BAUD_VAL8  _T("/baudrate=57600")
#define BAUD_VAL9  _T("/baudrate=115200")
#define BAUD_VAL10  _T("/baudrate=9600")

#define BAUD_RATE		_T("/baudrate")
#define REDIRECT	_T("/redirect")

#define VALUE_OFF _T("off")
#define VALUE_ON _T("on")

#define EDIT_STRING _T("EDIT")

#define KEY_BAUDRATE  _T("redirectbaudrate")

#define USEBIOSSET _T("biosset")

#define USEBIOSSETTINGS _T("USEBIOSSETTINGS")

#define ERROR_PROFILE_STRING _T("ERROR:")

#define ERROR_PROFILE_STRING1 _T("")

#define REDIRECT_STRING	_T("redirect")

#define BAUDRATE_STRING	_T("redirectbaudrate")

#define MAX_BOOTID_VAL	20

#define STRING255 255

#define STRING10 10


#define DRIVE_C 'C'
#define DRIVE_D 'D'
#define DRIVE_E 'E'
#define DRIVE_F 'F'
#define DRIVE_G 'G'
#define DRIVE_H 'H'
#define DRIVE_I 'I'
#define DRIVE_J 'J'
#define DRIVE_K 'K'
#define DRIVE_L 'L'
#define DRIVE_M 'M'
#define DRIVE_N 'N'
#define DRIVE_O 'O'
#define DRIVE_P 'P'
#define DRIVE_Q 'Q'
#define DRIVE_R 'R'
#define DRIVE_S 'S'
#define DRIVE_T 'T'
#define DRIVE_U 'U'
#define DRIVE_V 'V'
#define DRIVE_W 'W'
#define DRIVE_X 'X'
#define DRIVE_Y 'Y'
#define DRIVE_Z 'Z'


#define OI_SERVER 1 
#define OI_USER 2
#define OI_PASSWORD 3