This commit is contained in:
Bill Zissimopoulos 2015-11-24 16:36:11 -08:00
parent 25f6bd52a7
commit 324306a784
4 changed files with 16 additions and 6 deletions

View File

@ -29,6 +29,7 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
#define FSP_FSCTL_TRANSACT \ #define FSP_FSCTL_TRANSACT \
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS) CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSP_FSCTL_CREATE_BUFFER_SIZEMAX 64 #define FSP_FSCTL_CREATE_BUFFER_SIZE 64
#define FSP_FSCTL_TRANSACT_BUFFER_SIZE 4096
#endif #endif

View File

@ -191,7 +191,8 @@ typedef struct
typedef struct typedef struct
{ {
FSP_DEVICE_EXTENSION Base; FSP_DEVICE_EXTENSION Base;
FSP_IOQ Ioq; FSP_IOQ TransactIoq, Ioq;
FSP_TRANSACT_THREAD TransactThread;
UINT8 SecurityDescriptorBuf[]; UINT8 SecurityDescriptorBuf[];
} FSP_FSVRT_DEVICE_EXTENSION; } FSP_FSVRT_DEVICE_EXTENSION;
typedef struct typedef struct

View File

@ -41,7 +41,7 @@ static NTSTATUS FspFsctlCreateVolume(
!RtlValidRelativeSecurityDescriptor(SystemBuffer, InputBufferLength, !RtlValidRelativeSecurityDescriptor(SystemBuffer, InputBufferLength,
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION)) OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION))
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
if (FSP_FSCTL_CREATE_BUFFER_SIZEMAX > OutputBufferLength) if (FSP_FSCTL_CREATE_BUFFER_SIZE > OutputBufferLength)
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
NTSTATUS Result; NTSTATUS Result;
@ -63,7 +63,7 @@ static NTSTATUS FspFsctlCreateVolume(
UNICODE_STRING DeviceSddl; UNICODE_STRING DeviceSddl;
UNICODE_STRING DeviceName; UNICODE_STRING DeviceName;
RtlInitUnicodeString(&DeviceSddl, L"" FSP_FSVRT_DEVICE_SDDL); RtlInitUnicodeString(&DeviceSddl, L"" FSP_FSVRT_DEVICE_SDDL);
RtlInitEmptyUnicodeString(&DeviceName, SystemBuffer, FSP_FSCTL_CREATE_BUFFER_SIZEMAX); RtlInitEmptyUnicodeString(&DeviceName, SystemBuffer, FSP_FSCTL_CREATE_BUFFER_SIZE);
Result = RtlUnicodeStringPrintf(&DeviceName, Result = RtlUnicodeStringPrintf(&DeviceName,
L"\\Device\\Volume{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", L"\\Device\\Volume{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
Guid.Data1, Guid.Data2, Guid.Data3, Guid.Data1, Guid.Data2, Guid.Data3,
@ -77,10 +77,17 @@ static NTSTATUS FspFsctlCreateVolume(
&FsvrtDeviceObject); &FsvrtDeviceObject);
if (NT_SUCCESS(Result)) if (NT_SUCCESS(Result))
{ {
FspDeviceExtension(FsvrtDeviceObject)->Kind = FspFsvrtDeviceExtensionKind; FSP_FSVRT_DEVICE_EXTENSION *FsvrtDeviceExtension = FspFsvrtDeviceExtension(FsvrtDeviceObject);
FsvrtDeviceExtension->Base.Kind = FspFsvrtDeviceExtensionKind;
FspIoqInitialize(&FsvrtDeviceExtension->TransactIoq);
FspIoqInitialize(&FsvrtDeviceExtension->Ioq);
Result = FspTransactThreadStart(&FsvrtDeviceExtension->TransactThread,
&FsvrtDeviceExtension->TransactIoq, &FsvrtDeviceExtension->Ioq);
RtlCopyMemory(FspFsvrtDeviceExtension(FsvrtDeviceObject)->SecurityDescriptorBuf, RtlCopyMemory(FspFsvrtDeviceExtension(FsvrtDeviceObject)->SecurityDescriptorBuf,
SecurityDescriptor, InputBufferLength); SecurityDescriptor, InputBufferLength);
Irp->IoStatus.Information = DeviceName.Length + 1; Irp->IoStatus.Information = DeviceName.Length + 1;
if (!NT_SUCCESS(Result))
IoDeleteDevice(FsvrtDeviceObject);
} }
/* free the temporary security descriptor */ /* free the temporary security descriptor */
@ -108,6 +115,7 @@ static NTSTATUS FspFsvrtTransact(
{ {
NTSTATUS Result; NTSTATUS Result;
/* access check */
Result = FspSecuritySubjectContextAccessCheck( Result = FspSecuritySubjectContextAccessCheck(
FspFsvrtDeviceExtension(DeviceObject)->SecurityDescriptorBuf, FspFsvrtDeviceExtension(DeviceObject)->SecurityDescriptorBuf,
FILE_WRITE_DATA, Irp->RequestorMode); FILE_WRITE_DATA, Irp->RequestorMode);

View File

@ -36,7 +36,7 @@ static VOID FspTransactThread(PVOID StartContext)
else if (STATUS_WAIT_1 != Result) else if (STATUS_WAIT_1 != Result)
continue; /* retry */ continue; /* retry */
Irp = FspIoqNextPendingIrp(&TransactThread->TransactIoq, 0); Irp = FspIoqNextPendingIrp(TransactThread->TransactIoq, 0);
if (0 == Irp) if (0 == Irp)
continue; /* retry */ continue; /* retry */
} }