- Handle errors from CcInitializeCacheMap and CcCopyRead
CORE-6501

svn path=/trunk/; revision=66478
This commit is contained in:
Thomas Faber 2015-02-27 21:30:09 +00:00
parent 33d9e81156
commit b9809e6704
5 changed files with 76 additions and 26 deletions

View file

@ -19,6 +19,7 @@ list(APPEND SOURCE
add_library(cdfs SHARED ${SOURCE} cdfs.rc) add_library(cdfs SHARED ${SOURCE} cdfs.rc)
set_module_type(cdfs kernelmodedriver) set_module_type(cdfs kernelmodedriver)
target_link_libraries(cdfs ${PSEH_LIB})
add_importlibs(cdfs ntoskrnl hal) add_importlibs(cdfs ntoskrnl hal)
add_pch(cdfs cdfs.h SOURCE) add_pch(cdfs cdfs.h SOURCE)
add_cd_file(TARGET cdfs DESTINATION reactos/system32/drivers NO_CAB FOR all) add_cd_file(TARGET cdfs DESTINATION reactos/system32/drivers NO_CAB FOR all)

View file

@ -3,6 +3,7 @@
#include <ntifs.h> #include <ntifs.h>
#include <ntddcdrm.h> #include <ntddcdrm.h>
#include <pseh/pseh2.h>
#define CDFS_BASIC_SECTOR 2048 #define CDFS_BASIC_SECTOR 2048
#define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16 #define CDFS_PRIMARY_DESCRIPTOR_LOCATION 16

View file

@ -255,11 +255,23 @@ CdfsFCBInitializeCache(PVCB Vcb,
Fcb->FileObject = FileObject; Fcb->FileObject = FileObject;
Fcb->DevExt = Vcb; Fcb->DevExt = Vcb;
_SEH2_TRY
{
CcInitializeCacheMap(FileObject, CcInitializeCacheMap(FileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
FALSE, FALSE,
&(CdfsGlobalData->CacheMgrCallbacks), &(CdfsGlobalData->CacheMgrCallbacks),
Fcb); Fcb);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
FileObject->FsContext2 = NULL;
ExFreePoolWithTag(newCCB, TAG_CCB);
ObDereferenceObject(FileObject);
Fcb->FileObject = NULL;
return _SEH2_GetExceptionCode();
}
_SEH2_END;
ObDereferenceObject(FileObject); ObDereferenceObject(FileObject);
Fcb->Flags |= FCB_CACHE_INITIALIZED; Fcb->Flags |= FCB_CACHE_INITIALIZED;
@ -443,12 +455,22 @@ CdfsAttachFCBToFileObject(PDEVICE_EXTENSION Vcb,
Fcb->DevExt = Vcb; Fcb->DevExt = Vcb;
if (CdfsFCBIsDirectory(Fcb)) if (CdfsFCBIsDirectory(Fcb))
{
_SEH2_TRY
{ {
CcInitializeCacheMap(FileObject, CcInitializeCacheMap(FileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
FALSE, FALSE,
&(CdfsGlobalData->CacheMgrCallbacks), &(CdfsGlobalData->CacheMgrCallbacks),
Fcb); Fcb);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
FileObject->FsContext2 = NULL;
ExFreePoolWithTag(newCCB, TAG_CCB);
return _SEH2_GetExceptionCode();
}
_SEH2_END;
Fcb->Flags |= FCB_CACHE_INITIALIZED; Fcb->Flags |= FCB_CACHE_INITIALIZED;
} }

View file

@ -414,11 +414,20 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject,
Fcb->Entry.ExtentLocationL = 0; Fcb->Entry.ExtentLocationL = 0;
Fcb->Entry.DataLengthL = (DeviceExt->CdInfo.VolumeSpaceSize + DeviceExt->CdInfo.VolumeOffset) * BLOCKSIZE; Fcb->Entry.DataLengthL = (DeviceExt->CdInfo.VolumeSpaceSize + DeviceExt->CdInfo.VolumeOffset) * BLOCKSIZE;
_SEH2_TRY
{
CcInitializeCacheMap(DeviceExt->StreamFileObject, CcInitializeCacheMap(DeviceExt->StreamFileObject,
(PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize),
TRUE, TRUE,
&(CdfsGlobalData->CacheMgrCallbacks), &(CdfsGlobalData->CacheMgrCallbacks),
Fcb); Fcb);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
goto ByeBye;
}
_SEH2_END;
ExInitializeResourceLite(&DeviceExt->VcbResource); ExInitializeResourceLite(&DeviceExt->VcbResource);

View file

@ -91,20 +91,37 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt,
Fcb->RFCB.ValidDataLength.HighPart, Fcb->RFCB.ValidDataLength.HighPart,
Fcb->RFCB.ValidDataLength.LowPart); Fcb->RFCB.ValidDataLength.LowPart);
_SEH2_TRY
{
CcInitializeCacheMap(FileObject, CcInitializeCacheMap(FileObject,
&FileSizes, &FileSizes,
FALSE, FALSE,
&(CdfsGlobalData->CacheMgrCallbacks), &(CdfsGlobalData->CacheMgrCallbacks),
Fcb); Fcb);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
return _SEH2_GetExceptionCode();
}
_SEH2_END;
}
FileOffset.QuadPart = (LONGLONG)ReadOffset; FileOffset.QuadPart = (LONGLONG)ReadOffset;
_SEH2_TRY
{
CcCopyRead(FileObject, CcCopyRead(FileObject,
&FileOffset, &FileOffset,
ToRead, ToRead,
TRUE, TRUE,
Buffer, Buffer,
&IoStatus); &IoStatus);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
IoStatus.Information = 0;
IoStatus.Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
*LengthRead = IoStatus.Information; *LengthRead = IoStatus.Information;
Status = IoStatus.Status; Status = IoStatus.Status;