diff options
Diffstat (limited to 'plugins/sysinfo/win32')
-rw-r--r-- | plugins/sysinfo/win32/backend.c | 404 |
1 files changed, 14 insertions, 390 deletions
diff --git a/plugins/sysinfo/win32/backend.c b/plugins/sysinfo/win32/backend.c index 2451c122..446bc252 100644 --- a/plugins/sysinfo/win32/backend.c +++ b/plugins/sysinfo/win32/backend.c @@ -26,38 +26,18 @@ #include <glib.h> -#include "../format.h" +#include "../../../src/common/sysinfo/sysinfo.h" -/* Cache the info for subsequent invocations of /SYSINFO */ -static int cpu_arch = 0; -static char *os_name = NULL; -static char *cpu_info = NULL; -static char *vga_name = NULL; +#include "../format.h" static int command_callback (char *word[], char *word_eol[], void *user_data); -typedef enum -{ - QUERY_WMI_OS, - QUERY_WMI_CPU, - QUERY_WMI_VGA, - QUERY_WMI_HDD, -} QueryWmiType; - void print_info (void); -int get_cpu_arch (void); -char *query_wmi (QueryWmiType mode); -char *read_os_name (IWbemClassObject *object); -char *read_cpu_info (IWbemClassObject *object); -char *read_vga_name (IWbemClassObject *object); guint64 hdd_capacity; guint64 hdd_free_space; char *read_hdd_info (IWbemClassObject *object); - char *get_memory_info (void); -char *bstr_to_utf8 (BSTR bstr); -guint64 variant_to_uint64 (VARIANT *variant); char * sysinfo_backend_get_sound (void) @@ -80,14 +60,15 @@ sysinfo_backend_get_uptime (void) char * sysinfo_backend_get_disk (void) { - char *hdd_info; + guint64 hdd_capacity; + guint64 hdd_free_space; - /* HDD information is always loaded dynamically since it includes the current amount of free space */ - hdd_capacity = 0; - hdd_free_space = 0; - hdd_info = query_wmi (QUERY_WMI_HDD); - if (hdd_info) - return sysinfo_format_disk (hdd_capacity, hdd_free_space); + sysinfo_get_hdd_info (&hdd_capacity, &hdd_free_space); + + if (hdd_capacity != 0) + { + return sysinfo_format_disk(hdd_capacity, hdd_free_space); + } return NULL; } @@ -95,10 +76,7 @@ sysinfo_backend_get_disk (void) char * sysinfo_backend_get_cpu (void) { - if (cpu_info == NULL) - cpu_info = query_wmi (QUERY_WMI_CPU); - - return g_strdup (cpu_info); + return sysinfo_get_cpu (); } char * @@ -111,352 +89,18 @@ sysinfo_backend_get_memory (void) char * sysinfo_backend_get_gpu (void) { - if (vga_name == NULL) - vga_name = query_wmi (QUERY_WMI_VGA); - - return g_strdup (vga_name); + return sysinfo_get_gpu (); } char * sysinfo_backend_get_os (void) { - if (os_name == NULL) - os_name = query_wmi (QUERY_WMI_OS); - - if (cpu_arch == 0) - cpu_arch = get_cpu_arch (); - - return g_strdup_printf ("%s (x%d)", os_name, cpu_arch); + return sysinfo_get_os (); } static int get_cpu_arch (void) { - SYSTEM_INFO si; - - GetNativeSystemInfo (&si); - - if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) - { - return 64; - } - else - { - return 86; - } -} - -/* http://msdn.microsoft.com/en-us/site/aa390423 */ -static char *query_wmi (QueryWmiType type) -{ - GString *result = NULL; - HRESULT hr; - - IWbemLocator *locator = NULL; - BSTR namespaceName = NULL; - BSTR queryLanguageName = NULL; - BSTR query = NULL; - IWbemServices *namespace = NULL; - IUnknown *namespaceUnknown = NULL; - IEnumWbemClassObject *enumerator = NULL; - int i; - gboolean atleast_one_appended = FALSE; - - hr = CoCreateInstance (&CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, (LPVOID *) &locator); - if (FAILED (hr)) - { - goto exit; - } - - namespaceName = SysAllocString (L"root\\CIMV2"); - - hr = locator->lpVtbl->ConnectServer (locator, namespaceName, NULL, NULL, NULL, 0, NULL, NULL, &namespace); - if (FAILED (hr)) - { - goto release_locator; - } - - hr = namespace->lpVtbl->QueryInterface (namespace, &IID_IUnknown, &namespaceUnknown); - if (FAILED (hr)) - { - goto release_namespace; - } - - hr = CoSetProxyBlanket (namespaceUnknown, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); - if (FAILED (hr)) - { - goto release_namespaceUnknown; - } - - queryLanguageName = SysAllocString (L"WQL"); - - switch (type) - { - case QUERY_WMI_OS: - query = SysAllocString (L"SELECT Caption FROM Win32_OperatingSystem"); - break; - case QUERY_WMI_CPU: - query = SysAllocString (L"SELECT Name, MaxClockSpeed FROM Win32_Processor"); - break; - case QUERY_WMI_VGA: - query = SysAllocString (L"SELECT Name FROM Win32_VideoController"); - break; - case QUERY_WMI_HDD: - query = SysAllocString (L"SELECT Name, Capacity, FreeSpace FROM Win32_Volume"); - break; - default: - goto release_queryLanguageName; - } - - hr = namespace->lpVtbl->ExecQuery (namespace, queryLanguageName, query, WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator); - if (FAILED (hr)) - { - goto release_query; - } - - result = g_string_new (""); - - for (i = 0;; i++) - { - ULONG numReturned = 0; - IWbemClassObject *object; - char *line; - - hr = enumerator->lpVtbl->Next (enumerator, WBEM_INFINITE, 1, &object, &numReturned); - if (FAILED (hr) || numReturned == 0) - { - break; - } - - switch (type) - { - case QUERY_WMI_OS: - line = read_os_name (object); - break; - - case QUERY_WMI_CPU: - line = read_cpu_info (object); - break; - - case QUERY_WMI_VGA: - line = read_vga_name (object); - break; - - case QUERY_WMI_HDD: - line = read_hdd_info (object); - break; - - default: - break; - } - - object->lpVtbl->Release (object); - - if (line != NULL) - { - if (atleast_one_appended) - { - g_string_append (result, ", "); - } - - g_string_append (result, line); - - g_free (line); - - atleast_one_appended = TRUE; - } - } - - enumerator->lpVtbl->Release (enumerator); - -release_query: - SysFreeString (query); - -release_queryLanguageName: - SysFreeString (queryLanguageName); - -release_namespaceUnknown: - namespaceUnknown->lpVtbl->Release (namespaceUnknown); - -release_namespace: - namespace->lpVtbl->Release (namespace); - -release_locator: - locator->lpVtbl->Release (locator); - SysFreeString (namespaceName); - -exit: - if (result == NULL) - { - return NULL; - } - - return g_string_free (result, FALSE); -} - -static char *read_os_name (IWbemClassObject *object) -{ - HRESULT hr; - VARIANT caption_variant; - char *caption_utf8; - - hr = object->lpVtbl->Get (object, L"Caption", 0, &caption_variant, NULL, NULL); - if (FAILED (hr)) - { - return NULL; - } - - caption_utf8 = bstr_to_utf8 (caption_variant.bstrVal); - - VariantClear(&caption_variant); - - if (caption_utf8 == NULL) - { - return NULL; - } - - g_strchomp (caption_utf8); - - return caption_utf8; -} - -static char *read_cpu_info (IWbemClassObject *object) -{ - HRESULT hr; - VARIANT name_variant; - char *name_utf8; - VARIANT max_clock_speed_variant; - guint cpu_freq_mhz; - char *result; - - hr = object->lpVtbl->Get (object, L"Name", 0, &name_variant, NULL, NULL); - if (FAILED (hr)) - { - return NULL; - } - - name_utf8 = bstr_to_utf8 (name_variant.bstrVal); - - VariantClear (&name_variant); - - if (name_utf8 == NULL) - { - return NULL; - } - - hr = object->lpVtbl->Get (object, L"MaxClockSpeed", 0, &max_clock_speed_variant, NULL, NULL); - if (FAILED (hr)) - { - g_free (name_utf8); - - return NULL; - } - - cpu_freq_mhz = max_clock_speed_variant.uintVal; - - VariantClear (&max_clock_speed_variant); - - if (cpu_freq_mhz > 1000) - { - result = g_strdup_printf ("%s (%.2fGHz)", name_utf8, cpu_freq_mhz / 1000.f); - } - else - { - result = g_strdup_printf ("%s (%" G_GUINT32_FORMAT "MHz)", name_utf8, cpu_freq_mhz); - } - - g_free (name_utf8); - - return result; -} - -static char *read_vga_name (IWbemClassObject *object) -{ - HRESULT hr; - VARIANT name_variant; - char *name_utf8; - - hr = object->lpVtbl->Get (object, L"Name", 0, &name_variant, NULL, NULL); - if (FAILED (hr)) - { - return NULL; - } - - name_utf8 = bstr_to_utf8 (name_variant.bstrVal); - - VariantClear (&name_variant); - - if (name_utf8 == NULL) - { - return NULL; - } - - return g_strchomp (name_utf8); -} - -static char *read_hdd_info (IWbemClassObject *object) -{ - HRESULT hr; - VARIANT name_variant; - BSTR name_bstr; - gsize name_len; - VARIANT capacity_variant; - guint64 capacity; - VARIANT free_space_variant; - guint64 free_space; - - hr = object->lpVtbl->Get (object, L"Name", 0, &name_variant, NULL, NULL); - if (FAILED (hr)) - { - return NULL; - } - - name_bstr = name_variant.bstrVal; - name_len = SysStringLen (name_variant.bstrVal); - - if (name_len >= 4 && name_bstr[0] == L'\\' && name_bstr[1] == L'\\' && name_bstr[2] == L'?' && name_bstr[3] == L'\\') - { - // This is not a named volume. Skip it. - VariantClear (&name_variant); - - return NULL; - } - - VariantClear (&name_variant); - - hr = object->lpVtbl->Get (object, L"Capacity", 0, &capacity_variant, NULL, NULL); - if (FAILED (hr)) - { - return NULL; - } - - capacity = variant_to_uint64 (&capacity_variant); - - VariantClear (&capacity_variant); - - if (capacity == 0) - { - return NULL; - } - - hr = object->lpVtbl->Get (object, L"FreeSpace", 0, &free_space_variant, NULL, NULL); - if (FAILED (hr)) - { - return NULL; - } - - free_space = variant_to_uint64 (&free_space_variant); - - VariantClear (&free_space_variant); - - if (free_space == 0) - { - return NULL; - } - - hdd_capacity += capacity; - hdd_free_space += free_space; - - return NULL; + return sysinfo_get_cpu_arch (); } static char *get_memory_info (void) @@ -471,23 +115,3 @@ static char *get_memory_info (void) return sysinfo_format_memory (meminfo.ullTotalPhys, meminfo.ullAvailPhys); } - -static char *bstr_to_utf8 (BSTR bstr) -{ - return g_utf16_to_utf8 (bstr, SysStringLen (bstr), NULL, NULL, NULL); -} - -static guint64 variant_to_uint64 (VARIANT *variant) -{ - switch (V_VT (variant)) - { - case VT_UI8: - return variant->ullVal; - - case VT_BSTR: - return wcstoull (variant->bstrVal, NULL, 10); - - default: - return 0; - } -} |