shutdown.c

来自「This is a ReiserFs file system driver fo」· C语言 代码 · 共 115 行

C
115
字号
/*
 * COPYRIGHT:        GNU GENERAL PUBLIC LICENSE VERSION 2
 * PROJECT:          ReiserFs file system driver for Windows NT/2000/XP/Vista.
 * FILE:             shutdown.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, RfsdShutDown)
#endif

NTSTATUS
RfsdShutDown (IN PRFSD_IRP_CONTEXT IrpContext)
{
    NTSTATUS                Status;

    PKEVENT                 Event;

    PIRP                    Irp;
    PIO_STACK_LOCATION      IrpSp;

    PRFSD_VCB               Vcb;
    PLIST_ENTRY             ListEntry;

    BOOLEAN                 GlobalResourceAcquired = FALSE;

    __try {

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

        Status = STATUS_SUCCESS;

        Irp = IrpContext->Irp;
    
        IrpSp = IoGetCurrentIrpStackLocation(Irp);

        if (!ExAcquireResourceExclusiveLite(
                &RfsdGlobal->Resource,
                IrpContext->IsSynchronous )) {
            Status = STATUS_PENDING;
            __leave;
        }
            
        GlobalResourceAcquired = TRUE;

        Event = ExAllocatePool( NonPagedPool, sizeof(KEVENT));
        KeInitializeEvent(Event, NotificationEvent, FALSE );

        for (ListEntry = RfsdGlobal->VcbList.Flink;
             ListEntry != &(RfsdGlobal->VcbList);
             ListEntry = ListEntry->Flink ) {

            Vcb = CONTAINING_RECORD(ListEntry, RFSD_VCB, Next);

            if (ExAcquireResourceExclusiveLite(
                &Vcb->MainResource,
                TRUE )) {

                Status = RfsdFlushFiles(Vcb, TRUE);
                if(!NT_SUCCESS(Status)) {
                    DbgBreak();
                }

                Status = RfsdFlushVolume(Vcb, TRUE);

                if(!NT_SUCCESS(Status)) {
                    DbgBreak();
                }

                RfsdDiskShutDown(Vcb);

                ExReleaseResourceForThreadLite(
                    &Vcb->MainResource,
                    ExGetCurrentResourceThread());
            }
        }

/*
        IoUnregisterFileSystem(RfsdGlobal->DeviceObject);
*/
    } __finally {

        if (GlobalResourceAcquired) {
            ExReleaseResourceForThreadLite(
                &RfsdGlobal->Resource,
                ExGetCurrentResourceThread() );
        }

        if (!IrpContext->ExceptionInProgress) {
            if (Status == STATUS_PENDING) {
                RfsdQueueRequest(IrpContext);
            } else {
                RfsdCompleteIrpContext(IrpContext, Status);
            }
        }
    }

    return Status;
}

⌨️ 快捷键说明

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