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 + -
显示快捷键?