From 12c4e07a1840c03e6bc3907f3482a9ec4ce57d0c Mon Sep 17 00:00:00 2001 From: Dibyamartanda Samanta Date: Fri, 17 May 2024 17:03:52 +0200 Subject: [PATCH] [NTOSKRNL:CC] Use standard FSRTL routines for Write/Read CcMdlReadComplete, CcMdlWriteComplete, Older Macros are WDM Header dependent --- NTOSKRNL/CC/ccmdlhandler.cpp | 57 +++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/NTOSKRNL/CC/ccmdlhandler.cpp b/NTOSKRNL/CC/ccmdlhandler.cpp index 5e4fc8b..86b73e2 100644 --- a/NTOSKRNL/CC/ccmdlhandler.cpp +++ b/NTOSKRNL/CC/ccmdlhandler.cpp @@ -207,15 +207,26 @@ NTAPI CcMdlReadComplete(IN PFILE_OBJECT FileObject, IN PMDL MdlChain) { - PDEVICE_OBJECT RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject); - FAST_IO_DISPATCH FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch; - /* Start Faster MDL Operator if Suceeds , don't execute slower CcMdlReadComplete2*/ - BOOL MdlReadComplete_FLag = (*PFAST_IO_MDL_READ_COMPLETE) ( FileObject, MdlChain, RelatedDeviceObject); - - if ( !FastIoDispatch|| FastIoDispatch->SizeOfFastIoDispatch <= MAXIO_DISPATCH|| (MdlReadComplete_FLag = FastIoDispatch->MdlReadComplete) == 0|| !MdlReadComplete_FLag ) - { - CcMdlReadComplete2(NULL,MdlChain); - } + PDEVICE_OBJECT RelatedDeviceObject = nullptr; + PFAST_IO_DISPATCH FastIoDispatch = nullptr; + IO_MDLREAD_COMPLETE_ROUTINE MdlReadComplete; + + RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject); + FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch; + if(MdlChain == nullptr) + { DBGPRINT("Invalid MDLChain \n"); + return; + } + if (FastIoDispatch && + FastIoDispatch->SizeOfFastIoDispatch >= sizeof(FAST_IO_DISPATCH) && + (MdlReadComplete = FastIoDispatch->MdlReadComplete) != NULL && + MdlReadComplete(FileObject, MdlChain, RelatedDeviceObject)) + { + /* Faster Fast I/O MDL path successful, if it fails, we will go for our slower implementation*/ + return; + } + + CcMdlReadComplete2(FileObject, MdlChain); } VOID @@ -250,14 +261,26 @@ CcMdlWriteComplete(IN PFILE_OBJECT FileObject, IN PMDL MdlChain) { - DEVICE_OBJECT RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject); - FAST_IO_DISPATCH FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch; - BOOL MdlWriteComplete_FLag = (*PFAST_IO_MDL_WRITE_COMPLETE) ( FileObject, FileOffset, MdlChain, RelatedDeviceObject); - /* Start Faster MDL Operator if Suceeds , don't execute slower CcMdlReadComplete2*/ - if (!FastIoDispatch|| FastIoDispatch->SizeOfFastIoDispatch <= MAXIO_DISPATCH|| (MdlWriteComplete_FLag = FastIoDispatch->MdlWriteComplete) == 0|| !MdlWriteComplete_FLag) - { - CcMdlWriteComplete2(FileObject,FileOffset,MdlChain); - } + PDEVICE_OBJECT RelatedDeviceObject = nullptr; + PFAST_IO_DISPATCH FastIoDispatch = nullptr; + IO_MDLWRITE_COMPLETE_ROUTINE MdlWriteComplete; + if(MdlChain == nullptr) + { DBGPRINT("Invalid MDLChain \n"); + return; + } + RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject); + FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch; + + if (FastIoDispatch && + FastIoDispatch->SizeOfFastIoDispatch >= sizeof(FAST_IO_DISPATCH) && + (MdlWriteComplete = FastIoDispatch->MdlWriteComplete) != NULL && + MdlWriteComplete(FileObject, FileOffset, MdlChain, RelatedDeviceObject)) + { + /* Faster Fast I/O MDL path successful, if it fails, we will go for our slower implementation*/ + return; + } + + CcMdlWriteComplete2(FileObject, FileOffset, MdlChain); } VOID