From e758da5d28776bc10adbdaad881dc4d7e8097528 Mon Sep 17 00:00:00 2001 From: Arnavion Date: Sat, 3 Jan 2015 15:26:05 -0800 Subject: [PATCH] Bring the sysinfo plugin to the 21st century. - Support multiple CPUs and graphics adapters in the WMI responses. - Query max CPU frequency from WMI instead of registry. - Support uptimes longer than 50 days. - Don't report using /ME in notice and server notice tabs. - Convert to C --- plugins/sysinfo/sysinfo.c | 375 +++++++++++++++++++++ plugins/sysinfo/sysinfo.cpp | 416 ------------------------ plugins/sysinfo/sysinfo.vcxproj | 12 +- plugins/sysinfo/sysinfo.vcxproj.filters | 2 +- 4 files changed, 383 insertions(+), 422 deletions(-) create mode 100644 plugins/sysinfo/sysinfo.c delete mode 100644 plugins/sysinfo/sysinfo.cpp diff --git a/plugins/sysinfo/sysinfo.c b/plugins/sysinfo/sysinfo.c new file mode 100644 index 00000000..bf68f6aa --- /dev/null +++ b/plugins/sysinfo/sysinfo.c @@ -0,0 +1,375 @@ +/* HexChat + * Copyright (c) 2011-2012 Berke Viktor. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include + +#include + +#include "hexchat-plugin.h" + +static hexchat_plugin *ph; /* plugin handle */ + +static char name[] = "SysInfo"; +static char desc[] = "Display info about your hardware and OS"; +static char version[] = "1.1"; +static char helptext[] = "USAGE: /SYSINFO - Sends info about your hardware and OS to current channel."; + +/* 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; + +static int printInfo (char *word[], char *word_eol[], void *user_data); + +typedef enum +{ + QUERY_WMI_OS, + QUERY_WMI_CPU, + QUERY_WMI_VGA, +} QueryWmiType; + +static int get_cpu_arch (void); +char *query_wmi (QueryWmiType mode); +char *get_memory_info (void); + +int hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) +{ + ph = plugin_handle; + + *plugin_name = name; + *plugin_desc = desc; + *plugin_version = version; + + hexchat_hook_command (ph, "SYSINFO", HEXCHAT_PRI_NORM, printInfo, helptext, NULL); + hexchat_command (ph, "MENU -ishare\\system.png ADD \"Window/Send System Info\" \"SYSINFO\""); + + hexchat_printf (ph, "%s plugin loaded\n", name); + + return 1; +} + +int hexchat_plugin_deinit (void) +{ + g_free (os_name); + g_free (cpu_info); + g_free (vga_name); + + hexchat_command (ph, "MENU DEL \"Window/Display System Info\""); + hexchat_printf (ph, "%s plugin unloaded\n", name); + + return 1; +} + +static int printInfo (char *word[], char *word_eol[], void *user_data) +{ + char *memory_info; + int channel_type; + + /* Load information if not already loaded */ + + if (cpu_arch == 0) + { + cpu_arch = get_cpu_arch (); + } + + if (os_name == NULL) + { + hexchat_printf (ph, "%s - Querying and caching OS info...\n", name); + + os_name = query_wmi (QUERY_WMI_OS); + if (os_name == NULL) + { + hexchat_printf (ph, "%s - Error while getting OS info.\n", name); + os_name = g_strdup ("Unknown"); + } + } + + if (cpu_info == NULL) + { + hexchat_printf (ph, "%s - Querying and caching CPU info...\n", name); + + cpu_info = query_wmi (QUERY_WMI_CPU); + if (cpu_info == NULL) + { + hexchat_printf (ph, "%s - Error while getting CPU info.\n", name); + cpu_info = g_strdup ("Unknown"); + } + } + + if (vga_name == NULL) + { + hexchat_printf (ph, "%s - Querying and caching VGA info...\n", name); + + vga_name = query_wmi (QUERY_WMI_VGA); + if (vga_name == NULL) + { + hexchat_printf (ph, "%s - Error while getting VGA info.\n", name); + vga_name = g_strdup ("Unknown"); + } + } + + /* Memory information is always loaded dynamically since it includes the current amount of free memory */ + memory_info = get_memory_info (); + if (memory_info == NULL) + { + hexchat_printf (ph, "%s - Error while getting memory info.\n", name); + memory_info = g_strdup ("Unknown"); + } + + channel_type = hexchat_list_int (ph, NULL, "type"); + if (channel_type == 2 /* SESS_CHANNEL */ || channel_type == 3 /* SESS_DIALOG */) + { + hexchat_commandf ( + ph, + "ME ** SysInfo ** Client: HexChat %s (x%d) ** OS: %s ** CPU: %s ** RAM: %s ** VGA: %s ** Uptime: %.2f Hours **", + hexchat_get_info (ph, "version"), + cpu_arch, + os_name, + cpu_info, + memory_info, + vga_name, + (float) GetTickCount64 () / 1000 / 60 / 60); + } + else + { + hexchat_printf (ph, " * Client: HexChat %s (x%d)\n", hexchat_get_info (ph, "version"), cpu_arch); + hexchat_printf (ph, " * OS: %s\n", os_name); + hexchat_printf (ph, " * CPU: %s\n", cpu_info); + hexchat_printf (ph, " * RAM: %s\n", memory_info); + hexchat_printf (ph, " * VGA: %s\n", vga_name); + hexchat_printf (ph, " * Uptime: %.2f Hours\n", (float) GetTickCount64 () / 1000 / 60 / 60); + } + + g_free (memory_info); + + return HEXCHAT_EAT_HEXCHAT; +} + +/* 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; + + hr = CoInitializeEx (0, COINIT_APARTMENTTHREADED); + if (FAILED (hr)) + { + goto exit; + } + + /* If this is called after some other call to CoCreateInstance somewhere else in the process, this will fail with RPC_E_TOO_LATE. + * However if not, it *is* required to be called, so call it here but ignore any error returned. + */ + CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); + + hr = CoCreateInstance (&CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, (LPVOID *) &locator); + if (FAILED (hr)) + { + goto couninitialize; + } + + 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 * FROM Win32_OperatingSystem"); + break; + case QUERY_WMI_CPU: + query = SysAllocString (L"SELECT * FROM Win32_Processor"); + break; + case QUERY_WMI_VGA: + query = SysAllocString (L"SELECT * FROM Win32_VideoController"); + 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; + VARIANT property; + char *property_utf8; + + hr = enumerator->lpVtbl->Next (enumerator, WBEM_INFINITE, 1, &object, &numReturned); + if (FAILED (hr) || numReturned == 0) + { + break; + } + + switch (type) + { + case QUERY_WMI_OS: + hr = object->lpVtbl->Get (object, L"Caption", 0, &property, 0, 0); + break; + + case QUERY_WMI_CPU: + hr = object->lpVtbl->Get (object, L"Name", 0, &property, 0, 0); + break; + + case QUERY_WMI_VGA: + hr = object->lpVtbl->Get (object, L"Name", 0, &property, 0, 0); + break; + + default: + break; + } + + if (FAILED (hr)) + { + break; + } + + if (i > 0) + { + g_string_append (result, ", "); + } + + property_utf8 = g_utf16_to_utf8 (property.bstrVal, SysStringLen (property.bstrVal), NULL, NULL, NULL); + g_string_append (result, property_utf8); + + VariantClear (&property); + + if (type == QUERY_WMI_CPU) + { + guint cpu_freq_mhz; + + hr = object->lpVtbl->Get (object, L"MaxClockSpeed", 0, &property, 0, 0); + if (FAILED (hr)) + { + break; + } + + cpu_freq_mhz = property.uintVal; + + if (cpu_freq_mhz > 1000) + { + g_string_append_printf (result, " (%.2f GHz)", property.uintVal / 1000.0f); + } + else + { + g_string_append_printf (result, " (%" G_GUINT32_FORMAT " MHz)", property.uintVal); + } + } + + object->lpVtbl->Release (object); + } + + 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); + +couninitialize: + CoUninitialize (); + +exit: + if (result == NULL) + { + return NULL; + } + + return g_string_free (result, FALSE); +} + +static int get_cpu_arch (void) +{ + SYSTEM_INFO si; + + GetNativeSystemInfo (&si); + + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + { + return 64; + } + else + { + return 86; + } +} + +static char *get_memory_info (void) +{ + MEMORYSTATUSEX meminfo = { 0 }; + meminfo.dwLength = sizeof (meminfo); + + if (!GlobalMemoryStatusEx (&meminfo)) + { + return NULL; + } + + return g_strdup_printf ("%" G_GUINT64_FORMAT " MB Total (%" G_GUINT64_FORMAT " MB Free)", meminfo.ullTotalPhys / 1024 / 1024, meminfo.ullAvailPhys / 1024 / 1024); +} diff --git a/plugins/sysinfo/sysinfo.cpp b/plugins/sysinfo/sysinfo.cpp deleted file mode 100644 index 322dac17..00000000 --- a/plugins/sysinfo/sysinfo.cpp +++ /dev/null @@ -1,416 +0,0 @@ -/* HexChat - * Copyright (c) 2011-2012 Berke Viktor. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include -#include -#include -#include - -#include "hexchat-plugin.h" - -static hexchat_plugin *ph; /* plugin handle */ -static char name[] = "SysInfo"; -static char desc[] = "Display info about your hardware and OS"; -static char version[] = "1.1"; -static char helptext[] = "USAGE: /sysinfo - Sends info about your hardware and OS to current channel."; -static int firstRun; -static char *wmiOs; -static char *wmiCpu; -static char *wmiVga; - -static int -getCpuArch (void) -{ - OSVERSIONINFOEX osvi; - SYSTEM_INFO si; - - osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); - GetVersionEx ((LPOSVERSIONINFOW) &osvi); - - GetSystemInfo (&si); - - if (si.wProcessorArchitecture == 9) - { - return 64; - } - else - { - return 86; - } -} - -#if 0 -/* use WMI instead, wProcessorArchitecture displays current binary arch instead of OS arch anyway */ -static char * -getOsName (void) -{ - static char winver[32]; - double mhz; - OSVERSIONINFOEX osvi; - SYSTEM_INFO si; - - osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); - GetVersionEx ((LPOSVERSIONINFOW) &osvi); - - GetSystemInfo (&si); - - strcpy (winver, "Windows "); - - switch (osvi.dwMajorVersion) - { - case 5: - switch (osvi.dwMinorVersion) - { - case 1: - strcat (winver, "XP"); - break; - case 2: - if (osvi.wProductType == VER_NT_WORKSTATION) - { - strcat (winver, "XP x64 Edition"); - } - else - { - if (GetSystemMetrics(SM_SERVERR2) == 0) - { - strcat (winver, "Server 2003"); - } - else - { - strcat (winver, "Server 2003 R2"); - } - } - break; - } - break; - case 6: - switch (osvi.dwMinorVersion) - { - case 0: - if (osvi.wProductType == VER_NT_WORKSTATION) - { - strcat (winver, "Vista"); - } - else - { - strcat (winver, "Server 2008"); - } - break; - case 1: - if (osvi.wProductType == VER_NT_WORKSTATION) - { - strcat (winver, "7"); - } - else - { - strcat (winver, "Server 2008 R2"); - } - break; - case 2: - if (osvi.wProductType == VER_NT_WORKSTATION) - { - strcat (winver, "8"); - } - else - { - strcat (winver, "8 Server"); - } - break; - } - break; - } - - if (si.wProcessorArchitecture == 9) - { - strcat (winver, " (x64)"); - } - else - { - strcat (winver, " (x86)"); - } - - return winver; -} - -/* x86-only, SDK-only, use WMI instead */ -static char * -getCpuName (void) -{ - /* Get extended ids. */ - unsigned int nExIds; - unsigned int i; - int CPUInfo[4] = {-1}; - static char CPUBrandString[128]; - - __cpuid (CPUInfo, 0x80000000); - nExIds = CPUInfo[0]; - - /* Get the information associated with each extended ID. */ - for (i=0x80000000; i <= nExIds; ++i) - { - __cpuid (CPUInfo, i); - - if (i == 0x80000002) - { - memcpy (CPUBrandString, CPUInfo, sizeof (CPUInfo)); - } - else if (i == 0x80000003) - { - memcpy( CPUBrandString + 16, CPUInfo, sizeof (CPUInfo)); - } - else if (i == 0x80000004) - { - memcpy (CPUBrandString + 32, CPUInfo, sizeof (CPUInfo)); - } - } - - return CPUBrandString; -} -#endif - -static char * -getCpuMhz (void) -{ - HKEY hKey; - int result; - int data; - int dataSize; - double cpuspeed; - static char buffer[16]; - const char *cpuspeedstr; - - if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT("Hardware\\Description\\System\\CentralProcessor\\0"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) - { - dataSize = sizeof (data); - result = RegQueryValueEx (hKey, TEXT("~MHz"), 0, 0, (LPBYTE)&data, (LPDWORD)&dataSize); - RegCloseKey (hKey); - if (result == ERROR_SUCCESS) - { - cpuspeed = ( data > 1000 ) ? data / 1000 : data; - cpuspeedstr = ( data > 1000 ) ? "GHz" : "MHz"; - sprintf (buffer, "%.2f %s", cpuspeed, cpuspeedstr); - } - } - - return buffer; -} - -static char * -getMemoryInfo (void) -{ - static char buffer[32]; - MEMORYSTATUSEX meminfo; - - meminfo.dwLength = sizeof (meminfo); - GlobalMemoryStatusEx (&meminfo); - - sprintf (buffer, "%I64d MB Total (%I64d MB Free)", meminfo.ullTotalPhys / 1024 / 1024, meminfo.ullAvailPhys / 1024 / 1024); - - return buffer; -} - -static char * -getWmiInfo (int mode) -{ - /* for more details about this wonderful API, see - http://msdn.microsoft.com/en-us/site/aa394138 - http://msdn.microsoft.com/en-us/site/aa390423 - http://msdn.microsoft.com/en-us/library/windows/desktop/aa394138%28v=vs.85%29.aspx - http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/d6420012-e432-4964-8506-6f6b65e5a451 - */ - - char *buffer = (char *) malloc (128); - HRESULT hres; - HRESULT hr; - IWbemLocator *pLoc = NULL; - IWbemServices *pSvc = NULL; - IEnumWbemClassObject *pEnumerator = NULL; - IWbemClassObject *pclsObj; - ULONG uReturn = 0; - - hres = CoInitializeEx (0, COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); - - if (FAILED (hres)) - { - strcpy (buffer, "Error Code 0"); - return buffer; - } - - hres = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); - - /* mysteriously failing after the first execution, but only when used as a plugin, skip it */ - /*if (FAILED (hres)) - { - CoUninitialize (); - strcpy (buffer, "Error Code 1"); - return buffer; - }*/ - - hres = CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); - - if (FAILED (hres)) - { - CoUninitialize (); - strcpy (buffer, "Error Code 2"); - return buffer; - } - - hres = pLoc->ConnectServer (_bstr_t (L"root\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc); - - if (FAILED (hres)) - { - pLoc->Release (); - CoUninitialize (); - strcpy (buffer, "Error Code 3"); - return buffer; - } - - hres = CoSetProxyBlanket (pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); - - if (FAILED (hres)) - { - pSvc->Release (); - pLoc->Release (); - CoUninitialize (); - strcpy (buffer, "Error Code 4"); - return buffer; - } - - switch (mode) - { - case 0: - hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); - break; - case 1: - hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); - break; - case 2: - hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_VideoController"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); - break; - - } - - if (FAILED (hres)) - { - pSvc->Release (); - pLoc->Release (); - CoUninitialize (); - strcpy (buffer, "Error Code 5"); - return buffer; - } - - while (pEnumerator) - { - hr = pEnumerator->Next (WBEM_INFINITE, 1, &pclsObj, &uReturn); - if (0 == uReturn) - { - break; - } - VARIANT vtProp; - switch (mode) - { - case 0: - hr = pclsObj->Get (L"Caption", 0, &vtProp, 0, 0); - break; - case 1: - hr = pclsObj->Get (L"Name", 0, &vtProp, 0, 0); - break; - case 2: - hr = pclsObj->Get (L"Name", 0, &vtProp, 0, 0); - break; - } - WideCharToMultiByte (CP_ACP, 0, vtProp.bstrVal, -1, buffer, SysStringLen (vtProp.bstrVal)+1, NULL, NULL); - VariantClear (&vtProp); - } - - pSvc->Release (); - pLoc->Release (); - pEnumerator->Release (); - pclsObj->Release (); - CoUninitialize (); - return buffer; -} - -static int -printInfo (char *word[], char *word_eol[], void *user_data) -{ - /* query WMI info only at the first time SysInfo is called, then cache it to save time */ - if (firstRun) - { - hexchat_printf (ph, "%s first execution, querying and caching WMI info...\n", name); - wmiOs = getWmiInfo (0); - wmiCpu = getWmiInfo (1); - wmiVga = getWmiInfo (2); - firstRun = 0; - } - if (hexchat_list_int (ph, NULL, "type") >= 2) - { - /* uptime will work correctly for up to 50 days, should be enough */ - hexchat_commandf (ph, "ME ** SysInfo ** Client: HexChat %s (x%d) ** OS: %s ** CPU: %s (%s) ** RAM: %s ** VGA: %s ** Uptime: %.2f Hours **", - hexchat_get_info (ph, "version"), - getCpuArch (), - wmiOs, - wmiCpu, - getCpuMhz (), - getMemoryInfo (), - wmiVga, (float) GetTickCount() / 1000 / 60 / 60); - } - else - { - hexchat_printf (ph, " * Client: HexChat %s (x%d)\n", hexchat_get_info (ph, "version"), getCpuArch ()); - hexchat_printf (ph, " * OS: %s\n", wmiOs); - hexchat_printf (ph, " * CPU: %s (%s)\n", wmiCpu, getCpuMhz ()); - hexchat_printf (ph, " * RAM: %s\n", getMemoryInfo ()); - hexchat_printf (ph, " * VGA: %s\n", wmiVga); - hexchat_printf (ph, " * Uptime: %.2f Hours\n", (float) GetTickCount() / 1000 / 60 / 60); - } - - return HEXCHAT_EAT_HEXCHAT; -} - -int -hexchat_plugin_init (hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) -{ - ph = plugin_handle; - - *plugin_name = name; - *plugin_desc = desc; - *plugin_version = version; - - firstRun = 1; - - hexchat_hook_command (ph, "SYSINFO", HEXCHAT_PRI_NORM, printInfo, helptext, NULL); - hexchat_command (ph, "MENU -ishare\\system.png ADD \"Window/Send System Info\" \"SYSINFO\""); - - hexchat_printf (ph, "%s plugin loaded\n", name); - - return 1; /* return 1 for success */ -} - - -int -hexchat_plugin_deinit (void) -{ - hexchat_command (ph, "MENU DEL \"Window/Display System Info\""); - hexchat_printf (ph, "%s plugin unloaded\n", name); - return 1; -} diff --git a/plugins/sysinfo/sysinfo.vcxproj b/plugins/sysinfo/sysinfo.vcxproj index 7286b89a..1657fbee 100644 --- a/plugins/sysinfo/sysinfo.vcxproj +++ b/plugins/sysinfo/sysinfo.vcxproj @@ -62,7 +62,7 @@ true true WIN32;NDEBUG;_WINDOWS;_USRDLL;SYSINFO_EXPORTS;%(PreprocessorDefinitions) - ..\..\src\common;%(AdditionalIncludeDirectories) + ..\..\src\common;$(DepsRoot)\include;$(Glib);$(Gtk);%(AdditionalIncludeDirectories) true false @@ -72,7 +72,8 @@ true true sysinfo.def - wbemuuid.lib;comsupp.lib;%(AdditionalDependencies) + $(DepsRoot)\lib;%(AdditionalLibraryDirectories) + wbemuuid.lib;comsupp.lib;$(DepLibs);%(AdditionalDependencies) comsupp.lib @@ -83,7 +84,7 @@ true true WIN32;_WIN64;_AMD64_;NDEBUG;_WINDOWS;_USRDLL;SYSINFO_EXPORTS;%(PreprocessorDefinitions) - ..\..\src\common;%(AdditionalIncludeDirectories) + ..\..\src\common;$(DepsRoot)\include;$(Glib);$(Gtk);%(AdditionalIncludeDirectories) true false @@ -93,7 +94,8 @@ true true sysinfo.def - wbemuuid.lib;comsupp.lib;%(AdditionalDependencies) + $(DepsRoot)\lib;%(AdditionalLibraryDirectories) + wbemuuid.lib;comsupp.lib;$(DepLibs);%(AdditionalDependencies) comsupp.lib @@ -101,7 +103,7 @@ - + diff --git a/plugins/sysinfo/sysinfo.vcxproj.filters b/plugins/sysinfo/sysinfo.vcxproj.filters index 1ef90f5b..04831e5f 100644 --- a/plugins/sysinfo/sysinfo.vcxproj.filters +++ b/plugins/sysinfo/sysinfo.vcxproj.filters @@ -16,7 +16,7 @@ - + Source Files