mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-15 00:02:46 -05:00
sys: FSP_FSCTL_TRANSACT/FSP_FSCTL_TRANSACT_BATCH
This commit is contained in:
@ -159,6 +159,7 @@ const char *IoctlCodeSym(ULONG ControlCode)
|
||||
{
|
||||
SYM(FSP_FSCTL_VOLUME_NAME)
|
||||
SYM(FSP_FSCTL_TRANSACT)
|
||||
SYM(FSP_FSCTL_TRANSACT_BATCH)
|
||||
SYM(FSP_FSCTL_WORK)
|
||||
SYM(FSP_FSCTL_WORK_BEST_EFFORT)
|
||||
// cygwin: sed -n '/[IF][OS]CTL.*CTL_CODE/s/^#define[ \t]*\([^ \t]*\).*/SYM(\1)/p'
|
||||
|
@ -36,6 +36,7 @@ static NTSTATUS FspFsctlFileSystemControl(
|
||||
Result = FspVolumeGetName(DeviceObject, Irp, IrpSp);
|
||||
break;
|
||||
case FSP_FSCTL_TRANSACT:
|
||||
case FSP_FSCTL_TRANSACT_BATCH:
|
||||
if (0 != IrpSp->FileObject->FsContext2)
|
||||
Result = FspVolumeTransact(DeviceObject, Irp, IrpSp);
|
||||
break;
|
||||
|
@ -496,11 +496,14 @@ NTSTATUS FspVolumeTransact(
|
||||
|
||||
ASSERT(IRP_MJ_FILE_SYSTEM_CONTROL == IrpSp->MajorFunction);
|
||||
ASSERT(IRP_MN_USER_FS_REQUEST == IrpSp->MinorFunction);
|
||||
ASSERT(FSP_FSCTL_TRANSACT == IrpSp->Parameters.FileSystemControl.FsControlCode);
|
||||
ASSERT(
|
||||
FSP_FSCTL_TRANSACT == IrpSp->Parameters.FileSystemControl.FsControlCode ||
|
||||
FSP_FSCTL_TRANSACT_BATCH == IrpSp->Parameters.FileSystemControl.FsControlCode);
|
||||
ASSERT(0 != IrpSp->FileObject->FsContext2);
|
||||
|
||||
/* check parameters */
|
||||
PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2;
|
||||
ULONG ControlCode = IrpSp->Parameters.FileSystemControl.FsControlCode;
|
||||
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
|
||||
ULONG OutputBufferLength = IrpSp->Parameters.FileSystemControl.OutputBufferLength;
|
||||
PVOID SystemBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||
@ -509,7 +512,10 @@ NTSTATUS FspVolumeTransact(
|
||||
FSP_FSCTL_DEFAULT_ALIGN_UP(sizeof(FSP_FSCTL_TRANSACT_RSP)) > InputBufferLength)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
if (0 != OutputBufferLength &&
|
||||
FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMIN > OutputBufferLength)
|
||||
((FSP_FSCTL_TRANSACT == ControlCode &&
|
||||
FSP_FSCTL_TRANSACT_REQ_SIZEMAX > OutputBufferLength) ||
|
||||
(FSP_FSCTL_TRANSACT_BATCH == ControlCode &&
|
||||
FSP_FSCTL_TRANSACT_REQ_BUFFER_SIZEMIN > OutputBufferLength)))
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
|
||||
if (!FspDeviceReference(FsvolDeviceObject))
|
||||
@ -645,6 +651,10 @@ NTSTATUS FspVolumeTransact(
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* are we doing single request or batch mode? */
|
||||
if (FSP_FSCTL_TRANSACT == ControlCode)
|
||||
break;
|
||||
|
||||
/* check that we have enough space before pulling the next pending IRP off the queue */
|
||||
if (!FspFsctlTransactCanProduceRequest(Request, BufferEnd))
|
||||
break;
|
||||
|
Reference in New Issue
Block a user