sys: FspLockUserBuffer: now acts directly on the IRP

This commit is contained in:
Bill Zissimopoulos 2016-03-18 15:36:44 -07:00
parent 3d6397871d
commit 57460d7452
5 changed files with 20 additions and 30 deletions

View File

@ -392,8 +392,7 @@ NTSTATUS FspCreateGuid(GUID *Guid);
NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject, NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject,
FILE_INFORMATION_CLASS FileInformationClass, PVOID FileInformation, ULONG Length); FILE_INFORMATION_CLASS FileInformationClass, PVOID FileInformation, ULONG Length);
NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation); NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation);
NTSTATUS FspLockUserBuffer(PVOID UserBuffer, ULONG Length, NTSTATUS FspLockUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation);
KPROCESSOR_MODE RequestorMode, LOCK_OPERATION Operation, PMDL *PMdl);
NTSTATUS FspMapLockedPagesInUserMode(PMDL Mdl, PVOID *PAddress); NTSTATUS FspMapLockedPagesInUserMode(PMDL Mdl, PVOID *PAddress);
NTSTATUS FspCcInitializeCacheMap(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes, NTSTATUS FspCcInitializeCacheMap(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes,
BOOLEAN PinAccess, PCACHE_MANAGER_CALLBACKS Callbacks, PVOID CallbackContext); BOOLEAN PinAccess, PCACHE_MANAGER_CALLBACKS Callbacks, PVOID CallbackContext);

View File

@ -224,13 +224,9 @@ static NTSTATUS FspFsvolReadNonCached(
return STATUS_END_OF_FILE; return STATUS_END_OF_FILE;
/* probe and lock the user buffer */ /* probe and lock the user buffer */
if (0 == Irp->MdlAddress) Result = FspLockUserBuffer(Irp, ReadLength, IoWriteAccess);
{ if (!NT_SUCCESS(Result))
Result = FspLockUserBuffer(Irp->UserBuffer, ReadLength, return Result;
Irp->RequestorMode, IoWriteAccess, &Irp->MdlAddress);
if (!NT_SUCCESS(Result))
return Result;
}
/* acquire FileNode exclusive Full */ /* acquire FileNode exclusive Full */
Success = DEBUGTEST(90, TRUE) && Success = DEBUGTEST(90, TRUE) &&

View File

@ -14,8 +14,7 @@ NTSTATUS FspSendSetInformationIrp(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT File
static NTSTATUS FspSendSetInformationIrpCompletion( static NTSTATUS FspSendSetInformationIrpCompletion(
PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context0); PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context0);
NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation); NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation);
NTSTATUS FspLockUserBuffer(PVOID UserBuffer, ULONG Length, NTSTATUS FspLockUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation);
KPROCESSOR_MODE RequestorMode, LOCK_OPERATION Operation, PMDL *PMdl);
NTSTATUS FspMapLockedPagesInUserMode(PMDL Mdl, PVOID *PAddress); NTSTATUS FspMapLockedPagesInUserMode(PMDL Mdl, PVOID *PAddress);
NTSTATUS FspCcInitializeCacheMap(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes, NTSTATUS FspCcInitializeCacheMap(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes,
BOOLEAN PinAccess, PCACHE_MANAGER_CALLBACKS Callbacks, PVOID CallbackContext); BOOLEAN PinAccess, PCACHE_MANAGER_CALLBACKS Callbacks, PVOID CallbackContext);
@ -285,20 +284,20 @@ NTSTATUS FspBufferUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
NTSTATUS FspLockUserBuffer(PVOID UserBuffer, ULONG Length, NTSTATUS FspLockUserBuffer(PIRP Irp, ULONG Length, LOCK_OPERATION Operation)
KPROCESSOR_MODE RequestorMode, LOCK_OPERATION Operation, PMDL *PMdl)
{ {
PAGED_CODE(); PAGED_CODE();
*PMdl = 0; if (0 == Length || 0 != Irp->MdlAddress)
return STATUS_SUCCESS;
PMDL Mdl = IoAllocateMdl(UserBuffer, Length, FALSE, FALSE, 0); PMDL Mdl = IoAllocateMdl(Irp->UserBuffer, Length, FALSE, FALSE, 0);
if (0 == Mdl) if (0 == Mdl)
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
try try
{ {
MmProbeAndLockPages(Mdl, RequestorMode, Operation); MmProbeAndLockPages(Mdl, Irp->RequestorMode, Operation);
} }
except (EXCEPTION_EXECUTE_HANDLER) except (EXCEPTION_EXECUTE_HANDLER)
{ {
@ -306,7 +305,8 @@ NTSTATUS FspLockUserBuffer(PVOID UserBuffer, ULONG Length,
return GetExceptionCode(); return GetExceptionCode();
} }
*PMdl = Mdl; Irp->MdlAddress = Mdl;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View File

@ -20,14 +20,13 @@ NTSTATUS FspWqCreateAndPostIrpWorkItem(PIRP Irp,
/* probe and lock the user buffer (if not an MDL request) */ /* probe and lock the user buffer (if not an MDL request) */
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
if (0 == Irp->MdlAddress && if ((IRP_MJ_READ == IrpSp->MajorFunction || IRP_MJ_WRITE == IrpSp->MajorFunction) &&
(IRP_MJ_READ == IrpSp->MajorFunction || IRP_MJ_WRITE == IrpSp->MajorFunction) &&
!FlagOn(IrpSp->MinorFunction, IRP_MN_MDL)) !FlagOn(IrpSp->MinorFunction, IRP_MN_MDL))
{ {
Result = FspLockUserBuffer(Irp->UserBuffer, IrpSp->Parameters.Write.Length, if (IRP_MJ_READ == IrpSp->MajorFunction)
Irp->RequestorMode, Result = FspLockUserBuffer(Irp, IrpSp->Parameters.Read.Length, IoWriteAccess);
IRP_MJ_READ == IrpSp->MajorFunction ? IoWriteAccess : IoReadAccess, else
&Irp->MdlAddress); Result = FspLockUserBuffer(Irp, IrpSp->Parameters.Write.Length, IoReadAccess);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
return Result; return Result;
} }

View File

@ -290,13 +290,9 @@ static NTSTATUS FspFsvolWriteNonCached(
} }
/* probe and lock the user buffer */ /* probe and lock the user buffer */
if (0 == Irp->MdlAddress) Result = FspLockUserBuffer(Irp, WriteLength, IoReadAccess);
{ if (!NT_SUCCESS(Result))
Result = FspLockUserBuffer(Irp->UserBuffer, WriteLength, return Result;
Irp->RequestorMode, IoReadAccess, &Irp->MdlAddress);
if (!NT_SUCCESS(Result))
return Result;
}
/* acquire FileNode exclusive Full */ /* acquire FileNode exclusive Full */
Success = DEBUGTEST(90, TRUE) && Success = DEBUGTEST(90, TRUE) &&