2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
10 /* INCLUDES *****************************************************************/
14 /* GLOBALS ***************************************************************/
16 extern PEXT2_GLOBAL Ext2Global
;
18 /* DEFINITIONS *************************************************************/
21 #pragma alloc_text(PAGE, Ext2LockControl)
25 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext
)
27 PDEVICE_OBJECT DeviceObject
= NULL
;
28 PFILE_OBJECT FileObject
= NULL
;
32 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
33 BOOLEAN CompleteContext
= TRUE
;
34 BOOLEAN CompleteIrp
= TRUE
;
35 BOOLEAN bFcbAcquired
= FALSE
;
39 ASSERT(IrpContext
!= NULL
);
41 ASSERT((IrpContext
->Identifier
.Type
== EXT2ICX
) &&
42 (IrpContext
->Identifier
.Size
== sizeof(EXT2_IRP_CONTEXT
)));
44 DeviceObject
= IrpContext
->DeviceObject
;
46 if (IsExt2FsDevice(DeviceObject
)) {
47 Status
= STATUS_INVALID_DEVICE_REQUEST
;
51 FileObject
= IrpContext
->FileObject
;
53 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
55 if (Fcb
->Identifier
.Type
== EXT2VCB
) {
56 Status
= STATUS_INVALID_PARAMETER
;
60 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
61 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
63 if (FlagOn(Fcb
->Mcb
->FileAttr
, FILE_ATTRIBUTE_DIRECTORY
)) {
64 Status
= STATUS_INVALID_PARAMETER
;
68 ExAcquireResourceSharedLite(&Fcb
->MainResource
, TRUE
);
71 Irp
= IrpContext
->Irp
;
75 Status
= FsRtlCheckOplock( &Fcb
->Oplock
,
81 if (Status
!= STATUS_SUCCESS
) {
82 CompleteContext
= FALSE
;
87 // FsRtlProcessFileLock acquires FileObject->FsContext->Resource while
88 // modifying the file locks and calls IoCompleteRequest when it's done.
91 Status
= FsRtlProcessFileLock(
96 if (!NT_SUCCESS(Status
)) {
98 "Ext2LockControl: %-16.16s %-31s Status: %#x ***\n",
99 Ext2GetCurrentProcessName(),
100 "IRP_MJ_LOCK_CONTROL",
104 Fcb
->Header
.IsFastIoPossible
= Ext2IsFastIoPossible(Fcb
);
109 ExReleaseResourceLite(&Fcb
->MainResource
);
112 if (!IrpContext
->ExceptionInProgress
) {
115 IrpContext
->Irp
= NULL
;
118 if (CompleteContext
) {
119 Ext2CompleteIrpContext(IrpContext
, Status
);