[ros-diffs] [pschweitzer] 34617: Switched two more files to PSEH

pschweitzer at svn.reactos.org pschweitzer at svn.reactos.org
Sun Jul 20 22:33:18 CEST 2008


Author: pschweitzer
Date: Sun Jul 20 15:33:18 2008
New Revision: 34617

URL: http://svn.reactos.org/svn/reactos?rev=34617&view=rev
Log:
Switched two more files to PSEH

Modified:
    branches/pierre-fsd/drivers/filesystems/ext3fsd/fileinfo.c
    branches/pierre-fsd/drivers/filesystems/ext3fsd/flush.c

Modified: branches/pierre-fsd/drivers/filesystems/ext3fsd/fileinfo.c
URL: http://svn.reactos.org/svn/reactos/branches/pierre-fsd/drivers/filesystems/ext3fsd/fileinfo.c?rev=34617&r1=34616&r2=34617&view=diff
==============================================================================
--- branches/pierre-fsd/drivers/filesystems/ext3fsd/fileinfo.c [iso-8859-1] (original)
+++ branches/pierre-fsd/drivers/filesystems/ext3fsd/fileinfo.c [iso-8859-1] Sun Jul 20 15:33:18 2008
@@ -4,7 +4,8 @@
  * FILE:             fileinfo.c
  * PROGRAMMER:       Matt Wu <mattwu at 163.com>
  * HOMEPAGE:         http://ext2.yeah.net
- * UPDATE HISTORY: 
+ * UPDATE HISTORY:   15 Jul 2008 (Pierre Schweitzer <heis_spiter at hotmail.com>)
+ *                     Replaced SEH support with PSEH support
  */
 
 /* INCLUDES *****************************************************************/
@@ -16,6 +17,38 @@
 extern PEXT2_GLOBAL Ext2Global;
 
 /* DEFINITIONS *************************************************************/
+
+VOID
+Ext2QueryFileInformationFinal (
+    IN PEXT2_IRP_CONTEXT IrpContext,
+    IN PNTSTATUS pStatus,
+    IN PEXT2_FCB Fcb,
+    IN BOOLEAN FcbResourceAcquired    );
+
+VOID
+Ext2SetFileInformationFinal (
+    IN PEXT2_IRP_CONTEXT IrpContext,
+    IN PNTSTATUS pStatus,
+    IN PEXT2_VCB Vcb,
+    IN PFILE_OBJECT FileObject,
+    IN PEXT2_FCB Fcb,
+    IN ULONG NotifyFilter,
+    IN BOOLEAN VcbMainResourceAcquired,
+    IN BOOLEAN FcbMainResourceAcquired,
+    IN BOOLEAN FcbPagingIoResourceAcquired,
+    IN BOOLEAN CacheInitialized    );
+
+VOID
+Ext2DeleteFileFinal (
+    IN PEXT2_VCB Vcb,
+    IN PEXT2_MCB Mcb,
+    IN PEXT2_FCB Dcb,
+    IN PEXT2_FCB Fcb,
+    IN BOOLEAN VcbResourceAcquired,
+    IN BOOLEAN FcbPagingIoAcquired,
+    IN BOOLEAN FcbResourceAcquired,
+    IN BOOLEAN DcbResourceAcquired,
+    IN BOOLEAN bNewDcb    );
 
 #ifdef ALLOC_PRAGMA
 #pragma alloc_text(PAGE, Ext2QueryFileInformation)
@@ -27,6 +60,46 @@
 #pragma alloc_text(PAGE, Ext2DeleteFile)
 #endif
 
+
+/* FUNCTIONS ***************************************************************/
+
+
+_SEH_DEFINE_LOCALS(Ext2QueryFileInformationFinal)
+{
+    PEXT2_IRP_CONTEXT IrpContext;
+    PNTSTATUS pStatus;
+    PEXT2_FCB Fcb;
+    BOOLEAN FcbResourceAcquired;
+};
+
+_SEH_FINALLYFUNC(Ext2QueryFileInformationFinal_PSEH)
+{
+    _SEH_ACCESS_LOCALS(Ext2QueryFileInformationFinal);
+    Ext2QueryFileInformationFinal(_SEH_VAR(IrpContext), _SEH_VAR(pStatus),
+                                  _SEH_VAR(Fcb), _SEH_VAR(FcbResourceAcquired));
+}
+
+VOID
+Ext2QueryFileInformationFinal (
+    IN PEXT2_IRP_CONTEXT    IrpContext,
+    IN PNTSTATUS            pStatus,
+    IN PEXT2_FCB            Fcb,
+    IN BOOLEAN              FcbResourceAcquired
+    )
+{
+    if (FcbResourceAcquired) {
+        ExReleaseResourceLite(&Fcb->MainResource);
+    }
+
+    if (!IrpContext->ExceptionInProgress) {
+        if (*pStatus == STATUS_PENDING ||
+            *pStatus == STATUS_CANT_WAIT) {
+            *pStatus = Ext2QueueRequest(IrpContext);
+        } else {
+            Ext2CompleteIrpContext(IrpContext,  *pStatus);
+        }
+    }
+}
 
 NTSTATUS
 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext)
@@ -42,9 +115,13 @@
     FILE_INFORMATION_CLASS  FileInformationClass;
     ULONG                   Length;
     PVOID                   Buffer;
-    BOOLEAN                 FcbResourceAcquired = FALSE;
     
-    __try {
+    _SEH_TRY {
+
+        _SEH_DECLARE_LOCALS(Ext2QueryFileInformationFinal);
+        _SEH_VAR(IrpContext) = IrpContext;
+        _SEH_VAR(pStatus) = &Status;
+        _SEH_VAR(FcbResourceAcquired) = FALSE;
 
         ASSERT(IrpContext != NULL);
         
@@ -58,15 +135,16 @@
         //
         if (IsExt2FsDevice(DeviceObject)) {
             Status = STATUS_INVALID_DEVICE_REQUEST;
-            __leave;
+            _SEH_LEAVE;
         }
         
         FileObject = IrpContext->FileObject;
         Fcb = (PEXT2_FCB) FileObject->FsContext;
+        _SEH_VAR(Fcb) = Fcb;
         
         if (Fcb == NULL) {
             Status = STATUS_INVALID_PARAMETER;
-            __leave;
+            _SEH_LEAVE;
         }
 
         //
@@ -74,13 +152,13 @@
         //
         if (Fcb->Identifier.Type == EXT2VCB) {
             Status = STATUS_INVALID_PARAMETER;
-            __leave;
+            _SEH_LEAVE;
         }
         
         if(!((Fcb->Identifier.Type == EXT2FCB) &&
              (Fcb->Identifier.Size == sizeof(EXT2_FCB)))) {
             Status = STATUS_INVALID_PARAMETER;
-            __leave;
+            _SEH_LEAVE;
         }
 
         Vcb = Fcb->Vcb;
@@ -92,10 +170,10 @@
                 )) {
 
                 Status = STATUS_PENDING;
-                __leave;
+                _SEH_LEAVE;
             }
             
-            FcbResourceAcquired = TRUE;
+            _SEH_VAR(FcbResourceAcquired) = TRUE;
         }
         
         Ccb = (PEXT2_CCB) FileObject->FsContext2;
@@ -122,7 +200,7 @@
 
                 if (Length < sizeof(FILE_BASIC_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
 
                 FileBasicInformation = (PFILE_BASIC_INFORMATION) Buffer;
@@ -148,7 +226,7 @@
                 
                 if (Length < sizeof(FILE_STANDARD_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FSI = (PFILE_STANDARD_INFORMATION) Buffer;
@@ -182,7 +260,7 @@
                 
                 if (Length < sizeof(FILE_INTERNAL_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FileInternalInformation = (PFILE_INTERNAL_INFORMATION) Buffer;
@@ -202,7 +280,7 @@
                 
                 if (Length < sizeof(FILE_EA_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FileEaInformation = (PFILE_EA_INFORMATION) Buffer;
@@ -222,7 +300,7 @@
                 if (Length < sizeof(FILE_NAME_INFORMATION) +
                     Fcb->Mcb->ShortName.Length - sizeof(WCHAR)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FileNameInformation = (PFILE_NAME_INFORMATION) Buffer;
@@ -246,7 +324,7 @@
                 
                 if (Length < sizeof(FILE_POSITION_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FilePositionInformation = (PFILE_POSITION_INFORMATION) Buffer;
@@ -272,7 +350,7 @@
                 
                 if (Length < sizeof(FILE_ALL_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FileAllInformation = (PFILE_ALL_INFORMATION) Buffer;
@@ -335,7 +413,7 @@
                     Fcb->Mcb->ShortName.Length - sizeof(WCHAR)) {
                     Irp->IoStatus.Information = sizeof(FILE_ALL_INFORMATION);
                     Status = STATUS_BUFFER_OVERFLOW;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FileNameInformation->FileNameLength = Fcb->Mcb->ShortName.Length;
@@ -368,7 +446,7 @@
             
                 if (Length < sizeof(FILE_NETWORK_OPEN_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
 
                 PFNOI = (PFILE_NETWORK_OPEN_INFORMATION) Buffer;
@@ -405,7 +483,7 @@
                 
                 if (Length < sizeof(FILE_ATTRIBUTE_TAG_INFORMATION)) {
                     Status = STATUS_INFO_LENGTH_MISMATCH;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FATI = (PFILE_ATTRIBUTE_TAG_INFORMATION) Buffer;
@@ -430,25 +508,88 @@
             break;
         }
 
-    } __finally {
-
-        if (FcbResourceAcquired) {
-            ExReleaseResourceLite(&Fcb->MainResource);
-        }
-
-        if (!IrpContext->ExceptionInProgress) {
-            if (Status == STATUS_PENDING ||
-                Status == STATUS_CANT_WAIT) {
-                Status = Ext2QueueRequest(IrpContext);
-            } else {
-                Ext2CompleteIrpContext(IrpContext,  Status);
-            }
-        }
-    }
-    
+    }
+    _SEH_FINALLY(Ext2QueryFileInformationFinal_PSEH)
+    _SEH_END;
+
     return Status;
 }
 
+_SEH_DEFINE_LOCALS(Ext2SetFileInformationFinal)
+{
+    PEXT2_IRP_CONTEXT IrpContext;
+    PNTSTATUS pStatus;
+    PEXT2_VCB Vcb;
+    PFILE_OBJECT FileObject;
+    PEXT2_FCB Fcb;
+    ULONG NotifyFilter;
+    BOOLEAN VcbMainResourceAcquired;
+    BOOLEAN FcbMainResourceAcquired;
+    BOOLEAN FcbPagingIoResourceAcquired;
+    BOOLEAN CacheInitialized;
+};
+
+_SEH_FINALLYFUNC(Ext2SetFileInformationFinal_PSEH)
+{
+    _SEH_ACCESS_LOCALS(Ext2SetFileInformationFinal);
+    Ext2SetFileInformationFinal(_SEH_VAR(IrpContext), _SEH_VAR(pStatus),
+                                _SEH_VAR(Vcb), _SEH_VAR(FileObject), _SEH_VAR(Fcb),
+                                _SEH_VAR(NotifyFilter), _SEH_VAR(VcbMainResourceAcquired),
+                                _SEH_VAR(FcbMainResourceAcquired),
+                                _SEH_VAR(FcbPagingIoResourceAcquired),
+                                _SEH_VAR(CacheInitialized));
+}
+
+VOID
+Ext2SetFileInformationFinal (
+    IN PEXT2_IRP_CONTEXT    IrpContext,
+    IN PNTSTATUS            pStatus,
+    IN PEXT2_VCB            Vcb,
+    IN PFILE_OBJECT         FileObject,
+    IN PEXT2_FCB            Fcb,
+    IN ULONG                NotifyFilter,
+    IN BOOLEAN              VcbMainResourceAcquired,
+    IN BOOLEAN              FcbMainResourceAcquired,
+    IN BOOLEAN              FcbPagingIoResourceAcquired,
+    IN BOOLEAN              CacheInitialized
+    )
+{
+    if (FcbPagingIoResourceAcquired) {
+        ExReleaseResourceLite(&Fcb->PagingIoResource);
+    }
+        
+    if (NT_SUCCESS(*pStatus) && (NotifyFilter != 0)) {
+        Ext2NotifyReportChange(
+                    IrpContext,
+                    Vcb,
+                    Fcb->Mcb,
+                    NotifyFilter,
+                    FILE_ACTION_MODIFIED );
+
+    }
+
+    if (FcbMainResourceAcquired) {
+        ExReleaseResourceLite(&Fcb->MainResource);
+    }
+
+    if (CacheInitialized) {
+        CcUninitializeCacheMap(FileObject, NULL, NULL);
+    }
+
+    if (VcbMainResourceAcquired) {
+        ExReleaseResourceLite(&Vcb->MainResource);
+    }
+
+    if (!IrpContext->ExceptionInProgress) {
+        if (*pStatus == STATUS_PENDING || 
+            *pStatus == STATUS_CANT_WAIT ) {
+            DbgBreak();
+            *pStatus = Ext2QueueRequest(IrpContext);
+        } else {
+            Ext2CompleteIrpContext(IrpContext,  *pStatus);
+        }
+    }
+}
 
 NTSTATUS
 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext)
@@ -463,17 +604,19 @@
     PIO_STACK_LOCATION      IoStackLocation;
     FILE_INFORMATION_CLASS  FileInformationClass;
 
-    ULONG                   NotifyFilter = 0;
-
     ULONG                   Length;
     PVOID                   Buffer;
 
-    BOOLEAN                 VcbMainResourceAcquired = FALSE;
-    BOOLEAN                 FcbMainResourceAcquired = FALSE;
-    BOOLEAN                 FcbPagingIoResourceAcquired = FALSE;
-    BOOLEAN                 CacheInitialized = FALSE;
-
-    __try {
+    _SEH_TRY {
+
+        _SEH_DECLARE_LOCALS(Ext2SetFileInformationFinal);
+        _SEH_VAR(IrpContext) = IrpContext;
+        _SEH_VAR(pStatus) = &Status;
+        _SEH_VAR(NotifyFilter) = 0;
+        _SEH_VAR(VcbMainResourceAcquired) = FALSE;
+        _SEH_VAR(FcbMainResourceAcquired) = FALSE;
+        _SEH_VAR(FcbPagingIoResourceAcquired) = FALSE;
+        _SEH_VAR(CacheInitialized) = FALSE;
 
         ASSERT(IrpContext != NULL);
         
@@ -486,7 +629,7 @@
         //
         if (IsExt2FsDevice(DeviceObject)) {
             Status = STATUS_INVALID_DEVICE_REQUEST;
-            __leave;
+            _SEH_LEAVE;
         }
         
         /* check io stack location of irp stack */
@@ -499,12 +642,13 @@
 
         /* check Vcb */
         Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension;
+        _SEH_VAR(Vcb) = Vcb;
         ASSERT(Vcb != NULL);
         ASSERT((Vcb->Identifier.Type == EXT2VCB) &&
             (Vcb->Identifier.Size == sizeof(EXT2_VCB)));
         if (!IsMounted(Vcb)) {
             Status = STATUS_INVALID_DEVICE_REQUEST;
-            __leave;
+            _SEH_LEAVE;
         }
 
         /* we need grab Vcb in case it's a rename operation */
@@ -513,18 +657,20 @@
                     &Vcb->MainResource,
                     IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT) )) {
                     Status = STATUS_PENDING;
-                    __leave;
-            }
-            VcbMainResourceAcquired = TRUE;
+                    _SEH_LEAVE;
+            }
+            _SEH_VAR(VcbMainResourceAcquired) = TRUE;
         }
 
         FileObject = IrpContext->FileObject;
+        _SEH_VAR(FileObject) = FileObject;
         Fcb = (PEXT2_FCB) FileObject->FsContext;
+        _SEH_VAR(Fcb) = Fcb;
 
         // This request is issued to volumes, just return success
         if (Fcb == NULL || Fcb->Identifier.Type == EXT2VCB) {
             Status = STATUS_SUCCESS;
-            __leave;
+            _SEH_LEAVE;
         }
         
         ASSERT((Fcb->Identifier.Type == EXT2FCB) &&
@@ -532,7 +678,7 @@
 
         if (IsFlagOn(Fcb->Flags, FCB_FILE_DELETED)) {
             Status = STATUS_FILE_DELETED;
-            __leave;
+            _SEH_LEAVE;
         }
 
         Ccb = (PEXT2_CCB) FileObject->FsContext2;
@@ -551,7 +697,7 @@
                                        NULL );
 
             if (Status != STATUS_SUCCESS) {
-                __leave;
+                _SEH_LEAVE;
             }
 
             //
@@ -570,17 +716,17 @@
                 &Fcb->MainResource,
                 IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT) )) {
                 Status = STATUS_PENDING;
-                __leave;
+                _SEH_LEAVE;
             }
             
-            FcbMainResourceAcquired = TRUE;
+            _SEH_VAR(FcbMainResourceAcquired) = TRUE;
         }
         
         if (IsFlagOn(Vcb->Flags, VCB_READ_ONLY)) {
 
             if (FileInformationClass != FilePositionInformation) {
                 Status = STATUS_MEDIA_WRITE_PROTECTED;
-                __leave;
+                _SEH_LEAVE;
             }
         }
 
@@ -592,10 +738,10 @@
                 IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT) )) {
                 Status = STATUS_PENDING;
                 DbgBreak();
-                __leave;
+                _SEH_LEAVE;
             }
             
-            FcbPagingIoResourceAcquired = TRUE;
+            _SEH_VAR(FcbPagingIoResourceAcquired) = TRUE;
         }
        
 /*        
@@ -616,19 +762,19 @@
                 if (FBI->CreationTime.QuadPart != 0 && FBI->CreationTime.QuadPart != -1) {
                     Ext2Inode->i_ctime = Ext2LinuxTime(FBI->CreationTime);
                     Fcb->Mcb->CreationTime = Ext2NtTime(Ext2Inode->i_ctime);
-                    NotifyFilter |= FILE_NOTIFY_CHANGE_CREATION;
+                    _SEH_VAR(NotifyFilter) |= FILE_NOTIFY_CHANGE_CREATION;
                 }
 
                 if (FBI->LastAccessTime.QuadPart != 0 && FBI->LastAccessTime.QuadPart != -1) {
                     Ext2Inode->i_atime = Ext2LinuxTime(FBI->LastAccessTime);
                     Fcb->Mcb->LastAccessTime = Ext2NtTime(Ext2Inode->i_atime);
-                    NotifyFilter |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
+                    _SEH_VAR(NotifyFilter) |= FILE_NOTIFY_CHANGE_LAST_ACCESS;
                 }
 
                 if (FBI->LastWriteTime.QuadPart != 0 && FBI->LastWriteTime.QuadPart != -1) {
                     Ext2Inode->i_mtime = Ext2LinuxTime(FBI->LastWriteTime);
                     Fcb->Mcb->LastWriteTime = Ext2NtTime(Ext2Inode->i_mtime);
-                    NotifyFilter |= FILE_NOTIFY_CHANGE_LAST_WRITE;
+                    _SEH_VAR(NotifyFilter) |= FILE_NOTIFY_CHANGE_LAST_WRITE;
                     SetFlag(Ccb->Flags, CCB_LAST_WRITE_UPDATED);
                 }
 
@@ -639,7 +785,7 @@
                 if (FBI->FileAttributes != 0) {
 
                     BOOLEAN bIsDirectory = IsDirectory(Fcb);
-                    NotifyFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+                    _SEH_VAR(NotifyFilter) |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
 
                     if (IsFlagOn(FBI->FileAttributes, FILE_ATTRIBUTE_READONLY)) {
                         Ext2SetReadOnly(Fcb->Inode->i_mode);
@@ -659,14 +805,14 @@
                     }
                 }
 
-                if (NotifyFilter != 0) {
+                if (_SEH_VAR(NotifyFilter) != 0) {
                     if ( Ext2SaveInode( IrpContext, Vcb, 
                             Fcb->Mcb->iNo, Ext2Inode)) {
                         Status = STATUS_SUCCESS;
                     }
                 }
 
-                ClearFlag(NotifyFilter, FILE_NOTIFY_CHANGE_LAST_ACCESS);
+                ClearFlag(_SEH_VAR(NotifyFilter), FILE_NOTIFY_CHANGE_LAST_ACCESS);
                 Status = STATUS_SUCCESS;
             }
 
@@ -679,7 +825,7 @@
 
                 if (IsDirectory(Fcb)) {
                     Status = STATUS_INVALID_DEVICE_REQUEST;
-                    __leave;
+                    _SEH_LEAVE;
                 } else {
                     Status = STATUS_SUCCESS;
                 }
@@ -698,7 +844,7 @@
                             &(Ext2Global->CacheManagerNoOpCallbacks),
                             Fcb );
 
-                    CacheInitialized = TRUE;
+                    _SEH_VAR(CacheInitialized) = TRUE;
                 }
 
                 /* get user specified allocationsize aligned with BLOCK_SIZE */
@@ -721,7 +867,7 @@
 
                     Status = Ext2ExpandFile(IrpContext, Vcb, Fcb->Mcb, &AllocationSize);
                     Fcb->Header.AllocationSize = AllocationSize;
-                    NotifyFilter = FILE_NOTIFY_CHANGE_SIZE;
+                    _SEH_VAR(NotifyFilter) = FILE_NOTIFY_CHANGE_SIZE;
 
                 } else if (AllocationSize.QuadPart < Fcb->Header.AllocationSize.QuadPart) {
 
@@ -743,7 +889,7 @@
                             }
                         }
 
-                        NotifyFilter = FILE_NOTIFY_CHANGE_SIZE;
+                        _SEH_VAR(NotifyFilter) = FILE_NOTIFY_CHANGE_SIZE;
                         Fcb->Header.AllocationSize.QuadPart = AllocationSize.QuadPart;
                         if (Fcb->Header.FileSize.QuadPart > AllocationSize.QuadPart) {
                             Fcb->Header.FileSize.QuadPart = AllocationSize.QuadPart;
@@ -764,11 +910,11 @@
 
                         Status = STATUS_USER_MAPPED_FILE;
                         DbgBreak();
-                        __leave;
+                        _SEH_LEAVE;
                     }
                 }
 
-                if (NotifyFilter) {
+                if (_SEH_VAR(NotifyFilter)) {
 
                     SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
                     SetLongFlag(Fcb->Flags, FCB_FILE_MODIFIED);
@@ -795,7 +941,7 @@
 
                 if (IsDirectory(Fcb)) {
                     Status = STATUS_INVALID_DEVICE_REQUEST;
-                    __leave;
+                    _SEH_LEAVE;
                 } else {
                     Status = STATUS_SUCCESS;
                 }
@@ -814,7 +960,7 @@
                             &(Ext2Global->CacheManagerNoOpCallbacks),
                             Fcb );
 
-                    CacheInitialized = TRUE;
+                    _SEH_VAR(CacheInitialized) = TRUE;
                 }
 
                 AllocationSize = Fcb->Header.AllocationSize;
@@ -826,7 +972,7 @@
                 if (IoStackLocation->Parameters.SetFile.AdvanceOnly) {
 
                     if (IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING)) {
-                        __leave;
+                        _SEH_LEAVE;
                     }
 
                     if (EndOfFile.QuadPart > Fcb->Header.FileSize.QuadPart) {
@@ -840,11 +986,11 @@
                         if (S_ISREG(Fcb->Inode->i_mode)) {
                             Fcb->Inode->i_size_high = (__u32)(EndOfFile.HighPart);
                         }
-                        NotifyFilter = FILE_NOTIFY_CHANGE_SIZE;
+                        _SEH_VAR(NotifyFilter) = FILE_NOTIFY_CHANGE_SIZE;
                         goto FileEndChanged;
                     }
 
-                    __leave;
+                    _SEH_LEAVE;
                 }
 
                 /* check if file blocks are allocated in Ext2Create */
@@ -862,7 +1008,7 @@
                                     Fcb->Mcb,
                                     &(Fcb->Header.AllocationSize)
                                     );
-                    NotifyFilter = FILE_NOTIFY_CHANGE_SIZE;
+                    _SEH_VAR(NotifyFilter) = FILE_NOTIFY_CHANGE_SIZE;
 
                 } else if (FileSize.QuadPart == AllocationSize.QuadPart) {
 
@@ -913,7 +1059,7 @@
                         }
                     }
 
-                    NotifyFilter = FILE_NOTIFY_CHANGE_SIZE;
+                    _SEH_VAR(NotifyFilter) = FILE_NOTIFY_CHANGE_SIZE;
                 }
 
                 if (NT_SUCCESS(Status)) {
@@ -935,7 +1081,7 @@
 
                     SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
                     SetLongFlag(Fcb->Flags, FCB_FILE_MODIFIED);
-                    NotifyFilter = FILE_NOTIFY_CHANGE_SIZE;
+                    _SEH_VAR(NotifyFilter) = FILE_NOTIFY_CHANGE_SIZE;
                 }
 
 FileEndChanged:
@@ -981,7 +1127,7 @@
                 
                 if (Length < sizeof(FILE_POSITION_INFORMATION)) {
                     Status = STATUS_INVALID_PARAMETER;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FilePositionInformation = (PFILE_POSITION_INFORMATION) Buffer;
@@ -990,14 +1136,14 @@
                     (FilePositionInformation->CurrentByteOffset.LowPart &
                     DeviceObject->AlignmentRequirement) ) {
                     Status = STATUS_INVALID_PARAMETER;
-                    __leave;
+                    _SEH_LEAVE;
                 }
                 
                 FileObject->CurrentByteOffset =
                     FilePositionInformation->CurrentByteOffset;
                 
                 Status = STATUS_SUCCESS;
-                __leave;
+                _SEH_LEAVE;
             }
 
             break;
@@ -1013,44 +1159,9 @@
             Status = STATUS_INVALID_PARAMETER;/* STATUS_INVALID_INFO_CLASS; */
         }
 
-    } __finally {
-        
-        if (FcbPagingIoResourceAcquired) {
-            ExReleaseResourceLite(&Fcb->PagingIoResource);
-        }
-        
-        if (NT_SUCCESS(Status) && (NotifyFilter != 0)) {
-            Ext2NotifyReportChange(
-                        IrpContext,
-                        Vcb,
-                        Fcb->Mcb,
-                        NotifyFilter,
-                        FILE_ACTION_MODIFIED );
-
-        }
-
-        if (FcbMainResourceAcquired) {
-            ExReleaseResourceLite(&Fcb->MainResource);
-        }
-
-        if (CacheInitialized) {
-            CcUninitializeCacheMap(FileObject, NULL, NULL);
-        }
-
-        if (VcbMainResourceAcquired) {
-            ExReleaseResourceLite(&Vcb->MainResource);
-        }
-
-        if (!IrpContext->ExceptionInProgress) {
-            if (Status == STATUS_PENDING || 
-                Status == STATUS_CANT_WAIT ) {
-                DbgBreak();
-                Status = Ext2QueueRequest(IrpContext);
-            } else {
-                Ext2CompleteIrpContext(IrpContext,  Status);
-            }
-        }
-    }
+    }
+    _SEH_FINALLY(Ext2SetFileInformationFinal_PSEH)
+    _SEH_END;
     
     return Status;
 }
@@ -1780,6 +1891,69 @@
     return EXT2_FT_REG_FILE;
 }
 
+_SEH_DEFINE_LOCALS(Ext2DeleteFileFinal)
+{
+    PEXT2_VCB Vcb;
+    PEXT2_MCB Mcb;
+    PEXT2_FCB Dcb;
+    PEXT2_FCB Fcb;
+    BOOLEAN VcbResourceAcquired;
+    BOOLEAN FcbPagingIoAcquired;
+    BOOLEAN FcbResourceAcquired;
+    BOOLEAN DcbResourceAcquired;
+    BOOLEAN bNewDcb;
+};
+
+_SEH_FINALLYFUNC(Ext2DeleteFileFinal_PSEH)
+{
+    _SEH_ACCESS_LOCALS(Ext2DeleteFileFinal);
+    Ext2DeleteFileFinal(_SEH_VAR(Vcb), _SEH_VAR(Mcb), _SEH_VAR(Dcb),
+                        _SEH_VAR(Fcb), _SEH_VAR(VcbResourceAcquired),
+                        _SEH_VAR(FcbPagingIoAcquired), _SEH_VAR(FcbResourceAcquired),
+                        _SEH_VAR(DcbResourceAcquired), _SEH_VAR(bNewDcb));
+}
+
+VOID
+Ext2DeleteFileFinal (
+    IN PEXT2_VCB            Vcb,
+    IN PEXT2_MCB            Mcb,
+    IN PEXT2_FCB            Dcb,
+    IN PEXT2_FCB            Fcb,
+    IN BOOLEAN              VcbResourceAcquired,
+    IN BOOLEAN              FcbPagingIoAcquired,
+    IN BOOLEAN              FcbResourceAcquired,
+    IN BOOLEAN              DcbResourceAcquired,
+    IN BOOLEAN              bNewDcb
+    )
+{
+    if (FcbPagingIoAcquired) {
+        ExReleaseResourceLite(&Fcb->PagingIoResource);
+    }
+
+    if (FcbResourceAcquired) {
+        ExReleaseResourceLite(&Fcb->MainResource);
+    }
+
+    if (DcbResourceAcquired) {
+        ExReleaseResourceLite(&Dcb->MainResource);
+    }
+
+    if (Dcb) {
+        ClearLongFlag(Dcb->Flags, FCB_STATE_BUSY);
+        if (bNewDcb) {
+            if (Ext2DerefXcb(&Dcb->ReferenceCount) == 0) {
+                Ext2FreeFcb(Dcb);
+            } else {
+                DEBUG(DL_ERR, ( "Ext2DeleteFile: Dcb %wZ used by other threads.\n",
+                                      &Mcb->FullName ));
+            }
+        }
+    }
+    if (VcbResourceAcquired) {
+        ExReleaseResourceLite(&Vcb->MainResource);
+    }
+}
+
 NTSTATUS
 Ext2DeleteFile(
         PEXT2_IRP_CONTEXT IrpContext,
@@ -1793,13 +1967,6 @@
 
     NTSTATUS        Status = STATUS_UNSUCCESSFUL;
 
-    BOOLEAN         VcbResourceAcquired = FALSE;
-    BOOLEAN         FcbPagingIoAcquired = FALSE;
-    BOOLEAN         FcbResourceAcquired = FALSE;
-    BOOLEAN         DcbResourceAcquired = FALSE;
-
-    BOOLEAN         bNewDcb = FALSE;
-
     LARGE_INTEGER   SysTime;
 
     DEBUG(DL_INF, ( "Ext2DeleteFile: File %wZ (%xh) will be deleted!\n",
@@ -1818,22 +1985,33 @@
         }
     }
 
-    __try {
+    _SEH_TRY {
+
+        _SEH_DECLARE_LOCALS(Ext2DeleteFileFinal);
+        _SEH_VAR(Vcb) = Vcb;
+        _SEH_VAR(Mcb) = Mcb;
+        _SEH_VAR(Dcb) = Dcb;
+        _SEH_VAR(Fcb) = Fcb;
+        _SEH_VAR(VcbResourceAcquired) = FALSE;
+        _SEH_VAR(FcbPagingIoAcquired) = FALSE;
+        _SEH_VAR(FcbResourceAcquired) = FALSE;
+        _SEH_VAR(DcbResourceAcquired) = FALSE;
+        _SEH_VAR(bNewDcb) = FALSE;
 
         ExAcquireResourceExclusiveLite(&Vcb->MainResource, TRUE);
-        VcbResourceAcquired = TRUE;
+        _SEH_VAR(VcbResourceAcquired) = TRUE;
 
         if (!(Dcb = Mcb->Parent->Fcb)) {
             Dcb = Ext2AllocateFcb(Vcb, Mcb->Parent);
             if (Dcb) {
                 Ext2ReferXcb(&Dcb->ReferenceCount);
-                bNewDcb = TRUE;
+                _SEH_VAR(bNewDcb) = TRUE;
             }
         }
 
         if (Dcb) {
             SetLongFlag(Dcb->Flags, FCB_STATE_BUSY);
-            DcbResourceAcquired = 
+            _SEH_VAR(DcbResourceAcquired) = 
                 ExAcquireResourceExclusiveLite(&Dcb->MainResource, TRUE);
 
             /* remove it's entry form it's parent */
@@ -1848,10 +2026,10 @@
         if (NT_SUCCESS(Status)) {
 
             if (Fcb) {
-                FcbResourceAcquired = 
+                _SEH_VAR(FcbResourceAcquired) = 
                     ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
 
-                FcbPagingIoAcquired = 
+                _SEH_VAR(FcbPagingIoAcquired) = 
                     ExAcquireResourceExclusiveLite(&Fcb->PagingIoResource, TRUE);
             }
 
@@ -1873,7 +2051,7 @@
             }
 
             if (!NT_SUCCESS(Status)) {
-                __leave;
+                _SEH_LEAVE;
             }
 
             if (IsMcbSymlink(Mcb)) {
@@ -1941,35 +2119,9 @@
             Ext2RemoveMcb(Vcb, Mcb);
         }
 
-    } __finally {
-
-        if (FcbPagingIoAcquired) {
-            ExReleaseResourceLite(&Fcb->PagingIoResource);
-        }
-
-        if (FcbResourceAcquired) {
-            ExReleaseResourceLite(&Fcb->MainResource);
-        }
-
-        if (DcbResourceAcquired) {
-            ExReleaseResourceLite(&Dcb->MainResource);
-        }
-
-        if (Dcb) {
-            ClearLongFlag(Dcb->Flags, FCB_STATE_BUSY);
-            if (bNewDcb) {
-                if (Ext2DerefXcb(&Dcb->ReferenceCount) == 0) {
-                    Ext2FreeFcb(Dcb);
-                } else {
-                    DEBUG(DL_ERR, ( "Ext2DeleteFile: Dcb %wZ used by other threads.\n",
-                                          &Mcb->FullName ));
-                }
-            }
-        }
-        if (VcbResourceAcquired) {
-            ExReleaseResourceLite(&Vcb->MainResource);
-        }
-    }
+    }
+    _SEH_FINALLY(Ext2DeleteFileFinal_PSEH)
+    _SEH_END;
 
     DEBUG(DL_INF, ( "Ext2DeleteFile: %wZ Succeed... EXT2SB->S_FREE_BLOCKS = %xh .\n",
                          &Mcb->FullName, Vcb->SuperBlock->s_free_blocks_count));

Modified: branches/pierre-fsd/drivers/filesystems/ext3fsd/flush.c
URL: http://svn.reactos.org/svn/reactos/branches/pierre-fsd/drivers/filesystems/ext3fsd/flush.c?rev=34617&r1=34616&r2=34617&view=diff
==============================================================================
--- branches/pierre-fsd/drivers/filesystems/ext3fsd/flush.c [iso-8859-1] (original)
+++ branches/pierre-fsd/drivers/filesystems/ext3fsd/flush.c [iso-8859-1] Sun Jul 20 15:33:18 2008
@@ -4,7 +4,8 @@
  * FILE:             flush.c
  * PROGRAMMER:       Matt Wu <mattwu at 163.com>
  * HOMEPAGE:         http://ext2.yeah.net
- * UPDATE HISTORY: 
+ * UPDATE HISTORY:   15 Jul 2008 (Pierre Schweitzer <heis_spiter at hotmail.com>)
+ *                     Replaced SEH support with PSEH support
  */
 
 /* INCLUDES *****************************************************************/
@@ -16,6 +17,16 @@
 extern PEXT2_GLOBAL Ext2Global;
 
 /* DEFINITIONS *************************************************************/
+
+VOID
+Ext2FlushFinal (
+    IN PEXT2_IRP_CONTEXT IrpContext,
+    IN PNTSTATUS pStatus,
+    IN PIRP Irp,
+    IN PIO_STACK_LOCATION IrpSp,
+    IN PEXT2_VCB Vcb,
+    IN PEXT2_FCBVCB FcbOrVcb,
+    IN BOOLEAN MainResourceAcquired    );
 
 #ifdef ALLOC_PRAGMA
 #pragma alloc_text(PAGE, Ext2FlushFile)
@@ -25,6 +36,9 @@
 #endif
 
 
+/* FUNCTIONS ***************************************************************/
+
+
 NTSTATUS
 Ext2FlushCompletionRoutine (
     IN PDEVICE_OBJECT DeviceObject,
@@ -138,6 +152,71 @@
     return IoStatus.Status;
 }
 
+_SEH_DEFINE_LOCALS(Ext2FlushFinal)
+{
+    PEXT2_IRP_CONTEXT IrpContext;
+    PNTSTATUS pStatus;
+    PIRP Irp;
+    PIO_STACK_LOCATION IrpSp;
+    PEXT2_VCB Vcb;
+    PEXT2_FCBVCB FcbOrVcb;
+    BOOLEAN MainResourceAcquired;
+};
+
+_SEH_FINALLYFUNC(Ext2FlushFinal_PSEH)
+{
+    _SEH_ACCESS_LOCALS(Ext2FlushFinal);
+    Ext2FlushFinal(_SEH_VAR(IrpContext), _SEH_VAR(pStatus), _SEH_VAR(Irp),
+                   _SEH_VAR(IrpSp), _SEH_VAR(Vcb), _SEH_VAR(FcbOrVcb),
+                   _SEH_VAR(MainResourceAcquired));
+}
+
+VOID
+Ext2FlushFinal (
+    IN PEXT2_IRP_CONTEXT    IrpContext,
+    IN PNTSTATUS            pStatus,
+    IN PIRP                 Irp,
+    IN PIO_STACK_LOCATION   IrpSp,
+    IN PEXT2_VCB            Vcb,
+    IN PEXT2_FCBVCB         FcbOrVcb,
+    IN BOOLEAN              MainResourceAcquired
+    )
+{
+    if (MainResourceAcquired) {
+        ExReleaseResourceLite(&FcbOrVcb->MainResource);
+    }
+
+    if (!IrpContext->ExceptionInProgress) {
+
+        if (Vcb && Irp && IrpSp && (!IsFlagOn(Vcb->Flags, VCB_READ_ONLY))) {
+
+            // Call the disk driver to flush the physial media.
+            NTSTATUS DriverStatus;
+            PIO_STACK_LOCATION NextIrpSp;
+
+            NextIrpSp = IoGetNextIrpStackLocation(Irp);
+
+            *NextIrpSp = *IrpSp;
+
+            IoSetCompletionRoutine( Irp,
+                                    Ext2FlushCompletionRoutine,
+                                    NULL,
+                                    TRUE,
+                                    TRUE,
+                                    TRUE );
+
+            DriverStatus = IoCallDriver(Vcb->TargetDeviceObject, Irp);
+
+            *pStatus = (DriverStatus == STATUS_INVALID_DEVICE_REQUEST) ?
+                      *pStatus : DriverStatus;
+
+            IrpContext->Irp = Irp = NULL;
+        }
+
+        Ext2CompleteIrpContext(IrpContext, *pStatus);
+    }
+}
+
 NTSTATUS
 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext)
 {
@@ -154,9 +233,16 @@
 
     PDEVICE_OBJECT          DeviceObject = NULL;
 
-    BOOLEAN                 MainResourceAcquired = FALSE;
-
-    __try {
+    _SEH_TRY {
+
+        _SEH_DECLARE_LOCALS(Ext2FlushFinal);
+        _SEH_VAR(IrpContext) = IrpContext;
+        _SEH_VAR(pStatus) = &Status;
+        _SEH_VAR(Irp) = NULL;
+        _SEH_VAR(IrpSp) = NULL;
+        _SEH_VAR(Vcb) = NULL;
+        _SEH_VAR(FcbOrVcb) = NULL;
+        _SEH_VAR(MainResourceAcquired) = FALSE;
 
         ASSERT(IrpContext);
     
@@ -170,10 +256,11 @@
         //
         if (IsExt2FsDevice(DeviceObject)) {
             Status = STATUS_INVALID_DEVICE_REQUEST;
-            __leave;
+            _SEH_LEAVE;
         }
         
         Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension;
+        _SEH_VAR(Vcb) = Vcb;
         ASSERT(Vcb != NULL);
         ASSERT((Vcb->Identifier.Type == EXT2VCB) &&
             (Vcb->Identifier.Size == sizeof(EXT2_VCB)));
@@ -182,27 +269,30 @@
         if ( IsFlagOn(Vcb->Flags, VCB_READ_ONLY) ||
              IsFlagOn(Vcb->Flags, VCB_WRITE_PROTECTED)) {
             Status =  STATUS_SUCCESS;
-            __leave;
+            _SEH_LEAVE;
         }
 
         Irp = IrpContext->Irp;
+        _SEH_VAR(Irp) = Irp;
         IrpSp = IoGetCurrentIrpStackLocation(Irp);
+        _SEH_VAR(IrpSp) = IrpSp;
 
         FileObject = IrpContext->FileObject;
         FcbOrVcb = (PEXT2_FCBVCB) FileObject->FsContext;
+        _SEH_VAR(FcbOrVcb) = FcbOrVcb;
         ASSERT(FcbOrVcb != NULL);
 
         Ccb = (PEXT2_CCB) FileObject->FsContext2;
         if (Ccb == NULL) {
             Status =  STATUS_SUCCESS;
-            __leave;
-        }
-
-        MainResourceAcquired = 
+            _SEH_LEAVE;
+        }
+
+        _SEH_VAR(MainResourceAcquired) = 
         ExAcquireResourceExclusiveLite(&FcbOrVcb->MainResource,
                 IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT));
 
-        ASSERT(MainResourceAcquired);
+        ASSERT(_SEH_VAR(MainResourceAcquired));
         DEBUG(DL_USR, ("Ext2Flush-pre:  total mcb records=%u\n",
                            FsRtlNumberOfRunsInLargeMcb(&Vcb->Extents)));
 
@@ -211,7 +301,7 @@
             Ext2VerifyVcb(IrpContext, Vcb);
             Status = Ext2FlushFiles(IrpContext, (PEXT2_VCB)(FcbOrVcb), FALSE);
             if (NT_SUCCESS(Status)) {
-                __leave;
+                _SEH_LEAVE;
             }
 
             Status = Ext2FlushVolume(IrpContext, (PEXT2_VCB)(FcbOrVcb), FALSE);
@@ -237,42 +327,9 @@
                         FsRtlNumberOfRunsInLargeMcb(&Vcb->Extents)));
 
 
-    } __finally {
-
-        if (MainResourceAcquired) {
-            ExReleaseResourceLite(&FcbOrVcb->MainResource);
-        }
-
-        if (!IrpContext->ExceptionInProgress) {
-
-            if (Vcb && Irp && IrpSp && (!IsFlagOn(Vcb->Flags, VCB_READ_ONLY))) {
-
-                // Call the disk driver to flush the physial media.
-                NTSTATUS DriverStatus;
-                PIO_STACK_LOCATION NextIrpSp;
-
-                NextIrpSp = IoGetNextIrpStackLocation(Irp);
-
-                *NextIrpSp = *IrpSp;
-
-                IoSetCompletionRoutine( Irp,
-                                        Ext2FlushCompletionRoutine,
-                                        NULL,
-                                        TRUE,
-                                        TRUE,
-                                        TRUE );
-
-                DriverStatus = IoCallDriver(Vcb->TargetDeviceObject, Irp);
-
-                Status = (DriverStatus == STATUS_INVALID_DEVICE_REQUEST) ?
-                         Status : DriverStatus;
-
-                IrpContext->Irp = Irp = NULL;
-            }
-
-            Ext2CompleteIrpContext(IrpContext, Status);
-        }
-    }
+    }
+    _SEH_FINALLY(Ext2FlushFinal_PSEH)
+    _SEH_END;
 
     return Status;
-}
+}



More information about the Ros-diffs mailing list