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

📄 dispatch.c

📁 This is a ReiserFs file system driver for Windows NT/2000/XP/Vista.
💻 C
字号:
/*
 * COPYRIGHT:        GNU GENERAL PUBLIC LICENSE VERSION 2
 * PROJECT:          ReiserFs file system driver for Windows NT/2000/XP/Vista.
 * FILE:             dispatch.c
 * PURPOSE:          
 * PROGRAMMER:       Mark Piper, Matt Wu, Bo Brant閚.
 * HOMEPAGE:         
 * UPDATE HISTORY: 
 */

/* INCLUDES *****************************************************************/

#include "rfsd.h"

/* GLOBALS ***************************************************************/

extern PRFSD_GLOBAL RfsdGlobal;

/* DEFINITIONS *************************************************************/

#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RfsdQueueRequest)
#pragma alloc_text(PAGE, RfsdDeQueueRequest)
#pragma alloc_text(PAGE, RfsdDispatchRequest)
#pragma alloc_text(PAGE, RfsdBuildRequest)
#endif


NTSTATUS
RfsdQueueRequest (IN PRFSD_IRP_CONTEXT IrpContext)
{
    ASSERT(IrpContext);
    
    ASSERT((IrpContext->Identifier.Type == RFSDICX) &&
        (IrpContext->Identifier.Size == sizeof(RFSD_IRP_CONTEXT)));
    
    // IsSynchronous means we can block (so we don't requeue it)
    IrpContext->IsSynchronous = TRUE;

    SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_REQUEUED);
    
    IoMarkIrpPending(IrpContext->Irp);
    
    ExInitializeWorkItem(
        &IrpContext->WorkQueueItem,
        RfsdDeQueueRequest,
        IrpContext );
    
    ExQueueWorkItem(&IrpContext->WorkQueueItem, CriticalWorkQueue);
    
    return STATUS_PENDING;
}


VOID
RfsdDeQueueRequest (IN PVOID Context)
{
    PRFSD_IRP_CONTEXT IrpContext;

    IrpContext = (PRFSD_IRP_CONTEXT) Context;

    ASSERT(IrpContext);

    ASSERT((IrpContext->Identifier.Type == RFSDICX) &&
           (IrpContext->Identifier.Size == sizeof(RFSD_IRP_CONTEXT)));

    __try {

        __try {

            FsRtlEnterFileSystem();

            if (!IrpContext->IsTopLevel) {

                IoSetTopLevelIrp((PIRP) FSRTL_FSP_TOP_LEVEL_IRP);
            }

            RfsdDispatchRequest(IrpContext);

        } __except (RfsdExceptionFilter(IrpContext, GetExceptionInformation())) {

            RfsdExceptionHandler(IrpContext);
        }

    } __finally {

        IoSetTopLevelIrp(NULL);

        FsRtlExitFileSystem();
    }
}


NTSTATUS
RfsdDispatchRequest (IN PRFSD_IRP_CONTEXT IrpContext)
{
    ASSERT(IrpContext);
    
    ASSERT((IrpContext->Identifier.Type == RFSDICX) &&
        (IrpContext->Identifier.Size == sizeof(RFSD_IRP_CONTEXT)));
    
    switch (IrpContext->MajorFunction) {

        case IRP_MJ_CREATE:
            return RfsdCreate(IrpContext);
        
        case IRP_MJ_CLOSE:
            return RfsdClose(IrpContext);
        
        case IRP_MJ_READ:
            return RfsdRead(IrpContext);
/*
        case IRP_MJ_WRITE:
            return RfsdWrite(IrpContext);
*/
        case IRP_MJ_FLUSH_BUFFERS:
            return RfsdFlush(IrpContext);

        case IRP_MJ_QUERY_INFORMATION:
            return RfsdQueryInformation(IrpContext);
/*        
        case IRP_MJ_SET_INFORMATION:
            return RfsdSetInformation(IrpContext);
      */  
        case IRP_MJ_QUERY_VOLUME_INFORMATION:
            return RfsdQueryVolumeInformation(IrpContext);
/*
        case IRP_MJ_SET_VOLUME_INFORMATION:
            return RfsdSetVolumeInformation(IrpContext);
*/
        case IRP_MJ_DIRECTORY_CONTROL:
            return RfsdDirectoryControl(IrpContext);
        
        case IRP_MJ_FILE_SYSTEM_CONTROL:
            return RfsdFileSystemControl(IrpContext);

        case IRP_MJ_DEVICE_CONTROL:
            return RfsdDeviceControl(IrpContext);
        
        case IRP_MJ_LOCK_CONTROL:
            return RfsdLockControl(IrpContext);
        
        case IRP_MJ_CLEANUP:
            return RfsdCleanup(IrpContext);

        case IRP_MJ_SHUTDOWN:
            return RfsdShutDown(IrpContext);

#if (_WIN32_WINNT >= 0x0500)
        case IRP_MJ_PNP:
            return RfsdPnp(IrpContext);
#endif //(_WIN32_WINNT >= 0x0500)        
        default:
			{
				NTSTATUS DefaultRC = STATUS_INVALID_DEVICE_REQUEST;  // TODO: switch back to STATUS_INTERNAL_ERROR

				RfsdPrint((DBG_ERROR, "RfsdDispatchRequest: Unexpected major function: %xh\n",
                       IrpContext->MajorFunction));

				RfsdCompleteIrpContext(IrpContext, DefaultRC);

				return DefaultRC;
			}
    }
}


NTSTATUS
RfsdBuildRequest (PDEVICE_OBJECT   DeviceObject, PIRP Irp)
{
    BOOLEAN             AtIrqlPassiveLevel = FALSE;
    BOOLEAN             IsTopLevelIrp = FALSE;
    PRFSD_IRP_CONTEXT   IrpContext = NULL;
    NTSTATUS            Status = STATUS_UNSUCCESSFUL;
    
    __try {

        __try {

#if DBG
            RfsdDbgPrintCall(DeviceObject, Irp);
#endif
            
            AtIrqlPassiveLevel = (KeGetCurrentIrql() == PASSIVE_LEVEL);
            
            if (AtIrqlPassiveLevel) {

                FsRtlEnterFileSystem();
            }
            
            if (!IoGetTopLevelIrp()) {

                IsTopLevelIrp = TRUE;
                IoSetTopLevelIrp(Irp);
            }
            
            IrpContext = RfsdAllocateIrpContext(DeviceObject, Irp);
            
            if (!IrpContext) {

                Status = STATUS_INSUFFICIENT_RESOURCES;
                Irp->IoStatus.Status = Status;

                RfsdCompleteRequest(Irp, TRUE, IO_NO_INCREMENT);

            } else {

                if ((IrpContext->MajorFunction == IRP_MJ_CREATE) &&
                    !AtIrqlPassiveLevel) {

                    DbgBreak();
                }

                Status = RfsdDispatchRequest(IrpContext);
            }
        } __except (RfsdExceptionFilter(IrpContext, GetExceptionInformation())) {

            Status = RfsdExceptionHandler(IrpContext);
        }

    } __finally  {

        if (IsTopLevelIrp) {
            IoSetTopLevelIrp(NULL);
        }
        
        if (AtIrqlPassiveLevel) {
            FsRtlExitFileSystem();
        }       
    }
    
    return Status;
}

⌨️ 快捷键说明

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