mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 13:02:10 -05:00
sys: FspVolumeTransact: support both METHOD_BUFFERED and METHOD_OUT_DIRECT
This commit is contained in:
parent
f61aa5a9bb
commit
678f175713
@ -35,7 +35,7 @@ extern const __declspec(selectany) GUID FspFsvrtDeviceClassGuid =
|
|||||||
#define FSP_FSCTL_VOLUME_NAME \
|
#define FSP_FSCTL_VOLUME_NAME \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'N', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'N', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
#define FSP_FSCTL_TRANSACT \
|
#define FSP_FSCTL_TRANSACT \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 'T', METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||||
#define FSP_FSCTL_TRANSACT_BATCH \
|
#define FSP_FSCTL_TRANSACT_BATCH \
|
||||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 't', METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
|
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0x800 + 't', METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
|
||||||
|
|
||||||
|
@ -419,8 +419,8 @@ NTSTATUS FspVolumeRedirQueryPathEx(
|
|||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
/* check parameters */
|
/* check parameters */
|
||||||
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
ULONG InputBufferLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
ULONG OutputBufferLength = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
|
||||||
QUERY_PATH_REQUEST_EX *QueryPathRequest = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
QUERY_PATH_REQUEST_EX *QueryPathRequest = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||||
QUERY_PATH_RESPONSE *QueryPathResponse = Irp->UserBuffer;
|
QUERY_PATH_RESPONSE *QueryPathResponse = Irp->UserBuffer;
|
||||||
if (sizeof(QUERY_PATH_REQUEST_EX) > InputBufferLength ||
|
if (sizeof(QUERY_PATH_REQUEST_EX) > InputBufferLength ||
|
||||||
@ -499,6 +499,9 @@ NTSTATUS FspVolumeTransact(
|
|||||||
ASSERT(
|
ASSERT(
|
||||||
FSP_FSCTL_TRANSACT == IrpSp->Parameters.FileSystemControl.FsControlCode ||
|
FSP_FSCTL_TRANSACT == IrpSp->Parameters.FileSystemControl.FsControlCode ||
|
||||||
FSP_FSCTL_TRANSACT_BATCH == IrpSp->Parameters.FileSystemControl.FsControlCode);
|
FSP_FSCTL_TRANSACT_BATCH == IrpSp->Parameters.FileSystemControl.FsControlCode);
|
||||||
|
ASSERT(
|
||||||
|
METHOD_BUFFERED == (IrpSp->Parameters.FileSystemControl.FsControlCode & 3) ||
|
||||||
|
METHOD_OUT_DIRECT == (IrpSp->Parameters.FileSystemControl.FsControlCode & 3));
|
||||||
ASSERT(0 != IrpSp->FileObject->FsContext2);
|
ASSERT(0 != IrpSp->FileObject->FsContext2);
|
||||||
|
|
||||||
/* check parameters */
|
/* check parameters */
|
||||||
@ -506,8 +509,8 @@ NTSTATUS FspVolumeTransact(
|
|||||||
ULONG ControlCode = IrpSp->Parameters.FileSystemControl.FsControlCode;
|
ULONG ControlCode = IrpSp->Parameters.FileSystemControl.FsControlCode;
|
||||||
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
||||||
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
||||||
PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
|
PVOID InputBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
PVOID MdlBuffer;
|
PVOID OutputBuffer;
|
||||||
if (0 != InputBufferLength &&
|
if (0 != InputBufferLength &&
|
||||||
FSP_FSCTL_DEFAULT_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_RSP)) > InputBufferLength)
|
FSP_FSCTL_DEFAULT_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_RSP)) > InputBufferLength)
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
@ -531,8 +534,8 @@ NTSTATUS FspVolumeTransact(
|
|||||||
|
|
||||||
/* process any user-mode file system responses */
|
/* process any user-mode file system responses */
|
||||||
RepostedIrp = 0;
|
RepostedIrp = 0;
|
||||||
Response = SystemBuffer;
|
Response = InputBuffer;
|
||||||
BufferEnd = (PUINT8)SystemBuffer + InputBufferLength;
|
BufferEnd = (PUINT8)InputBuffer + InputBufferLength;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
NextResponse = FspFsctlTransactConsumeResponse(Response, BufferEnd);
|
NextResponse = FspFsctlTransactConsumeResponse(Response, BufferEnd);
|
||||||
@ -583,14 +586,33 @@ NTSTATUS FspVolumeTransact(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* were we sent an output buffer? */
|
/* were we sent an output buffer? */
|
||||||
|
switch (ControlCode & 3)
|
||||||
|
{
|
||||||
|
case METHOD_OUT_DIRECT:
|
||||||
if (0 == Irp->MdlAddress)
|
if (0 == Irp->MdlAddress)
|
||||||
{
|
{
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
MdlBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress);
|
OutputBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress);
|
||||||
ASSERT(0 != MdlBuffer);
|
break;
|
||||||
|
case METHOD_BUFFERED:
|
||||||
|
if (0 == OutputBufferLength)
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
Result = STATUS_SUCCESS;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
Result = STATUS_INVALID_PARAMETER;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
ASSERT(0 != OutputBuffer);
|
||||||
|
|
||||||
/* wait for an IRP to arrive */
|
/* wait for an IRP to arrive */
|
||||||
KeQuerySystemTime(&Timeout);
|
KeQuerySystemTime(&Timeout);
|
||||||
@ -613,8 +635,8 @@ NTSTATUS FspVolumeTransact(
|
|||||||
|
|
||||||
/* send any pending IRP's to the user-mode file system */
|
/* send any pending IRP's to the user-mode file system */
|
||||||
RepostedIrp = 0;
|
RepostedIrp = 0;
|
||||||
Request = MdlBuffer;
|
Request = OutputBuffer;
|
||||||
BufferEnd = (PUINT8)MdlBuffer + OutputBufferLength;
|
BufferEnd = (PUINT8)OutputBuffer + OutputBufferLength;
|
||||||
ASSERT(FspFsctlTransactCanProduceRequest(Request, BufferEnd));
|
ASSERT(FspFsctlTransactCanProduceRequest(Request, BufferEnd));
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -666,7 +688,7 @@ NTSTATUS FspVolumeTransact(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->IoStatus.Information = (PUINT8)Request - (PUINT8)MdlBuffer;
|
Irp->IoStatus.Information = (PUINT8)Request - (PUINT8)OutputBuffer;
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user