move files and directories into pcucontrol module
[monitor.git] / pcucontrol / models / intelamt / RemoteControlSample.cpp
diff --git a/pcucontrol/models/intelamt/RemoteControlSample.cpp b/pcucontrol/models/intelamt/RemoteControlSample.cpp
new file mode 100644 (file)
index 0000000..c488b64
--- /dev/null
@@ -0,0 +1,938 @@
+//----------------------------------------------------------------------------
+//
+//  Copyright (C) Intel Corporation, 2004 - 2006.
+//
+//  File:       RemoteControlSample.cpp 
+//
+//  Contents:   Sample code for an IntelĀ® AMT Network client.
+//
+//  Notes:      this file contains routines that call (using SOAP) 
+//              the RemoteControl functions of the Intel(R) AMT 2.0 as 
+//              defined in the "Intel(R) AMT Network Design Guide".
+//
+//----------------------------------------------------------------------------
+
+#include "CommonDefinitions.h"
+#include "RemoteControlTypes.h"
+#include "RemoteControlSoapBinding.nsmap"
+
+/*
+ * Function prototypes
+ */
+void Usage(char *cmd);
+bool GetUserValues(uint8 *&command, uint32 *&ianaOemNumber, 
+                                  uint8 *&specialCommand, uint16 *&specialCommandParameter, 
+                                  uint16 *&bootOptions, uint16 *&OEMParameters);
+void DisplaySystemCapabilities(uint8 specialCommandsSupported);
+void DisplaySpecialCommand(uint16 specialCommandsSupported);
+void DisplaySystemFirmwareCapabilities(uint32 systemFirmwareCapabilities);
+void DisplayOemDefinedCapabilities(uint32 OemDefinedCapabilities);
+bool ExecuteGetSystemPowerstate(Soap *server, bool verbose = true);
+bool ExecuteGetRemoteControlCapabilities(Soap *server, bool verbose = true);
+bool ExecuteRemoteControl(Soap *server, bool default_val = false);
+bool MainFlow(Soap *server,int option,bool verbose);
+bool ValidateOption(char *option, int *parameter);
+
+/*
+ * This is the main entry point
+ */
+int main(int argc, char* argv[])
+{
+       // Command line parameter
+       char *option = NULL;
+       // Client certificate's name
+       char *certName = NULL;
+#ifndef _WIN32
+       // Password for keys file openning
+       char *certPass = NULL;
+#else
+    // True if an authentication scheme is Kerberos, 
+    // otherwise the authentication scheme is digest
+    bool krb = true;
+#endif
+       // Target URL
+       char *target = NULL;
+       // Target username
+       char *username = NULL;
+       // Target password
+       char *password = NULL;
+       // Command line without app name and parameter
+       char **commandLine = NULL;
+       int commandLineLength = argc;
+       int parameter;
+       bool verbose = false;
+       
+
+       if( !GetOption(&commandLineLength,argv,
+               MIN_NUM_OF_CL_PARAMETERS,&option,&commandLine) ||
+               !ValidateOption(option,&parameter) ||
+#ifndef _WIN32
+               !ParseCommandLine(commandLineLength,commandLine,&target,
+               &certName,&certPass,&verbose,&username,&password)
+#else
+               !ParseCommandLine(commandLineLength,commandLine,&target,
+               &certName,NULL,&krb,&verbose,&username,&password)
+#endif
+               )
+       {
+               Usage(argv[0]);
+               return 1;
+       }
+
+    // The last parameter should be true for local application
+    // and false for remote application
+#ifndef _WIN32
+       Soap server(target,certName,certPass,username,password);
+#else
+       Soap server(target,certName,username,password,false,krb);
+#endif
+
+       if(MainFlow(&server,parameter,verbose) != true)
+       {
+               return 1;
+       }
+       return 0;
+}
+
+/*
+ * Validates an option passed in the command line.
+ * Arguments:
+ *     option - command line option
+ *  parameter - pointer to the variable that will hold 
+ *              type of the action the apllication 
+ *              will perform.
+ * Return value:
+ *  true - on succeed
+ *  false - on failure (command line option not recognized)
+ */
+bool ValidateOption(char *option, int *parameter)
+{
+       if(!option)
+       {
+               return false;
+       }
+       bool status = true;
+       if(!strcmp(option,POWER))
+       {
+               *parameter = OPT_POWER;
+       }
+       else if(!strcmp(option,CAPABILITIES))
+       {
+               *parameter = OPT_CAPABILITIES;
+       }
+       else if(!strcmp(option,REMOTE))
+       {
+               *parameter = OPT_REMOTE;
+       }
+       else if(!strcmp(option,API_TEST))
+       {
+               *parameter = OPT_API_TEST;
+       }
+       else if(!strcmp(option,REDUCED_API_TEST))
+       {
+               *parameter = OPT_REDUCED_API_TEST;
+       }
+       else
+       {
+               status = false;
+       }
+       return status;
+}
+
+/*
+ * Function that performs the main flow of Remote Control sample
+ * Arguments:
+ *  soap - pointer to the runtime environment 
+ *  option - variable that holds type of the action the apllication 
+ *           will perform
+ *  verbose - boolean value for API test 
+ * Return value:
+ *  true  - on success
+ *  false - on failure
+ */
+bool MainFlow(Soap *server, int option, bool verbose)
+{
+       bool status = true;
+       switch(option)
+       {
+               case OPT_POWER:
+                       status = ExecuteGetSystemPowerstate(server);
+                       break;
+               case OPT_CAPABILITIES:
+                       status = ExecuteGetRemoteControlCapabilities(server);
+                       break;
+               case OPT_REMOTE:
+                       status = ExecuteRemoteControl(server);
+                       break;
+               case OPT_API_TEST:
+                       if((status = ExecuteGetSystemPowerstate(server,verbose)) == false)
+                       {
+                               return status;
+                       }
+                       if((status = ExecuteGetRemoteControlCapabilities(server,verbose)) == false)
+                       {
+                               return status;
+                       }       
+                       if ((status = ExecuteRemoteControl(server,true)) == false)
+                       {
+                               return status;
+                       }
+                       break;
+               case OPT_REDUCED_API_TEST:                      
+                       if((status = ExecuteGetSystemPowerstate(server,verbose)) == false)
+                       {
+                               return status;
+                       }
+                       if((status = ExecuteGetRemoteControlCapabilities(server,verbose)) == false)
+                       {
+                               return status;
+                       }       
+                       break;
+               default:
+                       status = false;
+       }
+
+       return status;
+}
+
+/*
+ * Prints a usage information for the user.
+ */
+void Usage(char *cmd)
+{
+       printf("Usage:\n");
+#ifndef _WIN32
+    printf("\t %s <opt> [%s] [%s <name> %s <pass>] http[s]:", cmd, VERBOSE, CERT_NAME, CERT_PASS);
+#else
+       printf("\t %s <opt> [%s] [%s <username> %s <password>] [%s <name>] http[s]:", 
+        cmd, VERBOSE, USER, PASS, CERT_NAME);
+#endif
+       printf("//<Hostname>:<Port>/<RemoteControlUri> ");
+#ifndef _WIN32
+       printf("[%s <username> %s <password>]\n",USER,PASS); 
+#endif
+       printf("\nWhere <opt> is :\n");
+       printf("\t %s : GetSystemPowerstate\n",POWER);
+       printf("\t %s : GetRemoteControlCapabilities\n",CAPABILITIES);
+       printf("\t %s : RemoteControl\n",REMOTE);
+       printf("\t %s : perform API test\n",API_TEST);
+       printf("\t %s : perform API test without boot\n",REDUCED_API_TEST);
+       printf("\t To run API test in verbose mode include %s option\n", VERBOSE);
+       PrintAuthenticationNote();
+       printf("\nExample:\n");
+       printf("\t %s %s ", cmd, POWER);
+       printf("http://hostname:16992/RemoteControlService\n");
+#ifndef _WIN32
+    printf("\t %s %s %s MyCert %s Pass https://hostname:16993/RemoteControlService\n",   
+        cmd, POWER, CERT_NAME, CERT_PASS);
+#else
+       printf("\t %s %s %s MyCert https://hostname:16993/RemoteControlService\n",   
+               cmd, POWER, CERT_NAME);
+#endif
+}
+
+/*
+ * Queries (using SOAP) and display the system power state
+ * Arguments:
+ *  server     - pointer to the runtime environment 
+ *  url                - address of the web service            
+ *  verbose - boolean value for API test 
+ * Return value:
+ *  true  - on success
+ *  false - on failure
+ */
+bool ExecuteGetSystemPowerstate(Soap* server, bool verbose)
+{
+       int res;
+       bool status;
+
+       server->Init();
+
+       // gSOAP structures for handling 
+       // request and response information
+       _rci__GetSystemPowerState request;
+       _rci__GetSystemPowerStateResponse response;
+
+       FunctionCall("GetSystemPowerState");    
+       res = soap_call___rci__GetSystemPowerState(server->GetSoap(),
+               server->GetIp(),NULL, &request, &response);
+
+       if((status = 
+               CheckReturnStatus(res,
+               response.Status,
+               "GetSystemPowerState")) == true)
+       {
+               if(verbose)
+               {
+                       printf("\nSystemPowerstate is: %u\n", response.SystemPowerState);
+               }
+               else
+               {
+                       PrintSuccess();
+               }
+       }
+
+       return status;
+}
+
+/*
+ * Queries (using SOAP) and display the Intel(R) AMT
+ * device remote control capabilities
+ * Arguments:
+ *  server     - pointer to the runtime environment 
+ *  url                - address of the web service
+ *  verbose - boolean value for API test 
+ * Return value:
+ *  true  - on success
+ *  false - on failure
+ */
+bool ExecuteGetRemoteControlCapabilities(Soap* server, bool verbose)
+{
+       int res;
+       bool status;
+
+       server->Init();
+
+       // gSOAP structures for handling 
+       // request and response information
+       _rci__GetRemoteControlCapabilities request;
+       _rci__GetRemoteControlCapabilitiesResponse response;
+
+       FunctionCall("GetRemoteControlCapabilities");   
+       res = soap_call___rci__GetRemoteControlCapabilities(server->GetSoap(), 
+               server->GetIp(),NULL, &request, &response);
+
+       if((status = CheckReturnStatus(res,response.Status,"GetRemoteControlCapabilities")) == true)
+       {
+               if(verbose)
+               {
+                       printf("\nRemote Control Capabilities\n");
+                       printf("---------------------------------------\n");
+
+                       printf("IanaOemNumber = %u\n", response.IanaOemNumber);
+
+                       DisplayOemDefinedCapabilities(response.OemDefinedCapabilities);
+
+                       printf("\n");
+                       DisplaySpecialCommand(response.SpecialCommandsSupported);
+
+                       printf("\n");
+                       DisplaySystemCapabilities(response.SystemCapabilitiesSupported);
+
+                       printf("\n");
+                       DisplaySystemFirmwareCapabilities(response.SystemFirmwareCapabilities);
+
+                       printf("\n");
+               }
+               else
+               {
+                       PrintSuccess();
+               }
+       }
+
+       return status;
+}
+
+/*
+ * Controls remotely (using SOAP) the boot and power state of 
+ * Intel(R) AMT-managed PC.
+ * Arguments:
+ *  server     - pointer to the runtime environment 
+ *  url                - address of the web service 
+ *  def_values - if false request values from user  
+ * Return value:
+ *  true  - on success
+ *  false - on failure
+ */
+bool ExecuteRemoteControl(Soap* server,bool def_values)
+{
+       int res;
+       bool status = true;
+
+       server->Init();
+
+       // gSOAP structures for handling 
+       // request and response information
+       _rci__RemoteControl request;
+       _rci__RemoteControlResponse response;
+
+       // example values
+       uint8 *command = new uint8(Reset);
+       uint32 *ianaOemNumber = new uint32(IntelIanaNumber);
+       uint8 *specialCommand = NULL; //none
+       uint16 *oemParameter = NULL; //none
+       uint16 *bootOptions = NULL; //none
+       uint16 *specialCommandParameters = NULL; //none
+
+       if(!def_values)
+       {
+               // To use default values above, comment the following line.
+               if(!GetUserValues(command, ianaOemNumber, specialCommand, oemParameter, 
+                       bootOptions, specialCommandParameters))
+               {
+                       status = false;
+               }
+       }
+
+       if(status == true)
+       {
+               switch(*command)
+               {
+               case Reset:
+                       request.Command = rci__RemoteControlCommandType__16;
+                       break;
+               case PowerUp:
+                       request.Command = rci__RemoteControlCommandType__17;
+                       break;
+               case PowerDown:
+                       request.Command = rci__RemoteControlCommandType__18;
+                       break;
+               case PowerCycleReset:
+                       request.Command = rci__RemoteControlCommandType__19;
+                       break;
+               case SetBootOptions:
+                       request.Command = rci__RemoteControlCommandType__33;
+                       break;
+               default:
+                       break;
+               }
+
+               if(specialCommand == NULL)
+               {
+                       request.SpecialCommand = NULL;
+               }
+               else
+               {
+                       request.SpecialCommand = new rci__SpecialCommandType;
+                       switch(*specialCommand)
+                       {
+                       case NOP:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__0;
+                               break;
+                       case ForcePxeBoot:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__1;
+                               break;
+                       case ForceHardDriveBoot:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__2;
+                               break;
+                       case ForceHardDriveSafeModeBoot:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__3;
+                               break;
+                       case ForceDiagnosticsBoot:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__4;
+                               break;
+                       case ForceCdOrDvdBoot:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__5;
+                               break;
+                       case IntelOemCommand:
+                               *(request.SpecialCommand) = rci__SpecialCommandType__193;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+               request.IanaOemNumber = *ianaOemNumber;
+               request.BootOptions = bootOptions;
+               request.OEMparameters = oemParameter;
+               request.SpecialCommandParameter = specialCommandParameters;
+
+               FunctionCall("RemoteControl");  
+               res = soap_call___rci__RemoteControl(server->GetSoap(),
+                       server->GetIp(),NULL, &request, &response);
+
+               if((status = CheckReturnStatus(res,response.Status,"RemoteControl")) == true)
+               {
+                       PrintSuccess();
+               }
+
+               if(request.SpecialCommand != NULL)
+               {
+                       delete request.SpecialCommand;
+                       request.SpecialCommand = NULL;
+               }
+       }
+
+       // cleanup heap allocated memory 
+       if(command != NULL)
+       {
+               delete command;
+               command = NULL;
+       }
+       if(ianaOemNumber != NULL)
+       {
+               delete ianaOemNumber;
+               ianaOemNumber = NULL;
+       }
+       if(specialCommand != NULL)
+       {
+               delete specialCommand;
+               specialCommand = NULL;
+       }
+       if(oemParameter != NULL)
+       {
+               delete oemParameter;
+               oemParameter = NULL;
+       }
+       if(bootOptions != NULL)
+       {
+               delete bootOptions;
+               bootOptions = NULL;
+       }
+       if(specialCommandParameters != NULL)
+       {
+               delete specialCommandParameters;
+               specialCommandParameters = NULL;
+       }
+
+       return status;
+}
+
+/*
+ * Get user's settings for the RemoteControl function
+ * Arguments & return values:
+ *     command - specifies the boot or power state operation to be performed
+ *     ianaOemNumber   - specifies an IANA-assigned Enterprise Number
+ *     specialCommand  - specifies an optional modification to the boot behavior
+ *     OemParameter    - specifies IntelĀ® AMT proprietary boot options 
+ *     bootOptions             - specifies standard boot options 
+ *     specialCommandParameters - specifies an optional modification to the 
+ *                                                        boot behavior
+ * Return value:
+ *  true  - on success
+ *  false - on failure
+ */
+bool GetUserValues(uint8 *&command, uint32 *&ianaOemNumber, 
+                                  uint8 *&specialCommand, uint16 *&oemParameter, 
+                                  uint16 *&bootOptions, uint16 *&specialCommandParameters)
+{
+       uint32 tmp;
+
+       printf("Please specify the following parameters\n");
+
+       // Get mandatory parameters
+
+       // Get Command
+       printf("\n\tCommand");
+    printf("\n\t=======");
+       printf("\nPossible values:");
+       printf("\n\t%u (Reset)",Reset);
+       printf("\n\t%u (PowerUp)",PowerUp);
+       printf("\n\t%u (PowerDown)",PowerDown);
+       printf("\n\t%u (PowerCycleReset)",PowerCycleReset);
+       printf("\n\t%u (SetBootOptions)\n>",SetBootOptions);
+       scanf("%u", &tmp);
+
+       // verify command value 
+       if ( tmp == Reset ||
+                tmp == PowerUp ||
+                tmp == PowerDown ||
+                tmp == PowerCycleReset ||
+                tmp == SetBootOptions)
+       {
+               // sanity check
+               if ( command == NULL )
+               {
+                       command = new uint8();
+               }
+               *command = (uint8)tmp;
+       }
+       else
+       {
+               goto ILLEGAL_INPUT;
+       }
+
+       // If command is Set Boot Options, ianaOemNumber 
+       // should be IntelIanaNumber.
+       if( *command == SetBootOptions )
+       {
+               // sanity check
+               if ( ianaOemNumber == NULL )
+               {
+                       ianaOemNumber = new uint32();
+               }
+
+               printf("\nSetBootOptions command selected. ");
+               printf("Iana OEM Number is IntelIanaNumber (%u)\n",IntelIanaNumber);
+
+               *ianaOemNumber = (uint32)IntelIanaNumber;
+
+       }
+       else
+       {
+               // Get Iana number
+               printf("\n\tIana OEM Number");
+        printf("\n\t===============");
+               printf("\nPossible values:");
+               printf("\n\t%u (IntelIanaNumber)", IntelIanaNumber);
+               printf("\n\t%u (ASFIanaNumber)\n>", ASFIanaNumber);
+               scanf("%u", &tmp);
+
+               // verify ianaOemNumber value
+               if ( tmp == IntelIanaNumber ||
+                       tmp == ASFIanaNumber )
+               {
+                       // sanity check
+                       if ( ianaOemNumber == NULL )
+                       {
+                               ianaOemNumber = new uint32();
+                       }
+                       *ianaOemNumber = (uint32)tmp;
+               }
+               else
+               {
+                       goto ILLEGAL_INPUT;
+               }
+       }
+
+       // if power down, all other parameters should not be sent.
+       if ( *command == PowerDown )
+       {
+               specialCommand = NULL;
+               oemParameter = NULL;
+               bootOptions = NULL;
+               specialCommandParameters = NULL;
+               return true;
+       }
+
+       // Get optional parameters
+
+       // Get Special Command
+       printf("\n\tSpecial Command");
+    printf("\n\t===============");
+       printf("\nPossible values:");
+
+       printf("\n\t%d (No Special Command)",-1);
+       printf("\n\t%u (NOP)",NOP);
+       printf("\n\t%u (ForcePxeBoot)",ForcePxeBoot);
+       printf("\n\t%u (ForceHardDriveBoot)",ForceHardDriveBoot);
+       printf("\n\t%u (ForceHardDriveSafeModeBoot)",ForceHardDriveSafeModeBoot);
+       printf("\n\t%u (ForceDiagnosticsBoot)",ForceDiagnosticsBoot);
+       printf("\n\t%u (ForceCdOrDvdBoot)",ForceCdOrDvdBoot);
+       printf("\n\t%u (IntelOemCommand)\n>",IntelOemCommand);
+       scanf("%u", &tmp);
+
+       // verify specialCommand value
+       if ( tmp == NO_VALUE ||
+                tmp == NOP ||
+                tmp == ForcePxeBoot ||
+                tmp == ForceHardDriveBoot ||
+                tmp == ForceHardDriveSafeModeBoot ||
+                tmp == ForceDiagnosticsBoot ||
+                tmp == ForceCdOrDvdBoot ||
+                tmp == IntelOemCommand )
+       {
+               if ( tmp == NO_VALUE )
+               {
+                       specialCommand = NULL;
+               }
+        else if(tmp == IntelOemCommand &&
+                *ianaOemNumber != IntelIanaNumber)
+        {
+            printf("Error: Special Command value %d is legal", IntelOemCommand);
+            printf(" only for IanaOemNumber value %d", IntelIanaNumber);
+            exit(1);
+        }
+               else
+               {
+                       // sanity check
+                       if ( specialCommand == NULL )
+                       {
+                               specialCommand = new uint8();
+                       }
+                       *specialCommand = (uint8)tmp;
+               }
+       }
+       else
+       {
+               goto ILLEGAL_INPUT;
+       }
+
+       // Get OEM Parameter
+       // if ianaOemNumber is ASFIanaNumber, oemParameters should not be sent .
+       if ( *ianaOemNumber != IntelIanaNumber )
+       {
+               oemParameter = NULL;
+       }
+       else
+       {
+               printf("\n\tOEM Parameters");
+        printf("\n\t==============");
+        printf("\nPossible values:");
+        printf("\n\t%d (No OEM Parameters)",-1);
+               printf("\n\t%d (Undefined OEM Parameter)",UndefinedOEMParameter);
+               printf("\n\t%u (UseSol)\n>",UseSol);
+               scanf("%u", &tmp);
+               if ( tmp == NO_VALUE )
+               {
+                       oemParameter = NULL;
+               }
+               else
+               {
+                       // sanity check
+                       if ( oemParameter == NULL )
+                       {
+                               oemParameter = new uint16();
+                       }
+                       *oemParameter = (uint16) tmp;
+               }
+       }
+
+       // Get Special Command Parameters
+       printf("\n\tSpecial Command Parameters");
+    printf("\n\t==========================");
+       printf("\nPossible values:");
+
+       // Special Command is not equal to 0xC1 (IntelOemCommand)
+       if ( specialCommand == NULL ||
+               (specialCommand != NULL) && (*specialCommand != IntelOemCommand) )
+       {
+               printf("\n\tSpecial command not equal to %d",IntelOemCommand);
+               printf("\n\tSee ASF specification for the Special Command Parameter legal values");
+               printf("\n\n\t%d (No Special Command Parameter)\n>",-1);
+               scanf("%u", &tmp);
+       }
+       // Special Command is 0xC1, hence Special Command Parameter
+       // used to augment the Special Command
+       else
+       {
+               printf("\n\t%d (No Special Command Parameter)",-1);
+        printf("\n\t%d (Undefined Special Command Parameter)",
+            UndefinedSpecialCommandParameter);
+               printf("\n\t%u (UseIderFloppy)",UseIderFloppy);
+               printf("\n\t%u (ReflashBios)",ReflashBios);
+               printf("\n\t%u (BiosSetup)",BiosSetup);
+               printf("\n\t%u (BiosPause)",BiosPause);
+               printf("\n\t%u (UseIderCD)\n",UseIderCD);
+
+               printf("\nYou can choose several options by using bitwise OR operation\n\n>");
+               scanf("%u", &tmp);
+
+               // verify specialCommandParameters value
+               if ( (tmp != NO_VALUE) && (tmp & SpecialCommandParametersReservedBits) )
+               {
+                       goto ILLEGAL_INPUT;
+               }
+       }
+
+       if ( tmp == NO_VALUE )
+       {
+               specialCommandParameters = NULL;
+       }
+       else
+       {
+               // sanity check
+               if ( specialCommandParameters == NULL )
+               {
+                       specialCommandParameters = new uint16();
+               }
+               *specialCommandParameters = (uint16)tmp;
+       }
+               
+       
+
+       // Get Boot Options
+       printf("\n\tBoot Options");
+    printf("\n\t============");
+       printf("\nPossible values:");
+
+       printf("\n\t%d (No boot options)", -1);
+       printf("\n\t%u (LockPowerButton)",LockPowerButton);
+       printf("\n\t%u (LockResetButton)",LockResetButton);
+       printf("\n\t%u (LockKeyboard)",LockKeyboard);
+       printf("\n\t%u (LockSleepButton)",LockSleepButton);
+       printf("\n\t%u (UserPasswordBypass)",UserPasswordBypass);
+       printf("\n\t%u (ForceProgressEvents)",ForceProgressEvents);
+
+    printf("\n\n\tFirmware Verbosity Options:");
+    printf(  "\n\t---------------------------");
+       printf("\n\t%u (FirmwareVerbositySystemDefault)",FirmwareVerbositySystemDefault);
+       printf("\n\t%u (FirmwareVerbosityQuiet)",FirmwareVerbosityQuiet);
+       printf("\n\t%u (FirmwareVerbosityVerbose)",FirmwareVerbosityVerbose);
+       printf("\n\t%u (FirmwareVerbosityScreen)",FirmwareVerbosityScreen);
+       printf("\n\n\t%u (ConfigurationDataReset)\n",ConfigurationDataReset);
+
+       printf("\nYou can choose several options by using bitwise OR operation\n\n>");
+       scanf("%u", &tmp);
+
+       // verify bootOptions value
+       if ( (tmp != NO_VALUE) && (tmp & BootOptionsReservedBits) )
+       {
+               goto ILLEGAL_INPUT;
+       }
+       else
+       {
+               if ( tmp == NO_VALUE )
+               {
+                       bootOptions = NULL;
+               }
+               else
+               {
+                       // sanity check
+                       if ( bootOptions == NULL )
+                       {
+                               bootOptions = new uint16();
+                       }
+                       *bootOptions = (uint16)tmp;
+               }
+       }
+       return true;
+
+       ILLEGAL_INPUT:
+       printf("Error: %u is an illegal value. Aborting.\n", tmp);
+       return false;
+}
+
+/*
+ * Prints system capabilities supported by the Intel(R) AMT device
+ * Arguments:
+ *     systemCapabilitiesSupported     - set of flags that indicate the values
+ *                                                             the Intel(R) AMT device supports in the 
+ *                                                             Command parameter of the RemoteControl method
+ */
+void DisplaySystemCapabilities(uint8 systemCapabilitiesSupported)
+{
+       printf("\nSystemCapabilitiesSupported = %u", systemCapabilitiesSupported);
+
+       if ( systemCapabilitiesSupported & SuppPowerCycleReset )
+       {
+               printf("\nPowerCycleReset ");
+       }
+       if ( systemCapabilitiesSupported & SuppPowerDown )
+       {
+               printf("\nPowerDown ");
+       }
+       if ( systemCapabilitiesSupported & SuppPowerUp )
+       {
+               printf("\nPowerUp ");
+       }
+       if ( systemCapabilitiesSupported & SuppReset )
+       {
+               printf("\nReset");
+       }
+}
+
+/*
+ * Prints special commands supported by the Intel(R) AMT device
+ * Arguments:
+ *     specialCommandsSupported        - set of flags that indicate the values
+ *                                                             the Intel(R) AMT device supports in the 
+ *                                                             SpecialCommand parameter of the 
+ *                                                             RemoteControl method
+ */
+void DisplaySpecialCommand(uint16 specialCommandsSupported)
+{
+       printf("\nSpecialCommandsSupported = %u", specialCommandsSupported);
+
+       if ( specialCommandsSupported & SuppForcePXEBoot )
+       {
+               printf("\nForcePXEBoot ");
+       }
+       if ( specialCommandsSupported & SuppForceHardDriveBoot )
+       {
+               printf("\nForceHardDriveBoot ");
+       }
+       if ( specialCommandsSupported & SuppForceHardDriveSafeModeBoot )
+       {
+               printf("\nForceHardDriveSafeModeBoot ");
+       }
+       if ( specialCommandsSupported & SuppForceDiagnosticBoot )
+       {
+               printf("\nForceDiagnosticBoot ");
+       }
+       if ( specialCommandsSupported & SuppForceCDorDVDBoot )
+       {
+               printf("\nForceCDorDVDBoot");
+       }
+}
+
+
+/*
+ * Prints firmware capabilities supported by the Intel(R) AMT device
+ * Arguments:
+ *     systemCapabilitiesSupported     - set of flags that indicate the values
+ *                                                             the Intel(R) AMT device supports in the 
+ *                                                             BootOptions parameter of the RemoteControl 
+ *                                                             method
+ */
+void DisplaySystemFirmwareCapabilities(uint32 systemFirmwareCapabilities)
+{
+       printf("\nSystemFirmwareCapabilities = %u", systemFirmwareCapabilities);
+
+       if ( systemFirmwareCapabilities & SuppVerbosityScreenBlank )
+       {
+               printf("\nVerbosityScreenBlank ");
+       }
+       if ( systemFirmwareCapabilities & SuppPowerButtonLock )
+       {
+               printf("\nPowerButtonLock ");
+       }
+       if ( systemFirmwareCapabilities & SuppResetButtonLock )
+       {
+               printf("\nResetButtonLock ");
+       }
+       if ( systemFirmwareCapabilities & SuppKeyboardLock )
+       {
+               printf("\nKeyboardLock ");
+       }
+       if ( systemFirmwareCapabilities & SuppSleepButtonLock )
+       {
+               printf("\nSleepButtonLock ");
+       }
+       if ( systemFirmwareCapabilities & SuppUserPasswordBypass )
+       {
+               printf("\nUserPasswordBypass ");
+       }
+       if ( systemFirmwareCapabilities & SuppForcedProgressEvents )
+       {
+               printf("\nForcedProgressEvents ");
+       }
+       if ( systemFirmwareCapabilities & SuppVerbosityVerbose )
+       {
+               printf("\nVerbosityVerbose ");
+       }
+       if ( systemFirmwareCapabilities & SuppVerbosityQuiet )
+       {
+               printf("\nVerbosityQuiet ");
+       }
+       if ( systemFirmwareCapabilities & SuppConfigurationDataReset )
+       {
+               printf("\nConfigurationDataReset");
+       }
+}
+
+
+/*
+ * Prints OEM defined capabilities supported by the Intel(R) AMT device
+ * Arguments:
+ *     systemCapabilitiesSupported     - set of flags that indicate the values
+ *                                                             the Intel(R) AMT device supports in the 
+ *                                                             OemParameters parameter of the RemoteControl 
+ *                                                             method
+ */
+void DisplayOemDefinedCapabilities(uint32 oemDefinedCapabilities)
+{
+       printf("\nOemDefinedCapabilities = %u", oemDefinedCapabilities);
+
+       if ( oemDefinedCapabilities & SuppIDER )
+       {
+               printf("\nIDER");
+       }
+       if ( oemDefinedCapabilities & SuppSOL )
+       {
+               printf("\nSOL");
+       }
+       if ( oemDefinedCapabilities & SuppBiosReflash )
+       {
+               printf("\nBiosReflash");
+       }
+       if ( oemDefinedCapabilities & SuppBiosSetup )
+       {
+               printf("\nBiosSetup");
+       }
+       if ( oemDefinedCapabilities & SuppBiosPause )
+       {
+               printf("\nBiosPause");
+       }
+}
+