| 586 | |
| 587 | |
| 588 | NTSTATUS |
| 589 | Ext2DiskIoControl ( |
| 590 | IN PDEVICE_OBJECT DeviceObject, |
| 591 | IN ULONG IoctlCode, |
| 592 | IN PVOID InputBuffer, |
| 593 | IN ULONG InputBufferSize, |
| 594 | IN OUT PVOID OutputBuffer, |
| 595 | IN OUT PULONG OutputBufferSize) |
| 596 | { |
| 597 | ULONG OutBufferSize = 0; |
| 598 | KEVENT Event; |
| 599 | PIRP Irp; |
| 600 | IO_STATUS_BLOCK IoStatus; |
| 601 | NTSTATUS Status; |
| 602 | |
| 603 | ASSERT(DeviceObject != NULL); |
| 604 | |
| 605 | if (OutputBufferSize) |
| 606 | { |
| 607 | OutBufferSize = *OutputBufferSize; |
| 608 | } |
| 609 | |
| 610 | KeInitializeEvent(&Event, NotificationEvent, FALSE); |
| 611 | |
| 612 | Irp = IoBuildDeviceIoControlRequest( |
| 613 | IoctlCode, |
| 614 | DeviceObject, |
| 615 | InputBuffer, |
| 616 | InputBufferSize, |
| 617 | OutputBuffer, |
| 618 | OutBufferSize, |
| 619 | FALSE, |
| 620 | &Event, |
| 621 | &IoStatus |
| 622 | ); |
| 623 | |
| 624 | if (Irp == NULL) { |
| 625 | DEBUG(DL_ERR, ( "Ext2DiskIoControl: failed to build Irp!\n")); |
| 626 | return STATUS_INSUFFICIENT_RESOURCES; |
| 627 | } |
| 628 | |
| 629 | Status = IoCallDriver(DeviceObject, Irp); |
| 630 | |
| 631 | if (Status == STATUS_PENDING) { |
| 632 | KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); |
| 633 | Status = IoStatus.Status; |
| 634 | } |
| 635 | |
| 636 | if (OutputBufferSize) { |
| 637 | *OutputBufferSize = (ULONG)(IoStatus.Information); |
| 638 | } |
| 639 | |
| 640 | return Status; |
| 641 | } |
| 642 | |
| 643 | |
| 644 | NTSTATUS |
no outgoing calls
no test coverage detected