VirtualBox

Ignore:
Timestamp:
Jan 19, 2009 6:24:29 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
41748
Message:

FE/VBoxManage: Don't hold COM objects past XPCOM shutdown; pack all handler arguments to a single structure.

Location:
trunk/src/VBox/Frontends/VBoxManage
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp

    r15602 r16052  
    16521652 * Wrapper for handling internal commands
    16531653 */
    1654 int handleInternalCommands(int argc, char *argv[],
    1655                            ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     1654int handleInternalCommands(HandlerArg *a)
    16561655{
    16571656    g_fInternalMode = true;
    16581657
    16591658    /* at least a command is required */
    1660     if (argc < 1)
     1659    if (a->argc < 1)
    16611660        return errorSyntax(USAGE_ALL, "Command missing");
    16621661
     
    16641663     * The 'string switch' on command name.
    16651664     */
    1666     const char *pszCmd = argv[0];
     1665    const char *pszCmd = a->argv[0];
    16671666    if (!strcmp(pszCmd, "loadsyms"))
    1668         return CmdLoadSyms(argc - 1, &argv[1], aVirtualBox, aSession);
     1667        return CmdLoadSyms(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16691668    //if (!strcmp(pszCmd, "unloadsyms"))
    1670     //    return CmdUnloadSyms(argc - 1 , &argv[1]);
     1669    //    return CmdUnloadSyms(argc - 1 , &a->argv[1]);
    16711670    if (!strcmp(pszCmd, "sethduuid") || !strcmp(pszCmd, "setvdiuuid"))
    1672         return handleSetHDUUID(argc - 1, &argv[1], aVirtualBox, aSession);
     1671        return handleSetHDUUID(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16731672    if (!strcmp(pszCmd, "listpartitions"))
    1674         return CmdListPartitions(argc - 1, &argv[1], aVirtualBox, aSession);
     1673        return CmdListPartitions(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16751674    if (!strcmp(pszCmd, "createrawvmdk"))
    1676         return CmdCreateRawVMDK(argc - 1, &argv[1], aVirtualBox, aSession);
     1675        return CmdCreateRawVMDK(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16771676    if (!strcmp(pszCmd, "renamevmdk"))
    1678         return CmdRenameVMDK(argc - 1, &argv[1], aVirtualBox, aSession);
     1677        return CmdRenameVMDK(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16791678    if (!strcmp(pszCmd, "converttoraw"))
    1680         return CmdConvertToRaw(argc - 1, &argv[1], aVirtualBox, aSession);
     1679        return CmdConvertToRaw(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16811680    if (!strcmp(pszCmd, "converthd"))
    1682         return CmdConvertHardDisk(argc - 1, &argv[1], aVirtualBox, aSession);
     1681        return CmdConvertHardDisk(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
    16831682
    16841683    if (!strcmp(pszCmd, "modinstall"))
     
    16881687
    16891688    /* default: */
    1690     return errorSyntax(USAGE_ALL, "Invalid command '%s'", Utf8Str(argv[0]).raw());
    1691 }
    1692 
     1689    return errorSyntax(USAGE_ALL, "Invalid command '%s'", Utf8Str(a->argv[0]).raw());
     1690}
     1691
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp

    r15906 r16052  
    7373
    7474/** command handler type */
    75 typedef int (*PFNHANDLER)(int argc, char *argv[], ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
    76 
    77 #ifdef USE_XPCOM_QUEUE
    78 /** A pointer to the event queue, set by main() before calling any handlers. */
    79 nsCOMPtr<nsIEventQueue> g_pEventQ;
    80 #endif
     75typedef int (*PFNHANDLER)(HandlerArg *a);
    8176
    8277/**
     
    757752}
    758753
    759 static int handleRegisterVM(int argc, char *argv[],
    760                             ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     754static int handleRegisterVM(HandlerArg *a)
    761755{
    762756    HRESULT rc;
    763757
    764     if (argc != 1)
     758    if (a->argc != 1)
    765759        return errorSyntax(USAGE_REGISTERVM, "Incorrect number of parameters");
    766760
    767761    ComPtr<IMachine> machine;
    768     CHECK_ERROR(virtualBox, OpenMachine(Bstr(argv[0]), machine.asOutParam()));
     762    CHECK_ERROR(a->virtualBox, OpenMachine(Bstr(a->argv[0]), machine.asOutParam()));
    769763    if (SUCCEEDED(rc))
    770764    {
    771765        ASSERT(machine);
    772         CHECK_ERROR(virtualBox, RegisterMachine(machine));
     766        CHECK_ERROR(a->virtualBox, RegisterMachine(machine));
    773767    }
    774768    return SUCCEEDED(rc) ? 0 : 1;
    775769}
    776770
    777 static int handleUnregisterVM(int argc, char *argv[],
    778                               ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     771static int handleUnregisterVM(HandlerArg *a)
    779772{
    780773    HRESULT rc;
    781774
    782     if ((argc != 1) && (argc != 2))
     775    if ((a->argc != 1) && (a->argc != 2))
    783776        return errorSyntax(USAGE_UNREGISTERVM, "Incorrect number of parameters");
    784777
    785778    ComPtr<IMachine> machine;
    786779    /* assume it's a UUID */
    787     rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     780    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    788781    if (FAILED(rc) || !machine)
    789782    {
    790783        /* must be a name */
    791         CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     784        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    792785    }
    793786    if (machine)
     
    796789        machine->COMGETTER(Id)(uuid.asOutParam());
    797790        machine = NULL;
    798         CHECK_ERROR(virtualBox, UnregisterMachine(uuid, machine.asOutParam()));
     791        CHECK_ERROR(a->virtualBox, UnregisterMachine(uuid, machine.asOutParam()));
    799792        if (SUCCEEDED(rc) && machine)
    800793        {
    801794            /* are we supposed to delete the config file? */
    802             if ((argc == 2) && (strcmp(argv[1], "-delete") == 0))
     795            if ((a->argc == 2) && (strcmp(a->argv[1], "-delete") == 0))
    803796            {
    804797                CHECK_ERROR(machine, DeleteSettings());
     
    809802}
    810803
    811 static int handleCreateVM(int argc, char *argv[],
    812                           ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     804static int handleCreateVM(HandlerArg *a)
    813805{
    814806    HRESULT rc;
     
    821813
    822814    RTUuidClear(&id);
    823     for (int i = 0; i < argc; i++)
    824     {
    825         if (strcmp(argv[i], "-basefolder") == 0)
    826         {
    827             if (argc <= i + 1)
    828                 return errorArgument("Missing argument to '%s'", argv[i]);
    829             i++;
    830             baseFolder = argv[i];
    831         }
    832         else if (strcmp(argv[i], "-settingsfile") == 0)
    833         {
    834             if (argc <= i + 1)
    835                 return errorArgument("Missing argument to '%s'", argv[i]);
    836             i++;
    837             settingsFile = argv[i];
    838         }
    839         else if (strcmp(argv[i], "-name") == 0)
    840         {
    841             if (argc <= i + 1)
    842                 return errorArgument("Missing argument to '%s'", argv[i]);
    843             i++;
    844             name = argv[i];
    845         }
    846         else if (strcmp(argv[i], "-ostype") == 0)
    847         {
    848             if (argc <= i + 1)
    849                 return errorArgument("Missing argument to '%s'", argv[i]);
    850             i++;
    851             osTypeId = argv[i];
    852         }
    853         else if (strcmp(argv[i], "-uuid") == 0)
    854         {
    855             if (argc <= i + 1)
    856                 return errorArgument("Missing argument to '%s'", argv[i]);
    857             i++;
    858             if (RT_FAILURE(RTUuidFromStr(&id, argv[i])))
    859                 return errorArgument("Invalid UUID format %s\n", argv[i]);
    860         }
    861         else if (strcmp(argv[i], "-register") == 0)
     815    for (int i = 0; i < a->argc; i++)
     816    {
     817        if (strcmp(a->argv[i], "-basefolder") == 0)
     818        {
     819            if (a->argc <= i + 1)
     820                return errorArgument("Missing argument to '%s'", a->argv[i]);
     821            i++;
     822            baseFolder = a->argv[i];
     823        }
     824        else if (strcmp(a->argv[i], "-settingsfile") == 0)
     825        {
     826            if (a->argc <= i + 1)
     827                return errorArgument("Missing argument to '%s'", a->argv[i]);
     828            i++;
     829            settingsFile = a->argv[i];
     830        }
     831        else if (strcmp(a->argv[i], "-name") == 0)
     832        {
     833            if (a->argc <= i + 1)
     834                return errorArgument("Missing argument to '%s'", a->argv[i]);
     835            i++;
     836            name = a->argv[i];
     837        }
     838        else if (strcmp(a->argv[i], "-ostype") == 0)
     839        {
     840            if (a->argc <= i + 1)
     841                return errorArgument("Missing argument to '%s'", a->argv[i]);
     842            i++;
     843            osTypeId = a->argv[i];
     844        }
     845        else if (strcmp(a->argv[i], "-uuid") == 0)
     846        {
     847            if (a->argc <= i + 1)
     848                return errorArgument("Missing argument to '%s'", a->argv[i]);
     849            i++;
     850            if (RT_FAILURE(RTUuidFromStr(&id, a->argv[i])))
     851                return errorArgument("Invalid UUID format %s\n", a->argv[i]);
     852        }
     853        else if (strcmp(a->argv[i], "-register") == 0)
    862854        {
    863855            fRegister = true;
    864856        }
    865857        else
    866             return errorSyntax(USAGE_CREATEVM, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     858            return errorSyntax(USAGE_CREATEVM, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    867859    }
    868860    if (!name)
     
    877869
    878870        if (!settingsFile)
    879             CHECK_ERROR_BREAK(virtualBox,
     871            CHECK_ERROR_BREAK(a->virtualBox,
    880872                CreateMachine(name, osTypeId, baseFolder, Guid(id), machine.asOutParam()));
    881873        else
    882             CHECK_ERROR_BREAK(virtualBox,
     874            CHECK_ERROR_BREAK(a->virtualBox,
    883875                CreateLegacyMachine(name, osTypeId, settingsFile, Guid(id), machine.asOutParam()));
    884876
     
    886878        if (fRegister)
    887879        {
    888             CHECK_ERROR_BREAK(virtualBox, RegisterMachine(machine));
     880            CHECK_ERROR_BREAK(a->virtualBox, RegisterMachine(machine));
    889881        }
    890882        Guid uuid;
     
    928920#endif
    929921
    930 static int handleModifyVM(int argc, char *argv[],
    931                           ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     922static int handleModifyVM(HandlerArg *a)
    932923{
    933924    HRESULT rc;
     
    980971    /* VM ID + at least one parameter. Parameter arguments are checked
    981972     * individually. */
    982     if (argc < 2)
     973    if (a->argc < 2)
    983974        return errorSyntax(USAGE_MODIFYVM, "Not enough parameters");
    984975
     
    987978    {
    988979        ComPtr <ISystemProperties> info;
    989         CHECK_ERROR_RET (virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
     980        CHECK_ERROR_RET (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
    990981        CHECK_ERROR_RET (info, COMGETTER(NetworkAdapterCount) (&NetworkAdapterCount), 1);
    991982    }
     
    993984    {
    994985        ComPtr <ISystemProperties> info;
    995         CHECK_ERROR_RET (virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
     986        CHECK_ERROR_RET (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
    996987        CHECK_ERROR_RET (info, COMGETTER(SerialPortCount) (&SerialPortCount), 1);
    997988    }
     
    10121003    std::vector <char *> uarts_path (SerialPortCount, 0);
    10131004
    1014     for (int i = 1; i < argc; i++)
    1015     {
    1016         if (strcmp(argv[i], "-name") == 0)
    1017         {
    1018             if (argc <= i + 1)
    1019                 return errorArgument("Missing argument to '%s'", argv[i]);
    1020             i++;
    1021             name = argv[i];
    1022         }
    1023         else if (strcmp(argv[i], "-ostype") == 0)
    1024         {
    1025             if (argc <= i + 1)
    1026                 return errorArgument("Missing argument to '%s'", argv[i]);
    1027             i++;
    1028             ostype = argv[i];
    1029         }
    1030         else if (strcmp(argv[i], "-memory") == 0)
    1031         {
    1032             if (argc <= i + 1)
    1033                 return errorArgument("Missing argument to '%s'", argv[i]);
    1034             i++;
    1035             memorySize = RTStrToUInt32(argv[i]);
    1036         }
    1037         else if (strcmp(argv[i], "-vram") == 0)
    1038         {
    1039             if (argc <= i + 1)
    1040                 return errorArgument("Missing argument to '%s'", argv[i]);
    1041             i++;
    1042             vramSize = RTStrToUInt32(argv[i]);
    1043         }
    1044         else if (strcmp(argv[i], "-acpi") == 0)
    1045         {
    1046             if (argc <= i + 1)
    1047                 return errorArgument("Missing argument to '%s'", argv[i]);
    1048             i++;
    1049             acpi = argv[i];
    1050         }
    1051         else if (strcmp(argv[i], "-ioapic") == 0)
    1052         {
    1053             if (argc <= i + 1)
    1054                 return errorArgument("Missing argument to '%s'", argv[i]);
    1055             i++;
    1056             ioapic = argv[i];
    1057         }
    1058         else if (strcmp(argv[i], "-hwvirtex") == 0)
    1059         {
    1060             if (argc <= i + 1)
    1061                 return errorArgument("Missing argument to '%s'", argv[i]);
    1062             i++;
    1063             hwvirtex = argv[i];
    1064         }
    1065         else if (strcmp(argv[i], "-nestedpaging") == 0)
    1066         {
    1067             if (argc <= i + 1)
    1068                 return errorArgument("Missing argument to '%s'", argv[i]);
    1069             i++;
    1070             nestedpaging = argv[i];
    1071         }
    1072         else if (strcmp(argv[i], "-vtxvpid") == 0)
    1073         {
    1074             if (argc <= i + 1)
    1075                 return errorArgument("Missing argument to '%s'", argv[i]);
    1076             i++;
    1077             vtxvpid = argv[i];
    1078         }
    1079         else if (strcmp(argv[i], "-pae") == 0)
    1080         {
    1081             if (argc <= i + 1)
    1082                 return errorArgument("Missing argument to '%s'", argv[i]);
    1083             i++;
    1084             pae = argv[i];
    1085         }
    1086         else if (strcmp(argv[i], "-monitorcount") == 0)
    1087         {
    1088             if (argc <= i + 1)
    1089                 return errorArgument("Missing argument to '%s'", argv[i]);
    1090             i++;
    1091             monitorcount = RTStrToUInt32(argv[i]);
    1092         }
    1093         else if (strcmp(argv[i], "-accelerate3d") == 0)
    1094         {
    1095             if (argc <= i + 1)
    1096                 return errorArgument("Missing argument to '%s'", argv[i]);
    1097             i++;
    1098             accelerate3d = argv[i];
    1099         }
    1100         else if (strcmp(argv[i], "-bioslogofadein") == 0)
    1101         {
    1102             if (argc <= i + 1)
    1103                 return errorArgument("Missing argument to '%s'", argv[i]);
    1104             i++;
    1105             bioslogofadein = argv[i];
    1106         }
    1107         else if (strcmp(argv[i], "-bioslogofadeout") == 0)
    1108         {
    1109             if (argc <= i + 1)
    1110                 return errorArgument("Missing argument to '%s'", argv[i]);
    1111             i++;
    1112             bioslogofadeout = argv[i];
    1113         }
    1114         else if (strcmp(argv[i], "-bioslogodisplaytime") == 0)
    1115         {
    1116             if (argc <= i + 1)
    1117                 return errorArgument("Missing argument to '%s'", argv[i]);
    1118             i++;
    1119             bioslogodisplaytime = RTStrToUInt32(argv[i]);
    1120         }
    1121         else if (strcmp(argv[i], "-bioslogoimagepath") == 0)
    1122         {
    1123             if (argc <= i + 1)
    1124                 return errorArgument("Missing argument to '%s'", argv[i]);
    1125             i++;
    1126             bioslogoimagepath = argv[i];
    1127         }
    1128         else if (strcmp(argv[i], "-biosbootmenu") == 0)
    1129         {
    1130             if (argc <= i + 1)
    1131                 return errorArgument("Missing argument to '%s'", argv[i]);
    1132             i++;
    1133             biosbootmenumode = argv[i];
    1134         }
    1135         else if (strcmp(argv[i], "-biossystemtimeoffset") == 0)
    1136         {
    1137             if (argc <= i + 1)
    1138                 return errorArgument("Missing argument to '%s'", argv[i]);
    1139             i++;
    1140             biossystemtimeoffset = argv[i];
    1141         }
    1142         else if (strcmp(argv[i], "-biospxedebug") == 0)
    1143         {
    1144             if (argc <= i + 1)
    1145                 return errorArgument("Missing argument to '%s'", argv[i]);
    1146             i++;
    1147             biospxedebug = argv[i];
    1148         }
    1149         else if (strncmp(argv[i], "-boot", 5) == 0)
     1005    for (int i = 1; i < a->argc; i++)
     1006    {
     1007        if (strcmp(a->argv[i], "-name") == 0)
     1008        {
     1009            if (a->argc <= i + 1)
     1010                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1011            i++;
     1012            name = a->argv[i];
     1013        }
     1014        else if (strcmp(a->argv[i], "-ostype") == 0)
     1015        {
     1016            if (a->argc <= i + 1)
     1017                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1018            i++;
     1019            ostype = a->argv[i];
     1020        }
     1021        else if (strcmp(a->argv[i], "-memory") == 0)
     1022        {
     1023            if (a->argc <= i + 1)
     1024                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1025            i++;
     1026            memorySize = RTStrToUInt32(a->argv[i]);
     1027        }
     1028        else if (strcmp(a->argv[i], "-vram") == 0)
     1029        {
     1030            if (a->argc <= i + 1)
     1031                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1032            i++;
     1033            vramSize = RTStrToUInt32(a->argv[i]);
     1034        }
     1035        else if (strcmp(a->argv[i], "-acpi") == 0)
     1036        {
     1037            if (a->argc <= i + 1)
     1038                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1039            i++;
     1040            acpi = a->argv[i];
     1041        }
     1042        else if (strcmp(a->argv[i], "-ioapic") == 0)
     1043        {
     1044            if (a->argc <= i + 1)
     1045                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1046            i++;
     1047            ioapic = a->argv[i];
     1048        }
     1049        else if (strcmp(a->argv[i], "-hwvirtex") == 0)
     1050        {
     1051            if (a->argc <= i + 1)
     1052                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1053            i++;
     1054            hwvirtex = a->argv[i];
     1055        }
     1056        else if (strcmp(a->argv[i], "-nestedpaging") == 0)
     1057        {
     1058            if (a->argc <= i + 1)
     1059                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1060            i++;
     1061            nestedpaging = a->argv[i];
     1062        }
     1063        else if (strcmp(a->argv[i], "-vtxvpid") == 0)
     1064        {
     1065            if (a->argc <= i + 1)
     1066                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1067            i++;
     1068            vtxvpid = a->argv[i];
     1069        }
     1070        else if (strcmp(a->argv[i], "-pae") == 0)
     1071        {
     1072            if (a->argc <= i + 1)
     1073                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1074            i++;
     1075            pae = a->argv[i];
     1076        }
     1077        else if (strcmp(a->argv[i], "-monitorcount") == 0)
     1078        {
     1079            if (a->argc <= i + 1)
     1080                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1081            i++;
     1082            monitorcount = RTStrToUInt32(a->argv[i]);
     1083        }
     1084        else if (strcmp(a->argv[i], "-accelerate3d") == 0)
     1085        {
     1086            if (a->argc <= i + 1)
     1087                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1088            i++;
     1089            accelerate3d = a->argv[i];
     1090        }
     1091        else if (strcmp(a->argv[i], "-bioslogofadein") == 0)
     1092        {
     1093            if (a->argc <= i + 1)
     1094                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1095            i++;
     1096            bioslogofadein = a->argv[i];
     1097        }
     1098        else if (strcmp(a->argv[i], "-bioslogofadeout") == 0)
     1099        {
     1100            if (a->argc <= i + 1)
     1101                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1102            i++;
     1103            bioslogofadeout = a->argv[i];
     1104        }
     1105        else if (strcmp(a->argv[i], "-bioslogodisplaytime") == 0)
     1106        {
     1107            if (a->argc <= i + 1)
     1108                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1109            i++;
     1110            bioslogodisplaytime = RTStrToUInt32(a->argv[i]);
     1111        }
     1112        else if (strcmp(a->argv[i], "-bioslogoimagepath") == 0)
     1113        {
     1114            if (a->argc <= i + 1)
     1115                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1116            i++;
     1117            bioslogoimagepath = a->argv[i];
     1118        }
     1119        else if (strcmp(a->argv[i], "-biosbootmenu") == 0)
     1120        {
     1121            if (a->argc <= i + 1)
     1122                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1123            i++;
     1124            biosbootmenumode = a->argv[i];
     1125        }
     1126        else if (strcmp(a->argv[i], "-biossystemtimeoffset") == 0)
     1127        {
     1128            if (a->argc <= i + 1)
     1129                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1130            i++;
     1131            biossystemtimeoffset = a->argv[i];
     1132        }
     1133        else if (strcmp(a->argv[i], "-biospxedebug") == 0)
     1134        {
     1135            if (a->argc <= i + 1)
     1136                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1137            i++;
     1138            biospxedebug = a->argv[i];
     1139        }
     1140        else if (strncmp(a->argv[i], "-boot", 5) == 0)
    11501141        {
    11511142            uint32_t n = 0;
    1152             if (!argv[i][5])
    1153                 return errorSyntax(USAGE_MODIFYVM, "Missing boot slot number in '%s'", argv[i]);
    1154             if (VINF_SUCCESS != RTStrToUInt32Full(&argv[i][5], 10, &n))
    1155                 return errorSyntax(USAGE_MODIFYVM, "Invalid boot slot number in '%s'", argv[i]);
    1156             if (argc <= i + 1)
    1157                 return errorArgument("Missing argument to '%s'", argv[i]);
    1158             i++;
    1159             if (strcmp(argv[i], "none") == 0)
     1143            if (!a->argv[i][5])
     1144                return errorSyntax(USAGE_MODIFYVM, "Missing boot slot number in '%s'", a->argv[i]);
     1145            if (VINF_SUCCESS != RTStrToUInt32Full(&a->argv[i][5], 10, &n))
     1146                return errorSyntax(USAGE_MODIFYVM, "Invalid boot slot number in '%s'", a->argv[i]);
     1147            if (a->argc <= i + 1)
     1148                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1149            i++;
     1150            if (strcmp(a->argv[i], "none") == 0)
    11601151            {
    11611152                bootDevice[n - 1] = DeviceType_Null;
    11621153            }
    1163             else if (strcmp(argv[i], "floppy") == 0)
     1154            else if (strcmp(a->argv[i], "floppy") == 0)
    11641155            {
    11651156                bootDevice[n - 1] = DeviceType_Floppy;
    11661157            }
    1167             else if (strcmp(argv[i], "dvd") == 0)
     1158            else if (strcmp(a->argv[i], "dvd") == 0)
    11681159            {
    11691160                bootDevice[n - 1] = DeviceType_DVD;
    11701161            }
    1171             else if (strcmp(argv[i], "disk") == 0)
     1162            else if (strcmp(a->argv[i], "disk") == 0)
    11721163            {
    11731164                bootDevice[n - 1] = DeviceType_HardDisk;
    11741165            }
    1175             else if (strcmp(argv[i], "net") == 0)
     1166            else if (strcmp(a->argv[i], "net") == 0)
    11761167            {
    11771168                bootDevice[n - 1] = DeviceType_Network;
    11781169            }
    11791170            else
    1180                 return errorArgument("Invalid boot device '%s'", argv[i]);
     1171                return errorArgument("Invalid boot device '%s'", a->argv[i]);
    11811172
    11821173            bootDeviceChanged[n - 1] = true;
    11831174        }
    1184         else if (strcmp(argv[i], "-hda") == 0)
    1185         {
    1186             if (argc <= i + 1)
    1187                 return errorArgument("Missing argument to '%s'", argv[i]);
    1188             i++;
    1189             hdds[0] = argv[i];
    1190         }
    1191         else if (strcmp(argv[i], "-hdb") == 0)
    1192         {
    1193             if (argc <= i + 1)
    1194                 return errorArgument("Missing argument to '%s'", argv[i]);
    1195             i++;
    1196             hdds[1] = argv[i];
    1197         }
    1198         else if (strcmp(argv[i], "-hdd") == 0)
    1199         {
    1200             if (argc <= i + 1)
    1201                 return errorArgument("Missing argument to '%s'", argv[i]);
    1202             i++;
    1203             hdds[2] = argv[i];
    1204         }
    1205         else if (strcmp(argv[i], "-dvd") == 0)
    1206         {
    1207             if (argc <= i + 1)
    1208                 return errorArgument("Missing argument to '%s'", argv[i]);
    1209             i++;
    1210             dvd = argv[i];
    1211         }
    1212         else if (strcmp(argv[i], "-dvdpassthrough") == 0)
    1213         {
    1214             if (argc <= i + 1)
    1215                 return errorArgument("Missing argument to '%s'", argv[i]);
    1216             i++;
    1217             dvdpassthrough = argv[i];
    1218         }
    1219         else if (strcmp(argv[i], "-idecontroller") == 0)
    1220         {
    1221             if (argc <= i + 1)
    1222                 return errorArgument("Missing argument to '%s'", argv[i]);
    1223             i++;
    1224             idecontroller = argv[i];
    1225         }
    1226         else if (strcmp(argv[i], "-floppy") == 0)
    1227         {
    1228             if (argc <= i + 1)
    1229                 return errorArgument("Missing argument to '%s'", argv[i]);
    1230             i++;
    1231             floppy = argv[i];
    1232         }
    1233         else if (strcmp(argv[i], "-audio") == 0)
    1234         {
    1235             if (argc <= i + 1)
    1236                 return errorArgument("Missing argument to '%s'", argv[i]);
    1237             i++;
    1238             audio = argv[i];
    1239         }
    1240         else if (strcmp(argv[i], "-audiocontroller") == 0)
    1241         {
    1242             if (argc <= i + 1)
    1243                 return errorArgument("Missing argument to '%s'", argv[i]);
    1244             i++;
    1245             audiocontroller = argv[i];
    1246         }
    1247         else if (strcmp(argv[i], "-clipboard") == 0)
    1248         {
    1249             if (argc <= i + 1)
    1250                 return errorArgument("Missing argument to '%s'", argv[i]);
    1251             i++;
    1252             clipboard = argv[i];
    1253         }
    1254         else if (strncmp(argv[i], "-cableconnected", 15) == 0)
    1255         {
    1256             unsigned n = parseNum(&argv[i][15], NetworkAdapterCount, "NIC");
     1175        else if (strcmp(a->argv[i], "-hda") == 0)
     1176        {
     1177            if (a->argc <= i + 1)
     1178                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1179            i++;
     1180            hdds[0] = a->argv[i];
     1181        }
     1182        else if (strcmp(a->argv[i], "-hdb") == 0)
     1183        {
     1184            if (a->argc <= i + 1)
     1185                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1186            i++;
     1187            hdds[1] = a->argv[i];
     1188        }
     1189        else if (strcmp(a->argv[i], "-hdd") == 0)
     1190        {
     1191            if (a->argc <= i + 1)
     1192                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1193            i++;
     1194            hdds[2] = a->argv[i];
     1195        }
     1196        else if (strcmp(a->argv[i], "-dvd") == 0)
     1197        {
     1198            if (a->argc <= i + 1)
     1199                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1200            i++;
     1201            dvd = a->argv[i];
     1202        }
     1203        else if (strcmp(a->argv[i], "-dvdpassthrough") == 0)
     1204        {
     1205            if (a->argc <= i + 1)
     1206                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1207            i++;
     1208            dvdpassthrough = a->argv[i];
     1209        }
     1210        else if (strcmp(a->argv[i], "-idecontroller") == 0)
     1211        {
     1212            if (a->argc <= i + 1)
     1213                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1214            i++;
     1215            idecontroller = a->argv[i];
     1216        }
     1217        else if (strcmp(a->argv[i], "-floppy") == 0)
     1218        {
     1219            if (a->argc <= i + 1)
     1220                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1221            i++;
     1222            floppy = a->argv[i];
     1223        }
     1224        else if (strcmp(a->argv[i], "-audio") == 0)
     1225        {
     1226            if (a->argc <= i + 1)
     1227                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1228            i++;
     1229            audio = a->argv[i];
     1230        }
     1231        else if (strcmp(a->argv[i], "-audiocontroller") == 0)
     1232        {
     1233            if (a->argc <= i + 1)
     1234                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1235            i++;
     1236            audiocontroller = a->argv[i];
     1237        }
     1238        else if (strcmp(a->argv[i], "-clipboard") == 0)
     1239        {
     1240            if (a->argc <= i + 1)
     1241                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1242            i++;
     1243            clipboard = a->argv[i];
     1244        }
     1245        else if (strncmp(a->argv[i], "-cableconnected", 15) == 0)
     1246        {
     1247            unsigned n = parseNum(&a->argv[i][15], NetworkAdapterCount, "NIC");
    12571248            if (!n)
    12581249                return 1;
    12591250
    1260             if (argc <= i + 1)
    1261                 return errorArgument("Missing argument to '%s'", argv[i]);
    1262 
    1263             cableconnected[n - 1] = argv[i + 1];
     1251            if (a->argc <= i + 1)
     1252                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1253
     1254            cableconnected[n - 1] = a->argv[i + 1];
    12641255            i++;
    12651256        }
    12661257        /* watch for the right order of these -nic* comparisons! */
    1267         else if (strncmp(argv[i], "-nictracefile", 13) == 0)
    1268         {
    1269             unsigned n = parseNum(&argv[i][13], NetworkAdapterCount, "NIC");
     1258        else if (strncmp(a->argv[i], "-nictracefile", 13) == 0)
     1259        {
     1260            unsigned n = parseNum(&a->argv[i][13], NetworkAdapterCount, "NIC");
    12701261            if (!n)
    12711262                return 1;
    1272             if (argc <= i + 1)
    1273             {
    1274                 return errorArgument("Missing argument to '%s'", argv[i]);
    1275             }
    1276             nictracefile[n - 1] = argv[i + 1];
    1277             i++;
    1278         }
    1279         else if (strncmp(argv[i], "-nictrace", 9) == 0)
    1280         {
    1281             unsigned n = parseNum(&argv[i][9], NetworkAdapterCount, "NIC");
     1263            if (a->argc <= i + 1)
     1264            {
     1265                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1266            }
     1267            nictracefile[n - 1] = a->argv[i + 1];
     1268            i++;
     1269        }
     1270        else if (strncmp(a->argv[i], "-nictrace", 9) == 0)
     1271        {
     1272            unsigned n = parseNum(&a->argv[i][9], NetworkAdapterCount, "NIC");
    12821273            if (!n)
    12831274                return 1;
    1284             if (argc <= i + 1)
    1285                 return errorArgument("Missing argument to '%s'", argv[i]);
    1286             nictrace[n - 1] = argv[i + 1];
    1287             i++;
    1288         }
    1289         else if (strncmp(argv[i], "-nictype", 8) == 0)
    1290         {
    1291             unsigned n = parseNum(&argv[i][8], NetworkAdapterCount, "NIC");
     1275            if (a->argc <= i + 1)
     1276                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1277            nictrace[n - 1] = a->argv[i + 1];
     1278            i++;
     1279        }
     1280        else if (strncmp(a->argv[i], "-nictype", 8) == 0)
     1281        {
     1282            unsigned n = parseNum(&a->argv[i][8], NetworkAdapterCount, "NIC");
    12921283            if (!n)
    12931284                return 1;
    1294             if (argc <= i + 1)
    1295                 return errorArgument("Missing argument to '%s'", argv[i]);
    1296             nictype[n - 1] = argv[i + 1];
    1297             i++;
    1298         }
    1299         else if (strncmp(argv[i], "-nicspeed", 9) == 0)
    1300         {
    1301             unsigned n = parseNum(&argv[i][9], NetworkAdapterCount, "NIC");
     1285            if (a->argc <= i + 1)
     1286                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1287            nictype[n - 1] = a->argv[i + 1];
     1288            i++;
     1289        }
     1290        else if (strncmp(a->argv[i], "-nicspeed", 9) == 0)
     1291        {
     1292            unsigned n = parseNum(&a->argv[i][9], NetworkAdapterCount, "NIC");
    13021293            if (!n)
    13031294                return 1;
    1304             if (argc <= i + 1)
    1305                 return errorArgument("Missing argument to '%s'", argv[i]);
    1306             nicspeed[n - 1] = argv[i + 1];
    1307             i++;
    1308         }
    1309         else if (strncmp(argv[i], "-nic", 4) == 0)
    1310         {
    1311             unsigned n = parseNum(&argv[i][4], NetworkAdapterCount, "NIC");
     1295            if (a->argc <= i + 1)
     1296                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1297            nicspeed[n - 1] = a->argv[i + 1];
     1298            i++;
     1299        }
     1300        else if (strncmp(a->argv[i], "-nic", 4) == 0)
     1301        {
     1302            unsigned n = parseNum(&a->argv[i][4], NetworkAdapterCount, "NIC");
    13121303            if (!n)
    13131304                return 1;
    1314             if (argc <= i + 1)
    1315                 return errorArgument("Missing argument to '%s'", argv[i]);
    1316             nics[n - 1] = argv[i + 1];
    1317             i++;
    1318         }
    1319         else if (strncmp(argv[i], "-hostifdev", 10) == 0)
    1320         {
    1321             unsigned n = parseNum(&argv[i][10], NetworkAdapterCount, "NIC");
     1305            if (a->argc <= i + 1)
     1306                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1307            nics[n - 1] = a->argv[i + 1];
     1308            i++;
     1309        }
     1310        else if (strncmp(a->argv[i], "-hostifdev", 10) == 0)
     1311        {
     1312            unsigned n = parseNum(&a->argv[i][10], NetworkAdapterCount, "NIC");
    13221313            if (!n)
    13231314                return 1;
    1324             if (argc <= i + 1)
    1325                 return errorArgument("Missing argument to '%s'", argv[i]);
    1326             hostifdev[n - 1] = argv[i + 1];
    1327             i++;
    1328         }
    1329         else if (strncmp(argv[i], "-intnet", 7) == 0)
    1330         {
    1331             unsigned n = parseNum(&argv[i][7], NetworkAdapterCount, "NIC");
     1315            if (a->argc <= i + 1)
     1316                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1317            hostifdev[n - 1] = a->argv[i + 1];
     1318            i++;
     1319        }
     1320        else if (strncmp(a->argv[i], "-intnet", 7) == 0)
     1321        {
     1322            unsigned n = parseNum(&a->argv[i][7], NetworkAdapterCount, "NIC");
    13321323            if (!n)
    13331324                return 1;
    1334             if (argc <= i + 1)
    1335                 return errorArgument("Missing argument to '%s'", argv[i]);
    1336             intnet[n - 1] = argv[i + 1];
    1337             i++;
    1338         }
    1339         else if (strncmp(argv[i], "-natnet", 7) == 0)
    1340         {
    1341             unsigned n = parseNum(&argv[i][7], NetworkAdapterCount, "NIC");
     1325            if (a->argc <= i + 1)
     1326                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1327            intnet[n - 1] = a->argv[i + 1];
     1328            i++;
     1329        }
     1330        else if (strncmp(a->argv[i], "-natnet", 7) == 0)
     1331        {
     1332            unsigned n = parseNum(&a->argv[i][7], NetworkAdapterCount, "NIC");
    13421333            if (!n)
    13431334                return 1;
    1344             if (argc <= i + 1)
    1345                 return errorArgument("Missing argument to '%s'", argv[i]);
    1346 
    1347             if (!strcmp(argv[i + 1], "default"))
     1335            if (a->argc <= i + 1)
     1336                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1337
     1338            if (!strcmp(a->argv[i + 1], "default"))
    13481339                natnet[n - 1] = "";
    13491340            else
     
    13511342                RTIPV4ADDR Network;
    13521343                RTIPV4ADDR Netmask;
    1353                 int rc = RTCidrStrToIPv4(argv[i + 1], &Network, &Netmask);
     1344                int rc = RTCidrStrToIPv4(a->argv[i + 1], &Network, &Netmask);
    13541345                if (RT_FAILURE(rc))
    1355                     return errorArgument("Invalid IPv4 network '%s' specified -- CIDR notation expected.\n", argv[i + 1]);
     1346                    return errorArgument("Invalid IPv4 network '%s' specified -- CIDR notation expected.\n", a->argv[i + 1]);
    13561347                if (Netmask & 0x1f)
    13571348                    return errorArgument("Prefix length of the NAT network must be less than 28.\n");
    1358                 natnet[n - 1] = argv[i + 1];
    1359             }
    1360             i++;
    1361         }
    1362         else if (strncmp(argv[i], "-macaddress", 11) == 0)
    1363         {
    1364             unsigned n = parseNum(&argv[i][11], NetworkAdapterCount, "NIC");
     1349                natnet[n - 1] = a->argv[i + 1];
     1350            }
     1351            i++;
     1352        }
     1353        else if (strncmp(a->argv[i], "-macaddress", 11) == 0)
     1354        {
     1355            unsigned n = parseNum(&a->argv[i][11], NetworkAdapterCount, "NIC");
    13651356            if (!n)
    13661357                return 1;
    1367             if (argc <= i + 1)
    1368                 return errorArgument("Missing argument to '%s'", argv[i]);
    1369             macs[n - 1] = argv[i + 1];
     1358            if (a->argc <= i + 1)
     1359                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1360            macs[n - 1] = a->argv[i + 1];
    13701361            i++;
    13711362        }
    13721363#ifdef VBOX_WITH_VRDP
    1373         else if (strcmp(argv[i], "-vrdp") == 0)
    1374         {
    1375             if (argc <= i + 1)
    1376                 return errorArgument("Missing argument to '%s'", argv[i]);
    1377             i++;
    1378             vrdp = argv[i];
    1379         }
    1380         else if (strcmp(argv[i], "-vrdpport") == 0)
    1381         {
    1382             if (argc <= i + 1)
    1383                 return errorArgument("Missing argument to '%s'", argv[i]);
    1384             i++;
    1385             if (strcmp(argv[i], "default") == 0)
     1364        else if (strcmp(a->argv[i], "-vrdp") == 0)
     1365        {
     1366            if (a->argc <= i + 1)
     1367                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1368            i++;
     1369            vrdp = a->argv[i];
     1370        }
     1371        else if (strcmp(a->argv[i], "-vrdpport") == 0)
     1372        {
     1373            if (a->argc <= i + 1)
     1374                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1375            i++;
     1376            if (strcmp(a->argv[i], "default") == 0)
    13861377                vrdpport = 0;
    13871378            else
    1388                 vrdpport = RTStrToUInt16(argv[i]);
    1389         }
    1390         else if (strcmp(argv[i], "-vrdpaddress") == 0)
    1391         {
    1392             if (argc <= i + 1)
    1393                 return errorArgument("Missing argument to '%s'", argv[i]);
    1394             i++;
    1395             vrdpaddress = argv[i];
    1396         }
    1397         else if (strcmp(argv[i], "-vrdpauthtype") == 0)
    1398         {
    1399             if (argc <= i + 1)
    1400                 return errorArgument("Missing argument to '%s'", argv[i]);
    1401             i++;
    1402             vrdpauthtype = argv[i];
    1403         }
    1404         else if (strcmp(argv[i], "-vrdpmulticon") == 0)
    1405         {
    1406             if (argc <= i + 1)
    1407                 return errorArgument("Missing argument to '%s'", argv[i]);
    1408             i++;
    1409             vrdpmulticon = argv[i];
    1410         }
    1411         else if (strcmp(argv[i], "-vrdpreusecon") == 0)
    1412         {
    1413             if (argc <= i + 1)
    1414                 return errorArgument("Missing argument to '%s'", argv[i]);
    1415             i++;
    1416             vrdpreusecon = argv[i];
     1379                vrdpport = RTStrToUInt16(a->argv[i]);
     1380        }
     1381        else if (strcmp(a->argv[i], "-vrdpaddress") == 0)
     1382        {
     1383            if (a->argc <= i + 1)
     1384                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1385            i++;
     1386            vrdpaddress = a->argv[i];
     1387        }
     1388        else if (strcmp(a->argv[i], "-vrdpauthtype") == 0)
     1389        {
     1390            if (a->argc <= i + 1)
     1391                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1392            i++;
     1393            vrdpauthtype = a->argv[i];
     1394        }
     1395        else if (strcmp(a->argv[i], "-vrdpmulticon") == 0)
     1396        {
     1397            if (a->argc <= i + 1)
     1398                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1399            i++;
     1400            vrdpmulticon = a->argv[i];
     1401        }
     1402        else if (strcmp(a->argv[i], "-vrdpreusecon") == 0)
     1403        {
     1404            if (a->argc <= i + 1)
     1405                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1406            i++;
     1407            vrdpreusecon = a->argv[i];
    14171408        }
    14181409#endif /* VBOX_WITH_VRDP */
    1419         else if (strcmp(argv[i], "-usb") == 0)
    1420         {
    1421             if (argc <= i + 1)
    1422                 return errorArgument("Missing argument to '%s'", argv[i]);
    1423             i++;
    1424             if (strcmp(argv[i], "on") == 0 || strcmp(argv[i], "enable") == 0)
     1410        else if (strcmp(a->argv[i], "-usb") == 0)
     1411        {
     1412            if (a->argc <= i + 1)
     1413                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1414            i++;
     1415            if (strcmp(a->argv[i], "on") == 0 || strcmp(a->argv[i], "enable") == 0)
    14251416                fUsbEnabled = 1;
    1426             else if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
     1417            else if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
    14271418                fUsbEnabled = 0;
    14281419            else
    1429                 return errorArgument("Invalid -usb argument '%s'", argv[i]);
    1430         }
    1431         else if (strcmp(argv[i], "-usbehci") == 0)
    1432         {
    1433             if (argc <= i + 1)
    1434                 return errorArgument("Missing argument to '%s'", argv[i]);
    1435             i++;
    1436             if (strcmp(argv[i], "on") == 0 || strcmp(argv[i], "enable") == 0)
     1420                return errorArgument("Invalid -usb argument '%s'", a->argv[i]);
     1421        }
     1422        else if (strcmp(a->argv[i], "-usbehci") == 0)
     1423        {
     1424            if (a->argc <= i + 1)
     1425                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1426            i++;
     1427            if (strcmp(a->argv[i], "on") == 0 || strcmp(a->argv[i], "enable") == 0)
    14371428                fUsbEhciEnabled = 1;
    1438             else if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
     1429            else if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
    14391430                fUsbEhciEnabled = 0;
    14401431            else
    1441                 return errorArgument("Invalid -usbehci argument '%s'", argv[i]);
    1442         }
    1443         else if (strcmp(argv[i], "-snapshotfolder") == 0)
    1444         {
    1445             if (argc <= i + 1)
    1446                 return errorArgument("Missing argument to '%s'", argv[i]);
    1447             i++;
    1448             snapshotFolder = argv[i];
    1449         }
    1450         else if (strncmp(argv[i], "-uartmode", 9) == 0)
    1451         {
    1452             unsigned n = parseNum(&argv[i][9], SerialPortCount, "UART");
     1432                return errorArgument("Invalid -usbehci argument '%s'", a->argv[i]);
     1433        }
     1434        else if (strcmp(a->argv[i], "-snapshotfolder") == 0)
     1435        {
     1436            if (a->argc <= i + 1)
     1437                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1438            i++;
     1439            snapshotFolder = a->argv[i];
     1440        }
     1441        else if (strncmp(a->argv[i], "-uartmode", 9) == 0)
     1442        {
     1443            unsigned n = parseNum(&a->argv[i][9], SerialPortCount, "UART");
    14531444            if (!n)
    14541445                return 1;
    14551446            i++;
    1456             if (strcmp(argv[i], "disconnected") == 0)
    1457             {
    1458                 uarts_mode[n - 1] = argv[i];
     1447            if (strcmp(a->argv[i], "disconnected") == 0)
     1448            {
     1449                uarts_mode[n - 1] = a->argv[i];
    14591450            }
    14601451            else
    14611452            {
    1462                 if (strcmp(argv[i], "server") == 0 || strcmp(argv[i], "client") == 0)
    1463                 {
    1464                     uarts_mode[n - 1] = argv[i];
     1453                if (strcmp(a->argv[i], "server") == 0 || strcmp(a->argv[i], "client") == 0)
     1454                {
     1455                    uarts_mode[n - 1] = a->argv[i];
    14651456                    i++;
    14661457#ifdef RT_OS_WINDOWS
    1467                     if (strncmp(argv[i], "\\\\.\\pipe\\", 9))
     1458                    if (strncmp(a->argv[i], "\\\\.\\pipe\\", 9))
    14681459                        return errorArgument("Uart pipe must start with \\\\.\\pipe\\");
    14691460#endif
     
    14731464                    uarts_mode[n - 1] = (char*)"device";
    14741465                }
    1475                 if (argc <= i)
     1466                if (a->argc <= i)
    14761467                    return errorArgument("Missing argument to -uartmode");
    1477                 uarts_path[n - 1] = argv[i];
    1478             }
    1479         }
    1480         else if (strncmp(argv[i], "-uart", 5) == 0)
    1481         {
    1482             unsigned n = parseNum(&argv[i][5], SerialPortCount, "UART");
     1468                uarts_path[n - 1] = a->argv[i];
     1469            }
     1470        }
     1471        else if (strncmp(a->argv[i], "-uart", 5) == 0)
     1472        {
     1473            unsigned n = parseNum(&a->argv[i][5], SerialPortCount, "UART");
    14831474            if (!n)
    14841475                return 1;
    1485             if (argc <= i + 1)
    1486                 return errorArgument("Missing argument to '%s'", argv[i]);
    1487             i++;
    1488             if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
     1476            if (a->argc <= i + 1)
     1477                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1478            i++;
     1479            if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
    14891480            {
    14901481                uarts_base[n - 1] = (ULONG)-1;
     
    14921483            else
    14931484            {
    1494                 if (argc <= i + 1)
    1495                     return errorArgument("Missing argument to '%s'", argv[i-1]);
     1485                if (a->argc <= i + 1)
     1486                    return errorArgument("Missing argument to '%s'", a->argv[i-1]);
    14961487                uint32_t uVal;
    14971488                int vrc;
    1498                 vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
     1489                vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
    14991490                if (vrc != VINF_SUCCESS || uVal == 0)
    1500                     return errorArgument("Error parsing UART I/O base '%s'", argv[i]);
     1491                    return errorArgument("Error parsing UART I/O base '%s'", a->argv[i]);
    15011492                uarts_base[n - 1] = uVal;
    15021493                i++;
    1503                 vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
     1494                vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
    15041495                if (vrc != VINF_SUCCESS)
    1505                     return errorArgument("Error parsing UART IRQ '%s'", argv[i]);
     1496                    return errorArgument("Error parsing UART IRQ '%s'", a->argv[i]);
    15061497                uarts_irq[n - 1]  = uVal;
    15071498            }
    15081499        }
    15091500#ifdef VBOX_WITH_MEM_BALLOONING
    1510         else if (strncmp(argv[i], "-guestmemoryballoon", 19) == 0)
    1511         {
    1512             if (argc <= i + 1)
    1513                 return errorArgument("Missing argument to '%s'", argv[i]);
     1501        else if (strncmp(a->argv[i], "-guestmemoryballoon", 19) == 0)
     1502        {
     1503            if (a->argc <= i + 1)
     1504                return errorArgument("Missing argument to '%s'", a->argv[i]);
    15141505            i++;
    15151506            uint32_t uVal;
    15161507            int vrc;
    1517             vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
     1508            vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
    15181509            if (vrc != VINF_SUCCESS)
    1519                 return errorArgument("Error parsing guest memory balloon size '%s'", argv[i]);
     1510                return errorArgument("Error parsing guest memory balloon size '%s'", a->argv[i]);
    15201511            guestMemBalloonSize = uVal;
    15211512        }
    15221513#endif
    1523         else if (strncmp(argv[i], "-gueststatisticsinterval", 24) == 0)
    1524         {
    1525             if (argc <= i + 1)
    1526                 return errorArgument("Missing argument to '%s'", argv[i]);
     1514        else if (strncmp(a->argv[i], "-gueststatisticsinterval", 24) == 0)
     1515        {
     1516            if (a->argc <= i + 1)
     1517                return errorArgument("Missing argument to '%s'", a->argv[i]);
    15271518            i++;
    15281519            uint32_t uVal;
    15291520            int vrc;
    1530             vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
     1521            vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
    15311522            if (vrc != VINF_SUCCESS)
    1532                 return errorArgument("Error parsing guest statistics interval '%s'", argv[i]);
     1523                return errorArgument("Error parsing guest statistics interval '%s'", a->argv[i]);
    15331524            guestStatInterval = uVal;
    15341525        }
    1535         else if (strcmp(argv[i], "-sata") == 0)
    1536         {
    1537             if (argc <= i + 1)
    1538                 return errorArgument("Missing argument to '%s'", argv[i]);
    1539             i++;
    1540             if (strcmp(argv[i], "on") == 0 || strcmp(argv[i], "enable") == 0)
     1526        else if (strcmp(a->argv[i], "-sata") == 0)
     1527        {
     1528            if (a->argc <= i + 1)
     1529                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1530            i++;
     1531            if (strcmp(a->argv[i], "on") == 0 || strcmp(a->argv[i], "enable") == 0)
    15411532                fSataEnabled = 1;
    1542             else if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
     1533            else if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
    15431534                fSataEnabled = 0;
    15441535            else
    1545                 return errorArgument("Invalid -usb argument '%s'", argv[i]);
    1546         }
    1547         else if (strcmp(argv[i], "-sataportcount") == 0)
     1536                return errorArgument("Invalid -usb argument '%s'", a->argv[i]);
     1537        }
     1538        else if (strcmp(a->argv[i], "-sataportcount") == 0)
    15481539        {
    15491540            unsigned n;
    15501541
    1551             if (argc <= i + 1)
    1552                 return errorArgument("Missing arguments to '%s'", argv[i]);
    1553             i++;
    1554 
    1555             n = parseNum(argv[i], 30, "SATA");
     1542            if (a->argc <= i + 1)
     1543                return errorArgument("Missing arguments to '%s'", a->argv[i]);
     1544            i++;
     1545
     1546            n = parseNum(a->argv[i], 30, "SATA");
    15561547            if (!n)
    15571548                return 1;
    15581549            sataPortCount = n;
    15591550        }
    1560         else if (strncmp(argv[i], "-sataport", 9) == 0)
    1561         {
    1562             unsigned n = parseNum(&argv[i][9], 30, "SATA");
     1551        else if (strncmp(a->argv[i], "-sataport", 9) == 0)
     1552        {
     1553            unsigned n = parseNum(&a->argv[i][9], 30, "SATA");
    15631554            if (!n)
    15641555                return 1;
    1565             if (argc <= i + 1)
    1566                 return errorArgument("Missing argument to '%s'", argv[i]);
    1567             i++;
    1568             hdds[n-1+4] = argv[i];
    1569         }
    1570         else if (strncmp(argv[i], "-sataideemulation", 17) == 0)
     1556            if (a->argc <= i + 1)
     1557                return errorArgument("Missing argument to '%s'", a->argv[i]);
     1558            i++;
     1559            hdds[n-1+4] = a->argv[i];
     1560        }
     1561        else if (strncmp(a->argv[i], "-sataideemulation", 17) == 0)
    15711562        {
    15721563            unsigned bootDevicePos = 0;
    15731564            unsigned n;
    15741565
    1575             bootDevicePos = parseNum(&argv[i][17], 4, "SATA");
     1566            bootDevicePos = parseNum(&a->argv[i][17], 4, "SATA");
    15761567            if (!bootDevicePos)
    15771568                return 1;
    15781569            bootDevicePos--;
    15791570
    1580             if (argc <= i + 1)
    1581                 return errorArgument("Missing arguments to '%s'", argv[i]);
    1582             i++;
    1583 
    1584             n = parseNum(argv[i], 30, "SATA");
     1571            if (a->argc <= i + 1)
     1572                return errorArgument("Missing arguments to '%s'", a->argv[i]);
     1573            i++;
     1574
     1575            n = parseNum(a->argv[i], 30, "SATA");
    15851576            if (!n)
    15861577                return 1;
     
    15891580        }
    15901581        else
    1591             return errorSyntax(USAGE_MODIFYVM, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     1582            return errorSyntax(USAGE_MODIFYVM, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    15921583    }
    15931584
    15941585    /* try to find the given machine */
    15951586    ComPtr <IMachine> machine;
    1596     Guid uuid (argv[0]);
     1587    Guid uuid (a->argv[0]);
    15971588    if (!uuid.isEmpty())
    15981589    {
    1599         CHECK_ERROR (virtualBox, GetMachine (uuid, machine.asOutParam()));
     1590        CHECK_ERROR (a->virtualBox, GetMachine (uuid, machine.asOutParam()));
    16001591    }
    16011592    else
    16021593    {
    1603         CHECK_ERROR (virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     1594        CHECK_ERROR (a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    16041595        if (SUCCEEDED (rc))
    16051596            machine->COMGETTER(Id)(uuid.asOutParam());
     
    16091600
    16101601    /* open a session for the VM */
    1611     CHECK_ERROR_RET (virtualBox, OpenSession(session, uuid), 1);
     1602    CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
    16121603
    16131604    do
    16141605    {
    16151606        /* get the mutable session machine */
    1616         session->COMGETTER(Machine)(machine.asOutParam());
     1607        a->session->COMGETTER(Machine)(machine.asOutParam());
    16171608
    16181609        ComPtr <IBIOSSettings> biosSettings;
     
    16241615        {
    16251616            ComPtr<IGuestOSType> guestOSType;
    1626             CHECK_ERROR(virtualBox, GetGuestOSType(ostype, guestOSType.asOutParam()));
     1617            CHECK_ERROR(a->virtualBox, GetGuestOSType(ostype, guestOSType.asOutParam()));
    16271618            if (SUCCEEDED(rc) && guestOSType)
    16281619            {
     
    18631854                Guid uuid(hdds[0]);
    18641855                ComPtr<IHardDisk2> hardDisk;
    1865                 rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     1856                rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    18661857                /* not successful? Then it must be a filename */
    18671858                if (!hardDisk)
    18681859                {
    1869                     CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
     1860                    CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
    18701861                    if (FAILED(rc))
    18711862                    {
    18721863                        /* open the new hard disk object */
    1873                         CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
     1864                        CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
    18741865                    }
    18751866                }
     
    18961887                Guid uuid(hdds[1]);
    18971888                ComPtr<IHardDisk2> hardDisk;
    1898                 rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     1889                rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    18991890                /* not successful? Then it must be a filename */
    19001891                if (!hardDisk)
    19011892                {
    1902                     CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
     1893                    CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
    19031894                    if (FAILED(rc))
    19041895                    {
    19051896                        /* open the new hard disk object */
    1906                         CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
     1897                        CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
    19071898                    }
    19081899                }
     
    19291920                Guid uuid(hdds[2]);
    19301921                ComPtr<IHardDisk2> hardDisk;
    1931                 rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     1922                rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    19321923                /* not successful? Then it must be a filename */
    19331924                if (!hardDisk)
    19341925                {
    1935                     CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
     1926                    CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
    19361927                    if (FAILED(rc))
    19371928                    {
    19381929                        /* open the new hard disk object */
    1939                         CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
     1930                        CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
    19401931                    }
    19411932                }
     
    19661957            {
    19671958                ComPtr<IHost> host;
    1968                 CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     1959                CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    19691960                ComPtr<IHostDVDDriveCollection> hostDVDs;
    19701961                CHECK_ERROR(host, COMGETTER(DVDDrives)(hostDVDs.asOutParam()));
     
    19961987                Guid uuid(dvd);
    19971988                ComPtr<IDVDImage2> dvdImage;
    1998                 rc = virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
     1989                rc = a->virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
    19991990                if (FAILED(rc) || !dvdImage)
    20001991                {
    20011992                    /* must be a filename, check if it's in the collection */
    2002                     rc = virtualBox->FindDVDImage(Bstr(dvd), dvdImage.asOutParam());
     1993                    rc = a->virtualBox->FindDVDImage(Bstr(dvd), dvdImage.asOutParam());
    20031994                    /* not registered, do that on the fly */
    20041995                    if (!dvdImage)
    20051996                    {
    20061997                        Guid emptyUUID;
    2007                         CHECK_ERROR(virtualBox, OpenDVDImage(Bstr(dvd), emptyUUID, dvdImage.asOutParam()));
     1998                        CHECK_ERROR(a->virtualBox, OpenDVDImage(Bstr(dvd), emptyUUID, dvdImage.asOutParam()));
    20081999                    }
    20092000                }
     
    20692060                {
    20702061                    ComPtr<IHost> host;
    2071                     CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     2062                    CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    20722063                    ComPtr<IHostFloppyDriveCollection> hostFloppies;
    20732064                    CHECK_ERROR(host, COMGETTER(FloppyDrives)(hostFloppies.asOutParam()));
     
    20872078                    Guid uuid(floppy);
    20882079                    ComPtr<IFloppyImage2> floppyImage;
    2089                     rc = virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
     2080                    rc = a->virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
    20902081                    if (FAILED(rc) || !floppyImage)
    20912082                    {
    20922083                        /* must be a filename, check if it's in the collection */
    2093                         rc = virtualBox->FindFloppyImage(Bstr(floppy), floppyImage.asOutParam());
     2084                        rc = a->virtualBox->FindFloppyImage(Bstr(floppy), floppyImage.asOutParam());
    20942085                        /* not registered, do that on the fly */
    20952086                        if (!floppyImage)
    20962087                        {
    20972088                            Guid emptyUUID;
    2098                             CHECK_ERROR(virtualBox, OpenFloppyImage(Bstr(floppy), emptyUUID, floppyImage.asOutParam()));
     2089                            CHECK_ERROR(a->virtualBox, OpenFloppyImage(Bstr(floppy), emptyUUID, floppyImage.asOutParam()));
    20992090                        }
    21002091                    }
     
    26232614                    Guid uuid(hdds[i]);
    26242615                    ComPtr<IHardDisk2> hardDisk;
    2625                     rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     2616                    rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    26262617                    /* not successful? Then it must be a filename */
    26272618                    if (!hardDisk)
    26282619                    {
    2629                         CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
     2620                        CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
    26302621                        if (FAILED(rc))
    26312622                        {
    26322623                            /* open the new hard disk object */
    2633                             CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
     2624                            CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
    26342625                        }
    26352626                    }
     
    26762667
    26772668    /* it's important to always close sessions */
    2678     session->Close();
     2669    a->session->Close();
    26792670
    26802671    return SUCCEEDED(rc) ? 0 : 1;
     
    26862677#endif
    26872678
    2688 static int handleStartVM(int argc, char *argv[],
    2689                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     2679static int handleStartVM(HandlerArg *a)
    26902680{
    26912681    HRESULT rc;
    26922682
    2693     if (argc < 1)
     2683    if (a->argc < 1)
    26942684        return errorSyntax(USAGE_STARTVM, "Not enough parameters");
    26952685
    26962686    ComPtr<IMachine> machine;
    26972687    /* assume it's a UUID */
    2698     rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     2688    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    26992689    if (FAILED(rc) || !machine)
    27002690    {
    27012691        /* must be a name */
    2702         CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     2692        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    27032693    }
    27042694    if (machine)
     
    27102700        Bstr sessionType = "gui";
    27112701        /* has a session type been specified? */
    2712         if ((argc > 2) && (strcmp(argv[1], "-type") == 0))
    2713         {
    2714             if (strcmp(argv[2], "gui") == 0)
     2702        if ((a->argc > 2) && (strcmp(a->argv[1], "-type") == 0))
     2703        {
     2704            if (strcmp(a->argv[2], "gui") == 0)
    27152705            {
    27162706                sessionType = "gui";
    27172707            }
    2718             else if (strcmp(argv[2], "vrdp") == 0)
     2708            else if (strcmp(a->argv[2], "vrdp") == 0)
    27192709            {
    27202710                sessionType = "vrdp";
    27212711            }
    2722             else if (strcmp(argv[2], "capture") == 0)
     2712            else if (strcmp(a->argv[2], "capture") == 0)
    27232713            {
    27242714                sessionType = "capture";
    27252715            }
    27262716            else
    2727                 return errorArgument("Invalid session type argument '%s'", argv[2]);
     2717                return errorArgument("Invalid session type argument '%s'", a->argv[2]);
    27282718        }
    27292719
     
    27382728#endif
    27392729        ComPtr<IProgress> progress;
    2740         CHECK_ERROR_RET(virtualBox, OpenRemoteSession(session, uuid, sessionType,
    2741                                                       env, progress.asOutParam()), rc);
     2730        CHECK_ERROR_RET(a->virtualBox, OpenRemoteSession(a->session, uuid, sessionType,
     2731                                                         env, progress.asOutParam()), rc);
    27422732        RTPrintf("Waiting for the remote session to open...\n");
    27432733        CHECK_ERROR_RET(progress, WaitForCompletion (-1), 1);
     
    27632753
    27642754    /* it's important to always close sessions */
    2765     session->Close();
     2755    a->session->Close();
    27662756
    27672757    return SUCCEEDED(rc) ? 0 : 1;
    27682758}
    27692759
    2770 static int handleControlVM(int argc, char *argv[],
    2771                            ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     2760static int handleControlVM(HandlerArg *a)
    27722761{
    27732762    HRESULT rc;
    27742763
    2775     if (argc < 2)
     2764    if (a->argc < 2)
    27762765        return errorSyntax(USAGE_CONTROLVM, "Not enough parameters");
    27772766
    27782767    /* try to find the given machine */
    27792768    ComPtr <IMachine> machine;
    2780     Guid uuid (argv[0]);
     2769    Guid uuid (a->argv[0]);
    27812770    if (!uuid.isEmpty())
    27822771    {
    2783         CHECK_ERROR (virtualBox, GetMachine (uuid, machine.asOutParam()));
     2772        CHECK_ERROR (a->virtualBox, GetMachine (uuid, machine.asOutParam()));
    27842773    }
    27852774    else
    27862775    {
    2787         CHECK_ERROR (virtualBox, FindMachine (Bstr(argv[0]), machine.asOutParam()));
     2776        CHECK_ERROR (a->virtualBox, FindMachine (Bstr(a->argv[0]), machine.asOutParam()));
    27882777        if (SUCCEEDED (rc))
    27892778            machine->COMGETTER(Id) (uuid.asOutParam());
     
    27932782
    27942783    /* open a session for the VM */
    2795     CHECK_ERROR_RET (virtualBox, OpenExistingSession (session, uuid), 1);
     2784    CHECK_ERROR_RET (a->virtualBox, OpenExistingSession (a->session, uuid), 1);
    27962785
    27972786    do
     
    27992788        /* get the associated console */
    28002789        ComPtr<IConsole> console;
    2801         CHECK_ERROR_BREAK (session, COMGETTER(Console)(console.asOutParam()));
     2790        CHECK_ERROR_BREAK (a->session, COMGETTER(Console)(console.asOutParam()));
    28022791        /* ... and session machine */
    28032792        ComPtr<IMachine> sessionMachine;
    2804         CHECK_ERROR_BREAK (session, COMGETTER(Machine)(sessionMachine.asOutParam()));
     2793        CHECK_ERROR_BREAK (a->session, COMGETTER(Machine)(sessionMachine.asOutParam()));
    28052794
    28062795        /* which command? */
    2807         if (strcmp(argv[1], "pause") == 0)
     2796        if (strcmp(a->argv[1], "pause") == 0)
    28082797        {
    28092798            CHECK_ERROR_BREAK (console, Pause());
    28102799        }
    2811         else if (strcmp(argv[1], "resume") == 0)
     2800        else if (strcmp(a->argv[1], "resume") == 0)
    28122801        {
    28132802            CHECK_ERROR_BREAK (console, Resume());
    28142803        }
    2815         else if (strcmp(argv[1], "reset") == 0)
     2804        else if (strcmp(a->argv[1], "reset") == 0)
    28162805        {
    28172806            CHECK_ERROR_BREAK (console, Reset());
    28182807        }
    2819         else if (strcmp(argv[1], "poweroff") == 0)
     2808        else if (strcmp(a->argv[1], "poweroff") == 0)
    28202809        {
    28212810            CHECK_ERROR_BREAK (console, PowerDown());
    28222811        }
    2823         else if (strcmp(argv[1], "savestate") == 0)
     2812        else if (strcmp(a->argv[1], "savestate") == 0)
    28242813        {
    28252814            ComPtr<IProgress> progress;
     
    28422831            }
    28432832        }
    2844         else if (strcmp(argv[1], "acpipowerbutton") == 0)
     2833        else if (strcmp(a->argv[1], "acpipowerbutton") == 0)
    28452834        {
    28462835            CHECK_ERROR_BREAK (console, PowerButton());
    28472836        }
    2848         else if (strcmp(argv[1], "acpisleepbutton") == 0)
     2837        else if (strcmp(a->argv[1], "acpisleepbutton") == 0)
    28492838        {
    28502839            CHECK_ERROR_BREAK (console, SleepButton());
    28512840        }
    2852         else if (strcmp(argv[1], "injectnmi") == 0)
     2841        else if (strcmp(a->argv[1], "injectnmi") == 0)
    28532842        {
    28542843            /* get the machine debugger. */
     
    28572846            CHECK_ERROR_BREAK(debugger, InjectNMI());
    28582847        }
    2859         else if (strcmp(argv[1], "keyboardputscancode") == 0)
     2848        else if (strcmp(a->argv[1], "keyboardputscancode") == 0)
    28602849        {
    28612850            ComPtr<IKeyboard> keyboard;
    28622851            CHECK_ERROR_BREAK(console, COMGETTER(Keyboard)(keyboard.asOutParam()));
    28632852
    2864             if (argc <= 1 + 1)
    2865             {
    2866                 errorArgument("Missing argument to '%s'. Expected IBM PC AT set 2 keyboard scancode(s) as hex byte(s).", argv[1]);
     2853            if (a->argc <= 1 + 1)
     2854            {
     2855                errorArgument("Missing argument to '%s'. Expected IBM PC AT set 2 keyboard scancode(s) as hex byte(s).", a->argv[1]);
    28672856                rc = E_FAIL;
    28682857                break;
     
    28752864            /* Process the command line. */
    28762865            int i;
    2877             for (i = 1 + 1; i < argc && cScancodes < (int)RT_ELEMENTS(alScancodes); i++, cScancodes++)
    2878             {
    2879                 if (   RT_C_IS_XDIGIT (argv[i][0])
    2880                     && RT_C_IS_XDIGIT (argv[i][1])
    2881                     && argv[i][2] == 0)
     2866            for (i = 1 + 1; i < a->argc && cScancodes < (int)RT_ELEMENTS(alScancodes); i++, cScancodes++)
     2867            {
     2868                if (   RT_C_IS_XDIGIT (a->argv[i][0])
     2869                    && RT_C_IS_XDIGIT (a->argv[i][1])
     2870                    && a->argv[i][2] == 0)
    28822871                {
    28832872                    uint8_t u8Scancode;
    2884                     int rc = RTStrToUInt8Ex(argv[i], NULL, 16, &u8Scancode);
     2873                    int rc = RTStrToUInt8Ex(a->argv[i], NULL, 16, &u8Scancode);
    28852874                    if (RT_FAILURE (rc))
    28862875                    {
    2887                         RTPrintf("Error: converting '%s' returned %Rrc!\n", argv[i], rc);
     2876                        RTPrintf("Error: converting '%s' returned %Rrc!\n", a->argv[i], rc);
    28882877                        rc = E_FAIL;
    28892878                        break;
     
    28942883                else
    28952884                {
    2896                     RTPrintf("Error: '%s' is not a hex byte!\n", argv[i]);
     2885                    RTPrintf("Error: '%s' is not a hex byte!\n", a->argv[i]);
    28972886                    rc = E_FAIL;
    28982887                    break;
     
    29042893
    29052894            if (   cScancodes == RT_ELEMENTS(alScancodes)
    2906                 && i < argc)
     2895                && i < a->argc)
    29072896            {
    29082897                RTPrintf("Error: too many scancodes, maximum %d allowed!\n", RT_ELEMENTS(alScancodes));
     
    29202909            }
    29212910        }
    2922         else if (strncmp(argv[1], "setlinkstate", 12) == 0)
     2911        else if (strncmp(a->argv[1], "setlinkstate", 12) == 0)
    29232912        {
    29242913            /* Get the number of network adapters */
    29252914            ULONG NetworkAdapterCount = 0;
    29262915            ComPtr <ISystemProperties> info;
    2927             CHECK_ERROR_BREAK (virtualBox, COMGETTER(SystemProperties) (info.asOutParam()));
     2916            CHECK_ERROR_BREAK (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()));
    29282917            CHECK_ERROR_BREAK (info, COMGETTER(NetworkAdapterCount) (&NetworkAdapterCount));
    29292918
    2930             unsigned n = parseNum(&argv[1][12], NetworkAdapterCount, "NIC");
     2919            unsigned n = parseNum(&a->argv[1][12], NetworkAdapterCount, "NIC");
    29312920            if (!n)
    29322921            {
     
    29342923                break;
    29352924            }
    2936             if (argc <= 1 + 1)
    2937             {
    2938                 errorArgument("Missing argument to '%s'", argv[1]);
     2925            if (a->argc <= 1 + 1)
     2926            {
     2927                errorArgument("Missing argument to '%s'", a->argv[1]);
    29392928                rc = E_FAIL;
    29402929                break;
     
    29452934            if (adapter)
    29462935            {
    2947                 if (strcmp(argv[2], "on") == 0)
     2936                if (strcmp(a->argv[2], "on") == 0)
    29482937                {
    29492938                    CHECK_ERROR_BREAK (adapter, COMSETTER(CableConnected)(TRUE));
    29502939                }
    2951                 else if (strcmp(argv[2], "off") == 0)
     2940                else if (strcmp(a->argv[2], "off") == 0)
    29522941                {
    29532942                    CHECK_ERROR_BREAK (adapter, COMSETTER(CableConnected)(FALSE));
     
    29552944                else
    29562945                {
    2957                     errorArgument("Invalid link state '%s'", Utf8Str(argv[2]).raw());
     2946                    errorArgument("Invalid link state '%s'", Utf8Str(a->argv[2]).raw());
    29582947                    rc = E_FAIL;
    29592948                    break;
     
    29622951        }
    29632952#ifdef VBOX_WITH_VRDP
    2964         else if (strcmp(argv[1], "vrdp") == 0)
    2965         {
    2966             if (argc <= 1 + 1)
    2967             {
    2968                 errorArgument("Missing argument to '%s'", argv[1]);
     2953        else if (strcmp(a->argv[1], "vrdp") == 0)
     2954        {
     2955            if (a->argc <= 1 + 1)
     2956            {
     2957                errorArgument("Missing argument to '%s'", a->argv[1]);
    29692958                rc = E_FAIL;
    29702959                break;
     
    29762965            if (vrdpServer)
    29772966            {
    2978                 if (strcmp(argv[2], "on") == 0)
     2967                if (strcmp(a->argv[2], "on") == 0)
    29792968                {
    29802969                    CHECK_ERROR_BREAK (vrdpServer, COMSETTER(Enabled)(TRUE));
    29812970                }
    2982                 else if (strcmp(argv[2], "off") == 0)
     2971                else if (strcmp(a->argv[2], "off") == 0)
    29832972                {
    29842973                    CHECK_ERROR_BREAK (vrdpServer, COMSETTER(Enabled)(FALSE));
     
    29862975                else
    29872976                {
    2988                     errorArgument("Invalid vrdp server state '%s'", Utf8Str(argv[2]).raw());
     2977                    errorArgument("Invalid vrdp server state '%s'", Utf8Str(a->argv[2]).raw());
    29892978                    rc = E_FAIL;
    29902979                    break;
     
    29932982        }
    29942983#endif /* VBOX_WITH_VRDP */
    2995         else if (strcmp (argv[1], "usbattach") == 0 ||
    2996                  strcmp (argv[1], "usbdetach") == 0)
    2997         {
    2998             if (argc < 3)
     2984        else if (strcmp (a->argv[1], "usbattach") == 0 ||
     2985                 strcmp (a->argv[1], "usbdetach") == 0)
     2986        {
     2987            if (a->argc < 3)
    29992988            {
    30002989                errorSyntax(USAGE_CONTROLVM, "Not enough parameters");
     
    30032992            }
    30042993
    3005             bool attach = strcmp (argv[1], "usbattach") == 0;
    3006 
    3007             Guid usbId = argv [2];
     2994            bool attach = strcmp (a->argv[1], "usbattach") == 0;
     2995
     2996            Guid usbId = a->argv [2];
    30082997            if (usbId.isEmpty())
    30092998            {
     
    30123001                {
    30133002                    ComPtr <IHost> host;
    3014                     CHECK_ERROR_BREAK (virtualBox, COMGETTER(Host) (host.asOutParam()));
     3003                    CHECK_ERROR_BREAK (a->virtualBox, COMGETTER(Host) (host.asOutParam()));
    30153004                    ComPtr <IHostUSBDeviceCollection> coll;
    30163005                    CHECK_ERROR_BREAK (host, COMGETTER(USBDevices) (coll.asOutParam()));
    30173006                    ComPtr <IHostUSBDevice> dev;
    3018                     CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (argv [2]), dev.asOutParam()));
     3007                    CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (a->argv [2]), dev.asOutParam()));
    30193008                    CHECK_ERROR_BREAK (dev, COMGETTER(Id) (usbId.asOutParam()));
    30203009                }
     
    30243013                    CHECK_ERROR_BREAK (console, COMGETTER(USBDevices)(coll.asOutParam()));
    30253014                    ComPtr <IUSBDevice> dev;
    3026                     CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (argv [2]), dev.asOutParam()));
     3015                    CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (a->argv [2]), dev.asOutParam()));
    30273016                    CHECK_ERROR_BREAK (dev, COMGETTER(Id) (usbId.asOutParam()));
    30283017                }
     
    30373026            }
    30383027        }
    3039         else if (strcmp(argv[1], "setvideomodehint") == 0)
    3040         {
    3041             if (argc != 5 && argc != 6)
     3028        else if (strcmp(a->argv[1], "setvideomodehint") == 0)
     3029        {
     3030            if (a->argc != 5 && a->argc != 6)
    30423031            {
    30433032                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     
    30453034                break;
    30463035            }
    3047             uint32_t xres = RTStrToUInt32(argv[2]);
    3048             uint32_t yres = RTStrToUInt32(argv[3]);
    3049             uint32_t bpp  = RTStrToUInt32(argv[4]);
     3036            uint32_t xres = RTStrToUInt32(a->argv[2]);
     3037            uint32_t yres = RTStrToUInt32(a->argv[3]);
     3038            uint32_t bpp  = RTStrToUInt32(a->argv[4]);
    30503039            uint32_t displayIdx = 0;
    3051             if (argc == 6)
    3052                 displayIdx = RTStrToUInt32(argv[5]);
     3040            if (a->argc == 6)
     3041                displayIdx = RTStrToUInt32(a->argv[5]);
    30533042
    30543043            ComPtr<IDisplay> display;
     
    30563045            CHECK_ERROR_BREAK(display, SetVideoModeHint(xres, yres, bpp, displayIdx));
    30573046        }
    3058         else if (strcmp(argv[1], "setcredentials") == 0)
     3047        else if (strcmp(a->argv[1], "setcredentials") == 0)
    30593048        {
    30603049            bool fAllowLocalLogon = true;
    3061             if (argc == 7)
    3062             {
    3063                 if (strcmp(argv[5], "-allowlocallogon") != 0)
    3064                 {
    3065                     errorArgument("Invalid parameter '%s'", argv[5]);
     3050            if (a->argc == 7)
     3051            {
     3052                if (strcmp(a->argv[5], "-allowlocallogon") != 0)
     3053                {
     3054                    errorArgument("Invalid parameter '%s'", a->argv[5]);
    30663055                    rc = E_FAIL;
    30673056                    break;
    30683057                }
    3069                 if (strcmp(argv[6], "no") == 0)
     3058                if (strcmp(a->argv[6], "no") == 0)
    30703059                    fAllowLocalLogon = false;
    30713060            }
    3072             else if (argc != 5)
     3061            else if (a->argc != 5)
    30733062            {
    30743063                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     
    30793068            ComPtr<IGuest> guest;
    30803069            CHECK_ERROR_BREAK(console, COMGETTER(Guest)(guest.asOutParam()));
    3081             CHECK_ERROR_BREAK(guest, SetCredentials(Bstr(argv[2]), Bstr(argv[3]), Bstr(argv[4]), fAllowLocalLogon));
    3082         }
    3083         else if (strcmp(argv[1], "dvdattach") == 0)
    3084         {
    3085             if (argc != 3)
     3070            CHECK_ERROR_BREAK(guest, SetCredentials(Bstr(a->argv[2]), Bstr(a->argv[3]), Bstr(a->argv[4]), fAllowLocalLogon));
     3071        }
     3072        else if (strcmp(a->argv[1], "dvdattach") == 0)
     3073        {
     3074            if (a->argc != 3)
    30863075            {
    30873076                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     
    30943083
    30953084            /* unmount? */
    3096             if (strcmp(argv[2], "none") == 0)
     3085            if (strcmp(a->argv[2], "none") == 0)
    30973086            {
    30983087                CHECK_ERROR(dvdDrive, Unmount());
    30993088            }
    31003089            /* host drive? */
    3101             else if (strncmp(argv[2], "host:", 5) == 0)
     3090            else if (strncmp(a->argv[2], "host:", 5) == 0)
    31023091            {
    31033092                ComPtr<IHost> host;
    3104                 CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     3093                CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    31053094                ComPtr<IHostDVDDriveCollection> hostDVDs;
    31063095                CHECK_ERROR(host, COMGETTER(DVDDrives)(hostDVDs.asOutParam()));
    31073096                ComPtr<IHostDVDDrive> hostDVDDrive;
    3108                 rc = hostDVDs->FindByName(Bstr(argv[2] + 5), hostDVDDrive.asOutParam());
     3097                rc = hostDVDs->FindByName(Bstr(a->argv[2] + 5), hostDVDDrive.asOutParam());
    31093098                if (!hostDVDDrive)
    31103099                {
     
    31183107            {
    31193108                /* first assume it's a UUID */
    3120                 Guid uuid(argv[2]);
     3109                Guid uuid(a->argv[2]);
    31213110                ComPtr<IDVDImage2> dvdImage;
    3122                 rc = virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
     3111                rc = a->virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
    31233112                if (FAILED(rc) || !dvdImage)
    31243113                {
    31253114                    /* must be a filename, check if it's in the collection */
    3126                     rc = virtualBox->FindDVDImage(Bstr(argv[2]), dvdImage.asOutParam());
     3115                    rc = a->virtualBox->FindDVDImage(Bstr(a->argv[2]), dvdImage.asOutParam());
    31273116                    /* not registered, do that on the fly */
    31283117                    if (!dvdImage)
    31293118                    {
    31303119                        Guid emptyUUID;
    3131                         CHECK_ERROR(virtualBox, OpenDVDImage(Bstr(argv[2]), emptyUUID, dvdImage.asOutParam()));
     3120                        CHECK_ERROR(a->virtualBox, OpenDVDImage(Bstr(a->argv[2]), emptyUUID, dvdImage.asOutParam()));
    31323121                    }
    31333122                }
     
    31413130            }
    31423131        }
    3143         else if (strcmp(argv[1], "floppyattach") == 0)
    3144         {
    3145             if (argc != 3)
     3132        else if (strcmp(a->argv[1], "floppyattach") == 0)
     3133        {
     3134            if (a->argc != 3)
    31463135            {
    31473136                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     
    31553144
    31563145            /* unmount? */
    3157             if (strcmp(argv[2], "none") == 0)
     3146            if (strcmp(a->argv[2], "none") == 0)
    31583147            {
    31593148                CHECK_ERROR(floppyDrive, Unmount());
    31603149            }
    31613150            /* host drive? */
    3162             else if (strncmp(argv[2], "host:", 5) == 0)
     3151            else if (strncmp(a->argv[2], "host:", 5) == 0)
    31633152            {
    31643153                ComPtr<IHost> host;
    3165                 CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     3154                CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    31663155                ComPtr<IHostFloppyDriveCollection> hostFloppies;
    31673156                CHECK_ERROR(host, COMGETTER(FloppyDrives)(hostFloppies.asOutParam()));
    31683157                ComPtr<IHostFloppyDrive> hostFloppyDrive;
    3169                 rc = hostFloppies->FindByName(Bstr(argv[2] + 5), hostFloppyDrive.asOutParam());
     3158                rc = hostFloppies->FindByName(Bstr(a->argv[2] + 5), hostFloppyDrive.asOutParam());
    31703159                if (!hostFloppyDrive)
    31713160                {
     
    31793168            {
    31803169                /* first assume it's a UUID */
    3181                 Guid uuid(argv[2]);
     3170                Guid uuid(a->argv[2]);
    31823171                ComPtr<IFloppyImage2> floppyImage;
    3183                 rc = virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
     3172                rc = a->virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
    31843173                if (FAILED(rc) || !floppyImage)
    31853174                {
    31863175                    /* must be a filename, check if it's in the collection */
    3187                     rc = virtualBox->FindFloppyImage(Bstr(argv[2]), floppyImage.asOutParam());
     3176                    rc = a->virtualBox->FindFloppyImage(Bstr(a->argv[2]), floppyImage.asOutParam());
    31883177                    /* not registered, do that on the fly */
    31893178                    if (!floppyImage)
    31903179                    {
    31913180                        Guid emptyUUID;
    3192                         CHECK_ERROR(virtualBox, OpenFloppyImage(Bstr(argv[2]), emptyUUID, floppyImage.asOutParam()));
     3181                        CHECK_ERROR(a->virtualBox, OpenFloppyImage(Bstr(a->argv[2]), emptyUUID, floppyImage.asOutParam()));
    31933182                    }
    31943183                }
     
    32033192        }
    32043193#ifdef VBOX_WITH_MEM_BALLOONING
    3205         else if (strncmp(argv[1], "-guestmemoryballoon", 19) == 0)
    3206         {
    3207             if (argc != 3)
     3194        else if (strncmp(a->argv[1], "-guestmemoryballoon", 19) == 0)
     3195        {
     3196            if (a->argc != 3)
    32083197            {
    32093198                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     
    32133202            uint32_t uVal;
    32143203            int vrc;
    3215             vrc = RTStrToUInt32Ex(argv[2], NULL, 0, &uVal);
     3204            vrc = RTStrToUInt32Ex(a->argv[2], NULL, 0, &uVal);
    32163205            if (vrc != VINF_SUCCESS)
    32173206            {
    3218                 errorArgument("Error parsing guest memory balloon size '%s'", argv[2]);
     3207                errorArgument("Error parsing guest memory balloon size '%s'", a->argv[2]);
    32193208                rc = E_FAIL;
    32203209                break;
     
    32293218        }
    32303219#endif
    3231         else if (strncmp(argv[1], "-gueststatisticsinterval", 24) == 0)
    3232         {
    3233             if (argc != 3)
     3220        else if (strncmp(a->argv[1], "-gueststatisticsinterval", 24) == 0)
     3221        {
     3222            if (a->argc != 3)
    32343223            {
    32353224                errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
     
    32393228            uint32_t uVal;
    32403229            int vrc;
    3241             vrc = RTStrToUInt32Ex(argv[2], NULL, 0, &uVal);
     3230            vrc = RTStrToUInt32Ex(a->argv[2], NULL, 0, &uVal);
    32423231            if (vrc != VINF_SUCCESS)
    32433232            {
    3244                 errorArgument("Error parsing guest statistics interval '%s'", argv[2]);
     3233                errorArgument("Error parsing guest statistics interval '%s'", a->argv[2]);
    32453234                rc = E_FAIL;
    32463235                break;
     
    32563245        else
    32573246        {
    3258             errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
     3247            errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
    32593248            rc = E_FAIL;
    32603249        }
     
    32623251    while (0);
    32633252
    3264     session->Close();
     3253    a->session->Close();
    32653254
    32663255    return SUCCEEDED (rc) ? 0 : 1;
    32673256}
    32683257
    3269 static int handleDiscardState(int argc, char *argv[],
    3270                               ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     3258static int handleDiscardState(HandlerArg *a)
    32713259{
    32723260    HRESULT rc;
    32733261
    3274     if (argc != 1)
     3262    if (a->argc != 1)
    32753263        return errorSyntax(USAGE_DISCARDSTATE, "Incorrect number of parameters");
    32763264
    32773265    ComPtr<IMachine> machine;
    32783266    /* assume it's a UUID */
    3279     rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     3267    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    32803268    if (FAILED(rc) || !machine)
    32813269    {
    32823270        /* must be a name */
    3283         CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     3271        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    32843272    }
    32853273    if (machine)
     
    32903278            Guid guid;
    32913279            machine->COMGETTER(Id)(guid.asOutParam());
    3292             CHECK_ERROR_BREAK(virtualBox, OpenSession(session, guid));
     3280            CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
    32933281            do
    32943282            {
    32953283                ComPtr<IConsole> console;
    3296                 CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
     3284                CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
    32973285                CHECK_ERROR_BREAK(console, DiscardSavedState());
    32983286            }
    32993287            while (0);
    3300             CHECK_ERROR_BREAK(session, Close());
     3288            CHECK_ERROR_BREAK(a->session, Close());
    33013289        }
    33023290        while (0);
     
    33063294}
    33073295
    3308 static int handleAdoptdState(int argc, char *argv[],
    3309                              ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     3296static int handleAdoptdState(HandlerArg *a)
    33103297{
    33113298    HRESULT rc;
    33123299
    3313     if (argc != 2)
     3300    if (a->argc != 2)
    33143301        return errorSyntax(USAGE_ADOPTSTATE, "Incorrect number of parameters");
    33153302
    33163303    ComPtr<IMachine> machine;
    33173304    /* assume it's a UUID */
    3318     rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     3305    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    33193306    if (FAILED(rc) || !machine)
    33203307    {
    33213308        /* must be a name */
    3322         CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     3309        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    33233310    }
    33243311    if (machine)
     
    33293316            Guid guid;
    33303317            machine->COMGETTER(Id)(guid.asOutParam());
    3331             CHECK_ERROR_BREAK(virtualBox, OpenSession(session, guid));
     3318            CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
    33323319            do
    33333320            {
    33343321                ComPtr<IConsole> console;
    3335                 CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
    3336                 CHECK_ERROR_BREAK(console, AdoptSavedState (Bstr (argv[1])));
     3322                CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
     3323                CHECK_ERROR_BREAK(console, AdoptSavedState (Bstr (a->argv[1])));
    33373324            }
    33383325            while (0);
    3339             CHECK_ERROR_BREAK(session, Close());
     3326            CHECK_ERROR_BREAK(a->session, Close());
    33403327        }
    33413328        while (0);
     
    33453332}
    33463333
    3347 static int handleSnapshot(int argc, char *argv[],
    3348                           ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     3334static int handleSnapshot(HandlerArg *a)
    33493335{
    33503336    HRESULT rc;
    33513337
    33523338    /* we need at least a VM and a command */
    3353     if (argc < 2)
     3339    if (a->argc < 2)
    33543340        return errorSyntax(USAGE_SNAPSHOT, "Not enough parameters");
    33553341
     
    33573343    ComPtr<IMachine> machine;
    33583344    /* assume it's a UUID */
    3359     rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     3345    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    33603346    if (FAILED(rc) || !machine)
    33613347    {
    33623348        /* must be a name */
    3363         CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     3349        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    33643350    }
    33653351    if (!machine)
     
    33713357    {
    33723358        /* we have to open a session for this task. First try an existing session */
    3373         rc = virtualBox->OpenExistingSession(session, guid);
     3359        rc = a->virtualBox->OpenExistingSession(a->session, guid);
    33743360        if (FAILED(rc))
    3375             CHECK_ERROR_BREAK(virtualBox, OpenSession(session, guid));
     3361            CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
    33763362        ComPtr<IConsole> console;
    3377         CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
     3363        CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
    33783364
    33793365        /* switch based on the command */
    3380         if (strcmp(argv[1], "take") == 0)
     3366        if (strcmp(a->argv[1], "take") == 0)
    33813367        {
    33823368            /* there must be a name */
    3383             if (argc < 3)
     3369            if (a->argc < 3)
    33843370            {
    33853371                errorSyntax(USAGE_SNAPSHOT, "Missing snapshot name");
     
    33873373                break;
    33883374            }
    3389             Bstr name(argv[2]);
    3390             if ((argc > 3) && ((argc != 5) || (strcmp(argv[3], "-desc") != 0)))
     3375            Bstr name(a->argv[2]);
     3376            if ((a->argc > 3) && ((a->argc != 5) || (strcmp(a->argv[3], "-desc") != 0)))
    33913377            {
    33923378                errorSyntax(USAGE_SNAPSHOT, "Incorrect description format");
     
    33953381            }
    33963382            Bstr desc;
    3397             if (argc == 5)
    3398                 desc = argv[4];
     3383            if (a->argc == 5)
     3384                desc = a->argv[4];
    33993385            ComPtr<IProgress> progress;
    34003386            CHECK_ERROR_BREAK(console, TakeSnapshot(name, desc, progress.asOutParam()));
     
    34113397            }
    34123398        }
    3413         else if (strcmp(argv[1], "discard") == 0)
     3399        else if (strcmp(a->argv[1], "discard") == 0)
    34143400        {
    34153401            /* exactly one parameter: snapshot name */
    3416             if (argc != 3)
     3402            if (a->argc != 3)
    34173403            {
    34183404                errorSyntax(USAGE_SNAPSHOT, "Expecting snapshot name only");
     
    34243410
    34253411            /* assume it's a UUID */
    3426             Guid guid(argv[2]);
     3412            Guid guid(a->argv[2]);
    34273413            if (!guid.isEmpty())
    34283414            {
     
    34323418            {
    34333419                /* then it must be a name */
    3434                 CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(argv[2]), snapshot.asOutParam()));
     3420                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
    34353421            }
    34363422
     
    34513437            }
    34523438        }
    3453         else if (strcmp(argv[1], "discardcurrent") == 0)
    3454         {
    3455             if (   (argc != 3)
    3456                 || (   (strcmp(argv[2], "-state") != 0)
    3457                     && (strcmp(argv[2], "-all") != 0)))
    3458             {
    3459                 errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(argv[2]).raw());
     3439        else if (strcmp(a->argv[1], "discardcurrent") == 0)
     3440        {
     3441            if (   (a->argc != 3)
     3442                || (   (strcmp(a->argv[2], "-state") != 0)
     3443                    && (strcmp(a->argv[2], "-all") != 0)))
     3444            {
     3445                errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[2]).raw());
    34603446                rc = E_FAIL;
    34613447                break;
    34623448            }
    34633449            bool fAll = false;
    3464             if (strcmp(argv[2], "-all") == 0)
     3450            if (strcmp(a->argv[2], "-all") == 0)
    34653451                fAll = true;
    34663452
     
    34883474
    34893475        }
    3490         else if (strcmp(argv[1], "edit") == 0)
    3491         {
    3492             if (argc < 3)
     3476        else if (strcmp(a->argv[1], "edit") == 0)
     3477        {
     3478            if (a->argc < 3)
    34933479            {
    34943480                errorSyntax(USAGE_SNAPSHOT, "Missing snapshot name");
     
    34993485            ComPtr<ISnapshot> snapshot;
    35003486
    3501             if (strcmp(argv[2], "-current") == 0)
     3487            if (strcmp(a->argv[2], "-current") == 0)
    35023488            {
    35033489                CHECK_ERROR_BREAK(machine, COMGETTER(CurrentSnapshot)(snapshot.asOutParam()));
     
    35063492            {
    35073493                /* assume it's a UUID */
    3508                 Guid guid(argv[2]);
     3494                Guid guid(a->argv[2]);
    35093495                if (!guid.isEmpty())
    35103496                {
     
    35143500                {
    35153501                    /* then it must be a name */
    3516                     CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(argv[2]), snapshot.asOutParam()));
     3502                    CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
    35173503                }
    35183504            }
    35193505
    35203506            /* parse options */
    3521             for (int i = 3; i < argc; i++)
    3522             {
    3523                 if (strcmp(argv[i], "-newname") == 0)
    3524                 {
    3525                     if (argc <= i + 1)
     3507            for (int i = 3; i < a->argc; i++)
     3508            {
     3509                if (strcmp(a->argv[i], "-newname") == 0)
     3510                {
     3511                    if (a->argc <= i + 1)
    35263512                    {
    3527                         errorArgument("Missing argument to '%s'", argv[i]);
     3513                        errorArgument("Missing argument to '%s'", a->argv[i]);
    35283514                        rc = E_FAIL;
    35293515                        break;
    35303516                    }
    35313517                    i++;
    3532                     snapshot->COMSETTER(Name)(Bstr(argv[i]));
    3533                 }
    3534                 else if (strcmp(argv[i], "-newdesc") == 0)
    3535                 {
    3536                     if (argc <= i + 1)
     3518                    snapshot->COMSETTER(Name)(Bstr(a->argv[i]));
     3519                }
     3520                else if (strcmp(a->argv[i], "-newdesc") == 0)
     3521                {
     3522                    if (a->argc <= i + 1)
    35373523                    {
    3538                         errorArgument("Missing argument to '%s'", argv[i]);
     3524                        errorArgument("Missing argument to '%s'", a->argv[i]);
    35393525                        rc = E_FAIL;
    35403526                        break;
    35413527                    }
    35423528                    i++;
    3543                     snapshot->COMSETTER(Description)(Bstr(argv[i]));
     3529                    snapshot->COMSETTER(Description)(Bstr(a->argv[i]));
    35443530                }
    35453531                else
    35463532                {
    3547                     errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     3533                    errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    35483534                    rc = E_FAIL;
    35493535                    break;
     
    35523538
    35533539        }
    3554         else if (strcmp(argv[1], "showvminfo") == 0)
     3540        else if (strcmp(a->argv[1], "showvminfo") == 0)
    35553541        {
    35563542            /* exactly one parameter: snapshot name */
    3557             if (argc != 3)
     3543            if (a->argc != 3)
    35583544            {
    35593545                errorSyntax(USAGE_SNAPSHOT, "Expecting snapshot name only");
     
    35653551
    35663552            /* assume it's a UUID */
    3567             Guid guid(argv[2]);
     3553            Guid guid(a->argv[2]);
    35683554            if (!guid.isEmpty())
    35693555            {
     
    35733559            {
    35743560                /* then it must be a name */
    3575                 CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(argv[2]), snapshot.asOutParam()));
     3561                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
    35763562            }
    35773563
     
    35793565            ComPtr<IMachine> machine;
    35803566            snapshot->COMGETTER(Machine)(machine.asOutParam());
    3581             showVMInfo(virtualBox, machine, console);
     3567            showVMInfo(a->virtualBox, machine, console);
    35823568        }
    35833569        else
    35843570        {
    3585             errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
     3571            errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
    35863572            rc = E_FAIL;
    35873573        }
    35883574    } while (0);
    35893575
    3590     session->Close();
     3576    a->session->Close();
    35913577
    35923578    return SUCCEEDED(rc) ? 0 : 1;
    35933579}
    35943580
    3595 static int handleGetExtraData(int argc, char *argv[],
    3596                               ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     3581static int handleGetExtraData(HandlerArg *a)
    35973582{
    35983583    HRESULT rc = S_OK;
    35993584
    3600     if (argc != 2)
     3585    if (a->argc != 2)
    36013586        return errorSyntax(USAGE_GETEXTRADATA, "Incorrect number of parameters");
    36023587
    36033588    /* global data? */
    3604     if (strcmp(argv[0], "global") == 0)
     3589    if (strcmp(a->argv[0], "global") == 0)
    36053590    {
    36063591        /* enumeration? */
    3607         if (strcmp(argv[1], "enumerate") == 0)
     3592        if (strcmp(a->argv[1], "enumerate") == 0)
    36083593        {
    36093594            Bstr extraDataKey;
     
    36133598                Bstr nextExtraDataKey;
    36143599                Bstr nextExtraDataValue;
    3615                 HRESULT rcEnum = virtualBox->GetNextExtraDataKey(extraDataKey, nextExtraDataKey.asOutParam(),
    3616                                                                  nextExtraDataValue.asOutParam());
     3600                HRESULT rcEnum = a->virtualBox->GetNextExtraDataKey(extraDataKey, nextExtraDataKey.asOutParam(),
     3601                                                                    nextExtraDataValue.asOutParam());
    36173602                extraDataKey = nextExtraDataKey;
    36183603
     
    36243609        {
    36253610            Bstr value;
    3626             CHECK_ERROR(virtualBox, GetExtraData(Bstr(argv[1]), value.asOutParam()));
     3611            CHECK_ERROR(a->virtualBox, GetExtraData(Bstr(a->argv[1]), value.asOutParam()));
    36273612            if (value)
    36283613                RTPrintf("Value: %lS\n", value.raw());
     
    36353620        ComPtr<IMachine> machine;
    36363621        /* assume it's a UUID */
    3637         rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     3622        rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    36383623        if (FAILED(rc) || !machine)
    36393624        {
    36403625            /* must be a name */
    3641             CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     3626            CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    36423627        }
    36433628        if (machine)
    36443629        {
    36453630            /* enumeration? */
    3646             if (strcmp(argv[1], "enumerate") == 0)
     3631            if (strcmp(a->argv[1], "enumerate") == 0)
    36473632            {
    36483633                Bstr extraDataKey;
     
    36653650            {
    36663651                Bstr value;
    3667                 CHECK_ERROR(machine, GetExtraData(Bstr(argv[1]), value.asOutParam()));
     3652                CHECK_ERROR(machine, GetExtraData(Bstr(a->argv[1]), value.asOutParam()));
    36683653                if (value)
    36693654                    RTPrintf("Value: %lS\n", value.raw());
     
    36763661}
    36773662
    3678 static int handleSetExtraData(int argc, char *argv[],
    3679                               ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     3663static int handleSetExtraData(HandlerArg *a)
    36803664{
    36813665    HRESULT rc = S_OK;
    36823666
    3683     if (argc < 2)
     3667    if (a->argc < 2)
    36843668        return errorSyntax(USAGE_SETEXTRADATA, "Not enough parameters");
    36853669
    36863670    /* global data? */
    3687     if (strcmp(argv[0], "global") == 0)
    3688     {
    3689         if (argc < 3)
    3690             CHECK_ERROR(virtualBox, SetExtraData(Bstr(argv[1]), NULL));
    3691         else if (argc == 3)
    3692             CHECK_ERROR(virtualBox, SetExtraData(Bstr(argv[1]), Bstr(argv[2])));
     3671    if (strcmp(a->argv[0], "global") == 0)
     3672    {
     3673        if (a->argc < 3)
     3674            CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]), NULL));
     3675        else if (a->argc == 3)
     3676            CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]), Bstr(a->argv[2])));
    36933677        else
    36943678            return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
     
    36983682        ComPtr<IMachine> machine;
    36993683        /* assume it's a UUID */
    3700         rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     3684        rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    37013685        if (FAILED(rc) || !machine)
    37023686        {
    37033687            /* must be a name */
    3704             CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     3688            CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    37053689        }
    37063690        if (machine)
    37073691        {
    3708             if (argc < 3)
    3709                 CHECK_ERROR(machine, SetExtraData(Bstr(argv[1]), NULL));
    3710             else if (argc == 3)
    3711                 CHECK_ERROR(machine, SetExtraData(Bstr(argv[1]), Bstr(argv[2])));
     3692            if (a->argc < 3)
     3693                CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]), NULL));
     3694            else if (a->argc == 3)
     3695                CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]), Bstr(a->argv[2])));
    37123696            else
    37133697                return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
     
    37173701}
    37183702
    3719 static int handleSetProperty(int argc, char *argv[],
    3720                              ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     3703static int handleSetProperty(HandlerArg *a)
    37213704{
    37223705    HRESULT rc;
    37233706
    37243707    /* there must be two arguments: property name and value */
    3725     if (argc != 2)
     3708    if (a->argc != 2)
    37263709        return errorSyntax(USAGE_SETPROPERTY, "Incorrect number of parameters");
    37273710
    37283711    ComPtr<ISystemProperties> systemProperties;
    3729     virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
    3730 
    3731     if (strcmp(argv[0], "hdfolder") == 0)
     3712    a->virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
     3713
     3714    if (strcmp(a->argv[0], "hdfolder") == 0)
    37323715    {
    37333716        /* reset to default? */
    3734         if (strcmp(argv[1], "default") == 0)
     3717        if (strcmp(a->argv[1], "default") == 0)
    37353718            CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(NULL));
    37363719        else
    3737             CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(Bstr(argv[1])));
    3738     }
    3739     else if (strcmp(argv[0], "machinefolder") == 0)
     3720            CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(Bstr(a->argv[1])));
     3721    }
     3722    else if (strcmp(a->argv[0], "machinefolder") == 0)
    37403723    {
    37413724        /* reset to default? */
    3742         if (strcmp(argv[1], "default") == 0)
     3725        if (strcmp(a->argv[1], "default") == 0)
    37433726            CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(NULL));
    37443727        else
    3745             CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(Bstr(argv[1])));
    3746     }
    3747     else if (strcmp(argv[0], "vrdpauthlibrary") == 0)
     3728            CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(Bstr(a->argv[1])));
     3729    }
     3730    else if (strcmp(a->argv[0], "vrdpauthlibrary") == 0)
    37483731    {
    37493732        /* reset to default? */
    3750         if (strcmp(argv[1], "default") == 0)
     3733        if (strcmp(a->argv[1], "default") == 0)
    37513734            CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(NULL));
    37523735        else
    3753             CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(Bstr(argv[1])));
    3754     }
    3755     else if (strcmp(argv[0], "websrvauthlibrary") == 0)
     3736            CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(Bstr(a->argv[1])));
     3737    }
     3738    else if (strcmp(a->argv[0], "websrvauthlibrary") == 0)
    37563739    {
    37573740        /* reset to default? */
    3758         if (strcmp(argv[1], "default") == 0)
     3741        if (strcmp(a->argv[1], "default") == 0)
    37593742            CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(NULL));
    37603743        else
    3761             CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(Bstr(argv[1])));
    3762     }
    3763     else if (strcmp(argv[0], "hwvirtexenabled") == 0)
    3764     {
    3765         if (strcmp(argv[1], "yes") == 0)
     3744            CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(Bstr(a->argv[1])));
     3745    }
     3746    else if (strcmp(a->argv[0], "hwvirtexenabled") == 0)
     3747    {
     3748        if (strcmp(a->argv[1], "yes") == 0)
    37663749            CHECK_ERROR(systemProperties, COMSETTER(HWVirtExEnabled)(TRUE));
    3767         else if (strcmp(argv[1], "no") == 0)
     3750        else if (strcmp(a->argv[1], "no") == 0)
    37683751            CHECK_ERROR(systemProperties, COMSETTER(HWVirtExEnabled)(FALSE));
    37693752        else
    3770             return errorArgument("Invalid value '%s' for hardware virtualization extension flag", argv[1]);
    3771     }
    3772     else if (strcmp(argv[0], "loghistorycount") == 0)
     3753            return errorArgument("Invalid value '%s' for hardware virtualization extension flag", a->argv[1]);
     3754    }
     3755    else if (strcmp(a->argv[0], "loghistorycount") == 0)
    37733756    {
    37743757        uint32_t uVal;
    37753758        int vrc;
    3776         vrc = RTStrToUInt32Ex(argv[1], NULL, 0, &uVal);
     3759        vrc = RTStrToUInt32Ex(a->argv[1], NULL, 0, &uVal);
    37773760        if (vrc != VINF_SUCCESS)
    3778             return errorArgument("Error parsing Log history count '%s'", argv[1]);
     3761            return errorArgument("Error parsing Log history count '%s'", a->argv[1]);
    37793762        CHECK_ERROR(systemProperties, COMSETTER(LogHistoryCount)(uVal));
    37803763    }
    37813764    else
    3782         return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", argv[0]);
     3765        return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", a->argv[0]);
    37833766
    37843767    return SUCCEEDED(rc) ? 0 : 1;
    37853768}
    37863769
    3787 static int handleUSBFilter (int argc, char *argv[],
    3788                             ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     3770static int handleUSBFilter (HandlerArg *a)
    37893771{
    37903772    HRESULT rc = S_OK;
     
    37923774
    37933775    /* at least: 0: command, 1: index, 2: -target, 3: <target value> */
    3794     if (argc < 4)
     3776    if (a->argc < 4)
    37953777        return errorSyntax(USAGE_USBFILTER, "Not enough parameters");
    37963778
    37973779    /* which command? */
    37983780    cmd.mAction = USBFilterCmd::Invalid;
    3799     if      (strcmp (argv [0], "add") == 0)     cmd.mAction = USBFilterCmd::Add;
    3800     else if (strcmp (argv [0], "modify") == 0)  cmd.mAction = USBFilterCmd::Modify;
    3801     else if (strcmp (argv [0], "remove") == 0)  cmd.mAction = USBFilterCmd::Remove;
     3781    if      (strcmp (a->argv [0], "add") == 0)     cmd.mAction = USBFilterCmd::Add;
     3782    else if (strcmp (a->argv [0], "modify") == 0)  cmd.mAction = USBFilterCmd::Modify;
     3783    else if (strcmp (a->argv [0], "remove") == 0)  cmd.mAction = USBFilterCmd::Remove;
    38023784
    38033785    if (cmd.mAction == USBFilterCmd::Invalid)
    3804         return errorSyntax(USAGE_USBFILTER, "Invalid parameter '%s'", argv[0]);
     3786        return errorSyntax(USAGE_USBFILTER, "Invalid parameter '%s'", a->argv[0]);
    38053787
    38063788    /* which index? */
    3807     if (VINF_SUCCESS !=  RTStrToUInt32Full (argv[1], 10, &cmd.mIndex))
    3808         return errorSyntax(USAGE_USBFILTER, "Invalid index '%s'", argv[1]);
     3789    if (VINF_SUCCESS !=  RTStrToUInt32Full (a->argv[1], 10, &cmd.mIndex))
     3790        return errorSyntax(USAGE_USBFILTER, "Invalid index '%s'", a->argv[1]);
    38093791
    38103792    switch (cmd.mAction)
     
    38143796        {
    38153797            /* at least: 0: command, 1: index, 2: -target, 3: <target value>, 4: -name, 5: <name value> */
    3816             if (argc < 6)
     3798            if (a->argc < 6)
    38173799            {
    38183800                if (cmd.mAction == USBFilterCmd::Add)
     
    38283810                cmd.mFilter.mActive = true;
    38293811
    3830             for (int i = 2; i < argc; i++)
    3831             {
    3832                 if  (strcmp(argv [i], "-target") == 0)
    3833                 {
    3834                     if (argc <= i + 1 || !*argv[i+1])
    3835                         return errorArgument("Missing argument to '%s'", argv[i]);
     3812            for (int i = 2; i < a->argc; i++)
     3813            {
     3814                if  (strcmp(a->argv [i], "-target") == 0)
     3815                {
     3816                    if (a->argc <= i + 1 || !*a->argv[i+1])
     3817                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38363818                    i++;
    3837                     if (strcmp (argv [i], "global") == 0)
     3819                    if (strcmp (a->argv [i], "global") == 0)
    38383820                        cmd.mGlobal = true;
    38393821                    else
    38403822                    {
    38413823                        /* assume it's a UUID of a machine */
    3842                         rc = aVirtualBox->GetMachine(Guid(argv[i]), cmd.mMachine.asOutParam());
     3824                        rc = a->virtualBox->GetMachine(Guid(a->argv[i]), cmd.mMachine.asOutParam());
    38433825                        if (FAILED(rc) || !cmd.mMachine)
    38443826                        {
    38453827                            /* must be a name */
    3846                             CHECK_ERROR_RET(aVirtualBox, FindMachine(Bstr(argv[i]), cmd.mMachine.asOutParam()), 1);
     3828                            CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[i]), cmd.mMachine.asOutParam()), 1);
    38473829                        }
    38483830                    }
    38493831                }
    3850                 else if (strcmp(argv [i], "-name") == 0)
    3851                 {
    3852                     if (argc <= i + 1 || !*argv[i+1])
    3853                         return errorArgument("Missing argument to '%s'", argv[i]);
     3832                else if (strcmp(a->argv [i], "-name") == 0)
     3833                {
     3834                    if (a->argc <= i + 1 || !*a->argv[i+1])
     3835                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38543836                    i++;
    3855                     cmd.mFilter.mName = argv [i];
    3856                 }
    3857                 else if (strcmp(argv [i], "-active") == 0)
    3858                 {
    3859                     if (argc <= i + 1)
    3860                         return errorArgument("Missing argument to '%s'", argv[i]);
     3837                    cmd.mFilter.mName = a->argv [i];
     3838                }
     3839                else if (strcmp(a->argv [i], "-active") == 0)
     3840                {
     3841                    if (a->argc <= i + 1)
     3842                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38613843                    i++;
    3862                     if (strcmp (argv [i], "yes") == 0)
     3844                    if (strcmp (a->argv [i], "yes") == 0)
    38633845                        cmd.mFilter.mActive = true;
    3864                     else if (strcmp (argv [i], "no") == 0)
     3846                    else if (strcmp (a->argv [i], "no") == 0)
    38653847                        cmd.mFilter.mActive = false;
    38663848                    else
    3867                         return errorArgument("Invalid -active argument '%s'", argv[i]);
    3868                 }
    3869                 else if (strcmp(argv [i], "-vendorid") == 0)
    3870                 {
    3871                     if (argc <= i + 1)
    3872                         return errorArgument("Missing argument to '%s'", argv[i]);
     3849                        return errorArgument("Invalid -active argument '%s'", a->argv[i]);
     3850                }
     3851                else if (strcmp(a->argv [i], "-vendorid") == 0)
     3852                {
     3853                    if (a->argc <= i + 1)
     3854                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38733855                    i++;
    3874                     cmd.mFilter.mVendorId = argv [i];
    3875                 }
    3876                 else if (strcmp(argv [i], "-productid") == 0)
    3877                 {
    3878                     if (argc <= i + 1)
    3879                         return errorArgument("Missing argument to '%s'", argv[i]);
     3856                    cmd.mFilter.mVendorId = a->argv [i];
     3857                }
     3858                else if (strcmp(a->argv [i], "-productid") == 0)
     3859                {
     3860                    if (a->argc <= i + 1)
     3861                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38803862                    i++;
    3881                     cmd.mFilter.mProductId = argv [i];
    3882                 }
    3883                 else if (strcmp(argv [i], "-revision") == 0)
    3884                 {
    3885                     if (argc <= i + 1)
    3886                         return errorArgument("Missing argument to '%s'", argv[i]);
     3863                    cmd.mFilter.mProductId = a->argv [i];
     3864                }
     3865                else if (strcmp(a->argv [i], "-revision") == 0)
     3866                {
     3867                    if (a->argc <= i + 1)
     3868                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38873869                    i++;
    3888                     cmd.mFilter.mRevision = argv [i];
    3889                 }
    3890                 else if (strcmp(argv [i], "-manufacturer") == 0)
    3891                 {
    3892                     if (argc <= i + 1)
    3893                         return errorArgument("Missing argument to '%s'", argv[i]);
     3870                    cmd.mFilter.mRevision = a->argv [i];
     3871                }
     3872                else if (strcmp(a->argv [i], "-manufacturer") == 0)
     3873                {
     3874                    if (a->argc <= i + 1)
     3875                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    38943876                    i++;
    3895                     cmd.mFilter.mManufacturer = argv [i];
    3896                 }
    3897                 else if (strcmp(argv [i], "-product") == 0)
    3898                 {
    3899                     if (argc <= i + 1)
    3900                         return errorArgument("Missing argument to '%s'", argv[i]);
     3877                    cmd.mFilter.mManufacturer = a->argv [i];
     3878                }
     3879                else if (strcmp(a->argv [i], "-product") == 0)
     3880                {
     3881                    if (a->argc <= i + 1)
     3882                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    39013883                    i++;
    3902                     cmd.mFilter.mProduct = argv [i];
    3903                 }
    3904                 else if (strcmp(argv [i], "-remote") == 0)
    3905                 {
    3906                     if (argc <= i + 1)
    3907                         return errorArgument("Missing argument to '%s'", argv[i]);
     3884                    cmd.mFilter.mProduct = a->argv [i];
     3885                }
     3886                else if (strcmp(a->argv [i], "-remote") == 0)
     3887                {
     3888                    if (a->argc <= i + 1)
     3889                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    39083890                    i++;
    3909                     cmd.mFilter.mRemote = argv[i];
    3910                 }
    3911                 else if (strcmp(argv [i], "-serialnumber") == 0)
    3912                 {
    3913                     if (argc <= i + 1)
    3914                         return errorArgument("Missing argument to '%s'", argv[i]);
     3891                    cmd.mFilter.mRemote = a->argv[i];
     3892                }
     3893                else if (strcmp(a->argv [i], "-serialnumber") == 0)
     3894                {
     3895                    if (a->argc <= i + 1)
     3896                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    39153897                    i++;
    3916                     cmd.mFilter.mSerialNumber = argv [i];
    3917                 }
    3918                 else if (strcmp(argv [i], "-maskedinterfaces") == 0)
    3919                 {
    3920                     if (argc <= i + 1)
    3921                         return errorArgument("Missing argument to '%s'", argv[i]);
     3898                    cmd.mFilter.mSerialNumber = a->argv [i];
     3899                }
     3900                else if (strcmp(a->argv [i], "-maskedinterfaces") == 0)
     3901                {
     3902                    if (a->argc <= i + 1)
     3903                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    39223904                    i++;
    39233905                    uint32_t u32;
    3924                     rc = RTStrToUInt32Full(argv[i], 0, &u32);
     3906                    rc = RTStrToUInt32Full(a->argv[i], 0, &u32);
    39253907                    if (RT_FAILURE(rc))
    3926                         return errorArgument("Failed to convert the -maskedinterfaces value '%s' to a number, rc=%Rrc", argv[i], rc);
     3908                        return errorArgument("Failed to convert the -maskedinterfaces value '%s' to a number, rc=%Rrc", a->argv[i], rc);
    39273909                    cmd.mFilter.mMaskedInterfaces = u32;
    39283910                }
    3929                 else if (strcmp(argv [i], "-action") == 0)
    3930                 {
    3931                     if (argc <= i + 1)
    3932                         return errorArgument("Missing argument to '%s'", argv[i]);
     3911                else if (strcmp(a->argv [i], "-action") == 0)
     3912                {
     3913                    if (a->argc <= i + 1)
     3914                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    39333915                    i++;
    3934                     if (strcmp (argv [i], "ignore") == 0)
     3916                    if (strcmp (a->argv [i], "ignore") == 0)
    39353917                        cmd.mFilter.mAction = USBDeviceFilterAction_Ignore;
    3936                     else if (strcmp (argv [i], "hold") == 0)
     3918                    else if (strcmp (a->argv [i], "hold") == 0)
    39373919                        cmd.mFilter.mAction = USBDeviceFilterAction_Hold;
    39383920                    else
    3939                         return errorArgument("Invalid USB filter action '%s'", argv[i]);
     3921                        return errorArgument("Invalid USB filter action '%s'", a->argv[i]);
    39403922                }
    39413923                else
    39423924                    return errorSyntax(cmd.mAction == USBFilterCmd::Add ? USAGE_USBFILTER_ADD : USAGE_USBFILTER_MODIFY,
    3943                                        "Unknown option '%s'", argv[i]);
     3925                                       "Unknown option '%s'", a->argv[i]);
    39443926            }
    39453927
     
    39673949        {
    39683950            /* at least: 0: command, 1: index, 2: -target, 3: <target value> */
    3969             if (argc < 4)
     3951            if (a->argc < 4)
    39703952                return errorSyntax(USAGE_USBFILTER_REMOVE, "Not enough parameters");
    39713953
    3972             for (int i = 2; i < argc; i++)
    3973             {
    3974                 if  (strcmp(argv [i], "-target") == 0)
    3975                 {
    3976                     if (argc <= i + 1 || !*argv[i+1])
    3977                         return errorArgument("Missing argument to '%s'", argv[i]);
     3954            for (int i = 2; i < a->argc; i++)
     3955            {
     3956                if  (strcmp(a->argv [i], "-target") == 0)
     3957                {
     3958                    if (a->argc <= i + 1 || !*a->argv[i+1])
     3959                        return errorArgument("Missing argument to '%s'", a->argv[i]);
    39783960                    i++;
    3979                     if (strcmp (argv [i], "global") == 0)
     3961                    if (strcmp (a->argv [i], "global") == 0)
    39803962                        cmd.mGlobal = true;
    39813963                    else
    39823964                    {
    39833965                        /* assume it's a UUID of a machine */
    3984                         rc = aVirtualBox->GetMachine(Guid(argv[i]), cmd.mMachine.asOutParam());
     3966                        rc = a->virtualBox->GetMachine(Guid(a->argv[i]), cmd.mMachine.asOutParam());
    39853967                        if (FAILED(rc) || !cmd.mMachine)
    39863968                        {
    39873969                            /* must be a name */
    3988                             CHECK_ERROR_RET(aVirtualBox, FindMachine(Bstr(argv[i]), cmd.mMachine.asOutParam()), 1);
     3970                            CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[i]), cmd.mMachine.asOutParam()), 1);
    39893971                        }
    39903972                    }
     
    40073989    ComPtr <IUSBController> ctl;
    40083990    if (cmd.mGlobal)
    4009         CHECK_ERROR_RET (aVirtualBox, COMGETTER(Host) (host.asOutParam()), 1);
     3991        CHECK_ERROR_RET (a->virtualBox, COMGETTER(Host) (host.asOutParam()), 1);
    40103992    else
    40113993    {
     
    40133995        cmd.mMachine->COMGETTER(Id)(uuid.asOutParam());
    40143996        /* open a session for the VM */
    4015         CHECK_ERROR_RET (aVirtualBox, OpenSession(aSession, uuid), 1);
     3997        CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
    40163998        /* get the mutable session machine */
    4017         aSession->COMGETTER(Machine)(cmd.mMachine.asOutParam());
     3999        a->session->COMGETTER(Machine)(cmd.mMachine.asOutParam());
    40184000        /* and get the USB controller */
    40194001        CHECK_ERROR_RET (cmd.mMachine, COMGETTER(USBController) (ctl.asOutParam()), 1);
     
    41554137        /* commit and close the session */
    41564138        CHECK_ERROR(cmd.mMachine, SaveSettings());
    4157         aSession->Close();
     4139        a->session->Close();
    41584140    }
    41594141
     
    41614143}
    41624144
    4163 static int handleSharedFolder (int argc, char *argv[],
    4164                                ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     4145static int handleSharedFolder (HandlerArg *a)
    41654146{
    41664147    HRESULT rc;
    41674148
    41684149    /* we need at least a command and target */
    4169     if (argc < 2)
     4150    if (a->argc < 2)
    41704151        return errorSyntax(USAGE_SHAREDFOLDER, "Not enough parameters");
    41714152
    41724153    ComPtr<IMachine> machine;
    41734154    /* assume it's a UUID */
    4174     rc = aVirtualBox->GetMachine(Guid(argv[1]), machine.asOutParam());
     4155    rc = a->virtualBox->GetMachine(Guid(a->argv[1]), machine.asOutParam());
    41754156    if (FAILED(rc) || !machine)
    41764157    {
    41774158        /* must be a name */
    4178         CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[1]), machine.asOutParam()));
     4159        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[1]), machine.asOutParam()));
    41794160    }
    41804161    if (!machine)
     
    41834164    machine->COMGETTER(Id)(uuid.asOutParam());
    41844165
    4185     if (strcmp(argv[0], "add") == 0)
     4166    if (strcmp(a->argv[0], "add") == 0)
    41864167    {
    41874168        /* we need at least four more parameters */
    4188         if (argc < 5)
     4169        if (a->argc < 5)
    41894170            return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Not enough parameters");
    41904171
     
    41944175        bool fWritable = true;
    41954176
    4196         for (int i = 2; i < argc; i++)
    4197         {
    4198             if (strcmp(argv[i], "-name") == 0)
    4199             {
    4200                 if (argc <= i + 1 || !*argv[i+1])
    4201                     return errorArgument("Missing argument to '%s'", argv[i]);
     4177        for (int i = 2; i < a->argc; i++)
     4178        {
     4179            if (strcmp(a->argv[i], "-name") == 0)
     4180            {
     4181                if (a->argc <= i + 1 || !*a->argv[i+1])
     4182                    return errorArgument("Missing argument to '%s'", a->argv[i]);
    42024183                i++;
    4203                 name = argv[i];
    4204             }
    4205             else if (strcmp(argv[i], "-hostpath") == 0)
    4206             {
    4207                 if (argc <= i + 1 || !*argv[i+1])
    4208                     return errorArgument("Missing argument to '%s'", argv[i]);
     4184                name = a->argv[i];
     4185            }
     4186            else if (strcmp(a->argv[i], "-hostpath") == 0)
     4187            {
     4188                if (a->argc <= i + 1 || !*a->argv[i+1])
     4189                    return errorArgument("Missing argument to '%s'", a->argv[i]);
    42094190                i++;
    4210                 hostpath = argv[i];
    4211             }
    4212             else if (strcmp(argv[i], "-readonly") == 0)
     4191                hostpath = a->argv[i];
     4192            }
     4193            else if (strcmp(a->argv[i], "-readonly") == 0)
    42134194            {
    42144195                fWritable = false;
    42154196            }
    4216             else if (strcmp(argv[i], "-transient") == 0)
     4197            else if (strcmp(a->argv[i], "-transient") == 0)
    42174198            {
    42184199                fTransient = true;
    42194200            }
    42204201            else
    4221                 return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     4202                return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    42224203        }
    42234204
     
    42364217
    42374218            /* open an existing session for the VM */
    4238             CHECK_ERROR_RET(aVirtualBox, OpenExistingSession (aSession, uuid), 1);
     4219            CHECK_ERROR_RET(a->virtualBox, OpenExistingSession (a->session, uuid), 1);
    42394220            /* get the session machine */
    4240             CHECK_ERROR_RET(aSession, COMGETTER(Machine)(machine.asOutParam()), 1);
     4221            CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
    42414222            /* get the session console */
    4242             CHECK_ERROR_RET(aSession, COMGETTER(Console)(console.asOutParam()), 1);
     4223            CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
    42434224
    42444225            CHECK_ERROR(console, CreateSharedFolder(Bstr(name), Bstr(hostpath), fWritable));
    42454226
    42464227            if (console)
    4247                 aSession->Close();
     4228                a->session->Close();
    42484229        }
    42494230        else
    42504231        {
    42514232            /* open a session for the VM */
    4252             CHECK_ERROR_RET (aVirtualBox, OpenSession(aSession, uuid), 1);
     4233            CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
    42534234
    42544235            /* get the mutable session machine */
    4255             aSession->COMGETTER(Machine)(machine.asOutParam());
     4236            a->session->COMGETTER(Machine)(machine.asOutParam());
    42564237
    42574238            CHECK_ERROR(machine, CreateSharedFolder(Bstr(name), Bstr(hostpath), fWritable));
     
    42604241                CHECK_ERROR(machine, SaveSettings());
    42614242
    4262             aSession->Close();
    4263         }
    4264     }
    4265     else if (strcmp(argv[0], "remove") == 0)
     4243            a->session->Close();
     4244        }
     4245    }
     4246    else if (strcmp(a->argv[0], "remove") == 0)
    42664247    {
    42674248        /* we need at least two more parameters */
    4268         if (argc < 3)
     4249        if (a->argc < 3)
    42694250            return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Not enough parameters");
    42704251
     
    42724253        bool fTransient = false;
    42734254
    4274         for (int i = 2; i < argc; i++)
    4275         {
    4276             if (strcmp(argv[i], "-name") == 0)
    4277             {
    4278                 if (argc <= i + 1 || !*argv[i+1])
    4279                     return errorArgument("Missing argument to '%s'", argv[i]);
     4255        for (int i = 2; i < a->argc; i++)
     4256        {
     4257            if (strcmp(a->argv[i], "-name") == 0)
     4258            {
     4259                if (a->argc <= i + 1 || !*a->argv[i+1])
     4260                    return errorArgument("Missing argument to '%s'", a->argv[i]);
    42804261                i++;
    4281                 name = argv[i];
    4282             }
    4283             else if (strcmp(argv[i], "-transient") == 0)
     4262                name = a->argv[i];
     4263            }
     4264            else if (strcmp(a->argv[i], "-transient") == 0)
    42844265            {
    42854266                fTransient = true;
    42864267            }
    42874268            else
    4288                 return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     4269                return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    42894270        }
    42904271
     
    42984279
    42994280            /* open an existing session for the VM */
    4300             CHECK_ERROR_RET(aVirtualBox, OpenExistingSession (aSession, uuid), 1);
     4281            CHECK_ERROR_RET(a->virtualBox, OpenExistingSession (a->session, uuid), 1);
    43014282            /* get the session machine */
    4302             CHECK_ERROR_RET(aSession, COMGETTER(Machine)(machine.asOutParam()), 1);
     4283            CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
    43034284            /* get the session console */
    4304             CHECK_ERROR_RET(aSession, COMGETTER(Console)(console.asOutParam()), 1);
     4285            CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
    43054286
    43064287            CHECK_ERROR(console, RemoveSharedFolder(Bstr(name)));
    43074288
    43084289            if (console)
    4309                 aSession->Close();
     4290                a->session->Close();
    43104291        }
    43114292        else
    43124293        {
    43134294            /* open a session for the VM */
    4314             CHECK_ERROR_RET (aVirtualBox, OpenSession(aSession, uuid), 1);
     4295            CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
    43154296
    43164297            /* get the mutable session machine */
    4317             aSession->COMGETTER(Machine)(machine.asOutParam());
     4298            a->session->COMGETTER(Machine)(machine.asOutParam());
    43184299
    43194300            CHECK_ERROR(machine, RemoveSharedFolder(Bstr(name)));
     
    43214302            /* commit and close the session */
    43224303            CHECK_ERROR(machine, SaveSettings());
    4323             aSession->Close();
     4304            a->session->Close();
    43244305        }
    43254306    }
    43264307    else
    4327         return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", Utf8Str(argv[0]).raw());
     4308        return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", Utf8Str(a->argv[0]).raw());
    43284309
    43294310    return 0;
    43304311}
    43314312
    4332 static int handleVMStatistics(int argc, char *argv[],
    4333                               ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     4313static int handleVMStatistics(HandlerArg *a)
    43344314{
    43354315    HRESULT rc;
    43364316
    43374317    /* at least one option: the UUID or name of the VM */
    4338     if (argc < 1)
     4318    if (a->argc < 1)
    43394319        return errorSyntax(USAGE_VM_STATISTICS, "Incorrect number of parameters");
    43404320
    43414321    /* try to find the given machine */
    43424322    ComPtr <IMachine> machine;
    4343     Guid uuid (argv[0]);
     4323    Guid uuid (a->argv[0]);
    43444324    if (!uuid.isEmpty())
    4345         CHECK_ERROR(aVirtualBox, GetMachine(uuid, machine.asOutParam()));
     4325        CHECK_ERROR(a->virtualBox, GetMachine(uuid, machine.asOutParam()));
    43464326    else
    43474327    {
    4348         CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     4328        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    43494329        if (SUCCEEDED (rc))
    43504330            machine->COMGETTER(Id)(uuid.asOutParam());
     
    43574337    bool fWithDescriptions = false;
    43584338    const char *pszPattern = NULL; /* all */
    4359     for (int i = 1; i < argc; i++)
    4360     {
    4361         if (!strcmp(argv[i], "-pattern"))
     4339    for (int i = 1; i < a->argc; i++)
     4340    {
     4341        if (!strcmp(a->argv[i], "-pattern"))
    43624342        {
    43634343            if (pszPattern)
    43644344                return errorSyntax(USAGE_VM_STATISTICS, "Multiple -patterns options is not permitted");
    4365             if (i + 1 >= argc)
    4366                 return errorArgument("Missing argument to '%s'", argv[i]);
    4367             pszPattern = argv[++i];
    4368         }
    4369         else if (!strcmp(argv[i], "-descriptions"))
     4345            if (i + 1 >= a->argc)
     4346                return errorArgument("Missing argument to '%s'", a->argv[i]);
     4347            pszPattern = a->argv[++i];
     4348        }
     4349        else if (!strcmp(a->argv[i], "-descriptions"))
    43704350            fWithDescriptions = true;
    43714351        /* add: -file <filename> and -formatted */
    4372         else if (!strcmp(argv[i], "-reset"))
     4352        else if (!strcmp(a->argv[i], "-reset"))
    43734353            fReset = true;
    43744354        else
    4375             return errorSyntax(USAGE_VM_STATISTICS, "Unknown option '%s'", argv[i]);
     4355            return errorSyntax(USAGE_VM_STATISTICS, "Unknown option '%s'", a->argv[i]);
    43764356    }
    43774357    if (fReset && fWithDescriptions)
     
    43804360
    43814361    /* open an existing session for the VM. */
    4382     CHECK_ERROR(aVirtualBox, OpenExistingSession(aSession, uuid));
     4362    CHECK_ERROR(a->virtualBox, OpenExistingSession(a->session, uuid));
    43834363    if (SUCCEEDED(rc))
    43844364    {
    43854365        /* get the session console. */
    43864366        ComPtr <IConsole> console;
    4387         CHECK_ERROR(aSession, COMGETTER(Console)(console.asOutParam()));
     4367        CHECK_ERROR(a->session, COMGETTER(Console)(console.asOutParam()));
    43884368        if (SUCCEEDED(rc))
    43894369        {
     
    44094389                }
    44104390            }
    4411             aSession->Close();
     4391            a->session->Close();
    44124392        }
    44134393    }
     
    47164696
    47174697#ifdef USE_XPCOM_QUEUE
    4718     NS_GetMainEventQ(getter_AddRefs(g_pEventQ));
     4698    nsCOMPtr<nsIEventQueue> eventQ;
     4699    NS_GetMainEventQ(getter_AddRefs(eventQ));
    47194700#endif
    47204701
    47214702    if (!checkForAutoConvertedSettings (virtualBox, session, fConvertSettings))
    47224703        break;
     4704
     4705#ifdef USE_XPCOM_QUEUE
     4706    HandlerArg handlerArg = { 0, NULL, eventQ, virtualBox, session };
     4707#else
     4708    HandlerArg handlerArg = { 0, NULL, virtualBox, session };
     4709#endif
    47234710
    47244711    /*
     
    47744761        if (strcmp(commandHandlers[commandIndex].command, argv[iCmd]) == 0)
    47754762        {
    4776             rc = commandHandlers[commandIndex].handler(argc - iCmdArg, &argv[iCmdArg], virtualBox, session);
     4763            handlerArg.argc = argc - iCmdArg;
     4764            handlerArg.argv = &argv[iCmdArg];
     4765            rc = commandHandlers[commandIndex].handler(&handlerArg);
    47774766            break;
    47784767        }
     
    47914780
    47924781#ifdef USE_XPCOM_QUEUE
    4793     g_pEventQ->ProcessPendingEvents();
     4782    eventQ->ProcessPendingEvents();
    47944783#endif
    47954784
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h

    r15602 r16052  
    9090typedef uint64_t USAGECATEGORY;
    9191
     92/** command handler argument */
     93struct HandlerArg
     94{
     95    int argc;
     96    char **argv;
     97#ifdef USE_XPCOM_QUEUE
     98    nsCOMPtr<nsIEventQueue> eventQ;
     99#endif
     100    ComPtr<IVirtualBox> virtualBox;
     101    ComPtr<ISession> session;
     102};
     103
    92104/** flag whether we're in internal mode */
    93105extern bool g_fInternalMode;
    94 
    95 #ifndef VBOX_ONLY_DOCS
    96 # ifdef USE_XPCOM_QUEUE
    97 /** A pointer to the event queue, set by main() before calling any handlers. */
    98 extern nsCOMPtr<nsIEventQueue> g_pEventQ;
    99 # endif
    100 #endif /* !VBOX_ONLY_DOCS */
    101106
    102107/** showVMInfo details */
     
    113118 * Prototypes
    114119 */
     120
    115121/* VBoxManage.cpp */
    116122int errorSyntax(USAGECATEGORY u64Cmd, const char *pszFormat, ...);
     
    122128void showProgress(ComPtr<IProgress> progress);
    123129
    124 int handleInternalCommands(int argc, char *argv[],
    125                            ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
     130int handleInternalCommands(HandlerArg *a);
    126131#endif /* !VBOX_ONLY_DOCS */
    127132
     
    129134extern void usageGuestProperty(void);
    130135#ifndef VBOX_ONLY_DOCS
    131 extern int handleGuestProperty(int argc, char *argv[],
    132                                ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
     136extern int handleGuestProperty(HandlerArg *a);
    133137
    134138/* VBoxManageVMInfo.cpp */
    135139void showSnapshots(ComPtr<ISnapshot> rootSnapshot, VMINFO_DETAILS details, const com::Bstr &prefix = "", int level = 0);
    136 int handleShowVMInfo(int argc, char *argv[],
    137                      ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
     140int handleShowVMInfo(HandlerArg *a);
    138141HRESULT showVMInfo(ComPtr <IVirtualBox> virtualBox, ComPtr<IMachine> machine,
    139142                   ComPtr <IConsole> console = ComPtr <IConsole> (),
     
    141144
    142145/* VBoxManageList.cpp */
    143 int handleList(int argc, char *argv[],
    144                ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
     146int handleList(HandlerArg *a);
    145147
    146148/* VBoxManageMetrics.cpp */
    147 int handleMetrics(int argc, char *argv[],
    148                   ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
     149int handleMetrics(HandlerArg *a);
    149150
    150151/* VBoxManageDisk.cpp */
    151 int handleCreateHardDisk(int argc, char *argv[],
    152                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
    153 int handleModifyHardDisk(int argc, char *argv[],
    154                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
    155 int handleCloneHardDisk(int argc, char *argv[],
    156                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
    157 int handleConvertHardDisk(int argc, char **argv);
     152int handleCreateHardDisk(HandlerArg *a);
     153int handleModifyHardDisk(HandlerArg *a);
     154int handleCloneHardDisk(HandlerArg *a);
    158155int handleConvertFromRaw(int argc, char *argv[]);
    159 int handleAddiSCSIDisk(int argc, char *argv[],
    160                        ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
    161 int handleShowHardDiskInfo(int argc, char *argv[],
    162                            ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
    163 int handleOpenMedium(int argc, char *argv[],
    164                      ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
    165 int handleCloseMedium(int argc, char *argv[],
    166                       ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
     156int handleAddiSCSIDisk(HandlerArg *a);
     157int handleShowHardDiskInfo(HandlerArg *a);
     158int handleOpenMedium(HandlerArg *a);
     159int handleCloseMedium(HandlerArg *a);
    167160
    168161/* VBoxManageUSB.cpp */
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp

    r15693 r16052  
    5454
    5555
    56 int handleCreateHardDisk(int argc, char *argv[],
    57                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     56int handleCreateHardDisk(HandlerArg *a)
    5857{
    5958    HRESULT rc;
     
    6766
    6867    /* let's have a closer look at the arguments */
    69     for (int i = 0; i < argc; i++)
    70     {
    71         if (strcmp(argv[i], "-filename") == 0)
    72         {
    73             if (argc <= i + 1)
    74                 return errorArgument("Missing argument to '%s'", argv[i]);
    75             i++;
    76             filename = argv[i];
    77         }
    78         else if (strcmp(argv[i], "-size") == 0)
    79         {
    80             if (argc <= i + 1)
    81                 return errorArgument("Missing argument to '%s'", argv[i]);
    82             i++;
    83             sizeMB = RTStrToUInt64(argv[i]);
    84         }
    85         else if (strcmp(argv[i], "-format") == 0)
    86         {
    87             if (argc <= i + 1)
    88                 return errorArgument("Missing argument to '%s'", argv[i]);
    89             i++;
    90             format = argv[i];
    91         }
    92         else if (strcmp(argv[i], "-static") == 0)
     68    for (int i = 0; i < a->argc; i++)
     69    {
     70        if (strcmp(a->argv[i], "-filename") == 0)
     71        {
     72            if (a->argc <= i + 1)
     73                return errorArgument("Missing argument to '%s'", a->argv[i]);
     74            i++;
     75            filename = a->argv[i];
     76        }
     77        else if (strcmp(a->argv[i], "-size") == 0)
     78        {
     79            if (a->argc <= i + 1)
     80                return errorArgument("Missing argument to '%s'", a->argv[i]);
     81            i++;
     82            sizeMB = RTStrToUInt64(a->argv[i]);
     83        }
     84        else if (strcmp(a->argv[i], "-format") == 0)
     85        {
     86            if (a->argc <= i + 1)
     87                return errorArgument("Missing argument to '%s'", a->argv[i]);
     88            i++;
     89            format = a->argv[i];
     90        }
     91        else if (strcmp(a->argv[i], "-static") == 0)
    9392        {
    9493            fStatic = true;
    9594        }
    96         else if (strcmp(argv[i], "-comment") == 0)
    97         {
    98             if (argc <= i + 1)
    99                 return errorArgument("Missing argument to '%s'", argv[i]);
    100             i++;
    101             comment = argv[i];
    102         }
    103         else if (strcmp(argv[i], "-register") == 0)
     95        else if (strcmp(a->argv[i], "-comment") == 0)
     96        {
     97            if (a->argc <= i + 1)
     98                return errorArgument("Missing argument to '%s'", a->argv[i]);
     99            i++;
     100            comment = a->argv[i];
     101        }
     102        else if (strcmp(a->argv[i], "-register") == 0)
    104103        {
    105104            fRegister = true;
    106105        }
    107         else if (strcmp(argv[i], "-type") == 0)
    108         {
    109             if (argc <= i + 1)
    110                 return errorArgument("Missing argument to '%s'", argv[i]);
    111             i++;
    112             type = argv[i];
     106        else if (strcmp(a->argv[i], "-type") == 0)
     107        {
     108            if (a->argc <= i + 1)
     109                return errorArgument("Missing argument to '%s'", a->argv[i]);
     110            i++;
     111            type = a->argv[i];
    113112        }
    114113        else
    115             return errorSyntax(USAGE_CREATEHD, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     114            return errorSyntax(USAGE_CREATEHD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    116115    }
    117116    /* check the outcome */
     
    123122
    124123    ComPtr<IHardDisk2> hardDisk;
    125     CHECK_ERROR(virtualBox, CreateHardDisk2(format, filename, hardDisk.asOutParam()));
     124    CHECK_ERROR(a->virtualBox, CreateHardDisk2(format, filename, hardDisk.asOutParam()));
    126125    if (SUCCEEDED(rc) && hardDisk)
    127126    {
     
    207206
    208207
    209 int handleModifyHardDisk(int argc, char *argv[],
    210                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     208int handleModifyHardDisk(HandlerArg *a)
    211209{
    212210    HRESULT rc;
    213211
    214212    /* The uuid/filename and a command */
    215     if (argc < 2)
     213    if (a->argc < 2)
    216214        return errorSyntax(USAGE_MODIFYHD, "Incorrect number of parameters");
    217215
     
    220218
    221219    /* first guess is that it's a UUID */
    222     Guid uuid(argv[0]);
    223     rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     220    Guid uuid(a->argv[0]);
     221    rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    224222    /* no? then it must be a filename */
    225223    if (!hardDisk)
    226224    {
    227         filepath = argv[0];
    228         CHECK_ERROR(virtualBox, FindHardDisk2(filepath, hardDisk.asOutParam()));
     225        filepath = a->argv[0];
     226        CHECK_ERROR(a->virtualBox, FindHardDisk2(filepath, hardDisk.asOutParam()));
    229227    }
    230228
    231229    /* let's find out which command */
    232     if (strcmp(argv[1], "settype") == 0)
     230    if (strcmp(a->argv[1], "settype") == 0)
    233231    {
    234232        /* hard disk must be registered */
     
    237235            char *type = NULL;
    238236
    239             if (argc <= 2)
     237            if (a->argc <= 2)
    240238                return errorArgument("Missing argument to for settype");
    241239
    242             type = argv[2];
     240            type = a->argv[2];
    243241
    244242            HardDiskType_T hddType;
     
    269267            return errorArgument("Hard disk image not registered");
    270268    }
    271     else if (strcmp(argv[1], "compact") == 0)
     269    else if (strcmp(a->argv[1], "compact") == 0)
    272270    {
    273271#if 1
     
    278276        if (!hardDisk)
    279277        {
    280             virtualBox->OpenHardDisk2(Bstr(argv[0]), hardDisk.asOutParam());
     278            a->virtualBox->OpenHardDisk2(Bstr(a->argv[0]), hardDisk.asOutParam());
    281279            if (!hardDisk)
    282280                return errorArgument("Hard disk image not found");
     
    306304    }
    307305    else
    308         return errorSyntax(USAGE_MODIFYHD, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
     306        return errorSyntax(USAGE_MODIFYHD, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
    309307
    310308    return SUCCEEDED(rc) ? 0 : 1;
    311309}
    312310
    313 int handleCloneHardDisk(int argc, char *argv[],
    314                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     311int handleCloneHardDisk(HandlerArg *a)
    315312{
    316313    Bstr src, dst;
     
    321318
    322319    /* Parse the arguments. */
    323     for (int i = 0; i < argc; i++)
    324     {
    325         if (strcmp(argv[i], "-format") == 0)
    326         {
    327             if (argc <= i + 1)
    328             {
    329                 return errorArgument("Missing argument to '%s'", argv[i]);
    330             }
    331             i++;
    332             format = argv[i];
    333         }
    334         else if (strcmp(argv[i], "-remember") == 0 ||
    335                  strcmp(argv[i], "-register") == 0 /* backward compatiblity */)
     320    for (int i = 0; i < a->argc; i++)
     321    {
     322        if (strcmp(a->argv[i], "-format") == 0)
     323        {
     324            if (a->argc <= i + 1)
     325            {
     326                return errorArgument("Missing argument to '%s'", a->argv[i]);
     327            }
     328            i++;
     329            format = a->argv[i];
     330        }
     331        else if (strcmp(a->argv[i], "-remember") == 0 ||
     332                 strcmp(a->argv[i], "-register") == 0 /* backward compatiblity */)
    336333        {
    337334            remember = true;
     
    339336        else if (src.isEmpty())
    340337        {
    341             src = argv[i];
     338            src = a->argv[i];
    342339        }
    343340        else if (dst.isEmpty())
    344341        {
    345             dst = argv[i];
     342            dst = a->argv[i];
    346343        }
    347344        else
    348345        {
    349             return errorSyntax(USAGE_CLONEHD, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     346            return errorSyntax(USAGE_CLONEHD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    350347        }
    351348    }
     
    362359    /* first guess is that it's a UUID */
    363360    Guid uuid(Utf8Str(src).raw());
    364     rc = virtualBox->GetHardDisk2(uuid, srcDisk.asOutParam());
     361    rc = a->virtualBox->GetHardDisk2(uuid, srcDisk.asOutParam());
    365362    /* no? then it must be a filename */
    366363    if (FAILED (rc))
    367364    {
    368         rc = virtualBox->FindHardDisk2(src, srcDisk.asOutParam());
     365        rc = a->virtualBox->FindHardDisk2(src, srcDisk.asOutParam());
    369366        /* no? well, then it's an unkwnown image */
    370367        if (FAILED (rc))
    371368        {
    372             CHECK_ERROR(virtualBox, OpenHardDisk2(src, srcDisk.asOutParam()));
     369            CHECK_ERROR(a->virtualBox, OpenHardDisk2(src, srcDisk.asOutParam()));
    373370            if (SUCCEEDED (rc))
    374371            {
     
    389386        }
    390387
    391         CHECK_ERROR_BREAK(virtualBox, CreateHardDisk2(format, dst, dstDisk.asOutParam()));
     388        CHECK_ERROR_BREAK(a->virtualBox, CreateHardDisk2(format, dst, dstDisk.asOutParam()));
    392389
    393390        ComPtr<IProgress> progress;
     
    591588}
    592589
    593 int handleAddiSCSIDisk(int argc, char *argv[],
    594                        ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     590int handleAddiSCSIDisk(HandlerArg *a)
    595591{
    596592    HRESULT rc;
     
    605601
    606602    /* at least server and target */
    607     if (argc < 4)
     603    if (a->argc < 4)
    608604        return errorSyntax(USAGE_ADDISCSIDISK, "Not enough parameters");
    609605
    610606    /* let's have a closer look at the arguments */
    611     for (int i = 0; i < argc; i++)
    612     {
    613         if (strcmp(argv[i], "-server") == 0)
    614         {
    615             if (argc <= i + 1)
    616                 return errorArgument("Missing argument to '%s'", argv[i]);
    617             i++;
    618             server = argv[i];
    619         }
    620         else if (strcmp(argv[i], "-target") == 0)
    621         {
    622             if (argc <= i + 1)
    623                 return errorArgument("Missing argument to '%s'", argv[i]);
    624             i++;
    625             target = argv[i];
    626         }
    627         else if (strcmp(argv[i], "-port") == 0)
    628         {
    629             if (argc <= i + 1)
    630                 return errorArgument("Missing argument to '%s'", argv[i]);
    631             i++;
    632             port = argv[i];
    633         }
    634         else if (strcmp(argv[i], "-lun") == 0)
    635         {
    636             if (argc <= i + 1)
    637                 return errorArgument("Missing argument to '%s'", argv[i]);
    638             i++;
    639             lun = argv[i];
    640         }
    641         else if (strcmp(argv[i], "-encodedlun") == 0)
    642         {
    643             if (argc <= i + 1)
    644                 return errorArgument("Missing argument to '%s'", argv[i]);
    645             i++;
    646             lun = BstrFmt("enc%s", argv[i]);
    647         }
    648         else if (strcmp(argv[i], "-username") == 0)
    649         {
    650             if (argc <= i + 1)
    651                 return errorArgument("Missing argument to '%s'", argv[i]);
    652             i++;
    653             username = argv[i];
    654         }
    655         else if (strcmp(argv[i], "-password") == 0)
    656         {
    657             if (argc <= i + 1)
    658                 return errorArgument("Missing argument to '%s'", argv[i]);
    659             i++;
    660             password = argv[i];
    661         }
    662         else if (strcmp(argv[i], "-comment") == 0)
    663         {
    664             if (argc <= i + 1)
    665                 return errorArgument("Missing argument to '%s'", argv[i]);
    666             i++;
    667             comment = argv[i];
    668         }
    669         else if (strcmp(argv[i], "-intnet") == 0)
     607    for (int i = 0; i < a->argc; i++)
     608    {
     609        if (strcmp(a->argv[i], "-server") == 0)
     610        {
     611            if (a->argc <= i + 1)
     612                return errorArgument("Missing argument to '%s'", a->argv[i]);
     613            i++;
     614            server = a->argv[i];
     615        }
     616        else if (strcmp(a->argv[i], "-target") == 0)
     617        {
     618            if (a->argc <= i + 1)
     619                return errorArgument("Missing argument to '%s'", a->argv[i]);
     620            i++;
     621            target = a->argv[i];
     622        }
     623        else if (strcmp(a->argv[i], "-port") == 0)
     624        {
     625            if (a->argc <= i + 1)
     626                return errorArgument("Missing argument to '%s'", a->argv[i]);
     627            i++;
     628            port = a->argv[i];
     629        }
     630        else if (strcmp(a->argv[i], "-lun") == 0)
     631        {
     632            if (a->argc <= i + 1)
     633                return errorArgument("Missing argument to '%s'", a->argv[i]);
     634            i++;
     635            lun = a->argv[i];
     636        }
     637        else if (strcmp(a->argv[i], "-encodedlun") == 0)
     638        {
     639            if (a->argc <= i + 1)
     640                return errorArgument("Missing argument to '%s'", a->argv[i]);
     641            i++;
     642            lun = BstrFmt("enc%s", a->argv[i]);
     643        }
     644        else if (strcmp(a->argv[i], "-username") == 0)
     645        {
     646            if (a->argc <= i + 1)
     647                return errorArgument("Missing argument to '%s'", a->argv[i]);
     648            i++;
     649            username = a->argv[i];
     650        }
     651        else if (strcmp(a->argv[i], "-password") == 0)
     652        {
     653            if (a->argc <= i + 1)
     654                return errorArgument("Missing argument to '%s'", a->argv[i]);
     655            i++;
     656            password = a->argv[i];
     657        }
     658        else if (strcmp(a->argv[i], "-comment") == 0)
     659        {
     660            if (a->argc <= i + 1)
     661                return errorArgument("Missing argument to '%s'", a->argv[i]);
     662            i++;
     663            comment = a->argv[i];
     664        }
     665        else if (strcmp(a->argv[i], "-intnet") == 0)
    670666        {
    671667            i++;
     
    673669        }
    674670        else
    675             return errorSyntax(USAGE_ADDISCSIDISK, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
     671            return errorSyntax(USAGE_ADDISCSIDISK, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
    676672    }
    677673
     
    683679    {
    684680        ComPtr<IHardDisk2> hardDisk;
    685         CHECK_ERROR_BREAK (aVirtualBox,
     681        CHECK_ERROR_BREAK (a->virtualBox,
    686682            CreateHardDisk2(Bstr ("iSCSI"),
    687683                            BstrFmt ("%ls/%ls", server.raw(), target.raw()),
     
    745741
    746742
    747 int handleShowHardDiskInfo(int argc, char *argv[],
    748                            ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     743int handleShowHardDiskInfo(HandlerArg *a)
    749744{
    750745    HRESULT rc;
    751746
    752     if (argc != 1)
     747    if (a->argc != 1)
    753748        return errorSyntax(USAGE_SHOWHDINFO, "Incorrect number of parameters");
    754749
     
    759754
    760755    /* first guess is that it's a UUID */
    761     Guid uuid(argv[0]);
    762     rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     756    Guid uuid(a->argv[0]);
     757    rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    763758    /* no? then it must be a filename */
    764759    if (FAILED (rc))
    765760    {
    766         filepath = argv[0];
    767         rc = virtualBox->FindHardDisk2(filepath, hardDisk.asOutParam());
     761        filepath = a->argv[0];
     762        rc = a->virtualBox->FindHardDisk2(filepath, hardDisk.asOutParam());
    768763        /* no? well, then it's an unkwnown image */
    769764        if (FAILED (rc))
    770765        {
    771             CHECK_ERROR(virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
     766            CHECK_ERROR(a->virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
    772767            if (SUCCEEDED (rc))
    773768            {
     
    840835            {
    841836                ComPtr<IMachine> machine;
    842                 CHECK_ERROR(virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
     837                CHECK_ERROR(a->virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
    843838                ASSERT(machine);
    844839                Bstr name;
     
    869864}
    870865
    871 int handleOpenMedium(int argc, char *argv[],
    872                      ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     866int handleOpenMedium(HandlerArg *a)
    873867{
    874868    HRESULT rc;
    875869
    876     if (argc < 2)
     870    if (a->argc < 2)
    877871        return errorSyntax(USAGE_REGISTERIMAGE, "Not enough parameters");
    878872
    879     Bstr filepath(argv[1]);
    880 
    881     if (strcmp(argv[0], "disk") == 0)
     873    Bstr filepath(a->argv[1]);
     874
     875    if (strcmp(a->argv[0], "disk") == 0)
    882876    {
    883877        const char *type = NULL;
    884878        /* there can be a type parameter */
    885         if ((argc > 2) && (argc != 4))
     879        if ((a->argc > 2) && (a->argc != 4))
    886880            return errorSyntax(USAGE_REGISTERIMAGE, "Incorrect number of parameters");
    887         if (argc == 4)
    888         {
    889             if (strcmp(argv[2], "-type") != 0)
    890                 return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(argv[2]).raw());
    891             if (   (strcmp(argv[3], "normal") != 0)
    892                 && (strcmp(argv[3], "immutable") != 0)
    893                 && (strcmp(argv[3], "writethrough") != 0))
    894                 return errorArgument("Invalid hard disk type '%s' specified", Utf8Str(argv[3]).raw());
    895             type = argv[3];
     881        if (a->argc == 4)
     882        {
     883            if (strcmp(a->argv[2], "-type") != 0)
     884                return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(a->argv[2]).raw());
     885            if (   (strcmp(a->argv[3], "normal") != 0)
     886                && (strcmp(a->argv[3], "immutable") != 0)
     887                && (strcmp(a->argv[3], "writethrough") != 0))
     888                return errorArgument("Invalid hard disk type '%s' specified", Utf8Str(a->argv[3]).raw());
     889            type = a->argv[3];
    896890        }
    897891
    898892        ComPtr<IHardDisk2> hardDisk;
    899         CHECK_ERROR(virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
     893        CHECK_ERROR(a->virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
    900894        if (SUCCEEDED(rc) && hardDisk)
    901895        {
     
    912906        }
    913907    }
    914     else if (strcmp(argv[0], "dvd") == 0)
     908    else if (strcmp(a->argv[0], "dvd") == 0)
    915909    {
    916910        ComPtr<IDVDImage2> dvdImage;
    917         CHECK_ERROR(virtualBox, OpenDVDImage(filepath, Guid(), dvdImage.asOutParam()));
    918     }
    919     else if (strcmp(argv[0], "floppy") == 0)
     911        CHECK_ERROR(a->virtualBox, OpenDVDImage(filepath, Guid(), dvdImage.asOutParam()));
     912    }
     913    else if (strcmp(a->argv[0], "floppy") == 0)
    920914    {
    921915        ComPtr<IFloppyImage2> floppyImage;
    922         CHECK_ERROR(virtualBox, OpenFloppyImage(filepath, Guid(), floppyImage.asOutParam()));
     916        CHECK_ERROR(a->virtualBox, OpenFloppyImage(filepath, Guid(), floppyImage.asOutParam()));
    923917    }
    924918    else
    925         return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
     919        return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
    926920
    927921    return SUCCEEDED(rc) ? 0 : 1;
    928922}
    929923
    930 int handleCloseMedium(int argc, char *argv[],
    931                       ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     924int handleCloseMedium(HandlerArg *a)
    932925{
    933926    HRESULT rc;
    934927
    935     if (argc != 2)
     928    if (a->argc != 2)
    936929        return errorSyntax(USAGE_UNREGISTERIMAGE, "Incorrect number of parameters");
    937930
    938931    /* first guess is that it's a UUID */
    939     Guid uuid(argv[1]);
    940 
    941     if (strcmp(argv[0], "disk") == 0)
     932    Guid uuid(a->argv[1]);
     933
     934    if (strcmp(a->argv[0], "disk") == 0)
    942935    {
    943936        ComPtr<IHardDisk2> hardDisk;
    944         rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     937        rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
    945938        /* not a UUID or not registered? Then it must be a filename */
    946939        if (!hardDisk)
    947940        {
    948             CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(argv[1]), hardDisk.asOutParam()));
     941            CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(a->argv[1]), hardDisk.asOutParam()));
    949942        }
    950943        if (SUCCEEDED(rc) && hardDisk)
     
    954947    }
    955948    else
    956     if (strcmp(argv[0], "dvd") == 0)
     949    if (strcmp(a->argv[0], "dvd") == 0)
    957950    {
    958951        ComPtr<IDVDImage2> dvdImage;
    959         rc = virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
     952        rc = a->virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
    960953        /* not a UUID or not registered? Then it must be a filename */
    961954        if (!dvdImage)
    962955        {
    963             CHECK_ERROR(virtualBox, FindDVDImage(Bstr(argv[1]), dvdImage.asOutParam()));
     956            CHECK_ERROR(a->virtualBox, FindDVDImage(Bstr(a->argv[1]), dvdImage.asOutParam()));
    964957        }
    965958        if (SUCCEEDED(rc) && dvdImage)
     
    969962    }
    970963    else
    971     if (strcmp(argv[0], "floppy") == 0)
     964    if (strcmp(a->argv[0], "floppy") == 0)
    972965    {
    973966        ComPtr<IFloppyImage2> floppyImage;
    974         rc = virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
     967        rc = a->virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
    975968        /* not a UUID or not registered? Then it must be a filename */
    976969        if (!floppyImage)
    977970        {
    978             CHECK_ERROR(virtualBox, FindFloppyImage(Bstr(argv[1]), floppyImage.asOutParam()));
     971            CHECK_ERROR(a->virtualBox, FindFloppyImage(Bstr(a->argv[1]), floppyImage.asOutParam()));
    979972        }
    980973        if (SUCCEEDED(rc) && floppyImage)
     
    984977    }
    985978    else
    986         return errorSyntax(USAGE_UNREGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
     979        return errorSyntax(USAGE_UNREGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
    987980
    988981    return SUCCEEDED(rc) ? 0 : 1;
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp

    r15994 r16052  
    214214}
    215215
    216 static int handleGetGuestProperty(int argc, char *argv[],
    217                                   ComPtr<IVirtualBox> aVirtualBox,
    218                                   ComPtr<ISession> aSession)
     216static int handleGetGuestProperty(HandlerArg *a)
    219217{
    220218    HRESULT rc = S_OK;
    221219
    222220    bool verbose = false;
    223     if ((3 == argc) && (0 == strcmp(argv[2], "-verbose")))
     221    if ((3 == a->argc) && (0 == strcmp(a->argv[2], "-verbose")))
    224222        verbose = true;
    225     else if (argc != 2)
     223    else if (a->argc != 2)
    226224        return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
    227225
    228226    ComPtr<IMachine> machine;
    229227    /* assume it's a UUID */
    230     rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     228    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    231229    if (FAILED(rc) || !machine)
    232230    {
    233231        /* must be a name */
    234         CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     232        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    235233    }
    236234    if (machine)
     
    240238
    241239        /* open a session for the VM - new or existing */
    242         if (FAILED (aVirtualBox->OpenSession(aSession, uuid)))
    243             CHECK_ERROR_RET (aVirtualBox, OpenExistingSession(aSession, uuid), 1);
     240        if (FAILED (a->virtualBox->OpenSession(a->session, uuid)))
     241            CHECK_ERROR_RET (a->virtualBox, OpenExistingSession(a->session, uuid), 1);
    244242
    245243        /* get the mutable session machine */
    246         aSession->COMGETTER(Machine)(machine.asOutParam());
     244        a->session->COMGETTER(Machine)(machine.asOutParam());
    247245
    248246        Bstr value;
    249247        uint64_t u64Timestamp;
    250248        Bstr flags;
    251         CHECK_ERROR(machine, GetGuestProperty(Bstr(argv[1]), value.asOutParam(),
     249        CHECK_ERROR(machine, GetGuestProperty(Bstr(a->argv[1]), value.asOutParam(),
    252250                    &u64Timestamp, flags.asOutParam()));
    253251        if (!value)
     
    264262}
    265263
    266 static int handleSetGuestProperty(int argc, char *argv[],
    267                                   ComPtr<IVirtualBox> aVirtualBox,
    268                                   ComPtr<ISession> aSession)
     264static int handleSetGuestProperty(HandlerArg *a)
    269265{
    270266    HRESULT rc = S_OK;
     
    278274    const char *pszValue = NULL;
    279275    const char *pszFlags = NULL;
    280     if (3 == argc)
    281     {
    282         pszValue = argv[2];
    283     }
    284     else if (4 == argc)
     276    if (3 == a->argc)
     277    {
     278        pszValue = a->argv[2];
     279    }
     280    else if (4 == a->argc)
    285281        usageOK = false;
    286     else if (5 == argc)
    287     {
    288         pszValue = argv[2];
    289         if (strcmp(argv[3], "-flags") != 0)
     282    else if (5 == a->argc)
     283    {
     284        pszValue = a->argv[2];
     285        if (strcmp(a->argv[3], "-flags") != 0)
    290286            usageOK = false;
    291         pszFlags = argv[4];
    292     }
    293     else if (argc != 2)
     287        pszFlags = a->argv[4];
     288    }
     289    else if (a->argc != 2)
    294290        usageOK = false;
    295291    if (!usageOK)
    296292        return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
    297293    /* This is always needed. */
    298     pszName = argv[1];
     294    pszName = a->argv[1];
    299295
    300296    ComPtr<IMachine> machine;
    301297    /* assume it's a UUID */
    302     rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     298    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    303299    if (FAILED(rc) || !machine)
    304300    {
    305301        /* must be a name */
    306         CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     302        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    307303    }
    308304    if (machine)
     
    312308
    313309        /* open a session for the VM - new or existing */
    314         if (FAILED (aVirtualBox->OpenSession(aSession, uuid)))
    315             CHECK_ERROR_RET (aVirtualBox, OpenExistingSession(aSession, uuid), 1);
     310        if (FAILED (a->virtualBox->OpenSession(a->session, uuid)))
     311            CHECK_ERROR_RET (a->virtualBox, OpenExistingSession(a->session, uuid), 1);
    316312
    317313        /* get the mutable session machine */
    318         aSession->COMGETTER(Machine)(machine.asOutParam());
     314        a->session->COMGETTER(Machine)(machine.asOutParam());
    319315
    320316        if ((NULL == pszValue) && (NULL == pszFlags))
     
    328324            CHECK_ERROR(machine, SaveSettings());
    329325
    330         aSession->Close();
     326        a->session->Close();
    331327    }
    332328    return SUCCEEDED(rc) ? 0 : 1;
     
    339335 * @note see the command line API description for parameters
    340336 */
    341 static int handleEnumGuestProperty(int argc, char *argv[],
    342                                    ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     337static int handleEnumGuestProperty(HandlerArg *a)
    343338{
    344339/*
     
    346341 * arguments.
    347342 */
    348     if ((argc < 1) || (2 == argc) ||
    349         ((argc > 3) && strcmp(argv[1], "-patterns") != 0))
     343    if ((a->argc < 1) || (2 == a->argc) ||
     344        ((a->argc > 3) && strcmp(a->argv[1], "-patterns") != 0))
    350345        return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
    351346
     
    353348 * Pack the patterns
    354349 */
    355     Utf8Str Utf8Patterns(argc > 2 ? argv[2] : "*");
    356     for (ssize_t i = 3; i < argc; ++i)
    357         Utf8Patterns = Utf8StrFmt ("%s,%s", Utf8Patterns.raw(), argv[i]);
     350    Utf8Str Utf8Patterns(a->argc > 2 ? a->argv[2] : "*");
     351    for (ssize_t i = 3; i < a->argc; ++i)
     352        Utf8Patterns = Utf8StrFmt ("%s,%s", Utf8Patterns.raw(), a->argv[i]);
    358353
    359354/*
     
    362357    ComPtr<IMachine> machine;
    363358    /* assume it's a UUID */
    364     HRESULT rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     359    HRESULT rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    365360    if (FAILED(rc) || !machine)
    366361    {
    367362        /* must be a name */
    368         CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     363        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    369364    }
    370365    if (machine)
     
    374369
    375370        /* open a session for the VM - new or existing */
    376         if (FAILED (aVirtualBox->OpenSession(aSession, uuid)))
    377             CHECK_ERROR_RET (aVirtualBox, OpenExistingSession(aSession, uuid), 1);
     371        if (FAILED (a->virtualBox->OpenSession(a->session, uuid)))
     372            CHECK_ERROR_RET (a->virtualBox, OpenExistingSession(a->session, uuid), 1);
    378373
    379374        /* get the mutable session machine */
    380         aSession->COMGETTER(Machine)(machine.asOutParam());
     375        a->session->COMGETTER(Machine)(machine.asOutParam());
    381376
    382377        com::SafeArray <BSTR> names;
     
    407402 * @note see the command line API description for parameters
    408403 */
    409 static int handleWaitGuestProperty(int argc, char *argv[],
    410                                    ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     404static int handleWaitGuestProperty(HandlerArg *a)
    411405{
    412406
     
    417411    uint32_t u32Timeout = RT_INDEFINITE_WAIT;
    418412    bool usageOK = true;
    419     if (argc < 2)
     413    if (a->argc < 2)
    420414        usageOK = false;
    421415    else
    422         pszPatterns = argv[1];
     416        pszPatterns = a->argv[1];
    423417    ComPtr<IMachine> machine;
    424418    /* assume it's a UUID */
    425     HRESULT rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
     419    HRESULT rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
    426420    if (FAILED(rc) || !machine)
    427421    {
    428422        /* must be a name */
    429         CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
     423        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
    430424    }
    431425    if (!machine)
    432426        usageOK = false;
    433     for (int i = 2; usageOK && i < argc; ++i)
    434     {
    435         if (strcmp(argv[i], "-timeout") == 0)
    436         {
    437             if (   i + 1 >= argc
    438                 || RTStrToUInt32Full(argv[i + 1], 10, &u32Timeout)
     427    for (int i = 2; usageOK && i < a->argc; ++i)
     428    {
     429        if (strcmp(a->argv[i], "-timeout") == 0)
     430        {
     431            if (   i + 1 >= a->argc
     432                || RTStrToUInt32Full(a->argv[i + 1], 10, &u32Timeout)
    439433                       != VINF_SUCCESS
    440434               )
     
    456450    GuestPropertyCallback *callback = new GuestPropertyCallback(pszPatterns, uuid);
    457451    callback->AddRef();
    458     aVirtualBox->RegisterCallback (callback);
     452    a->virtualBox->RegisterCallback (callback);
    459453    bool stop = false;
    460454#ifdef USE_XPCOM_QUEUE
    461     int max_fd = g_pEventQ->GetEventQueueSelectFD();
     455    int max_fd = a->eventQ->GetEventQueueSelectFD();
    462456#endif
    463457    for (; !stop && u32Timeout > 0; u32Timeout -= RT_MIN(u32Timeout, 1000))
     
    483477            uint64_t u64NextTime = RTTimeSpecGetMilli(RTTimeNow(&TimeNow));
    484478            u32Timeout += (uint32_t)(u64Time + 1000 - u64NextTime);
    485             g_pEventQ->ProcessPendingEvents();
     479            a->eventQ->ProcessPendingEvents();
    486480            if (callback->Signalled())
    487481                stop = true;
     
    499493 * Clean up the callback.
    500494 */
    501     aVirtualBox->UnregisterCallback (callback);
     495    a->virtualBox->UnregisterCallback (callback);
    502496    if (!callback->Signalled())
    503497        RTPrintf("Time out or interruption while waiting for a notification.\n");
     
    516510 * @note see the command line API description for parameters
    517511 */
    518 int handleGuestProperty(int argc, char *argv[],
    519                         ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
    520 {
    521     if (0 == argc)
     512int handleGuestProperty(HandlerArg *a)
     513{
     514    HandlerArg arg = *a;
     515    arg.argc = a->argc - 1;
     516    arg.argv = a->argv + 1;
     517
     518    if (0 == a->argc)
    522519        return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
    523     if (0 == strcmp(argv[0], "get"))
    524         return handleGetGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
    525     else if (0 == strcmp(argv[0], "set"))
    526         return handleSetGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
    527     else if (0 == strcmp(argv[0], "enumerate"))
    528         return handleEnumGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
    529     else if (0 == strcmp(argv[0], "wait"))
    530         return handleWaitGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
     520    if (0 == strcmp(a->argv[0], "get"))
     521        return handleGetGuestProperty(&arg);
     522    else if (0 == strcmp(a->argv[0], "set"))
     523        return handleSetGuestProperty(&arg);
     524    else if (0 == strcmp(a->argv[0], "enumerate"))
     525        return handleEnumGuestProperty(&arg);
     526    else if (0 == strcmp(a->argv[0], "wait"))
     527        return handleWaitGuestProperty(&arg);
    531528    /* else */
    532529    return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r15918 r16052  
    18571857#endif
    18581858
    1859 int handleShowVMInfo(int argc, char *argv[],
    1860                      ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     1859int handleShowVMInfo(HandlerArg *a)
    18611860{
    18621861    HRESULT rc;
    18631862
    18641863    /* at least one option: the UUID or name of the VM */
    1865     if (argc < 1)
     1864    if (a->argc < 1)
    18661865        return errorSyntax(USAGE_SHOWVMINFO, "Incorrect number of parameters");
    18671866
    18681867    /* try to find the given machine */
    18691868    ComPtr <IMachine> machine;
    1870     Guid uuid (argv[0]);
     1869    Guid uuid (a->argv[0]);
    18711870    if (!uuid.isEmpty())
    18721871    {
    1873         CHECK_ERROR (virtualBox, GetMachine (uuid, machine.asOutParam()));
    1874     }
    1875     else
    1876     {
    1877         CHECK_ERROR (virtualBox, FindMachine (Bstr(argv[0]), machine.asOutParam()));
     1872        CHECK_ERROR (a->virtualBox, GetMachine (uuid, machine.asOutParam()));
     1873    }
     1874    else
     1875    {
     1876        CHECK_ERROR (a->virtualBox, FindMachine (Bstr(a->argv[0]), machine.asOutParam()));
    18781877        if (SUCCEEDED (rc))
    18791878            machine->COMGETTER(Id) (uuid.asOutParam());
     
    18871886    bool fStatistics = false;
    18881887    bool fMachinereadable = false;
    1889     for (int i=1;i<argc;i++)
    1890     {
    1891         if (!strcmp(argv[i], "-details"))
     1888    for (int i=1;i<a->argc;i++)
     1889    {
     1890        if (!strcmp(a->argv[i], "-details"))
    18921891            fDetails = true;
    18931892        else
    1894         if (!strcmp(argv[i], "-statistics"))
     1893        if (!strcmp(a->argv[i], "-statistics"))
    18951894            fStatistics = true;
    1896         if (!strcmp(argv[1], "-machinereadable"))
     1895        if (!strcmp(a->argv[1], "-machinereadable"))
    18971896            fMachinereadable = true;
    18981897    }
     
    19121911
    19131912    /* open an existing session for the VM */
    1914     rc = virtualBox->OpenExistingSession (session, uuid);
     1913    rc = a->virtualBox->OpenExistingSession (a->session, uuid);
    19151914    if (SUCCEEDED(rc))
    19161915        /* get the session machine */
    1917         rc = session->COMGETTER(Machine)(machine.asOutParam());
     1916        rc = a->session->COMGETTER(Machine)(machine.asOutParam());
    19181917    if (SUCCEEDED(rc))
    19191918        /* get the session console */
    1920         rc = session->COMGETTER(Console)(console.asOutParam());
    1921 
    1922     rc = showVMInfo (virtualBox, machine, console, details);
     1919        rc = a->session->COMGETTER(Console)(console.asOutParam());
     1920
     1921    rc = showVMInfo (a->virtualBox, machine, console, details);
    19231922
    19241923    if (console)
    1925         session->Close();
     1924        a->session->Close();
    19261925
    19271926    return SUCCEEDED (rc) ? 0 : 1;
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp

    r15570 r16052  
    6464#endif
    6565
    66 int handleList(int argc, char *argv[],
    67                ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
     66int handleList(HandlerArg *a)
    6867{
    6968    HRESULT rc = S_OK;
    7069
    7170    /* exactly one option: the object */
    72     if (argc != 1)
     71    if (a->argc != 1)
    7372        return errorSyntax(USAGE_LIST, "Incorrect number of parameters");
    7473
    7574    /* which object? */
    76     if (strcmp(argv[0], "vms") == 0)
     75    if (strcmp(a->argv[0], "vms") == 0)
    7776    {
    7877        /*
     
    8079         */
    8180        com::SafeIfaceArray <IMachine> machines;
    82         rc = virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
     81        rc = a->virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
    8382        if (SUCCEEDED(rc))
    8483        {
     
    8988            {
    9089                if (machines [i])
    91                     rc = showVMInfo(virtualBox, machines [i]);
    92             }
    93         }
    94     }
    95     else
    96     if (strcmp(argv[0], "runningvms") == 0)
     90                    rc = showVMInfo(a->virtualBox, machines [i]);
     91            }
     92        }
     93    }
     94    else
     95    if (strcmp(a->argv[0], "runningvms") == 0)
    9796    {
    9897        /*
     
    10099         */
    101100        com::SafeIfaceArray <IMachine> machines;
    102         rc = virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
     101        rc = a->virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
    103102        if (SUCCEEDED(rc))
    104103        {
     
    132131    }
    133132    else
    134     if (strcmp(argv[0], "ostypes") == 0)
     133    if (strcmp(a->argv[0], "ostypes") == 0)
    135134    {
    136135        ComPtr<IGuestOSTypeCollection> coll;
    137136        ComPtr<IGuestOSTypeEnumerator> enumerator;
    138         CHECK_ERROR(virtualBox, COMGETTER(GuestOSTypes)(coll.asOutParam()));
     137        CHECK_ERROR(a->virtualBox, COMGETTER(GuestOSTypes)(coll.asOutParam()));
    139138        if (SUCCEEDED(rc) && coll)
    140139        {
     
    155154    }
    156155    else
    157     if (strcmp(argv[0], "hostdvds") == 0)
     156    if (strcmp(a->argv[0], "hostdvds") == 0)
    158157    {
    159158        ComPtr<IHost> host;
    160         CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     159        CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    161160        ComPtr<IHostDVDDriveCollection> coll;
    162161        ComPtr<IHostDVDDriveEnumerator> enumerator;
     
    177176    }
    178177    else
    179     if (strcmp(argv[0], "hostfloppies") == 0)
     178    if (strcmp(a->argv[0], "hostfloppies") == 0)
    180179    {
    181180        ComPtr<IHost> host;
    182         CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     181        CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    183182        ComPtr<IHostFloppyDriveCollection> coll;
    184183        ComPtr<IHostFloppyDriveEnumerator> enumerator;
     
    199198    }
    200199    else
    201     if (strcmp(argv[0], "hostifs") == 0)
     200    if (strcmp(a->argv[0], "hostifs") == 0)
    202201    {
    203202        ComPtr<IHost> host;
    204         CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
     203        CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
    205204        com::SafeIfaceArray <IHostNetworkInterface> hostNetworkInterfaces;
    206         CHECK_ERROR(host, 
     205        CHECK_ERROR(host,
    207206                    COMGETTER(NetworkInterfaces) (ComSafeArrayAsOutParam (hostNetworkInterfaces)));
    208207        for (size_t i = 0; i < hostNetworkInterfaces.size(); ++i)
     
    256255    }
    257256    else
    258     if (strcmp(argv[0], "hostinfo") == 0)
     257    if (strcmp(a->argv[0], "hostinfo") == 0)
    259258    {
    260259        ComPtr<IHost> Host;
    261         CHECK_ERROR (virtualBox, COMGETTER(Host)(Host.asOutParam()));
     260        CHECK_ERROR (a->virtualBox, COMGETTER(Host)(Host.asOutParam()));
    262261
    263262        RTPrintf("Host Information:\n\n");
     
    311310    }
    312311    else
    313     if (strcmp(argv[0], "hddbackends") == 0)
     312    if (strcmp(a->argv[0], "hddbackends") == 0)
    314313    {
    315314        ComPtr<ISystemProperties> systemProperties;
    316         CHECK_ERROR(virtualBox,
     315        CHECK_ERROR(a->virtualBox,
    317316                    COMGETTER(SystemProperties) (systemProperties.asOutParam()));
    318317        com::SafeIfaceArray <IHardDiskFormat> hardDiskFormats;
     
    387386    }
    388387    else
    389     if (strcmp(argv[0], "hdds") == 0)
     388    if (strcmp(a->argv[0], "hdds") == 0)
    390389    {
    391390        com::SafeIfaceArray <IHardDisk2> hdds;
    392         CHECK_ERROR(virtualBox, COMGETTER(HardDisks2)(ComSafeArrayAsOutParam (hdds)));
     391        CHECK_ERROR(a->virtualBox, COMGETTER(HardDisks2)(ComSafeArrayAsOutParam (hdds)));
    393392        for (size_t i = 0; i < hdds.size(); ++ i)
    394393        {
     
    413412            {
    414413                ComPtr<IMachine> machine;
    415                 CHECK_ERROR(virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
     414                CHECK_ERROR(a->virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
    416415                ASSERT(machine);
    417416                Bstr name;
     
    429428    }
    430429    else
    431     if (strcmp(argv[0], "dvds") == 0)
     430    if (strcmp(a->argv[0], "dvds") == 0)
    432431    {
    433432        com::SafeIfaceArray<IDVDImage2> dvds;
    434         CHECK_ERROR(virtualBox, COMGETTER(DVDImages)(ComSafeArrayAsOutParam(dvds)));
     433        CHECK_ERROR(a->virtualBox, COMGETTER(DVDImages)(ComSafeArrayAsOutParam(dvds)));
    435434        for (size_t i = 0; i < dvds.size(); ++ i)
    436435        {
     
    450449    }
    451450    else
    452     if (strcmp(argv[0], "floppies") == 0)
     451    if (strcmp(a->argv[0], "floppies") == 0)
    453452    {
    454453        com::SafeIfaceArray<IFloppyImage2> floppies;
    455         CHECK_ERROR(virtualBox, COMGETTER(FloppyImages)(ComSafeArrayAsOutParam(floppies)));
     454        CHECK_ERROR(a->virtualBox, COMGETTER(FloppyImages)(ComSafeArrayAsOutParam(floppies)));
    456455        for (size_t i = 0; i < floppies.size(); ++ i)
    457456        {
     
    471470    }
    472471    else
    473     if (strcmp(argv[0], "usbhost") == 0)
     472    if (strcmp(a->argv[0], "usbhost") == 0)
    474473    {
    475474        ComPtr<IHost> Host;
    476         CHECK_ERROR_RET (virtualBox, COMGETTER(Host)(Host.asOutParam()), 1);
     475        CHECK_ERROR_RET (a->virtualBox, COMGETTER(Host)(Host.asOutParam()), 1);
    477476
    478477        ComPtr<IHostUSBDeviceCollection> CollPtr;
     
    562561    }
    563562    else
    564     if (strcmp(argv[0], "usbfilters") == 0)
     563    if (strcmp(a->argv[0], "usbfilters") == 0)
    565564    {
    566565        RTPrintf("Global USB Device Filters:\n\n");
    567566
    568567        ComPtr <IHost> host;
    569         CHECK_ERROR_RET (virtualBox, COMGETTER(Host) (host.asOutParam()), 1);
     568        CHECK_ERROR_RET (a->virtualBox, COMGETTER(Host) (host.asOutParam()), 1);
    570569
    571570        ComPtr<IHostUSBDeviceFilterCollection> coll;
     
    637636        }
    638637    }
    639     else if (strcmp(argv[0], "systemproperties") == 0)
     638    else if (strcmp(a->argv[0], "systemproperties") == 0)
    640639    {
    641640        ComPtr<ISystemProperties> systemProperties;
    642         virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
     641        a->virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
    643642
    644643        Bstr str;
     
    670669    }
    671670    else
    672         return errorSyntax(USAGE_LIST, "Invalid parameter '%s'", Utf8Str(argv[0]).raw());
     671        return errorSyntax(USAGE_LIST, "Invalid parameter '%s'", Utf8Str(a->argv[0]).raw());
    673672
    674673    return SUCCEEDED(rc) ? 0 : 1;
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageMetrics.cpp

    r14740 r16052  
    523523}
    524524
    525 int handleMetrics(int argc, char *argv[],
    526                   ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
     525int handleMetrics(HandlerArg *a)
    527526{
    528527    int rc;
    529528
    530529    /* at least one option: subcommand name */
    531     if (argc < 1)
     530    if (a->argc < 1)
    532531        return errorSyntax(USAGE_METRICS, "Subcommand missing");
    533532
    534533    ComPtr<IPerformanceCollector> performanceCollector;
    535     CHECK_ERROR(aVirtualBox, COMGETTER(PerformanceCollector)(performanceCollector.asOutParam()));
    536 
    537     if (!strcmp(argv[0], "list"))
    538         rc = handleMetricsList(argc, argv, aVirtualBox, performanceCollector);
    539     else if (!strcmp(argv[0], "setup"))
    540         rc = handleMetricsSetup(argc, argv, aVirtualBox, performanceCollector);
    541     else if (!strcmp(argv[0], "query"))
    542         rc = handleMetricsQuery(argc, argv, aVirtualBox, performanceCollector);
    543     else if (!strcmp(argv[0], "collect"))
    544         rc = handleMetricsCollect(argc, argv, aVirtualBox, performanceCollector);
     534    CHECK_ERROR(a->virtualBox, COMGETTER(PerformanceCollector)(performanceCollector.asOutParam()));
     535
     536    if (!strcmp(a->argv[0], "list"))
     537        rc = handleMetricsList(a->argc, a->argv, a->virtualBox, performanceCollector);
     538    else if (!strcmp(a->argv[0], "setup"))
     539        rc = handleMetricsSetup(a->argc, a->argv, a->virtualBox, performanceCollector);
     540    else if (!strcmp(a->argv[0], "query"))
     541        rc = handleMetricsQuery(a->argc, a->argv, a->virtualBox, performanceCollector);
     542    else if (!strcmp(a->argv[0], "collect"))
     543        rc = handleMetricsCollect(a->argc, a->argv, a->virtualBox, performanceCollector);
    545544    else
    546         return errorSyntax(USAGE_METRICS, "Invalid subcommand '%s'", argv[0]);
     545        return errorSyntax(USAGE_METRICS, "Invalid subcommand '%s'", a->argv[0]);
    547546
    548547    return rc;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette