Disk: add support for Windows

Also major refactoring of util/windows/wmi
This commit is contained in:
李通洲
2022-10-06 22:56:56 +08:00
parent 8849107260
commit 49921f5ed1
17 changed files with 300 additions and 139 deletions
+8 -8
View File
@@ -21,13 +21,13 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results)
BatteryResult* battery = (BatteryResult*)ffListAdd(results);
ffStrbufInit(&battery->manufacturer);
ffGetWmiObjValue(pclsObj, L"SystemName", &battery->manufacturer);
ffGetWmiObjString(pclsObj, L"SystemName", &battery->manufacturer);
ffStrbufInit(&battery->modelName);
ffGetWmiObjValue(pclsObj, L"Name", &battery->modelName);
ffGetWmiObjString(pclsObj, L"Name", &battery->modelName);
int64_t chemistry;
ffGetWmiObjInteger(pclsObj, L"Chemistry", &chemistry);
uint64_t chemistry;
ffGetWmiObjUnsigned(pclsObj, L"Chemistry", &chemistry);
switch(chemistry)
{
case 1: ffStrbufInitS(&battery->technology, "Other"); break;
@@ -40,12 +40,12 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results)
case 8: ffStrbufInitS(&battery->technology, "Lithium Polymer"); break;
}
int64_t capacity;
ffGetWmiObjInteger(pclsObj, L"EstimatedChargeRemaining", &capacity);
uint64_t capacity;
ffGetWmiObjUnsigned(pclsObj, L"EstimatedChargeRemaining", &capacity);
ffStrbufInitF(&battery->capacity, "%d", (int)capacity);
int64_t batteryStatus;
ffGetWmiObjInteger(pclsObj, L"BatteryStatus", &batteryStatus);
uint64_t batteryStatus;
ffGetWmiObjUnsigned(pclsObj, L"BatteryStatus", &batteryStatus);
switch(batteryStatus)
{
case 1: ffStrbufInitS(&battery->status, "Discharging"); break;
+4 -4
View File
@@ -28,10 +28,10 @@ extern "C" void ffDetectBios(FFBiosResult* bios)
return;
}
ffGetWmiObjValue(pclsObj, L"Name", &bios->biosRelease);
ffGetWmiObjValue(pclsObj, L"ReleaseDate", &bios->biosDate);
ffGetWmiObjValue(pclsObj, L"Version", &bios->biosVersion);
ffGetWmiObjValue(pclsObj, L"Manufacturer", &bios->biosVendor);
ffGetWmiObjString(pclsObj, L"Name", &bios->biosRelease);
ffGetWmiObjString(pclsObj, L"ReleaseDate", &bios->biosDate);
ffGetWmiObjString(pclsObj, L"Version", &bios->biosVersion);
ffGetWmiObjString(pclsObj, L"Manufacturer", &bios->biosVendor);
pclsObj->Release();
pEnumerator->Release();
+3 -3
View File
@@ -27,9 +27,9 @@ extern "C" void ffDetectBoard(FFBoardResult* board)
return;
}
ffGetWmiObjValue(pclsObj, L"Product", &board->boardName);
ffGetWmiObjValue(pclsObj, L"Manufacturer", &board->boardVendor);
ffGetWmiObjValue(pclsObj, L"Version", &board->boardVersion);
ffGetWmiObjString(pclsObj, L"Product", &board->boardName);
ffGetWmiObjString(pclsObj, L"Manufacturer", &board->boardVendor);
ffGetWmiObjString(pclsObj, L"Version", &board->boardVersion);
pclsObj->Release();
pEnumerator->Release();
+55
View File
@@ -0,0 +1,55 @@
#include "fastfetch.h"
#include "disk.h"
#include <sys/statvfs.h>
void ffDetectDiskWithStatvfs(const char* folderPath, struct statvfs* fs, FFDiskResult* result)
{
ffStrbufInitS(&result->path, folderPath);
result->used = result->total = 0;
ffStrbufInit(&result->error);
struct statvfs newFs;
if(fs == NULL)
{
fs = &newFs;
int ret = statvfs(folderPath, fs);
if(ret != 0)
{
ffStrbufAppendF(&result->error, "statvfs(\"%s\", &fs) != 0 (%i)", folderPath, ret);
return;
}
}
result->total = fs->f_blocks * fs->f_frsize;
if(result->total == 0)
{
ffStrbufAppendF(&result->error, "statvfs for %s returned size 0", folderPath);
return;
}
result->used = result->total - (fs->f_bavail * fs->f_frsize);
result->files = (uint32_t) (fs->f_files - fs->f_ffree);
}
bool ffDiskDetectDiskFolders(FFinstance* instance, FFlist* folders)
{
ffStrbufTrim(&instance->config.diskFolders, ':');
if(instance->config.diskFolders.length == 0)
return false;
uint32_t startIndex = 0;
while(startIndex < instance->config.diskFolders.length)
{
uint32_t colonIndex = ffStrbufNextIndexC(&instance->config.diskFolders, startIndex, ':');
instance->config.diskFolders.chars[colonIndex] = '\0';
ffDetectDiskWithStatvfs(instance->config.diskFolders.chars + startIndex, NULL, (FFDiskResult*)ffListAdd(folders));
startIndex = colonIndex + 1;
}
return true;
}
+10
View File
@@ -5,6 +5,16 @@
#include "fastfetch.h"
typedef struct FFDiskResult
{
FFstrbuf path;
uint64_t used;
uint64_t total;
uint32_t files;
FFstrbuf error;
} FFDiskResult;
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders);
bool ffDiskDetectDiskFolders(FFinstance* instance, FFlist* folders);
#endif
+3 -1
View File
@@ -2,6 +2,8 @@
#import <Foundation/Foundation.h>
void ffDetectDiskWithStatvfs(const char* folderPath, struct statvfs* fs, FFDiskResult* result);
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
{
NSArray *keys = [NSArray arrayWithObjects:NSURLVolumeNameKey, nil];
@@ -18,7 +20,7 @@ const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
if(removable.boolValue && !instance->config.diskRemovable)
continue;
ffStrbufInitS((FFstrbuf *)ffListAdd(folders), [url.relativePath cStringUsingEncoding:NSUTF8StringEncoding]);
ffDetectDiskWithStatvfs([url.relativePath cStringUsingEncoding:NSUTF8StringEncoding], NULL, (FFDiskResult*)ffListAdd(folders));
}
return NULL;
+4 -2
View File
@@ -2,6 +2,8 @@
#include <sys/statvfs.h>
void ffDetectDiskWithStatvfs(const char* folderPath, struct statvfs* fs, FFDiskResult* result);
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
{
FF_UNUSED(instance);
@@ -11,12 +13,12 @@ const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
if(rootRet != 0)
return "statvfs(\"/\") failed";
ffStrbufInitS((FFstrbuf *)ffListAdd(folders), FASTFETCH_TARGET_DIR_ROOT"/");
ffDetectDiskWithStatvfs(FASTFETCH_TARGET_DIR_ROOT"/", &fsRoot, (FFDiskResult*)ffListAdd(folders));
struct statvfs fsHome;
int homeRet = statvfs(FASTFETCH_TARGET_DIR_HOME, &fsHome);
if(homeRet == 0 && (fsRoot.f_fsid != fsHome.f_fsid))
ffStrbufInitS((FFstrbuf *)ffListAdd(folders), FASTFETCH_TARGET_DIR_HOME);
ffDetectDiskWithStatvfs(FASTFETCH_TARGET_DIR_HOME, &fsHome, (FFDiskResult*)ffListAdd(folders));
return NULL;
}
+48
View File
@@ -0,0 +1,48 @@
extern "C" {
#include "disk.h"
}
#include "util/windows/wmi.hpp"
const char* ffDiskAutodetectFolders(FFinstance* instance, FFlist* folders)
{
FF_UNUSED(instance);
IEnumWbemClassObject* pEnumerator = ffQueryWmi(L"SELECT Name, DriveType, FreeSpace, Size FROM Win32_LogicalDisk", nullptr);
if(!pEnumerator)
return "Query WMI service failed";
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
while(SUCCEEDED(pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn)) && uReturn != 0)
{
uint64_t driveType;
ffGetWmiObjUnsigned(pclsObj, L"DriveType", &driveType);
if(driveType == 2 && !instance->config.diskRemovable)
continue;
FFDiskResult* folder = (FFDiskResult*)ffListAdd(folders);
ffStrbufInit(&folder->path);
ffGetWmiObjString(pclsObj, L"Name", &folder->path);
uint64_t free;
ffGetWmiObjUnsigned(pclsObj, L"Size", &folder->total);
ffGetWmiObjUnsigned(pclsObj, L"FreeSpace", &free);
folder->used = folder->total - free;
folder->files = 0; //Unsupported
ffStrbufInit(&folder->error);
}
pclsObj->Release();
pEnumerator->Release();
return nullptr;
}
bool ffDiskDetectDiskFolders(FFinstance*, FFlist*)
{
return false; // Unsupported
}
+3 -3
View File
@@ -21,7 +21,7 @@ const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance)
FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus);
ffStrbufInit(&gpu->vendor);
ffGetWmiObjValue(pclsObj, L"AdapterCompatibility", &gpu->vendor);
ffGetWmiObjString(pclsObj, L"AdapterCompatibility", &gpu->vendor);
if(ffStrbufStartsWithS(&gpu->vendor, "Intel "))
{
//Intel returns "Intel Corporation", not sure about AMD
@@ -29,10 +29,10 @@ const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance)
}
ffStrbufInit(&gpu->name);
ffGetWmiObjValue(pclsObj, L"Name", &gpu->name);
ffGetWmiObjString(pclsObj, L"Name", &gpu->name);
ffStrbufInit(&gpu->driver);
ffGetWmiObjValue(pclsObj, L"DriverVersion", &gpu->driver);
ffGetWmiObjString(pclsObj, L"DriverVersion", &gpu->driver);
gpu->temperature = FF_GPU_TEMP_UNSET;
gpu->coreCount = FF_GPU_CORE_COUNT_UNSET;
+4 -4
View File
@@ -32,10 +32,10 @@ extern "C" void ffDetectHostImpl(FFHostResult* host)
return;
}
ffGetWmiObjValue(pclsObj, L"Name", &host->productName);
ffGetWmiObjValue(pclsObj, L"Version", &host->productVersion);
ffGetWmiObjValue(pclsObj, L"SKUNumber", &host->productSku);
ffGetWmiObjValue(pclsObj, L"Vendor", &host->sysVendor);
ffGetWmiObjString(pclsObj, L"Name", &host->productName);
ffGetWmiObjString(pclsObj, L"Version", &host->productVersion);
ffGetWmiObjString(pclsObj, L"SKUNumber", &host->productSku);
ffGetWmiObjString(pclsObj, L"Vendor", &host->sysVendor);
pclsObj->Release();
pEnumerator->Release();
+3 -3
View File
@@ -33,7 +33,7 @@ void ffDetectOSImpl(FFOSResult* os, const FFinstance* instance)
return;
}
ffGetWmiObjValue(pclsObj, L"Caption", &os->variant); // Microsoft Windows 11 家庭中文版
ffGetWmiObjString(pclsObj, L"Caption", &os->variant); // Microsoft Windows 11 家庭中文版
if(ffStrbufStartsWithS(&os->variant, "Microsoft Windows "))
{
ffStrbufAppendS(&os->name, "Microsoft Windows");
@@ -58,8 +58,8 @@ void ffDetectOSImpl(FFOSResult* os, const FFinstance* instance)
ffStrbufAppendF(&os->id, "Windows %*s", &os->version.length, &os->version.chars);
#endif
ffGetWmiObjValue(pclsObj, L"BuildNumber", &os->buildID);
ffGetWmiObjValue(pclsObj, L"OSArchitecture", &os->architecture);
ffGetWmiObjString(pclsObj, L"BuildNumber", &os->buildID);
ffGetWmiObjString(pclsObj, L"OSArchitecture", &os->architecture);
#ifdef __CYGWIN__
ffStrbufSetS(&os->systemName, instance->state.utsname.sysname);
@@ -22,8 +22,8 @@ uint32_t ffDetectProcesses(FFinstance* instance, FFstrbuf* error)
return 0;
}
int64_t result = 0;
ffGetWmiObjInteger(pclsObj, L"NumberOfProcesses", &result);
uint64_t result = 0;
ffGetWmiObjUnsigned(pclsObj, L"NumberOfProcesses", &result);
pclsObj->Release();
pEnumerator->Release();
return (uint32_t)result;
+1 -1
View File
@@ -18,7 +18,7 @@ next:
{
FFstrbuf antecedent;
ffStrbufInit(&antecedent);
ffGetWmiObjValue(pclsObj, L"Antecedent", &antecedent); // \\.\root\cimv2:Win32_Account.Domain="DOMAIN",Name="NAME"
ffGetWmiObjString(pclsObj, L"Antecedent", &antecedent); // \\.\root\cimv2:Win32_Account.Domain="DOMAIN",Name="NAME"
ffStrbufTrimRight(&antecedent, '"'); // \\.\root\cimv2:Win32_Account.Domain="DOMAIN",Name="NAME
ffStrbufSubstrAfterFirstC(&antecedent, '"'); // DOMAIN",Name="NAME
uint32_t index = ffStrbufFirstIndexC(&antecedent, '"');