| 18 | /* DEFINITIONS *************************************************************/ |
| 19 | |
| 20 | NTSTATUS |
| 21 | Ext2ExceptionFilter ( |
| 22 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 23 | IN PEXCEPTION_POINTERS ExceptionPointer |
| 24 | ) |
| 25 | { |
| 26 | NTSTATUS Status = EXCEPTION_EXECUTE_HANDLER; |
| 27 | NTSTATUS ExceptionCode; |
| 28 | PEXCEPTION_RECORD ExceptRecord; |
| 29 | |
| 30 | ExceptRecord = ExceptionPointer->ExceptionRecord; |
| 31 | ExceptionCode = ExceptRecord->ExceptionCode; |
| 32 | |
| 33 | DbgPrint("-------------------------------------------------------------\n"); |
| 34 | DbgPrint("Exception happends in Ext2Fsd (code %xh):\n", ExceptionCode); |
| 35 | DbgPrint(".exr %p;.cxr %p;\n", ExceptionPointer->ExceptionRecord, |
| 36 | ExceptionPointer->ContextRecord); |
| 37 | DbgPrint("-------------------------------------------------------------\n"); |
| 38 | |
| 39 | DbgBreak(); |
| 40 | |
| 41 | // |
| 42 | // Check IrpContext is valid or not |
| 43 | // |
| 44 | |
| 45 | if (IrpContext) { |
| 46 | if ((IrpContext->Identifier.Type != EXT2ICX) || |
| 47 | (IrpContext->Identifier.Size != sizeof(EXT2_IRP_CONTEXT))) { |
| 48 | DbgBreak(); |
| 49 | IrpContext = NULL; |
| 50 | } else if (IrpContext->DeviceObject) { |
| 51 | PEXT2_VCB Vcb = NULL; |
| 52 | Vcb = (PEXT2_VCB) IrpContext->DeviceObject->DeviceExtension; |
| 53 | if (NULL == Vcb) { |
| 54 | Status = EXCEPTION_EXECUTE_HANDLER; |
| 55 | } else { |
| 56 | if (Vcb->Identifier.Type == EXT2VCB && !IsMounted(Vcb)) { |
| 57 | Status = EXCEPTION_EXECUTE_HANDLER; |
| 58 | } |
| 59 | } |
| 60 | } |
| 61 | } else { |
| 62 | if (FsRtlIsNtstatusExpected(ExceptionCode)) { |
| 63 | return EXCEPTION_EXECUTE_HANDLER; |
| 64 | } else { |
| 65 | Ext2BugCheck( EXT2_BUGCHK_EXCEPT, (ULONG_PTR)ExceptRecord, |
| 66 | (ULONG_PTR)ExceptionPointer->ContextRecord, |
| 67 | (ULONG_PTR)ExceptRecord->ExceptionAddress ); |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | if (IrpContext) { |
| 72 | SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT); |
| 73 | } |
| 74 | |
| 75 | if ( Status == EXCEPTION_EXECUTE_HANDLER || |
| 76 | FsRtlIsNtstatusExpected(ExceptionCode)) { |
| 77 | // |
no test coverage detected