11#include "disk.h"
22#include "common/io/io.h"
3+ #include "common/thread.h"
34#include "util/windows/unicode.h"
45
56#include <windows.h>
67#include <winioctl.h>
78
9+ static unsigned __stdcall testRemoteVolumeAccessable (void * mountpoint )
10+ {
11+ FF_AUTO_CLOSE_FD HANDLE handle = CreateFileW (
12+ (wchar_t * ) mountpoint ,
13+ READ_CONTROL ,
14+ FILE_SHARE_READ ,
15+ NULL ,
16+ OPEN_EXISTING ,
17+ FILE_FLAG_BACKUP_SEMANTICS ,
18+ NULL );
19+ return 0 ;
20+ }
21+
822const char * ffDetectDisksImpl (FFDiskOptions * options , FFlist * disks )
923{
1024 wchar_t buf [MAX_PATH + 1 ];
@@ -41,28 +55,48 @@ const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
4155
4256 FFDisk * disk = ffListAdd (disks );
4357
44- if (!GetDiskFreeSpaceExW (
58+ disk -> filesUsed = 0 ;
59+ disk -> filesTotal = 0 ;
60+ disk -> bytesTotal = 0 ;
61+ disk -> bytesFree = 0 ;
62+ disk -> bytesUsed = 0 ; // To be filled in ./disk.c
63+ disk -> bytesAvailable = 0 ;
64+ disk -> createTime = 0 ;
65+ ffStrbufInit (& disk -> filesystem );
66+ ffStrbufInit (& disk -> name );
67+ ffStrbufInitMove (& disk -> mountpoint , & buffer );
68+ ffStrbufInit (& disk -> mountFrom );
69+ disk -> type = driveType == DRIVE_REMOVABLE || driveType == DRIVE_REMOTE || driveType == DRIVE_CDROM
70+ ? FF_DISK_VOLUME_TYPE_EXTERNAL_BIT
71+ : driveType == DRIVE_FIXED
72+ ? FF_DISK_VOLUME_TYPE_REGULAR_BIT
73+ : FF_DISK_VOLUME_TYPE_HIDDEN_BIT ;
74+
75+ if (mountpoint [2 ] == L'\\' && mountpoint [3 ] == L'\0' )
76+ {
77+ wchar_t volumeName [MAX_PATH + 1 ];
78+ mountpoint [2 ] = L'\0' ;
79+ if (QueryDosDeviceW (mountpoint , volumeName , sizeof (volumeName ) / sizeof (* volumeName )))
80+ ffStrbufSetWS (& disk -> mountFrom , volumeName );
81+ mountpoint [2 ] = L'\\' ;
82+ }
83+
84+ #ifdef FF_HAVE_THREADS
85+ if (driveType == DRIVE_REMOTE )
86+ {
87+ FFThreadType thread = ffThreadCreate (testRemoteVolumeAccessable , mountpoint );
88+ if (!ffThreadJoin (thread , 500 ))
89+ continue ;
90+ }
91+ #endif
92+
93+ GetDiskFreeSpaceExW (
4594 mountpoint ,
4695 (PULARGE_INTEGER )& disk -> bytesAvailable ,
4796 (PULARGE_INTEGER )& disk -> bytesTotal ,
4897 (PULARGE_INTEGER )& disk -> bytesFree
49- ))
50- {
51- disk -> bytesTotal = 0 ;
52- disk -> bytesFree = 0 ;
53- disk -> bytesAvailable = 0 ;
54- }
55- disk -> bytesUsed = 0 ; // To be filled in ./disk.c
56-
57- if (driveType == DRIVE_REMOVABLE || driveType == DRIVE_REMOTE || driveType == DRIVE_CDROM )
58- disk -> type = FF_DISK_VOLUME_TYPE_EXTERNAL_BIT ;
59- else if (driveType == DRIVE_FIXED )
60- disk -> type = FF_DISK_VOLUME_TYPE_REGULAR_BIT ;
61- else
62- disk -> type = FF_DISK_VOLUME_TYPE_HIDDEN_BIT ;
98+ );
6399
64- ffStrbufInit (& disk -> filesystem );
65- ffStrbufInit (& disk -> name );
66100 wchar_t diskName [MAX_PATH + 1 ], diskFileSystem [MAX_PATH + 1 ];
67101
68102 //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa#remarks
@@ -89,23 +123,6 @@ const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
89123 WIN32_FILE_ATTRIBUTE_DATA data ;
90124 if (GetFileAttributesExW (mountpoint , GetFileExInfoStandard , & data ) && data .ftCreationTime .dwHighDateTime > 0 )
91125 disk -> createTime = (* (uint64_t * ) & data .ftCreationTime - 116444736000000000ull ) / 10000ull ;
92- else
93- disk -> createTime = 0 ;
94-
95- ffStrbufInitMove (& disk -> mountpoint , & buffer );
96- if (mountpoint [2 ] == L'\\' && mountpoint [3 ] == L'\0' )
97- {
98- wchar_t volumeName [MAX_PATH + 1 ];
99- mountpoint [2 ] = L'\0' ;
100- if (QueryDosDeviceW (mountpoint , volumeName , sizeof (volumeName ) / sizeof (* volumeName )))
101- ffStrbufInitWS (& disk -> mountFrom , volumeName );
102- else
103- ffStrbufInit (& disk -> mountFrom );
104- }
105-
106- //Unsupported
107- disk -> filesUsed = 0 ;
108- disk -> filesTotal = 0 ;
109126 }
110127
111128 return NULL ;
0 commit comments