阅读:1039回复:0
IRP操作的两个问题
1. 同步方式的超时及出错处理的问题
伪代码如下: NTSTATUS status; PIRP irp; KEVENT irpDone; LARGE_INTEGER waitTime; // 5 seconds KeInitializeEvent( &irpDone, ... ); irp = IoBuildDeviceIoControlRequest(...); status = IoCallDriver( lowerDevice, irp, ... ); if( STATUS_PENDING == status ) { status = KeWaitForSingleObject( irpDone, ..., &waitTime ); if( STATUS_SUCCESS == status ) { //... } else if( STATUS_TIMEOUT == status ) { // 这里需要取消该IRP么? } else { } } 采用同步方式时,如果不希望无限等待,而是要设定操作超时机制,那么在超时或者发生错误时是否需要调用IoCancelIrp来取消该IRP? 2. 异步方式时,提交给USBD的IRP是按照提交顺序完成的吗? |
|