[CDFS_NEW] _SEH2_FINALLY implement SEH support for real instead of its current stub.

This notably fixes BSOD on media change
This commit is contained in:
Pierre Schweitzer 2017-11-17 22:18:53 +01:00
parent 519620ce61
commit f723d230a0
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B
17 changed files with 138 additions and 168 deletions

View file

@ -149,7 +149,7 @@ Return Value:
// Use a try finally to facilitate cleanup. // Use a try finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// We use a loop to perform the lookup. If we don't find the mapping in the // We use a loop to perform the lookup. If we don't find the mapping in the
@ -296,7 +296,7 @@ Return Value:
FirstPass = FALSE; FirstPass = FALSE;
} }
} finally { } _SEH2_FINALLY {
if (CleanupParent) { if (CleanupParent) {
@ -311,7 +311,7 @@ Return Value:
} }
if (UnlockFcb) { CdUnlockFcb( IrpContext, Fcb ); } if (UnlockFcb) { CdUnlockFcb( IrpContext, Fcb ); }
} } _SEH2_END;
return; return;
} }

View file

@ -94,7 +94,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Create the internal stream. The Vpb should be pointing at our volume // Create the internal stream. The Vpb should be pointing at our volume
@ -272,7 +272,7 @@ Return Value:
} }
} }
} finally { } _SEH2_FINALLY {
// //
// Cleanup any dirent structures we may have used. // Cleanup any dirent structures we may have used.
@ -306,7 +306,7 @@ Return Value:
} }
CdUnlockFcb( IrpContext, Fcb ); CdUnlockFcb( IrpContext, Fcb );
} } _SEH2_END;
return; return;
} }

View file

@ -259,7 +259,7 @@ Return Value:
// Use a try-except to handle the exception cases. // Use a try-except to handle the exception cases.
// //
try { _SEH2_TRY {
// //
// If the IrpContext is NULL then this is the first pass through // If the IrpContext is NULL then this is the first pass through
@ -398,10 +398,10 @@ Return Value:
CdCompleteRequest( IrpContext, Irp, Status ); CdCompleteRequest( IrpContext, Irp, Status );
} }
} except( CdExceptionFilter( IrpContext, GetExceptionInformation() )) { } _SEH2_EXCEPT( CdExceptionFilter( IrpContext, _SEH2_GetExceptionInformation() )) {
Status = CdProcessException( IrpContext, Irp, GetExceptionCode() ); Status = CdProcessException( IrpContext, Irp, _SEH2_GetExceptionCode() );
} } _SEH2_END;
} while (Status == STATUS_CANT_WAIT); } while (Status == STATUS_CANT_WAIT);
@ -653,7 +653,7 @@ Return Value:
// Note that (children of) CdFsdPostRequest can raise (Mdl allocation). // Note that (children of) CdFsdPostRequest can raise (Mdl allocation).
// //
try { _SEH2_TRY {
if (ExceptionCode == STATUS_CANT_WAIT) { if (ExceptionCode == STATUS_CANT_WAIT) {
@ -670,10 +670,10 @@ Return Value:
} }
} }
} }
except( CdExceptionFilter( IrpContext, GetExceptionInformation() )) { _SEH2_EXCEPT( CdExceptionFilter( IrpContext, _SEH2_GetExceptionInformation() )) {
ExceptionCode = GetExceptionCode(); ExceptionCode = _SEH2_GetExceptionCode();
} } _SEH2_END;
// //
// If we posted the request or our caller will retry then just return here. // If we posted the request or our caller will retry then just return here.

View file

@ -22,6 +22,9 @@ Abstract:
#include <ntddcdrm.h> #include <ntddcdrm.h>
#include <ntdddisk.h> #include <ntdddisk.h>
#include <ntddscsi.h> #include <ntddscsi.h>
#ifdef __REACTOS__
#include <pseh/pseh2.h>
#endif
#ifndef INLINE #ifndef INLINE
#define INLINE __inline #define INLINE __inline
@ -1881,16 +1884,14 @@ CdCommonPnp ( // Implemented in Pnp.c
// //
// #define try_return(S) { S; goto try_exit; } // #define try_return(S) { S; goto try_exit; }
// //
/* ReactOS Change: Remove SEH */
#define try
#define leave goto exitLabel;
#define finally if (0) goto exitLabel; exitLabel:
#define except(x) while (0)
#define GetExceptionCode() 0
#define AbnormalTermination() 0
#ifndef __REACTOS__
#define try_return(S) { S; goto try_exit; } #define try_return(S) { S; goto try_exit; }
#define try_leave(S) { S; leave; } #define try_leave(S) { S; leave; }
#else
#define try_return(S) { S; goto try_exit; }
#define try_leave(S) { S; _SEH2_LEAVE; }
#endif
// //

View file

@ -159,7 +159,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
//try { /* ReactOS Change: Manual removal of SEH since macros to hack around it don't allow multiple SEH usage within one function */ _SEH2_TRY {
// //
// Case on the type of open that we are trying to cleanup. // Case on the type of open that we are trying to cleanup.
@ -279,7 +279,7 @@ Return Value:
IoRemoveShareAccess( FileObject, &Fcb->ShareAccess ); IoRemoveShareAccess( FileObject, &Fcb->ShareAccess );
//} finally { /* ReactOS Change: Manual removal of SEH since macros to hack around it don't allow multiple SEH usage within one function */ } _SEH2_FINALLY {
CdReleaseFcb( IrpContext, Fcb ); CdReleaseFcb( IrpContext, Fcb );
@ -287,7 +287,7 @@ Return Value:
FsRtlNotifyVolumeEvent( FileObject, FSRTL_VOLUME_UNLOCK ); FsRtlNotifyVolumeEvent( FileObject, FSRTL_VOLUME_UNLOCK );
} }
//} /* ReactOS Change: Manual removal of SEH since macros to hack around it don't allow multiple SEH usage within one function */ } _SEH2_END;
// //
// If appropriate, try to spark teardown by purging the volume. Should // If appropriate, try to spark teardown by purging the volume. Should
@ -305,19 +305,19 @@ Return Value:
CdAcquireCdData( IrpContext); CdAcquireCdData( IrpContext);
try { _SEH2_TRY {
CdAcquireVcbExclusive( IrpContext, Vcb, FALSE ); CdAcquireVcbExclusive( IrpContext, Vcb, FALSE );
VcbAcquired = TRUE; VcbAcquired = TRUE;
CdPurgeVolume( IrpContext, Vcb, FALSE ); CdPurgeVolume( IrpContext, Vcb, FALSE );
} finally { } _SEH2_FINALLY {
if (VcbAcquired) { CdReleaseVcb( IrpContext, Vcb ); } if (VcbAcquired) { CdReleaseVcb( IrpContext, Vcb ); }
CdReleaseCdData( IrpContext); CdReleaseCdData( IrpContext);
} } _SEH2_END;
} }
// //

View file

@ -357,7 +357,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Verify that the Vcb is not in an unusable condition. This routine // Verify that the Vcb is not in an unusable condition. This routine
@ -901,7 +901,7 @@ Return Value:
RelatedCcb )); RelatedCcb ));
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
// //
// Cleanup the PathEntry if initialized. // Cleanup the PathEntry if initialized.
@ -926,7 +926,7 @@ Return Value:
// condition. // condition.
// //
if (AbnormalTermination()) { if (_SEH2_AbnormalTermination()) {
// //
@ -985,7 +985,7 @@ Return Value:
// //
CdCompleteRequest( IrpContext, Irp, Status ); CdCompleteRequest( IrpContext, Irp, Status );
} } _SEH2_END;
return Status; return Status;
} }
@ -1512,7 +1512,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Go ahead and figure out the TypeOfOpen and NodeType. We can // Go ahead and figure out the TypeOfOpen and NodeType. We can
@ -1905,7 +1905,7 @@ Return Value:
} }
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
if (UnlockVcb) { if (UnlockVcb) {
@ -1921,7 +1921,7 @@ Return Value:
CdCleanupCompoundPathEntry( IrpContext, &CompoundPathEntry ); CdCleanupCompoundPathEntry( IrpContext, &CompoundPathEntry );
} }
} } _SEH2_END;
return Status; return Status;
} }
@ -2126,7 +2126,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Check the related Ccb to see if this was an OpenByFileId. // Check the related Ccb to see if this was an OpenByFileId.
@ -2281,7 +2281,7 @@ Return Value:
IrpSp->Parameters.Create.SecurityContext->DesiredAccess ); IrpSp->Parameters.Create.SecurityContext->DesiredAccess );
} }
} finally { } _SEH2_FINALLY {
// //
// Unlock the Vcb if held. // Unlock the Vcb if held.
@ -2300,7 +2300,7 @@ Return Value:
CdReleaseFcb( IrpContext, ParentFcb ); CdReleaseFcb( IrpContext, ParentFcb );
} }
} } _SEH2_END;
return Status; return Status;
} }
@ -2399,7 +2399,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Check if a version number was used to open this file. // Check if a version number was used to open this file.
@ -2569,7 +2569,7 @@ Return Value:
CcbFlags, CcbFlags,
IrpSp->Parameters.Create.SecurityContext->DesiredAccess ); IrpSp->Parameters.Create.SecurityContext->DesiredAccess );
} finally { } _SEH2_FINALLY {
// //
// Unlock the Vcb if held. // Unlock the Vcb if held.
@ -2588,7 +2588,7 @@ Return Value:
CdReleaseFcb( IrpContext, ParentFcb ); CdReleaseFcb( IrpContext, ParentFcb );
} }
} } _SEH2_END;
return Status; return Status;
} }

View file

@ -355,7 +355,7 @@ Return Value:
// Use a try-finally to perform the final cleanup. // Use a try-finally to perform the final cleanup.
// //
try { _SEH2_TRY {
// //
// Loop while there are more bytes to transfer. // Loop while there are more bytes to transfer.
@ -518,7 +518,7 @@ Return Value:
} }
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
// //
// Perform final cleanup on the IoRuns if necessary. // Perform final cleanup on the IoRuns if necessary.
@ -528,7 +528,7 @@ Return Value:
CdFinishBuffers( IrpContext, IoRuns, CleanupRunCount, TRUE, FALSE ); CdFinishBuffers( IrpContext, IoRuns, CleanupRunCount, TRUE, FALSE );
} }
} } _SEH2_END;
return Status; return Status;
} }
@ -624,7 +624,7 @@ Return Value:
// Use a try-finally to perform the final cleanup. // Use a try-finally to perform the final cleanup.
// //
try { _SEH2_TRY {
// //
// If the initial offset lies within the RIFF header then copy the // If the initial offset lies within the RIFF header then copy the
@ -960,7 +960,7 @@ Return Value:
KeFlushIoBuffers( IrpContext->Irp->MdlAddress, TRUE, FALSE ); KeFlushIoBuffers( IrpContext->Irp->MdlAddress, TRUE, FALSE );
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
// //
// Perform final cleanup on the IoRuns if necessary. // Perform final cleanup on the IoRuns if necessary.
@ -970,7 +970,7 @@ Return Value:
CdFinishBuffers( IrpContext, IoRuns, CleanupRunCount, TRUE, FALSE ); CdFinishBuffers( IrpContext, IoRuns, CleanupRunCount, TRUE, FALSE );
} }
} } _SEH2_END;
return Status; return Status;
} }
@ -1176,15 +1176,15 @@ Return Value:
// deallocate the Mdl and return the appropriate "expected" status. // deallocate the Mdl and return the appropriate "expected" status.
// //
try { _SEH2_TRY {
MmProbeAndLockPages( Mdl, IrpContext->Irp->RequestorMode, IoWriteAccess ); MmProbeAndLockPages( Mdl, IrpContext->Irp->RequestorMode, IoWriteAccess );
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} except(EXCEPTION_EXECUTE_HANDLER) { } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
Status = GetExceptionCode(); Status = _SEH2_GetExceptionCode();
IoFreeMdl( Mdl ); IoFreeMdl( Mdl );
IrpContext->Irp->MdlAddress = NULL; IrpContext->Irp->MdlAddress = NULL;
@ -1193,7 +1193,7 @@ Return Value:
Status = STATUS_INVALID_USER_BUFFER; Status = STATUS_INVALID_USER_BUFFER;
} }
} } _SEH2_END;
} }
// //

View file

@ -287,7 +287,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Verify the Fcb is still good. // Verify the Fcb is still good.
@ -499,7 +499,7 @@ Return Value:
// such trickery. // such trickery.
// //
try { _SEH2_TRY {
// //
// Zero and initialize the base part of the current entry. // Zero and initialize the base part of the current entry.
@ -715,7 +715,7 @@ Return Value:
LastEntry = NextEntry; LastEntry = NextEntry;
NextEntry = QuadAlign( Information ); NextEntry = QuadAlign( Information );
} except (EXCEPTION_EXECUTE_HANDLER) { } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) {
// //
// We had a problem filling in the user's buffer, so stop and // We had a problem filling in the user's buffer, so stop and
@ -724,13 +724,13 @@ Return Value:
// //
Information = 0; Information = 0;
try_leave( Status = GetExceptionCode()); try_leave( Status = _SEH2_GetExceptionCode());
} } _SEH2_END;
} }
DoCcbUpdate = TRUE; DoCcbUpdate = TRUE;
} finally { } _SEH2_FINALLY {
// //
// Cleanup our search context - *before* acquiring the FCB mutex exclusive, // Cleanup our search context - *before* acquiring the FCB mutex exclusive,
@ -769,7 +769,7 @@ Return Value:
// //
CdReleaseFile( IrpContext, Fcb ); CdReleaseFile( IrpContext, Fcb );
} } _SEH2_END;
// //
// Complete the request here. // Complete the request here.
@ -837,7 +837,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Verify the Vcb. // Verify the Vcb.
@ -862,14 +862,14 @@ Return Value:
NULL, NULL,
NULL ); NULL );
} finally { } _SEH2_FINALLY {
// //
// Release the Vcb. // Release the Vcb.
// //
CdReleaseVcb( IrpContext, IrpContext->Vcb ); CdReleaseVcb( IrpContext, IrpContext->Vcb );
} } _SEH2_END;
// //
// Cleanup the IrpContext. // Cleanup the IrpContext.

View file

@ -165,7 +165,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// We only support query on file and directory handles. // We only support query on file and directory handles.
@ -325,7 +325,7 @@ Return Value:
Irp->IoStatus.Information = IrpSp->Parameters.QueryFile.Length - Length; Irp->IoStatus.Information = IrpSp->Parameters.QueryFile.Length - Length;
} finally { } _SEH2_FINALLY {
// //
// Release the file. // Release the file.
@ -335,7 +335,7 @@ Return Value:
CdReleaseFile( IrpContext, Fcb ); CdReleaseFile( IrpContext, Fcb );
} }
} } _SEH2_END;
// //
// Complete the request if we didn't raise. // Complete the request if we didn't raise.
@ -406,7 +406,7 @@ Return Value:
CdAcquireFileShared( IrpContext, Fcb ); CdAcquireFileShared( IrpContext, Fcb );
try { _SEH2_TRY {
// //
// Make sure the Fcb is in a usable condition. This // Make sure the Fcb is in a usable condition. This
@ -445,10 +445,10 @@ Return Value:
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
CdReleaseFile( IrpContext, Fcb ); CdReleaseFile( IrpContext, Fcb );
} } _SEH2_END;
// //
// Complete the request if there was no raise. // Complete the request if there was no raise.
@ -536,7 +536,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Only deal with 'good' Fcb's. // Only deal with 'good' Fcb's.
@ -566,12 +566,12 @@ Return Value:
Result = TRUE; Result = TRUE;
} }
} finally { } _SEH2_FINALLY {
ExReleaseResourceLite( Fcb->Resource ); ExReleaseResourceLite( Fcb->Resource );
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Result; return Result;
} }
@ -654,7 +654,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Only deal with 'good' Fcb's. // Only deal with 'good' Fcb's.
@ -694,12 +694,12 @@ Return Value:
Result = TRUE; Result = TRUE;
} }
} finally { } _SEH2_FINALLY {
ExReleaseResourceLite( Fcb->Resource ); ExReleaseResourceLite( Fcb->Resource );
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Result; return Result;
} }
@ -782,7 +782,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Only deal with 'good' Fcb's. // Only deal with 'good' Fcb's.
@ -827,12 +827,12 @@ Return Value:
Result = TRUE; Result = TRUE;
} }
} finally { } _SEH2_FINALLY {
ExReleaseResourceLite( Fcb->Resource ); ExReleaseResourceLite( Fcb->Resource );
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Result; return Result;
} }
@ -1278,7 +1278,7 @@ Return Value:
// Use a try-finally to cleanup the structures. // Use a try-finally to cleanup the structures.
// //
try { _SEH2_TRY {
ParentFcb = Fcb->ParentFcb; ParentFcb = Fcb->ParentFcb;
CdAcquireFileShared( IrpContext, ParentFcb ); CdAcquireFileShared( IrpContext, ParentFcb );
@ -1396,7 +1396,7 @@ Return Value:
RtlCopyMemory( Buffer->FileName, ShortNameBuffer, Buffer->FileNameLength ); RtlCopyMemory( Buffer->FileName, ShortNameBuffer, Buffer->FileNameLength );
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
if (CleanupFileLookup) { if (CleanupFileLookup) {
@ -1413,7 +1413,7 @@ Return Value:
CdReleaseFile( IrpContext, ParentFcb ); CdReleaseFile( IrpContext, ParentFcb );
} }
} } _SEH2_END;
// //
// Reduce the available bytes by the amount stored into this buffer. // Reduce the available bytes by the amount stored into this buffer.

View file

@ -723,7 +723,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Allocate a buffer to query the TOC. // Allocate a buffer to query the TOC.
@ -1058,7 +1058,7 @@ Return Value:
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
} finally { } _SEH2_FINALLY {
// //
// Free the TOC buffer if not in the Vcb. // Free the TOC buffer if not in the Vcb.
@ -1082,7 +1082,7 @@ Return Value:
// If we are not mounting the device, then set the verify bit again. // If we are not mounting the device, then set the verify bit again.
// //
if ((AbnormalTermination() || (Status != STATUS_SUCCESS)) && if ((_SEH2_AbnormalTermination() || (Status != STATUS_SUCCESS)) &&
SetDoVerifyOnFail) { SetDoVerifyOnFail) {
CdMarkRealDevForVerify( IrpContext->RealDevice); CdMarkRealDevForVerify( IrpContext->RealDevice);
@ -1119,7 +1119,7 @@ Return Value:
// //
CdReleaseCdData( IrpContext ); CdReleaseCdData( IrpContext );
} } _SEH2_END;
// //
// Now send mount notification. // Now send mount notification.
@ -1221,7 +1221,7 @@ Return Value:
CdAcquireCdData( IrpContext ); CdAcquireCdData( IrpContext );
try { _SEH2_TRY {
CdAcquireVcbExclusive( IrpContext, Vcb, FALSE ); CdAcquireVcbExclusive( IrpContext, Vcb, FALSE );
ReleaseVcb = TRUE; ReleaseVcb = TRUE;
@ -1545,7 +1545,7 @@ Return Value:
} }
} }
} finally { } _SEH2_FINALLY {
// //
// Free the TOC buffer if allocated. // Free the TOC buffer if allocated.
@ -1567,7 +1567,7 @@ Return Value:
} }
CdReleaseCdData( IrpContext ); CdReleaseCdData( IrpContext );
} } _SEH2_END;
// //
// Now send mount notification. // Now send mount notification.
@ -1692,7 +1692,7 @@ Return Value:
// Use a try finally to free the Fcb. // Use a try finally to free the Fcb.
// //
try { _SEH2_TRY {
// //
// Verify the Fcb. // Verify the Fcb.
@ -1722,14 +1722,14 @@ Return Value:
Irp = NULL; Irp = NULL;
} finally { } _SEH2_FINALLY {
// //
// Release all of our resources // Release all of our resources
// //
CdReleaseFcb( IrpContext, Fcb ); CdReleaseFcb( IrpContext, Fcb );
} } _SEH2_END;
// //
// Complete the request if there was no exception. // Complete the request if there was no exception.
@ -1804,7 +1804,7 @@ Return Value:
Vcb = Fcb->Vcb; Vcb = Fcb->Vcb;
CdAcquireVcbExclusive( IrpContext, Vcb, FALSE ); CdAcquireVcbExclusive( IrpContext, Vcb, FALSE );
try { _SEH2_TRY {
// //
// Verify the Vcb. // Verify the Vcb.
@ -1814,7 +1814,7 @@ Return Value:
Status = CdLockVolumeInternal( IrpContext, Vcb, IrpSp->FileObject ); Status = CdLockVolumeInternal( IrpContext, Vcb, IrpSp->FileObject );
} finally { } _SEH2_FINALLY {
// //
// Release the Vcb. // Release the Vcb.
@ -1822,11 +1822,11 @@ Return Value:
CdReleaseVcb( IrpContext, Vcb ); CdReleaseVcb( IrpContext, Vcb );
if (AbnormalTermination() || !NT_SUCCESS( Status )) { if (_SEH2_AbnormalTermination() || !NT_SUCCESS( Status )) {
FsRtlNotifyVolumeEvent( IrpSp->FileObject, FSRTL_VOLUME_LOCK_FAILED ); FsRtlNotifyVolumeEvent( IrpSp->FileObject, FSRTL_VOLUME_LOCK_FAILED );
} }
} } _SEH2_END;
// //
// Complete the request if there haven't been any exceptions. // Complete the request if there haven't been any exceptions.
@ -2635,7 +2635,7 @@ Return Value:
// Check for whether this device supports XA and multi-session. // Check for whether this device supports XA and multi-session.
// //
try { _SEH2_TRY {
// //
// Allocate a buffer for the last session information. // Allocate a buffer for the last session information.
@ -2713,10 +2713,10 @@ Return Value:
ThisPass += 1; ThisPass += 1;
} }
} finally { } _SEH2_FINALLY {
if (CdromToc != NULL) { CdFreePool( &CdromToc ); } if (CdromToc != NULL) { CdFreePool( &CdromToc ); }
} } _SEH2_END;
} }
// //

View file

@ -94,7 +94,7 @@ Return Value:
while (TRUE) { while (TRUE) {
try { _SEH2_TRY {
// //
// Reinitialize for the next try at completing this // Reinitialize for the next try at completing this
@ -184,10 +184,10 @@ Return Value:
CdCompleteRequest( IrpContext, Irp, Status ); CdCompleteRequest( IrpContext, Irp, Status );
} }
} except( CdExceptionFilter( IrpContext, GetExceptionInformation() )) { } _SEH2_EXCEPT( CdExceptionFilter( IrpContext, _SEH2_GetExceptionInformation() )) {
Status = CdProcessException( IrpContext, Irp, GetExceptionCode() ); Status = CdProcessException( IrpContext, Irp, _SEH2_GetExceptionCode() );
} } _SEH2_END;
// //
// Break out of the loop if we didn't get CANT_WAIT. // Break out of the loop if we didn't get CANT_WAIT.

View file

@ -224,7 +224,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// We check whether we can proceed based on the state of the file oplocks. // We check whether we can proceed based on the state of the file oplocks.
@ -275,10 +275,10 @@ Return Value:
} }
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Results; return Results;
} }
@ -366,7 +366,7 @@ Return Value:
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
try { _SEH2_TRY {
// //
// We check whether we can proceed based on the state of the file oplocks. // We check whether we can proceed based on the state of the file oplocks.
@ -416,10 +416,10 @@ Return Value:
} }
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Results; return Results;
} }
@ -498,7 +498,7 @@ Return Value:
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
try { _SEH2_TRY {
// //
// We check whether we can proceed based on the state of the file oplocks. // We check whether we can proceed based on the state of the file oplocks.
@ -539,10 +539,10 @@ Return Value:
CdUnlockFcb( IrpContext, Fcb ); CdUnlockFcb( IrpContext, Fcb );
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Results; return Results;
} }
@ -624,7 +624,7 @@ Return Value:
FsRtlEnterFileSystem(); FsRtlEnterFileSystem();
try { _SEH2_TRY {
// //
// We check whether we can proceed based on the state of the file oplocks. // We check whether we can proceed based on the state of the file oplocks.
@ -666,10 +666,10 @@ Return Value:
CdUnlockFcb( IrpContext, Fcb ); CdUnlockFcb( IrpContext, Fcb );
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
FsRtlExitFileSystem(); FsRtlExitFileSystem();
} } _SEH2_END;
return Results; return Results;
} }

View file

@ -35,11 +35,11 @@ Abstract:
// //
#define SafeZeroMemory(IC,AT,BYTE_COUNT) { \ #define SafeZeroMemory(IC,AT,BYTE_COUNT) { \
try { \ _SEH2_TRY { \
RtlZeroMemory( (AT), (BYTE_COUNT) ); \ RtlZeroMemory( (AT), (BYTE_COUNT) ); \
} except( EXCEPTION_EXECUTE_HANDLER ) { \ } _SEH2_EXCEPT( EXCEPTION_EXECUTE_HANDLER ) { \
CdRaiseStatus( IC, STATUS_INVALID_USER_BUFFER ); \ CdRaiseStatus( IC, STATUS_INVALID_USER_BUFFER ); \
} \ } _SEH2_END; \
} }
// //
@ -180,7 +180,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Verify the Fcb. Allow reads if this is a DASD handle that is // Verify the Fcb. Allow reads if this is a DASD handle that is
@ -515,7 +515,7 @@ Return Value:
} }
try_exit: NOTHING; try_exit: NOTHING;
} finally { } _SEH2_FINALLY {
// //
// Release the Fcb. // Release the Fcb.
@ -525,7 +525,7 @@ Return Value:
CdReleaseFile( IrpContext, Fcb ); CdReleaseFile( IrpContext, Fcb );
} }
} } _SEH2_END;
// //
// Post the request if we got CANT_WAIT. // Post the request if we got CANT_WAIT.

View file

@ -298,19 +298,19 @@ Return Value:
// uninitialize the notify structures before returning. // uninitialize the notify structures before returning.
// //
try { _SEH2_TRY {
Vcb->SwapVpb = FsRtlAllocatePoolWithTag( NonPagedPool, Vcb->SwapVpb = FsRtlAllocatePoolWithTag( NonPagedPool,
sizeof( VPB ), sizeof( VPB ),
TAG_VPB ); TAG_VPB );
} }
finally { _SEH2_FINALLY {
if (AbnormalTermination()) { if (_SEH2_AbnormalTermination()) {
FsRtlNotifyUninitializeSync( &Vcb->NotifySync ); FsRtlNotifyUninitializeSync( &Vcb->NotifySync );
} }
} } _SEH2_END;
// //
// Nothing beyond this point should raise. // Nothing beyond this point should raise.
@ -456,7 +456,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Copy the block size and compute the various block masks. // Copy the block size and compute the various block masks.
@ -843,10 +843,10 @@ Return Value:
SetFlag( Vcb->VcbState, VCB_STATE_ISO ); SetFlag( Vcb->VcbState, VCB_STATE_ISO );
} }
} finally { } _SEH2_FINALLY {
if (UnlockVcb) { CdUnlockVcb( IrpContext, Vcb ); } if (UnlockVcb) { CdUnlockVcb( IrpContext, Vcb ); }
} } _SEH2_END;
} }
@ -1238,7 +1238,7 @@ Return Value:
CdLockFcb( IrpContext, Fcb ); CdLockFcb( IrpContext, Fcb );
try { _SEH2_TRY {
// //
// Initialize the common header in the Fcb. The node type is already // Initialize the common header in the Fcb. The node type is already
@ -1361,10 +1361,10 @@ Return Value:
CdInsertFcbTable( IrpContext, Fcb ); CdInsertFcbTable( IrpContext, Fcb );
SetFlag( Fcb->FcbState, FCB_STATE_IN_FCB_TABLE ); SetFlag( Fcb->FcbState, FCB_STATE_IN_FCB_TABLE );
} finally { } _SEH2_FINALLY {
CdUnlockFcb( IrpContext, Fcb ); CdUnlockFcb( IrpContext, Fcb );
} } _SEH2_END;
return; return;
} }
@ -1937,7 +1937,7 @@ Return Value:
// Use a try-finally to safely clear the top-level field. // Use a try-finally to safely clear the top-level field.
// //
try { _SEH2_TRY {
// //
// Loop until we find an Fcb we can't remove. // Loop until we find an Fcb we can't remove.
@ -2041,7 +2041,7 @@ Return Value:
} while (CurrentFcb != NULL); } while (CurrentFcb != NULL);
} finally { } _SEH2_FINALLY {
// //
// Release the current Fcb if we have acquired it. // Release the current Fcb if we have acquired it.
@ -2057,7 +2057,7 @@ Return Value:
// //
ClearFlag( IrpContext->TopLevel->Flags, IRP_CONTEXT_FLAG_IN_TEARDOWN ); ClearFlag( IrpContext->TopLevel->Flags, IRP_CONTEXT_FLAG_IN_TEARDOWN );
} } _SEH2_END;
*RemovedStartingFcb = (CurrentFcb != StartingFcb); *RemovedStartingFcb = (CurrentFcb != StartingFcb);
return; return;

View file

@ -92,7 +92,7 @@ Return Value:
Vcb = &CONTAINING_RECORD( IrpSp->DeviceObject, Vcb = &CONTAINING_RECORD( IrpSp->DeviceObject,
VOLUME_DEVICE_OBJECT, VOLUME_DEVICE_OBJECT,
DeviceObject )->Vcb; DeviceObject )->Vcb;
try { _SEH2_TRY {
// //
// Send down the verify FSCTL. Note that this is sent to the // Send down the verify FSCTL. Note that this is sent to the
@ -206,7 +206,7 @@ Return Value:
Status = CdFsdPostRequest( IrpContext, Irp ); Status = CdFsdPostRequest( IrpContext, Irp );
} }
} except(CdExceptionFilter( IrpContext, GetExceptionInformation() )) { } _SEH2_EXCEPT(CdExceptionFilter( IrpContext, _SEH2_GetExceptionInformation() )) {
// //
// We had some trouble trying to perform the verify or raised // We had some trouble trying to perform the verify or raised
@ -214,8 +214,8 @@ Return Value:
// the error status that we get back from the exception code. // the error status that we get back from the exception code.
// //
Status = CdProcessException( IrpContext, Irp, GetExceptionCode() ); Status = CdProcessException( IrpContext, Irp, _SEH2_GetExceptionCode() );
} } _SEH2_END;
return Status; return Status;
} }

View file

@ -130,7 +130,7 @@ Return Value:
// Use a try-finally to facilitate cleanup. // Use a try-finally to facilitate cleanup.
// //
try { _SEH2_TRY {
// //
// Verify the Vcb. // Verify the Vcb.
@ -177,14 +177,14 @@ Return Value:
Irp->IoStatus.Information = IrpSp->Parameters.QueryVolume.Length - Length; Irp->IoStatus.Information = IrpSp->Parameters.QueryVolume.Length - Length;
} finally { } _SEH2_FINALLY {
// //
// Release the Vcb. // Release the Vcb.
// //
CdReleaseVcb( IrpContext, Fcb->Vcb ); CdReleaseVcb( IrpContext, Fcb->Vcb );
} } _SEH2_END;
// //
// Complete the request if we didn't raise. // Complete the request if we didn't raise.

View file

@ -805,37 +805,6 @@ Index: drivers/filesystems/cdfs_new/lockctrl.c
CdFastUnlockAllByKey ( CdFastUnlockAllByKey (
IN PFILE_OBJECT FileObject, IN PFILE_OBJECT FileObject,
PVOID ProcessId, PVOID ProcessId,
Index: drivers/filesystems/cdfs_new/cleanup.c
===================================================================
--- drivers/filesystems/cdfs_new/cleanup.c (revision 34615)
+++ drivers/filesystems/cdfs_new/cleanup.c (working copy)
@@ -159,7 +159,7 @@
// Use a try-finally to facilitate cleanup.
//
- try {
+ //try { /* ReactOS Change: Manual removal of SEH since macros to hack around it don't allow multiple SEH usage within one function */
//
// Case on the type of open that we are trying to cleanup.
@@ -279,7 +279,7 @@
IoRemoveShareAccess( FileObject, &Fcb->ShareAccess );
- } finally {
+ //} finally { /* ReactOS Change: Manual removal of SEH since macros to hack around it don't allow multiple SEH usage within one function */
CdReleaseFcb( IrpContext, Fcb );
@@ -287,7 +287,7 @@
FsRtlNotifyVolumeEvent( FileObject, FSRTL_VOLUME_UNLOCK );
}
- }
+ //} /* ReactOS Change: Manual removal of SEH since macros to hack around it don't allow multiple SEH usage within one function */
//
// If appropriate, try to spark teardown by purging the volume. Should
Index: drivers/filesystems/cdfs_new/strucsup.c Index: drivers/filesystems/cdfs_new/strucsup.c
=================================================================== ===================================================================
--- drivers/filesystems/cdfs_new/strucsup.c (revision 34615) --- drivers/filesystems/cdfs_new/strucsup.c (revision 34615)