[ros-dev] [ros-diffs] [tfaber] 63928: [FASTFAT] - Properly handle errors in CcInitializeCacheMap, CcCopyRead and CcCopyWrite CORE-8410
Jérôme Gardou
jerome.gardou at reactos.org
Sun Aug 24 10:04:09 UTC 2014
Hey Thomas
I think that you want to use _SEH2_YIELD in a few places here, that is,
unless we want to completely ditch pseh2 in favor of pseh3 ;-)
Regards
Jérôme
Le 24/08/2014 05:28, tfaber at svn.reactos.org a écrit :
> Author: tfaber
> Date: Sun Aug 24 03:28:01 2014
> New Revision: 63928
>
> URL: http://svn.reactos.org/svn/reactos?rev=63928&view=rev
> Log:
> [FASTFAT]
> - Properly handle errors in CcInitializeCacheMap, CcCopyRead and CcCopyWrite
> CORE-8410
>
> Modified:
> trunk/reactos/drivers/filesystems/fastfat/CMakeLists.txt
> trunk/reactos/drivers/filesystems/fastfat/fcb.c
> trunk/reactos/drivers/filesystems/fastfat/fsctl.c
> trunk/reactos/drivers/filesystems/fastfat/rw.c
> trunk/reactos/drivers/filesystems/fastfat/vfat.h
>
> Modified: trunk/reactos/drivers/filesystems/fastfat/CMakeLists.txt
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/CMakeLists.txt?rev=63928&r1=63927&r2=63928&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fastfat/CMakeLists.txt [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fastfat/CMakeLists.txt [iso-8859-1] Sun Aug 24 03:28:01 2014
> @@ -26,6 +26,7 @@
> add_library(fastfat SHARED ${SOURCE} vfatfs.rc)
>
> set_module_type(fastfat kernelmodedriver)
> +target_link_libraries(fastfat ${PSEH_LIB})
> add_importlibs(fastfat ntoskrnl hal)
>
> add_pch(fastfat vfat.h SOURCE)
>
> Modified: trunk/reactos/drivers/filesystems/fastfat/fcb.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/fcb.c?rev=63928&r1=63927&r2=63928&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fastfat/fcb.c [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fastfat/fcb.c [iso-8859-1] Sun Aug 24 03:28:01 2014
> @@ -340,12 +340,14 @@
> {
> PFILE_OBJECT fileObject;
> PVFATCCB newCCB;
> + NTSTATUS status;
>
> fileObject = IoCreateStreamFileObject (NULL, vcb->StorageDevice);
>
> newCCB = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList);
> if (newCCB == NULL)
> {
> + ObDereferenceObject(fileObject);
> return STATUS_INSUFFICIENT_RESOURCES;
> }
> RtlZeroMemory(newCCB, sizeof (VFATCCB));
> @@ -356,11 +358,24 @@
> fcb->FileObject = fileObject;
> fcb->RefCount++;
>
> - CcInitializeCacheMap(fileObject,
> - (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize),
> - TRUE,
> - &VfatGlobalData->CacheMgrCallbacks,
> - fcb);
> + _SEH2_TRY
> + {
> + CcInitializeCacheMap(fileObject,
> + (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize),
> + TRUE,
> + &VfatGlobalData->CacheMgrCallbacks,
> + fcb);
> + }
> + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> + {
> + status = _SEH2_GetExceptionCode();
> + fcb->RefCount--;
> + fcb->FileObject = NULL;
> + ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, newCCB);
> + ObDereferenceObject(fileObject);
> + return status;
> + }
> + _SEH2_END;
>
> fcb->Flags |= FCB_CACHE_INITIALIZED;
> return STATUS_SUCCESS;
>
> Modified: trunk/reactos/drivers/filesystems/fastfat/fsctl.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/fsctl.c?rev=63928&r1=63927&r2=63928&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fastfat/fsctl.c [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fastfat/fsctl.c [iso-8859-1] Sun Aug 24 03:28:01 2014
> @@ -550,11 +550,20 @@
> Fcb->RFCB.ValidDataLength = Fcb->RFCB.FileSize;
> Fcb->RFCB.AllocationSize = Fcb->RFCB.FileSize;
>
> - CcInitializeCacheMap(DeviceExt->FATFileObject,
> - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
> - TRUE,
> - &VfatGlobalData->CacheMgrCallbacks,
> - Fcb);
> + _SEH2_TRY
> + {
> + CcInitializeCacheMap(DeviceExt->FATFileObject,
> + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
> + TRUE,
> + &VfatGlobalData->CacheMgrCallbacks,
> + Fcb);
> + }
> + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> + {
> + Status = _SEH2_GetExceptionCode();
> + goto ByeBye;
> + }
> + _SEH2_END;
>
> DeviceExt->LastAvailableCluster = 2;
> ExInitializeResourceLite(&DeviceExt->FatResource);
>
> Modified: trunk/reactos/drivers/filesystems/fastfat/rw.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/rw.c?rev=63928&r1=63927&r2=63928&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fastfat/rw.c [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fastfat/rw.c [iso-8859-1] Sun Aug 24 03:28:01 2014
> @@ -673,22 +673,35 @@
> Status = /*STATUS_END_OF_FILE*/STATUS_SUCCESS;
> }
>
> - if (IrpContext->FileObject->PrivateCacheMap == NULL)
> - {
> - CcInitializeCacheMap(IrpContext->FileObject,
> - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
> - FALSE,
> - &(VfatGlobalData->CacheMgrCallbacks),
> - Fcb);
> - }
> -
> - if (!CcCopyRead(IrpContext->FileObject, &ByteOffset, Length,
> - (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT), Buffer,
> - &IrpContext->Irp->IoStatus))
> - {
> - Status = STATUS_PENDING;
> - goto ByeBye;
> - }
> + _SEH2_TRY
> + {
> + if (IrpContext->FileObject->PrivateCacheMap == NULL)
> + {
> + CcInitializeCacheMap(IrpContext->FileObject,
> + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
> + FALSE,
> + &(VfatGlobalData->CacheMgrCallbacks),
> + Fcb);
> + }
> +
> + if (!CcCopyRead(IrpContext->FileObject,
> + &ByteOffset,
> + Length,
> + (IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0,
> + Buffer,
> + &IrpContext->Irp->IoStatus))
> + {
> + ASSERT((IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0);
> + Status = STATUS_PENDING;
> + goto ByeBye;
> + }
> + }
> + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> + {
> + Status = _SEH2_GetExceptionCode();
> + goto ByeBye;
> + }
> + _SEH2_END;
>
> if (!NT_SUCCESS(IrpContext->Irp->IoStatus.Status))
> {
> @@ -947,30 +960,42 @@
> {
> // cached write
>
> - if (IrpContext->FileObject->PrivateCacheMap == NULL)
> - {
> - CcInitializeCacheMap(IrpContext->FileObject,
> - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
> - FALSE,
> - &VfatGlobalData->CacheMgrCallbacks,
> - Fcb);
> - }
> -
> - if (ByteOffset.QuadPart > OldFileSize.QuadPart)
> - {
> - CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
> - }
> -
> - if (CcCopyWrite(IrpContext->FileObject, &ByteOffset, Length,
> - 1 /*IrpContext->Flags & IRPCONTEXT_CANWAIT*/, Buffer))
> - {
> - IrpContext->Irp->IoStatus.Information = Length;
> - Status = STATUS_SUCCESS;
> - }
> - else
> - {
> - Status = STATUS_UNSUCCESSFUL;
> - }
> + _SEH2_TRY
> + {
> + if (IrpContext->FileObject->PrivateCacheMap == NULL)
> + {
> + CcInitializeCacheMap(IrpContext->FileObject,
> + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
> + FALSE,
> + &VfatGlobalData->CacheMgrCallbacks,
> + Fcb);
> + }
> +
> + if (ByteOffset.QuadPart > OldFileSize.QuadPart)
> + {
> + CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE);
> + }
> +
> + if (CcCopyWrite(IrpContext->FileObject,
> + &ByteOffset,
> + Length,
> + TRUE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0*/,
> + Buffer))
> + {
> + IrpContext->Irp->IoStatus.Information = Length;
> + Status = STATUS_SUCCESS;
> + }
> + else
> + {
> + ASSERT(FALSE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0*/);
> + Status = STATUS_UNSUCCESSFUL;
> + }
> + }
> + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
> + {
> + Status = _SEH2_GetExceptionCode();
> + }
> + _SEH2_END;
> }
> else
> {
>
> Modified: trunk/reactos/drivers/filesystems/fastfat/vfat.h
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfat/vfat.h?rev=63928&r1=63927&r2=63928&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fastfat/vfat.h [iso-8859-1] Sun Aug 24 03:28:01 2014
> @@ -4,6 +4,7 @@
> #include <ntifs.h>
> #include <ntdddisk.h>
> #include <dos.h>
> +#include <pseh/pseh2.h>
>
> #define USE_ROS_CC_AND_FS
>
>
>
More information about the Ros-dev
mailing list