VOID STREAMAPI AdapterCancelPacket( PHW_STREAM_REQUEST_BLOCK pSrb ) { PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension; PSTREAMEX pStrmEx; int StreamNumber; BOOL Found = FALSE; // // Run through all the streams the driver has available // for (StreamNumber = 0; !Found && (StreamNumber < DRIVER_STREAM_COUNT); StreamNumber++) { // // Check to see if the stream is in use // if (pStrmEx = (PSTREAMEX) pHwDevExt->pStrmEx[StreamNumber]) { Found = VideoQueueCancelOneSRB ( pStrmEx, pSrb ); } // if the stream is open } // for all streams DbgLogInfo(("TestCap: Cancelling SRB %8x Succeeded=%d\n", pSrb, Found)); }
VOID STREAMAPI VideoReceiveDataPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb ) { PHW_DEVICE_EXTENSION pHwDevExt = ((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension); PSTREAMEX pStrmEx = (PSTREAMEX)pSrb->StreamObject->HwStreamExtension; int StreamNumber = pSrb->StreamObject->StreamNumber; // // make sure we have a device extension and are at passive level // DEBUG_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); DEBUG_ASSERT(pHwDevExt!=NULL); DbgLogTrace(("TestCap: Receiving Stream Data SRB %p, %x\n", pSrb, pSrb->Command)); // // Default to success // pSrb->Status = STATUS_SUCCESS; // // determine the type of packet. // switch (pSrb->Command){ case SRB_READ_DATA: // Rule: // Only accept read requests when in either the Pause or Run // States. If Stopped, immediately return the SRB. if (pStrmEx->KSState == KSSTATE_STOP) { CompleteStreamSRB (pSrb); break; } // // Put this read request on the pending queue // VideoQueueAddSRB (pSrb); // Since another thread COULD HAVE MODIFIED THE STREAM STATE // in the midst of adding it to the queue, check the stream // state again, and cancel the SRB if necessary. Note that // this race condition was NOT handled in the original DDK // release of testcap! if (pStrmEx->KSState == KSSTATE_STOP) { VideoQueueCancelOneSRB ( pStrmEx, pSrb); } break; default: // // invalid / unsupported command. Fail it as such // TRAP; pSrb->Status = STATUS_NOT_IMPLEMENTED; CompleteStreamSRB (pSrb); } // switch (pSrb->Command) }