Index: CMakeLists.txt =================================================================== --- drivers/filesystems/fastfat/CMakeLists.txt (revision 63837) +++ drivers/filesystems/fastfat/CMakeLists.txt (working copy) @@ -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) Index: fcb.c =================================================================== --- drivers/filesystems/fastfat/fcb.c (revision 63837) +++ drivers/filesystems/fastfat/fcb.c (working copy) @@ -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; Index: fsctl.c =================================================================== --- drivers/filesystems/fastfat/fsctl.c (revision 63837) +++ drivers/filesystems/fastfat/fsctl.c (working copy) @@ -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); Index: rw.c =================================================================== --- drivers/filesystems/fastfat/rw.c (revision 63837) +++ drivers/filesystems/fastfat/rw.c (working copy) @@ -673,22 +673,35 @@ Status = /*STATUS_END_OF_FILE*/STATUS_SUCCESS; } - if (IrpContext->FileObject->PrivateCacheMap == NULL) + _SEH2_TRY { - CcInitializeCacheMap(IrpContext->FileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - FALSE, - &(VfatGlobalData->CacheMgrCallbacks), - Fcb); + 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; + } } - - if (!CcCopyRead(IrpContext->FileObject, &ByteOffset, Length, - (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT), Buffer, - &IrpContext->Irp->IoStatus)) + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = STATUS_PENDING; + 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) + _SEH2_TRY { - CcInitializeCacheMap(IrpContext->FileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - FALSE, - &VfatGlobalData->CacheMgrCallbacks, - Fcb); - } + 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 (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; + 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; + } } - else + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = STATUS_UNSUCCESSFUL; + Status = _SEH2_GetExceptionCode(); } + _SEH2_END; } else { Index: vfat.h =================================================================== --- drivers/filesystems/fastfat/vfat.h (revision 63837) +++ drivers/filesystems/fastfat/vfat.h (working copy) @@ -4,6 +4,7 @@ #include #include #include +#include #define USE_ROS_CC_AND_FS