From 2979bfe4ca783f742c111483c6c1922208877e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Dec 2023 18:17:28 +0800 Subject: [PATCH] DiskIO: detect physical drive size --- src/detection/diskio/diskio.h | 1 + src/detection/diskio/diskio_apple.c | 1 + src/detection/diskio/diskio_bsd.c | 1 + src/detection/diskio/diskio_linux.c | 6 ++++++ src/detection/diskio/diskio_windows.c | 14 ++++++++++++++ src/modules/diskio/diskio.c | 5 +++++ 6 files changed, 28 insertions(+) diff --git a/src/detection/diskio/diskio.h b/src/detection/diskio/diskio.h index 7bde1cc325..0f8b39f569 100644 --- a/src/detection/diskio/diskio.h +++ b/src/detection/diskio/diskio.h @@ -14,6 +14,7 @@ typedef struct FFDiskIOResult FFstrbuf name; FFstrbuf interconnect; FFDiskIOPhysicalType type; + uint64_t size; FFstrbuf devPath; uint64_t bytesRead; uint64_t readCount; diff --git a/src/detection/diskio/diskio_apple.c b/src/detection/diskio/diskio_apple.c index cdaadfa579..82fd3928ff 100644 --- a/src/detection/diskio/diskio_apple.c +++ b/src/detection/diskio/diskio_apple.c @@ -49,6 +49,7 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) ffStrbufInitS(&device->name, deviceName); ffStrbufInit(&device->devPath); device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; + device->size = 0; ffCfDictGetInt64(statistics, CFSTR(kIOBlockStorageDriverStatisticsBytesReadKey), (int64_t*) &device->bytesRead); ffCfDictGetInt64(statistics, CFSTR(kIOBlockStorageDriverStatisticsBytesWrittenKey), (int64_t*) &device->bytesWritten); diff --git a/src/detection/diskio/diskio_bsd.c b/src/detection/diskio/diskio_bsd.c index 62b8aa2520..658e4e5a08 100644 --- a/src/detection/diskio/diskio_bsd.c +++ b/src/detection/diskio/diskio_bsd.c @@ -27,6 +27,7 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) continue; FFDiskIOResult* device = (FFDiskIOResult*) ffListAdd(result); + device->size = 0; ffStrbufInitS(&device->name, deviceName); ffStrbufInitF(&device->devPath, "/dev/%s", deviceName); device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; diff --git a/src/detection/diskio/diskio_linux.c b/src/detection/diskio/diskio_linux.c index fe505fd9e4..3737789be1 100644 --- a/src/detection/diskio/diskio_linux.c +++ b/src/detection/diskio/diskio_linux.c @@ -102,6 +102,12 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) device->type = ffStrbufEqualS(&buffer, "1") ? FF_DISKIO_PHYSICAL_TYPE_HDD : FF_DISKIO_PHYSICAL_TYPE_SSD; else device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; + + snprintf(pathSysBlock, PATH_MAX, "/sys/block/%s/size", devName); + if (ffReadFileBuffer(pathSysBlock, &buffer)) + device->size = ffStrbufToUInt(&buffer, 0); + else + device->size = 0; } return NULL; diff --git a/src/detection/diskio/diskio_windows.c b/src/detection/diskio/diskio_windows.c index c2e71f41e3..0fe06faf74 100644 --- a/src/detection/diskio/diskio_windows.c +++ b/src/detection/diskio/diskio_windows.c @@ -82,6 +82,20 @@ const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) device->type = dspd.IncursSeekPenalty ? FF_DISKIO_PHYSICAL_TYPE_HDD : FF_DISKIO_PHYSICAL_TYPE_SSD; else device->type = FF_DISKIO_PHYSICAL_TYPE_UNKNOWN; + + DISK_GEOMETRY_EX dge = {}; + if(DeviceIoControl( + hDevice, + IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, + NULL, + 0, + &dge, + sizeof(dge), + &retSize, + NULL)) + device->size = (uint64_t) dge.DiskSize.QuadPart; + else + device->size = 0; } } diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index b7b77c2d98..11fc4f02bb 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -87,6 +87,8 @@ void ffPrintDiskIO(FFDiskIOOptions* options) physicalType = "Unknown"; break; } + FF_STRBUF_AUTO_DESTROY sizePretty = ffStrbufCreate(); + ffParseSize(dev->size, &sizePretty); ffPrintFormatString(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, FF_DISKIO_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &buffer}, @@ -99,6 +101,7 @@ void ffPrintDiskIO(FFDiskIOOptions* options) {FF_FORMAT_ARG_TYPE_UINT64, &dev->bytesWritten}, {FF_FORMAT_ARG_TYPE_UINT64, &dev->readCount}, {FF_FORMAT_ARG_TYPE_UINT64, &dev->writeCount}, + {FF_FORMAT_ARG_TYPE_STRBUF, &sizePretty}, }); } ++index; @@ -198,6 +201,7 @@ void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, y yyjson_mut_obj_add_uint(doc, obj, "bytesWritten", dev->bytesWritten); yyjson_mut_obj_add_uint(doc, obj, "readCount", dev->readCount); yyjson_mut_obj_add_uint(doc, obj, "writeCount", dev->writeCount); + yyjson_mut_obj_add_uint(doc, obj, "size", dev->size); } FF_LIST_FOR_EACH(FFDiskIOResult, dev, result) @@ -221,6 +225,7 @@ void ffPrintDiskIOHelpFormat(void) "Size of data written per second (in bytes)", "Number of reads", "Number of writes", + "Device size (formatted)", }); }