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, tfa...@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



_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to