From 7025dd5cf049cabb252f673343905a7519b76e52 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 18 Apr 2016 12:12:52 -0700 Subject: [PATCH] sys: FspVolumeGetName: now return concat of VolumeName and VolumePrefix (if network mount) --- inc/winfsp/fsctl.h | 6 ++++-- inc/winfsp/winfsp.h | 1 - src/dll/fs.c | 44 ++++++-------------------------------------- src/sys/driver.h | 3 +-- src/sys/volume.c | 9 +++++++-- 5 files changed, 18 insertions(+), 45 deletions(-) diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h index 14e641ab..577dadf1 100644 --- a/inc/winfsp/fsctl.h +++ b/inc/winfsp/fsctl.h @@ -41,7 +41,9 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid = #define FSP_FSCTL_STOP \ CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'S', METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSP_FSCTL_VOLUME_NAME_SIZEMAX 128 +#define FSP_FSCTL_VOLUME_NAME_SIZE (64 * sizeof(WCHAR)) +#define FSP_FSCTL_VOLUME_PREFIX_SIZE (64 * sizeof(WCHAR)) +#define FSP_FSCTL_VOLUME_NAME_SIZEMAX (FSP_FSCTL_VOLUME_NAME_SIZE + FSP_FSCTL_VOLUME_PREFIX_SIZE) #define FSP_FSCTL_TRANSACT_REQ_SIZEMAX (4096 - 64) /* 64: size for internal request header */ #define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (4096 - 64) /* symmetry! */ @@ -113,7 +115,7 @@ typedef struct UINT32 HardLinks:1; /* unimplemented; set to 0 */ UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */ UINT32 ReadOnlyVolume:1; - WCHAR Prefix[64]; /* UNC prefix to recognize (\\server\path format, 0-term) */ + WCHAR Prefix[FSP_FSCTL_VOLUME_PREFIX_SIZE / sizeof(WCHAR)]; /* UNC prefix (\Server\Share) */ } FSP_FSCTL_VOLUME_PARAMS; typedef struct { diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h index ea639a80..05e4304e 100644 --- a/inc/winfsp/winfsp.h +++ b/inc/winfsp/winfsp.h @@ -551,7 +551,6 @@ typedef struct _FSP_FILE_SYSTEM { UINT16 Version; PVOID UserContext; - WCHAR VolumePrefix[sizeof(((FSP_FSCTL_VOLUME_PARAMS *)0)->Prefix) / sizeof(WCHAR)]; WCHAR VolumeName[FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR)]; HANDLE VolumeHandle; FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation, *LeaveOperation; diff --git a/src/dll/fs.c b/src/dll/fs.c index 24d89e15..22f2dffd 100644 --- a/src/dll/fs.c +++ b/src/dll/fs.c @@ -16,29 +16,6 @@ static FSP_FILE_SYSTEM_INTERFACE FspFileSystemNullInterface; static CRITICAL_SECTION FspFileSystemMountListGuard; static LIST_ENTRY FspFileSystemMountList = { &FspFileSystemMountList, &FspFileSystemMountList }; -static inline -BOOL FspFileSystemDefineDosDevice(DWORD Flags, PWSTR MountPoint, FSP_FILE_SYSTEM *FileSystem) -{ - WCHAR TargetBuf[( - sizeof(((FSP_FILE_SYSTEM *)0)->VolumePrefix) + - sizeof(((FSP_FILE_SYSTEM *)0)->VolumeName)) / sizeof(WCHAR)]; - PWSTR P; - ULONG L0, L1; - - for (P = FileSystem->VolumeName; *P; P++) - ; - L0 = (ULONG)(P - FileSystem->VolumeName); - memcpy(TargetBuf, FileSystem->VolumeName, L0 * sizeof(WCHAR)); - - for (P = FileSystem->VolumePrefix; *P; P++) - ; - L1 = (ULONG)(P - FileSystem->VolumePrefix); - memcpy(TargetBuf + L0, FileSystem->VolumePrefix, L1 * sizeof(WCHAR)); - TargetBuf[L0 + L1] = L'\0'; - - return DefineDosDeviceW(Flags, MountPoint, TargetBuf); -} - VOID FspFileSystemInitialize(VOID) { /* @@ -85,9 +62,9 @@ VOID FspFileSystemFinalize(VOID) { FileSystem = CONTAINING_RECORD(MountEntry, FSP_FILE_SYSTEM, MountEntry); - FspFileSystemDefineDosDevice( + DefineDosDeviceW( DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, - FileSystem->MountPoint, FileSystem); + FileSystem->MountPoint, FileSystem->VolumeName); } LeaveCriticalSection(&FspFileSystemMountListGuard); @@ -100,7 +77,6 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, { NTSTATUS Result; FSP_FILE_SYSTEM *FileSystem; - ULONG PrefixLength; *PFileSystem = 0; @@ -121,14 +97,6 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath, return Result; } - memcpy(FileSystem->VolumePrefix, VolumeParams->Prefix, sizeof VolumeParams->Prefix); - FileSystem->VolumePrefix[sizeof FileSystem->VolumePrefix / sizeof(WCHAR) - 1] = L'\0'; - for (PrefixLength = 0; L'\0' != FileSystem->VolumePrefix[PrefixLength]; PrefixLength++) - ; - for (; 0 < PrefixLength && L'\\' == FileSystem->VolumePrefix[PrefixLength - 1]; PrefixLength--) - ; - FileSystem->VolumePrefix[PrefixLength] = L'\0'; - FileSystem->Operations[FspFsctlTransactCreateKind] = FspFileSystemOpCreate; FileSystem->Operations[FspFsctlTransactOverwriteKind] = FspFileSystemOpOverwrite; FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup; @@ -183,7 +151,7 @@ FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR M if (0 == (Drives & (1 << (Drive - 'A')))) { MountPoint[0] = Drive; - if (FspFileSystemDefineDosDevice(DDD_RAW_TARGET_PATH, MountPoint, FileSystem)) + if (DefineDosDeviceW(DDD_RAW_TARGET_PATH, MountPoint, FileSystem->VolumeName)) { Result = STATUS_SUCCESS; goto exit; @@ -209,7 +177,7 @@ FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR M memcpy(P, MountPoint, L); MountPoint = P; - if (FspFileSystemDefineDosDevice(DDD_RAW_TARGET_PATH, MountPoint, FileSystem)) + if (DefineDosDeviceW(DDD_RAW_TARGET_PATH, MountPoint, FileSystem->VolumeName)) Result = STATUS_SUCCESS; else Result = FspNtStatusFromWin32(GetLastError()); @@ -239,8 +207,8 @@ FSP_API VOID FspFileSystemRemoveMountPoint(FSP_FILE_SYSTEM *FileSystem) RemoveEntryList(&FileSystem->MountEntry); LeaveCriticalSection(&FspFileSystemMountListGuard); - FspFileSystemDefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, - FileSystem->MountPoint, FileSystem); + DefineDosDeviceW(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, + FileSystem->MountPoint, FileSystem->VolumeName); MemFree(FileSystem->MountPoint); FileSystem->MountPoint = 0; diff --git a/src/sys/driver.h b/src/sys/driver.h index 8aa5d764..88ad5034 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -700,7 +700,6 @@ VOID FspWqPostIrpWorkItem(PIRP Irp); FspWqCreateAndPostIrpWorkItem(I, RW, RF, TRUE) /* device management */ -#define FSP_DEVICE_VOLUME_NAME_LENMAX (FSP_FSCTL_VOLUME_NAME_SIZEMAX - sizeof(WCHAR)) enum { FspFsvolDeviceSecurityCacheCapacity = 100, @@ -766,7 +765,7 @@ typedef struct RTL_AVL_TABLE ContextByNameTable; PVOID ContextByNameTableElementStorage; UNICODE_STRING VolumeName; - WCHAR VolumeNameBuf[FSP_DEVICE_VOLUME_NAME_LENMAX / sizeof(WCHAR)]; + WCHAR VolumeNameBuf[FSP_FSCTL_VOLUME_NAME_SIZE / sizeof(WCHAR)]; KSPIN_LOCK InfoSpinLock; UINT64 InfoExpirationTime; FSP_FSCTL_VOLUME_INFO VolumeInfo; diff --git a/src/sys/volume.c b/src/sys/volume.c index 4717f2d2..ce514c32 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -68,7 +68,7 @@ NTSTATUS FspVolumeCreate( GUID Guid; UNICODE_STRING DeviceSddl; UNICODE_STRING VolumeName; - WCHAR VolumeNameBuf[FSP_DEVICE_VOLUME_NAME_LENMAX / sizeof(WCHAR)]; + WCHAR VolumeNameBuf[FSP_FSCTL_VOLUME_NAME_SIZE / sizeof(WCHAR)]; PDEVICE_OBJECT FsvolDeviceObject; PDEVICE_OBJECT FsvrtDeviceObject; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; @@ -146,6 +146,7 @@ NTSTATUS FspVolumeCreate( Guid.Data4[0], Guid.Data4[1], Guid.Data4[2], Guid.Data4[3], Guid.Data4[4], Guid.Data4[5], Guid.Data4[6], Guid.Data4[7]); ASSERT(NT_SUCCESS(Result)); + VolumeName.MaximumLength = VolumeName.Length; /* create the volume (and virtual disk) device(s) */ Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, 0, @@ -495,10 +496,14 @@ NTSTATUS FspVolumeGetName( UNICODE_STRING VolumeName; ASSERT(FSP_FSCTL_VOLUME_NAME_SIZEMAX >= - FsvolDeviceExtension->VolumeName.MaximumLength + sizeof(WCHAR)); + FsvolDeviceExtension->VolumeName.MaximumLength + + FsvolDeviceExtension->VolumePrefix.MaximumLength + + sizeof(WCHAR)); RtlInitEmptyUnicodeString(&VolumeName, SystemBuffer, FSP_FSCTL_VOLUME_NAME_SIZEMAX); RtlCopyUnicodeString(&VolumeName, &FsvolDeviceExtension->VolumeName); + if (FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType) + RtlAppendUnicodeStringToString(&VolumeName, &FsvolDeviceExtension->VolumePrefix); VolumeName.Buffer[VolumeName.Length / sizeof(WCHAR)] = L'\0'; Irp->IoStatus.Information = VolumeName.Length + sizeof(WCHAR);