⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 except.c

📁 一个windows 文件系统驱动源码
💻 C
字号:
 
 /*
  *     Copyright (C) Satish kumar Janarthanan (vsat_in@yahoo.com.), 2004-2005
  *
  *		Project:		Win2fs
  *
  *		Module Name:    \FSD\except.c
  *
  *     Abstract:		Exception handler code.
  *
  *     Author:		    Satish Kumar J
  *
  *		Date:			09-JUL-2004
  *
  *		Notes:			None.
  *
  *		Revision History:
  *
  *		Date		Version	Author				Changes
  *		------------------------------------------------------------------------
  *
  *		09-JUL-04	1.00	Satish Kumar J		Initial	Version.
  *
  *
  */

 //////////////////////////////////////////////////////////////////////////////

 // Include files.

 #include "ntifs.h"
 #include "ext2fs.h"

 //////////////////////////////////////////////////////////////////////////////

 // Global data.

 extern PEXT2_GLOBAL gExt2Global;

 //////////////////////////////////////////////////////////////////////////////

 // Static data.

 #ifdef ALLOC_PRAGMA
	#pragma alloc_text(PAGE, Ext2ExceptionFilter)
	#pragma alloc_text(PAGE, Ext2ExceptionHandler)
 #endif

 //////////////////////////////////////////////////////////////////////////////

 // Static functions.

 // None.

 //////////////////////////////////////////////////////////////////////////////

 // Global functions.

 NTSTATUS
 Ext2ExceptionFilter (
	IN PEXT2_IRP_CONTEXT    IrpContext,
    IN NTSTATUS             ExceptionCode)
 {
    NTSTATUS Status = STATUS_UNSUCCESSFUL;

    //
    // Only use a valid IrpContext
    //

    if (IrpContext)
    {
        if ((IrpContext->Identifier.Type != EXT2ICX) ||
            (IrpContext->Identifier.Size != sizeof(EXT2_IRP_CONTEXT)))
        {
            IrpContext = NULL;
        }
    }

    //
    //  For the purposes of processing this exception, let's mark this
    //  request as being able to wait, and neither write through nor on
    //  removable media if we aren't posting it.
    //

    SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT);

    //
    // If the exception is expected execute our handler
    //

    if (FsRtlIsNtstatusExpected(ExceptionCode))
    {
        Ext2DbgPrint(D_EXCEPT, "Ext2ExceptionFilter: Catching exception %#x\n",  ExceptionCode);
        
        Status = EXCEPTION_EXECUTE_HANDLER;
        
        if (IrpContext)
        {
            IrpContext->ExceptionInProgress = TRUE;
            IrpContext->ExceptionCode = ExceptionCode;
        }
    }

    //
    // else continue search for an higher level exception handler
    //

    else
    {
        Ext2DbgPrint(D_EXCEPT, "Ext2ExceptionFilter: Passing on exception %#x\n", ExceptionCode);
        
        Status = EXCEPTION_CONTINUE_SEARCH;
        
        if (IrpContext)
        {
            Ext2FreeIrpContext(IrpContext);
        }
    }
    
    return Status;
 }

 NTSTATUS 
 Ext2ExceptionHandler (
	IN PEXT2_IRP_CONTEXT IrpContext)
 {
    NTSTATUS Status = STATUS_UNSUCCESSFUL;
    
    if (IrpContext)
    {
        Status = IrpContext->ExceptionCode;
        
        if (IrpContext->Irp)
        {
            IrpContext->Irp->IoStatus.Status = Status;
            
            Ext2CompleteRequest(IrpContext->Irp, IO_NO_INCREMENT);
        }
        
        Ext2FreeIrpContext(IrpContext);
    }
    else
    {
        Status = STATUS_INSUFFICIENT_RESOURCES;
    }
    
    return Status;
 }

 //////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -