11#include "disk.h"
2+ #include "util/windows/unicode.h"
23
34#include <windows.h>
5+ #include <assert.h>
46
57void 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