diff --git a/Ext4Fsd/fsctl.c b/Ext4Fsd/fsctl.c index ef5819f..ca2b18d 100644 --- a/Ext4Fsd/fsctl.c +++ b/Ext4Fsd/fsctl.c @@ -2019,14 +2019,22 @@ Ext2IsMediaWriteProtected ( Status = IoCallDriver(TargetDevice, Irp); if (Status == STATUS_PENDING) { + LARGE_INTEGER Timeout; + Timeout.QuadPart = (LONGLONG)-30 * 10 * 1000 * 1000; /* 30 seconds */ - (VOID) KeWaitForSingleObject( &Event, + Status = KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, - (PLARGE_INTEGER)NULL ); + &Timeout ); - Status = IoStatus.Status; + if (Status == STATUS_TIMEOUT) { + IoCancelIrp(Irp); + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = STATUS_IO_TIMEOUT; + } else { + Status = IoStatus.Status; + } } return (BOOLEAN)(Status == STATUS_MEDIA_WRITE_PROTECTED); diff --git a/Ext4Fsd/pnp.c b/Ext4Fsd/pnp.c index 9382422..fc58057 100644 --- a/Ext4Fsd/pnp.c +++ b/Ext4Fsd/pnp.c @@ -198,11 +198,20 @@ Ext2PnpQueryRemove ( IrpContext->Irp); if (Status == STATUS_PENDING) { - KeWaitForSingleObject( &Event, + LARGE_INTEGER Timeout; + Timeout.QuadPart = (LONGLONG)-30 * 10 * 1000 * 1000; /* 30 seconds */ + + Status = KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, - NULL ); + &Timeout ); + + if (Status == STATUS_TIMEOUT) { + IoCancelIrp(IrpContext->Irp); + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } + Status = IrpContext->Irp->IoStatus.Status; } @@ -270,12 +279,19 @@ Ext2PnpRemove ( IrpContext->Irp); if (Status == STATUS_PENDING) { + LARGE_INTEGER Timeout; + Timeout.QuadPart = (LONGLONG)-30 * 10 * 1000 * 1000; /* 30 seconds */ - KeWaitForSingleObject( &Event, + Status = KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, - NULL ); + &Timeout ); + + if (Status == STATUS_TIMEOUT) { + IoCancelIrp(IrpContext->Irp); + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } Status = IrpContext->Irp->IoStatus.Status; } @@ -342,12 +358,19 @@ Ext2PnpSurpriseRemove ( IrpContext->Irp); if (Status == STATUS_PENDING) { + LARGE_INTEGER Timeout; + Timeout.QuadPart = (LONGLONG)-30 * 10 * 1000 * 1000; /* 30 seconds */ - KeWaitForSingleObject( &Event, + Status = KeWaitForSingleObject( &Event, Executive, KernelMode, FALSE, - NULL ); + &Timeout ); + + if (Status == STATUS_TIMEOUT) { + IoCancelIrp(IrpContext->Irp); + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } Status = IrpContext->Irp->IoStatus.Status; }