Skip to content

Commit 2fc9230

Browse files
committed
Disk (Windows): use sub thread to check accessiblity of remote volumes.
1 parent 5fb1286 commit 2fc9230

File tree

2 files changed

+53
-34
lines changed

2 files changed

+53
-34
lines changed

src/detection/disk/disk_windows.c

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
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+
822
const 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;

src/modules/disk/disk.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,8 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso
406406
yyjson_mut_arr_add_str(doc, typeArr, "Hidden");
407407
if(item->type & FF_DISK_VOLUME_TYPE_READONLY_BIT)
408408
yyjson_mut_arr_add_str(doc, typeArr, "Read-only");
409+
if(item->type & FF_DISK_VOLUME_TYPE_UNKNOWN_BIT)
410+
yyjson_mut_arr_add_str(doc, typeArr, "Unknown");
409411

410412
const char* pstr = ffTimeToFullStr(item->createTime);
411413
if (*pstr)

0 commit comments

Comments
 (0)