mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
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:
parent
fc18b70a00
commit
2ffb8a1c97
@ -71,6 +71,10 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
#define FSP_FSCTL_TRANSACT_INTERNAL \
|
#define FSP_FSCTL_TRANSACT_INTERNAL \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'I', METHOD_NEITHER, FILE_ANY_ACCESS)
|
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_PARAMS_PREFIX "\\VolumeParams="
|
||||||
|
|
||||||
#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR))
|
#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR))
|
||||||
|
@ -698,6 +698,10 @@ static NTSTATUS FspFsvolFileSystemControl(
|
|||||||
case FSP_FSCTL_WORK_BEST_EFFORT:
|
case FSP_FSCTL_WORK_BEST_EFFORT:
|
||||||
Result = FspVolumeWork(FsvolDeviceObject, Irp, IrpSp);
|
Result = FspVolumeWork(FsvolDeviceObject, Irp, IrpSp);
|
||||||
break;
|
break;
|
||||||
|
case FSP_FSCTL_QUERY_WINFSP:
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
case FSCTL_GET_REPARSE_POINT:
|
case FSCTL_GET_REPARSE_POINT:
|
||||||
Result = FspFsvolFileSystemControlReparsePoint(FsvolDeviceObject, Irp, IrpSp, FALSE);
|
Result = FspFsvolFileSystemControlReparsePoint(FsvolDeviceObject, Irp, IrpSp, FALSE);
|
||||||
break;
|
break;
|
||||||
|
@ -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)
|
void info_tests(void)
|
||||||
{
|
{
|
||||||
if (!OptShareName)
|
if (!OptShareName)
|
||||||
@ -1955,4 +1996,5 @@ void info_tests(void)
|
|||||||
TEST(rename_pid_test);
|
TEST(rename_pid_test);
|
||||||
TEST(getvolinfo_test);
|
TEST(getvolinfo_test);
|
||||||
TEST(setvolinfo_test);
|
TEST(setvolinfo_test);
|
||||||
|
TEST(query_winfsp_test);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user