/** * List the registered VMs. * * @param argv0 executable name * @param virtualBox ptr to IVirtualBox object * @param session ptr to ISession object */ static void listVMs(const char *argv0, IVirtualBox *virtualBox, ISession *session) { HRESULT rc; SAFEARRAY *machinesSA = g_pVBoxFuncs->pfnSafeArrayOutParamAlloc(); IMachine **machines = NULL; ULONG machineCnt = 0; ULONG i; unsigned start_id; /* * Get the list of all registered VMs. */ rc = IVirtualBox_get_Machines(virtualBox, ComSafeArrayAsOutIfaceParam(machinesSA, IMachine *)); if (FAILED(rc)) { PrintErrorInfo(argv0, "could not get list of machines", rc); return; } /* * Extract interface pointers from machinesSA, and update the reference * counter of each object, as destroying machinesSA would call Release. */ g_pVBoxFuncs->pfnSafeArrayCopyOutIfaceParamHelper((IUnknown ***)&machines, &machineCnt, machinesSA); g_pVBoxFuncs->pfnSafeArrayDestroy(machinesSA); if (!machineCnt) { g_pVBoxFuncs->pfnArrayOutFree(machines); printf("\tNo VMs\n"); return; } printf("VM List:\n\n"); /* * Iterate through the collection. */ for (i = 0; i < machineCnt; ++i) { IMachine *machine = machines[i]; BOOL isAccessible = FALSE; printf("\tMachine #%u\n", (unsigned)i); if (!machine) { printf("\t(skipped, NULL)\n"); continue; } IMachine_get_Accessible(machine, &isAccessible); if (isAccessible) { BSTR machineNameUtf16; char *machineName; IMachine_get_Name(machine, &machineNameUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(machineNameUtf16,&machineName); g_pVBoxFuncs->pfnComUnallocString(machineNameUtf16); printf("\tName: %s\n", machineName); g_pVBoxFuncs->pfnUtf8Free(machineName); } else printf("\tName: <inaccessible>\n"); { BSTR uuidUtf16; char *uuidUtf8; IMachine_get_Id(machine, &uuidUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(uuidUtf16, &uuidUtf8); g_pVBoxFuncs->pfnComUnallocString(uuidUtf16); printf("\tUUID: %s\n", uuidUtf8); g_pVBoxFuncs->pfnUtf8Free(uuidUtf8); } if (isAccessible) { { BSTR configFileUtf16; char *configFileUtf8; IMachine_get_SettingsFilePath(machine, &configFileUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(configFileUtf16, &configFileUtf8); g_pVBoxFuncs->pfnComUnallocString(configFileUtf16); printf("\tConfig file: %s\n", configFileUtf8); g_pVBoxFuncs->pfnUtf8Free(configFileUtf8); } { ULONG memorySize; IMachine_get_MemorySize(machine, &memorySize); printf("\tMemory size: %uMB\n", memorySize); } { BSTR typeId; BSTR osNameUtf16; char *osName; IGuestOSType *osType = NULL; IMachine_get_OSTypeId(machine, &typeId); IVirtualBox_GetGuestOSType(virtualBox, typeId, &osType); g_pVBoxFuncs->pfnComUnallocString(typeId); IGuestOSType_get_Description(osType, &osNameUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(osNameUtf16,&osName); g_pVBoxFuncs->pfnComUnallocString(osNameUtf16); printf("\tGuest OS: %s\n\n", osName); g_pVBoxFuncs->pfnUtf8Free(osName); IGuestOSType_Release(osType); } } } /* * Let the user chose a machine to start. */ printf("Type Machine# to start (0 - %u) or 'quit' to do nothing: ", (unsigned)(machineCnt - 1)); fflush(stdout); if (scanf("%u", &start_id) == 1 && start_id < machineCnt) { IMachine *machine = machines[start_id]; if (machine) { BSTR uuidUtf16 = NULL; IMachine_get_Id(machine, &uuidUtf16); startVM(argv0, virtualBox, session, uuidUtf16); g_pVBoxFuncs->pfnComUnallocString(uuidUtf16); } } /* * Don't forget to release the objects in the array. */ for (i = 0; i < machineCnt; ++i) { IMachine *machine = machines[i]; if (machine) IMachine_Release(machine); } g_pVBoxFuncs->pfnArrayOutFree(machines); }
void initVM() { if (getvmonoff() == 255) setvmonoff(0); startVM(getvmonoff()); }
/** * List the registered VMs. * * @param virtualBox ptr to IVirtualBox object * @param session ptr to ISession object */ static void listVMs(IVirtualBox *virtualBox, ISession *session) { nsresult rc; IMachine **machines = NULL; PRUint32 machineCnt = 0; PRUint32 i; unsigned start_id; /* * Get the list of all registered VMs. */ rc = virtualBox->vtbl->GetMachines(virtualBox, &machineCnt, &machines); if (NS_FAILED(rc)) { fprintf(stderr, "could not get list of machines, rc=%08x\n", (unsigned)rc); return; } if (machineCnt == 0) { printf("\tNo VMs\n"); return; } printf("VM List:\n\n"); /* * Iterate through the collection. */ for (i = 0; i < machineCnt; ++i) { IMachine *machine = machines[i]; PRBool isAccessible = PR_FALSE; printf("\tMachine #%u\n", (unsigned)i); if (!machine) { printf("\t(skipped, NULL)\n"); continue; } machine->vtbl->GetAccessible(machine, &isAccessible); if (isAccessible) { PRUnichar *machineNameUtf16; char *machineName; machine->vtbl->GetName(machine, &machineNameUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(machineNameUtf16,&machineName); printf("\tName: %s\n", machineName); g_pVBoxFuncs->pfnUtf8Free(machineName); g_pVBoxFuncs->pfnComUnallocMem(machineNameUtf16); } else { printf("\tName: <inaccessible>\n"); } { PRUnichar *uuidUtf16 = NULL; char *uuidUtf8 = NULL; machine->vtbl->GetId(machine, &uuidUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(uuidUtf16, &uuidUtf8); printf("\tUUID: %s\n", uuidUtf8); g_pVBoxFuncs->pfnUtf8Free(uuidUtf8); g_pVBoxFuncs->pfnUtf16Free(uuidUtf16); } if (isAccessible) { { PRUnichar *configFile; char *configFile1 = calloc((size_t)64, (size_t)1); machine->vtbl->GetSettingsFilePath(machine, &configFile); g_pVBoxFuncs->pfnUtf16ToUtf8(configFile, &configFile1); printf("\tConfig file: %s\n", configFile1); free(configFile1); g_pVBoxFuncs->pfnComUnallocMem(configFile); } { PRUint32 memorySize; machine->vtbl->GetMemorySize(machine, &memorySize); printf("\tMemory size: %uMB\n", memorySize); } { PRUnichar *typeId; PRUnichar *osNameUtf16; char *osName; IGuestOSType *osType = NULL; machine->vtbl->GetOSTypeId(machine, &typeId); virtualBox->vtbl->GetGuestOSType(virtualBox, typeId, &osType); osType->vtbl->GetDescription(osType, &osNameUtf16); g_pVBoxFuncs->pfnUtf16ToUtf8(osNameUtf16,&osName); printf("\tGuest OS: %s\n\n", osName); osType->vtbl->nsisupports.Release((void *)osType); g_pVBoxFuncs->pfnUtf8Free(osName); g_pVBoxFuncs->pfnComUnallocMem(osNameUtf16); g_pVBoxFuncs->pfnComUnallocMem(typeId); } } } /* * Let the user chose a machine to start. */ printf("Type Machine# to start (0 - %u) or 'quit' to do nothing: ", (unsigned)(machineCnt - 1)); fflush(stdout); if (scanf("%u", &start_id) == 1 && start_id < machineCnt) { IMachine *machine = machines[start_id]; if (machine) { PRUnichar *uuidUtf16 = NULL; machine->vtbl->GetId(machine, &uuidUtf16); startVM(virtualBox, session, uuidUtf16); g_pVBoxFuncs->pfnUtf16Free(uuidUtf16); } } /* * Don't forget to release the objects in the array. */ for (i = 0; i < machineCnt; ++i) { IMachine *machine = machines[i]; if (machine) { machine->vtbl->nsisupports.Release((void *)machine); } } }