MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2Close

Function Ext2Close

Ext4Fsd/close.c:25–187  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

23#endif
24
25NTSTATUS
26Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext)
27{
28 PDEVICE_OBJECT DeviceObject;
29 NTSTATUS Status = STATUS_SUCCESS;
30 PEXT2_VCB Vcb = NULL;
31 PFILE_OBJECT FileObject;
32 PEXT2_FCB Fcb = NULL;
33 PEXT2_CCB Ccb = NULL;
34
35 BOOLEAN VcbResourceAcquired = FALSE;
36 BOOLEAN FcbResourceAcquired = FALSE;
37 BOOLEAN FcbDerefDeferred = FALSE;
38
39 __try {
40
41 ASSERT(IrpContext != NULL);
42 ASSERT((IrpContext->Identifier.Type == EXT2ICX) &&
43 (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT)));
44
45 DeviceObject = IrpContext->DeviceObject;
46 if (IsExt2FsDevice(DeviceObject)) {
47 Status = STATUS_SUCCESS;
48 Vcb = NULL;
49 __leave;
50 }
51
52 Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension;
53 ASSERT(Vcb != NULL);
54 ASSERT((Vcb->Identifier.Type == EXT2VCB) &&
55 (Vcb->Identifier.Size == sizeof(EXT2_VCB)));
56
57 if (IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_DELAY_CLOSE)) {
58
59 FileObject = NULL;
60 Fcb = IrpContext->Fcb;
61 Ccb = IrpContext->Ccb;
62
63 } else {
64
65 FileObject = IrpContext->FileObject;
66 Fcb = (PEXT2_FCB) FileObject->FsContext;
67 if (!Fcb) {
68 Status = STATUS_SUCCESS;
69 __leave;
70 }
71 ASSERT(Fcb != NULL);
72 Ccb = (PEXT2_CCB) FileObject->FsContext2;
73 }
74
75 DEBUG(DL_INF, ( "Ext2Close: (VCB) Vcb = %p ReferCount = %d\n",
76 Vcb, Vcb->ReferenceCount));
77
78 /*
79 * WARNING: don't release Vcb resource lock here.
80 *
81 * CcPurgeCacheSection will lead a recursive irp: IRP_MJ_CLOSE
82 * which would cause revrese order of lock acquirision:

Callers 2

Ext2DispatchRequestFunction · 0.70
Ext2DeQueueCloseRequestFunction · 0.70

Calls 3

Ext2FreeCcbFunction · 0.85
Ext2QueueCloseRequestFunction · 0.85
Ext2CompleteIrpContextFunction · 0.85

Tested by

no test coverage detected