| 598 | } |
| 599 | |
| 600 | BOOLEAN |
| 601 | Ext2FastIoUnlockSingle ( |
| 602 | IN PFILE_OBJECT FileObject, |
| 603 | IN PLARGE_INTEGER FileOffset, |
| 604 | IN PLARGE_INTEGER Length, |
| 605 | IN PEPROCESS Process, |
| 606 | IN ULONG Key, |
| 607 | OUT PIO_STATUS_BLOCK IoStatus, |
| 608 | IN PDEVICE_OBJECT DeviceObject |
| 609 | ) |
| 610 | { |
| 611 | BOOLEAN Status = FALSE; |
| 612 | PEXT2_FCB Fcb; |
| 613 | |
| 614 | __try { |
| 615 | |
| 616 | FsRtlEnterFileSystem(); |
| 617 | |
| 618 | __try { |
| 619 | |
| 620 | if (IsExt2FsDevice(DeviceObject)) { |
| 621 | IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; |
| 622 | __leave; |
| 623 | } |
| 624 | |
| 625 | Fcb = (PEXT2_FCB) FileObject->FsContext; |
| 626 | if (Fcb == NULL || Fcb->Identifier.Type == EXT2VCB) { |
| 627 | DbgBreak(); |
| 628 | IoStatus->Status = STATUS_INVALID_PARAMETER; |
| 629 | __leave; |
| 630 | } |
| 631 | |
| 632 | ASSERT((Fcb->Identifier.Type == EXT2FCB) && |
| 633 | (Fcb->Identifier.Size == sizeof(EXT2_FCB))); |
| 634 | |
| 635 | if (IsDirectory(Fcb)) { |
| 636 | DbgBreak(); |
| 637 | IoStatus->Status = STATUS_INVALID_PARAMETER; |
| 638 | __leave; |
| 639 | } |
| 640 | |
| 641 | #if EXT2_DEBUG |
| 642 | DEBUG(DL_INF, ( |
| 643 | "Ext2FastIoUnlockSingle: %s %s %wZ\n", |
| 644 | (PUCHAR) Process + ProcessNameOffset, |
| 645 | "FASTIO_UNLOCK_SINGLE", |
| 646 | &Fcb->Mcb->FullName )); |
| 647 | |
| 648 | DEBUG(DL_INF, ( |
| 649 | "Ext2FastIoUnlockSingle: Offset: %I64xh Length: %I64xh Key: %u\n", |
| 650 | FileOffset->QuadPart, |
| 651 | Length->QuadPart, |
| 652 | Key )); |
| 653 | #endif |
| 654 | |
| 655 | if (!FsRtlOplockIsFastIoPossible(&Fcb->Oplock)) { |
| 656 | __leave; |
| 657 | } |
nothing calls this directly
no test coverage detected