sys: FspVolumeGetName: now return concat of VolumeName and VolumePrefix (if network mount)

This commit is contained in:
Bill Zissimopoulos 2016-04-18 12:12:52 -07:00
parent 7ee6a52260
commit 7025dd5cf0
5 changed files with 18 additions and 45 deletions

View File

@ -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
{ {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);