Skip to content

Commit 0a946e3

Browse files
committed
Disk (Windows): improve performance
1 parent a339f00 commit 0a946e3

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

src/detection/disk/disk_windows.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,31 @@
11
#include "disk.h"
2+
#include "util/windows/unicode.h"
23

34
#include <windows.h>
5+
#include <assert.h>
46

57
void ffDetectDisksImpl(FFDiskResult* disks)
68
{
7-
uint32_t length = GetLogicalDriveStringsA(0, NULL);
8-
if(length == 0)
9-
{
10-
ffStrbufAppendS(&disks->error, "GetLogicalDriveStringsA failed");
11-
return;
12-
}
13-
14-
char* buf = malloc(length + 1);
15-
GetLogicalDriveStringsA(length, buf);
9+
wchar_t buf[MAX_PATH + 1];
10+
uint32_t length = GetLogicalDriveStringsW(sizeof(buf) / sizeof(*buf), buf);
11+
assert(length < sizeof(buf) / sizeof(*buf));
1612

1713
for(uint32_t i = 0; i < length; i++)
1814
{
19-
const char* mountpoint = buf + i;
15+
const wchar_t* mountpoint = buf + i;
2016

21-
UINT driveType = GetDriveTypeA(mountpoint);
17+
UINT driveType = GetDriveTypeW(mountpoint);
2218
if(driveType == DRIVE_NO_ROOT_DIR)
2319
{
24-
i += (uint32_t)strlen(mountpoint);
20+
i += (uint32_t)wcslen(mountpoint);
2521
continue;
2622
}
2723

2824
FFDisk* disk = ffListAdd(&disks->disks);
29-
ffStrbufInitS(&disk->mountpoint, mountpoint);
25+
ffStrbufInitWS(&disk->mountpoint, mountpoint);
3026

3127
uint64_t bytesFree;
32-
if(!GetDiskFreeSpaceExA(mountpoint, NULL, (PULARGE_INTEGER)&disk->bytesTotal, (PULARGE_INTEGER)&bytesFree))
28+
if(!GetDiskFreeSpaceExW(mountpoint, NULL, (PULARGE_INTEGER)&disk->bytesTotal, (PULARGE_INTEGER)&bytesFree))
3329
{
3430
disk->bytesTotal = 0;
3531
bytesFree = 0;
@@ -43,27 +39,32 @@ void ffDetectDisksImpl(FFDiskResult* disks)
4339
else
4440
disk->type = FF_DISK_TYPE_HIDDEN;
4541

46-
ffStrbufInitA(&disk->filesystem, MAX_PATH + 1);
47-
ffStrbufInitA(&disk->name, MAX_PATH + 1);
42+
ffStrbufInit(&disk->filesystem);
43+
ffStrbufInit(&disk->name);
44+
wchar_t diskName[MAX_PATH + 1], diskFileSystem[MAX_PATH + 1];
45+
4846
//https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa#remarks
4947
UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
50-
GetVolumeInformationA(mountpoint,
51-
disk->name.chars, disk->name.allocated, //Volume name
48+
49+
BOOL result = GetVolumeInformationW(mountpoint,
50+
diskName, sizeof(diskName) / sizeof(*diskName), //Volume name
5251
NULL, //Serial number
5352
NULL, //Max component length
5453
NULL, //File system flags
55-
disk->filesystem.chars, disk->filesystem.allocated
54+
diskFileSystem, sizeof(diskFileSystem) / sizeof(*diskFileSystem)
5655
);
5756
SetErrorMode(errorMode);
58-
ffStrbufRecalculateLength(&disk->name);
59-
ffStrbufRecalculateLength(&disk->filesystem);
57+
58+
if(result)
59+
{
60+
ffStrbufSetWS(&disk->filesystem, diskFileSystem);
61+
ffStrbufSetWS(&disk->name, diskName);
62+
}
6063

6164
//TODO: implement
6265
disk->filesUsed = 0;
6366
disk->filesTotal = 0;
6467

6568
i += disk->mountpoint.length;
6669
}
67-
68-
free(buf);
6970
}

0 commit comments

Comments
 (0)