Skip to content

Commit 18233a2

Browse files
committed
Disk (Windows): detect disk physical type
1 parent 9857f48 commit 18233a2

File tree

4 files changed

+43
-2
lines changed

4 files changed

+43
-2
lines changed

src/detection/disk/disk.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,21 @@
55

66
#include "fastfetch.h"
77

8+
typedef enum FFDiskPhysicalType
9+
{
10+
FF_DISK_TYPE_UNKNOWN,
11+
FF_DISK_TYPE_HDD,
12+
FF_DISK_TYPE_SSD,
13+
} FFDiskPhysicalType;
14+
815
typedef struct FFDisk
916
{
1017
FFstrbuf mountFrom;
1118
FFstrbuf mountpoint;
1219
FFstrbuf filesystem;
1320
FFstrbuf name;
1421
FFDiskVolumeType type;
22+
FFDiskPhysicalType physicalType;
1523

1624
uint64_t bytesUsed;
1725
uint64_t bytesFree;

src/detection/disk/disk_bsd.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,15 @@ const char* ffDetectDisksImpl(FFlist* disks)
6464
if(!ffStrStartsWith(fs->f_mntfromname, "/dev/") && !ffStrEquals(fs->f_fstypename, "zfs"))
6565
continue;
6666

67-
FFDisk* disk = ffListAdd(disks);
68-
6967
#ifdef __FreeBSD__
7068
// f_bavail and f_ffree are signed on FreeBSD...
7169
if(fs->f_bavail < 0) fs->f_bavail = 0;
7270
if(fs->f_ffree < 0) fs->f_ffree = 0;
7371
#endif
7472

73+
FFDisk* disk = ffListAdd(disks);
74+
disk->physicalType = FF_DISK_TYPE_UNKNOWN;
75+
7576
disk->bytesTotal = fs->f_blocks * fs->f_bsize;
7677
disk->bytesFree = (uint64_t)fs->f_bfree * fs->f_bsize;
7778
disk->bytesAvailable = (uint64_t)fs->f_bavail * fs->f_bsize;

src/detection/disk/disk_linux.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ const char* ffDetectDisksImpl(FFlist* disks)
277277
//We have a valid device, add it to the list
278278
FFDisk* disk = ffListAdd(disks);
279279
disk->type = FF_DISK_VOLUME_TYPE_NONE;
280+
disk->physicalType = FF_DISK_TYPE_UNKNOWN;
280281

281282
//detect mountFrom
282283
ffStrbufInitS(&disk->mountFrom, device->mnt_fsname);

src/detection/disk/disk_windows.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#include "disk.h"
2+
#include "common/io/io.h"
23
#include "util/windows/unicode.h"
34

45
#include <windows.h>
6+
#include <winioctl.h>
57
#include <assert.h>
68

79
const char* ffDetectDisksImpl(FFlist* disks)
@@ -26,8 +28,37 @@ const char* ffDetectDisksImpl(FFlist* disks)
2628
ffStrbufInitWS(&disk->mountpoint, mountpoint);
2729

2830
wchar_t volumeName[64];
31+
32+
disk->physicalType = FF_DISK_TYPE_UNKNOWN;
33+
if(mountpoint[1] == ':')
34+
{
35+
memcpy(volumeName, L"\\\\.\\ :", sizeof(L"\\\\.\\ :"));
36+
volumeName[4] = mountpoint[0];
37+
FF_AUTO_CLOSE_FD HANDLE handle = CreateFileW(volumeName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
38+
if (handle != INVALID_HANDLE_VALUE)
39+
{
40+
DEVICE_SEEK_PENALTY_DESCRIPTOR dspd = {};
41+
if(DeviceIoControl(
42+
handle,
43+
IOCTL_STORAGE_QUERY_PROPERTY,
44+
&(STORAGE_PROPERTY_QUERY) {
45+
.PropertyId = StorageDeviceSeekPenaltyProperty,
46+
.QueryType = PropertyStandardQuery,
47+
},
48+
sizeof(STORAGE_PROPERTY_QUERY),
49+
&dspd,
50+
sizeof(dspd),
51+
NULL,
52+
NULL
53+
))
54+
disk->physicalType = dspd.IncursSeekPenalty ? FF_DISK_TYPE_HDD : FF_DISK_TYPE_SSD;
55+
}
56+
}
57+
2958
if(GetVolumeNameForVolumeMountPointW(mountpoint, volumeName, sizeof(volumeName) / sizeof(*volumeName)))
59+
{
3060
ffStrbufInitWS(&disk->mountFrom, volumeName);
61+
}
3162
else
3263
ffStrbufInit(&disk->mountFrom);
3364

0 commit comments

Comments
 (0)