[libvirt] [PATCH] vbox: Fix version extraction on Windows for newer VirtualBox versions
Matthias Bolte
matthias.bolte at googlemail.com
Sat Jun 4 10:07:04 UTC 2011
2011/6/4 Daniel Veillard <veillard at redhat.com>:
> On Sat, Jun 04, 2011 at 10:53:06AM +0200, Matthias Bolte wrote:
>> VirtualBox 4.0.8 changed the registry key layout. Before the version
>> number was in a Version key. Now the Version key contains %VER% and
>> the actual version number is in VersionExt now.
>>
>> Move value lookup code into its own function: vboxLookupRegistryValue.
>> ---
>> src/vbox/vbox_MSCOMGlue.c | 87 +++++++++++++++++++++++++++++++--------------
>> 1 files changed, 60 insertions(+), 27 deletions(-)
>>
>> diff --git a/src/vbox/vbox_MSCOMGlue.c b/src/vbox/vbox_MSCOMGlue.c
>> index e31a763..8aef266 100644
>> --- a/src/vbox/vbox_MSCOMGlue.c
>> +++ b/src/vbox/vbox_MSCOMGlue.c
>> @@ -2,7 +2,7 @@
>> /*
>> * vbox_MSCOMGlue.c: glue to the MSCOM based VirtualBox API
>> *
>> - * Copyright (C) 2010 Matthias Bolte <matthias.bolte at googlemail.com>
>> + * Copyright (C) 2010-2011 Matthias Bolte <matthias.bolte at googlemail.com>
>> *
>> * This library is free software; you can redistribute it and/or
>> * modify it under the terms of the GNU Lesser General Public
>> @@ -338,45 +338,31 @@ static nsIEventQueue vboxEventQueue = {
>>
>>
>>
>> -static int
>> -vboxLookupVersionInRegistry(void)
>> +static char *
>> +vboxLookupRegistryValue(HKEY key, const char *keyName, const char *valueName)
>> {
>> - int result = -1;
>> - const char *keyName = VBOX_REGKEY_ORACLE;
>> LONG status;
>> - HKEY key;
>> DWORD type;
>> DWORD length;
>> char *value = NULL;
>>
>> - status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &key);
>> + status = RegQueryValueEx(key, valueName, NULL, &type, NULL, &length);
>>
>> if (status != ERROR_SUCCESS) {
>> - keyName = VBOX_REGKEY_SUN;
>> - status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &key);
>> -
>> - if (status != ERROR_SUCCESS) {
>> - /* Both keys aren't there, or we cannot open them. In general this
>> - * indicates that VirtualBox is not installed, so we just silently
>> - * fail here making vboxRegister() register the dummy driver. */
>> - return -1;
>> - }
>> - }
>> -
>> - status = RegQueryValueEx(key, "Version", NULL, &type, NULL, &length);
>> -
>> - if (status != ERROR_SUCCESS) {
>> - VIR_ERROR(_("Could not query registry value '%s\\Version'"), keyName);
>> + VIR_ERROR(_("Could not query registry value '%s\\%s'"),
>> + keyName, valueName);
>> goto cleanup;
>> }
>>
>> if (type != REG_SZ) {
>> - VIR_ERROR(_("Registry value '%s\\Version' has unexpected type"), keyName);
>> + VIR_ERROR(_("Registry value '%s\\%s' has unexpected type"),
>> + keyName, valueName);
>> goto cleanup;
>> }
>>
>> if (length < 2) {
>> - VIR_ERROR(_("Registry value '%s\\Version' is too short"), keyName);
>> + VIR_ERROR(_("Registry value '%s\\%s' is too short"),
>> + keyName, valueName);
>> goto cleanup;
>> }
>>
>> @@ -386,10 +372,12 @@ vboxLookupVersionInRegistry(void)
>> goto cleanup;
>> }
>>
>> - status = RegQueryValueEx(key, "Version", NULL, NULL, (LPBYTE)value, &length);
>> + status = RegQueryValueEx(key, valueName, NULL, NULL, (LPBYTE)value, &length);
>>
>> if (status != ERROR_SUCCESS) {
>> - VIR_ERROR(_("Could not query registry value '%s\\Version'"), keyName);
>> + VIR_FREE(value);
>> + VIR_ERROR(_("Could not query registry value '%s\\%s'"),
>> + keyName, valueName);
>> goto cleanup;
>> }
>>
>> @@ -397,7 +385,52 @@ vboxLookupVersionInRegistry(void)
>> value[length] = '\0';
>> }
>>
>> - if (virParseVersionString(value, &vboxVersion)) {
>> + cleanup:
>> + return value;
>> +}
>> +
>> +static int
>> +vboxLookupVersionInRegistry(void)
>> +{
>> + int result = -1;
>> + const char *keyName = VBOX_REGKEY_ORACLE;
>> + LONG status;
>> + HKEY key;
>> + char *value = NULL;
>> +
>> + status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &key);
>> +
>> + if (status != ERROR_SUCCESS) {
>> + keyName = VBOX_REGKEY_SUN;
>> + status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &key);
>> +
>> + if (status != ERROR_SUCCESS) {
>> + /* Both keys aren't there, or we cannot open them. In general this
>> + * indicates that VirtualBox is not installed, so we just silently
>> + * fail here making vboxRegister() register the dummy driver. */
>> + return -1;
>> + }
>> + }
>> +
>> + /* The registry key layout changed around version 4.0.8. Before the version
>> + * number was in the Version key, now the Version key can contain %VER% and
>> + * the actual version number is in the VersionExt key then. */
>> + value = vboxLookupRegistryValue(key, keyName, "Version");
>> +
>> + if (value == NULL) {
>> + goto cleanup;
>> + }
>> +
>> + if (STREQ(value, "%VER%")) {
>> + VIR_FREE(value);
>> + value = vboxLookupRegistryValue(key, keyName, "VersionExt");
>> +
>> + if (value == NULL) {
>> + goto cleanup;
>> + }
>> + }
>> +
>> + if (virParseVersionString(value, &vboxVersion) < 0) {
>> VIR_ERROR(_("Could not parse version number from '%s'"), value);
>> goto cleanup;
>> }
>
> Okay, looks reasonable, ACK, please push for release :-)
>
> Daniel
>
Thanks, pushed.
Matthias
More information about the libvir-list
mailing list