mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
sys: FspVolumeGetName: now return concat of VolumeName and VolumePrefix (if network mount)
This commit is contained in:
parent
7ee6a52260
commit
7025dd5cf0
@ -41,7 +41,9 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
#define FSP_FSCTL_STOP \
|
#define FSP_FSCTL_STOP \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'S', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
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_REQ_SIZEMAX (4096 - 64) /* 64: size for internal request header */
|
||||||
#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (4096 - 64) /* symmetry! */
|
#define FSP_FSCTL_TRANSACT_RSP_SIZEMAX (4096 - 64) /* symmetry! */
|
||||||
@ -113,7 +115,7 @@ typedef struct
|
|||||||
UINT32 HardLinks:1; /* unimplemented; set to 0 */
|
UINT32 HardLinks:1; /* unimplemented; set to 0 */
|
||||||
UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */
|
UINT32 ExtendedAttributes:1; /* unimplemented; set to 0 */
|
||||||
UINT32 ReadOnlyVolume:1;
|
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;
|
} FSP_FSCTL_VOLUME_PARAMS;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -551,7 +551,6 @@ typedef struct _FSP_FILE_SYSTEM
|
|||||||
{
|
{
|
||||||
UINT16 Version;
|
UINT16 Version;
|
||||||
PVOID UserContext;
|
PVOID UserContext;
|
||||||
WCHAR VolumePrefix[sizeof(((FSP_FSCTL_VOLUME_PARAMS *)0)->Prefix) / sizeof(WCHAR)];
|
|
||||||
WCHAR VolumeName[FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR)];
|
WCHAR VolumeName[FSP_FSCTL_VOLUME_NAME_SIZEMAX / sizeof(WCHAR)];
|
||||||
HANDLE VolumeHandle;
|
HANDLE VolumeHandle;
|
||||||
FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation, *LeaveOperation;
|
FSP_FILE_SYSTEM_OPERATION_GUARD *EnterOperation, *LeaveOperation;
|
||||||
|
44
src/dll/fs.c
44
src/dll/fs.c
@ -16,29 +16,6 @@ static FSP_FILE_SYSTEM_INTERFACE FspFileSystemNullInterface;
|
|||||||
static CRITICAL_SECTION FspFileSystemMountListGuard;
|
static CRITICAL_SECTION FspFileSystemMountListGuard;
|
||||||
static LIST_ENTRY FspFileSystemMountList = { &FspFileSystemMountList, &FspFileSystemMountList };
|
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)
|
VOID FspFileSystemInitialize(VOID)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -85,9 +62,9 @@ VOID FspFileSystemFinalize(VOID)
|
|||||||
{
|
{
|
||||||
FileSystem = CONTAINING_RECORD(MountEntry, FSP_FILE_SYSTEM, MountEntry);
|
FileSystem = CONTAINING_RECORD(MountEntry, FSP_FILE_SYSTEM, MountEntry);
|
||||||
|
|
||||||
FspFileSystemDefineDosDevice(
|
DefineDosDeviceW(
|
||||||
DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
||||||
FileSystem->MountPoint, FileSystem);
|
FileSystem->MountPoint, FileSystem->VolumeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&FspFileSystemMountListGuard);
|
LeaveCriticalSection(&FspFileSystemMountListGuard);
|
||||||
@ -100,7 +77,6 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
|
|||||||
{
|
{
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_FILE_SYSTEM *FileSystem;
|
FSP_FILE_SYSTEM *FileSystem;
|
||||||
ULONG PrefixLength;
|
|
||||||
|
|
||||||
*PFileSystem = 0;
|
*PFileSystem = 0;
|
||||||
|
|
||||||
@ -121,14 +97,6 @@ FSP_API NTSTATUS FspFileSystemCreate(PWSTR DevicePath,
|
|||||||
return Result;
|
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[FspFsctlTransactCreateKind] = FspFileSystemOpCreate;
|
||||||
FileSystem->Operations[FspFsctlTransactOverwriteKind] = FspFileSystemOpOverwrite;
|
FileSystem->Operations[FspFsctlTransactOverwriteKind] = FspFileSystemOpOverwrite;
|
||||||
FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup;
|
FileSystem->Operations[FspFsctlTransactCleanupKind] = FspFileSystemOpCleanup;
|
||||||
@ -183,7 +151,7 @@ FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR M
|
|||||||
if (0 == (Drives & (1 << (Drive - 'A'))))
|
if (0 == (Drives & (1 << (Drive - 'A'))))
|
||||||
{
|
{
|
||||||
MountPoint[0] = Drive;
|
MountPoint[0] = Drive;
|
||||||
if (FspFileSystemDefineDosDevice(DDD_RAW_TARGET_PATH, MountPoint, FileSystem))
|
if (DefineDosDeviceW(DDD_RAW_TARGET_PATH, MountPoint, FileSystem->VolumeName))
|
||||||
{
|
{
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -209,7 +177,7 @@ FSP_API NTSTATUS FspFileSystemSetMountPoint(FSP_FILE_SYSTEM *FileSystem, PWSTR M
|
|||||||
memcpy(P, MountPoint, L);
|
memcpy(P, MountPoint, L);
|
||||||
MountPoint = P;
|
MountPoint = P;
|
||||||
|
|
||||||
if (FspFileSystemDefineDosDevice(DDD_RAW_TARGET_PATH, MountPoint, FileSystem))
|
if (DefineDosDeviceW(DDD_RAW_TARGET_PATH, MountPoint, FileSystem->VolumeName))
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
else
|
else
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
@ -239,8 +207,8 @@ FSP_API VOID FspFileSystemRemoveMountPoint(FSP_FILE_SYSTEM *FileSystem)
|
|||||||
RemoveEntryList(&FileSystem->MountEntry);
|
RemoveEntryList(&FileSystem->MountEntry);
|
||||||
LeaveCriticalSection(&FspFileSystemMountListGuard);
|
LeaveCriticalSection(&FspFileSystemMountListGuard);
|
||||||
|
|
||||||
FspFileSystemDefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
DefineDosDeviceW(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE,
|
||||||
FileSystem->MountPoint, FileSystem);
|
FileSystem->MountPoint, FileSystem->VolumeName);
|
||||||
|
|
||||||
MemFree(FileSystem->MountPoint);
|
MemFree(FileSystem->MountPoint);
|
||||||
FileSystem->MountPoint = 0;
|
FileSystem->MountPoint = 0;
|
||||||
|
@ -700,7 +700,6 @@ VOID FspWqPostIrpWorkItem(PIRP Irp);
|
|||||||
FspWqCreateAndPostIrpWorkItem(I, RW, RF, TRUE)
|
FspWqCreateAndPostIrpWorkItem(I, RW, RF, TRUE)
|
||||||
|
|
||||||
/* device management */
|
/* device management */
|
||||||
#define FSP_DEVICE_VOLUME_NAME_LENMAX (FSP_FSCTL_VOLUME_NAME_SIZEMAX - sizeof(WCHAR))
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
FspFsvolDeviceSecurityCacheCapacity = 100,
|
FspFsvolDeviceSecurityCacheCapacity = 100,
|
||||||
@ -766,7 +765,7 @@ typedef struct
|
|||||||
RTL_AVL_TABLE ContextByNameTable;
|
RTL_AVL_TABLE ContextByNameTable;
|
||||||
PVOID ContextByNameTableElementStorage;
|
PVOID ContextByNameTableElementStorage;
|
||||||
UNICODE_STRING VolumeName;
|
UNICODE_STRING VolumeName;
|
||||||
WCHAR VolumeNameBuf[FSP_DEVICE_VOLUME_NAME_LENMAX / sizeof(WCHAR)];
|
WCHAR VolumeNameBuf[FSP_FSCTL_VOLUME_NAME_SIZE / sizeof(WCHAR)];
|
||||||
KSPIN_LOCK InfoSpinLock;
|
KSPIN_LOCK InfoSpinLock;
|
||||||
UINT64 InfoExpirationTime;
|
UINT64 InfoExpirationTime;
|
||||||
FSP_FSCTL_VOLUME_INFO VolumeInfo;
|
FSP_FSCTL_VOLUME_INFO VolumeInfo;
|
||||||
|
@ -68,7 +68,7 @@ NTSTATUS FspVolumeCreate(
|
|||||||
GUID Guid;
|
GUID Guid;
|
||||||
UNICODE_STRING DeviceSddl;
|
UNICODE_STRING DeviceSddl;
|
||||||
UNICODE_STRING VolumeName;
|
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 FsvolDeviceObject;
|
||||||
PDEVICE_OBJECT FsvrtDeviceObject;
|
PDEVICE_OBJECT FsvrtDeviceObject;
|
||||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension;
|
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[0], Guid.Data4[1], Guid.Data4[2], Guid.Data4[3],
|
||||||
Guid.Data4[4], Guid.Data4[5], Guid.Data4[6], Guid.Data4[7]);
|
Guid.Data4[4], Guid.Data4[5], Guid.Data4[6], Guid.Data4[7]);
|
||||||
ASSERT(NT_SUCCESS(Result));
|
ASSERT(NT_SUCCESS(Result));
|
||||||
|
VolumeName.MaximumLength = VolumeName.Length;
|
||||||
|
|
||||||
/* create the volume (and virtual disk) device(s) */
|
/* create the volume (and virtual disk) device(s) */
|
||||||
Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, 0,
|
Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, 0,
|
||||||
@ -495,10 +496,14 @@ NTSTATUS FspVolumeGetName(
|
|||||||
UNICODE_STRING VolumeName;
|
UNICODE_STRING VolumeName;
|
||||||
|
|
||||||
ASSERT(FSP_FSCTL_VOLUME_NAME_SIZEMAX >=
|
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);
|
RtlInitEmptyUnicodeString(&VolumeName, SystemBuffer, FSP_FSCTL_VOLUME_NAME_SIZEMAX);
|
||||||
RtlCopyUnicodeString(&VolumeName, &FsvolDeviceExtension->VolumeName);
|
RtlCopyUnicodeString(&VolumeName, &FsvolDeviceExtension->VolumeName);
|
||||||
|
if (FILE_DEVICE_NETWORK_FILE_SYSTEM == FsctlDeviceObject->DeviceType)
|
||||||
|
RtlAppendUnicodeStringToString(&VolumeName, &FsvolDeviceExtension->VolumePrefix);
|
||||||
VolumeName.Buffer[VolumeName.Length / sizeof(WCHAR)] = L'\0';
|
VolumeName.Buffer[VolumeName.Length / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
Irp->IoStatus.Information = VolumeName.Length + sizeof(WCHAR);
|
Irp->IoStatus.Information = VolumeName.Length + sizeof(WCHAR);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user