sys: FSP_FSCTL_QUERY_WINFSP

The FSP_FSCTL_QUERY_WINFSP code provides a simple method to determine if
the file system backing a file is a WinFsp file system. To use issue a

    DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &Bytes, 0)

If the return value is TRUE this is a WinFsp file system.
This commit is contained in:
Bill Zissimopoulos 2020-05-24 21:04:28 -07:00
parent fc18b70a00
commit 2ffb8a1c97
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
3 changed files with 50 additions and 0 deletions

View File

@ -71,6 +71,10 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
#define FSP_FSCTL_TRANSACT_INTERNAL \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'I', METHOD_NEITHER, FILE_ANY_ACCESS)
/* fsvol device codes */
#define FSP_FSCTL_QUERY_WINFSP \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + '?', METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSP_FSCTL_VOLUME_PARAMS_PREFIX "\\VolumeParams="
#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR))

View File

@ -698,6 +698,10 @@ static NTSTATUS FspFsvolFileSystemControl(
case FSP_FSCTL_WORK_BEST_EFFORT:
Result = FspVolumeWork(FsvolDeviceObject, Irp, IrpSp);
break;
case FSP_FSCTL_QUERY_WINFSP:
Irp->IoStatus.Information = 0;
Result = STATUS_SUCCESS;
break;
case FSCTL_GET_REPARSE_POINT:
Result = FspFsvolFileSystemControlReparsePoint(FsvolDeviceObject, Irp, IrpSp, FALSE);
break;

View File

@ -1930,6 +1930,47 @@ void setvolinfo_test(void)
}
}
void query_winfsp_dotest(ULONG Flags, PWSTR Prefix, ULONG FileInfoTimeout, BOOLEAN ExpectWinFsp)
{
void* memfs = memfs_start_ex(Flags, FileInfoTimeout);
WCHAR FilePath[MAX_PATH];
HANDLE Handle;
DWORD BytesTransferred;
StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s\\",
Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs));
Handle = CreateFileW(FilePath,
0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, 0);
ASSERT(INVALID_HANDLE_VALUE != Handle);
if (ExpectWinFsp)
ASSERT(DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &BytesTransferred, 0));
else
ASSERT(!DeviceIoControl(Handle, FSP_FSCTL_QUERY_WINFSP, 0, 0, 0, 0, &BytesTransferred, 0) &&
ERROR_INVALID_FUNCTION == GetLastError());
CloseHandle(Handle);
memfs_stop(memfs);
}
void query_winfsp_test(void)
{
if (NtfsTests)
{
WCHAR DirBuf[MAX_PATH], DriveBuf[3];
GetTestDirectoryAndDrive(DirBuf, DriveBuf);
query_winfsp_dotest(-1, DriveBuf, 0, FALSE);
}
if (WinFspDiskTests)
query_winfsp_dotest(MemfsDisk, 0, 0, TRUE);
if (WinFspNetTests)
query_winfsp_dotest(MemfsNet, L"\\\\memfs\\share", 0, TRUE);
}
void info_tests(void)
{
if (!OptShareName)
@ -1955,4 +1996,5 @@ void info_tests(void)
TEST(rename_pid_test);
TEST(getvolinfo_test);
TEST(setvolinfo_test);
TEST(query_winfsp_test);
}