阅读:1595回复:4
请大家看看这两段程序如何合并?(20分)
关于智能卡读卡器的程序,用DW+DDK写的,需要把这两段合并在一起完成,我试过没成功,问题是不知完成例程的那个Irp如何在cCardTracking和Urb连接在一起,请大家帮忙!谢谢
--------------------------- NTSTATUS cCardTracking(PSMARTCARD_EXTENSION SmartcardExtension) { KUsbPipe *m_Read = SmartcardExtension->ReaderExtension->m_Read; PURB pUrb; if( SmartcardExtension->ReaderExtension->bCardTrackingRunning) { t<<\"cCardTracking: Already running\\n\"; return STATUS_PENDING; } if(m_Read->Type()==UsbdPipeTypeBulk) pUrb = m_Read->BuildBulkTransfer(SmartcardExtension->ReaderExtension->pBuffer, AM_USB_BLOCK_SIZE, TRUE, NULL, FALSE); else pUrb = m_Read->BuildInterruptTransfer(SmartcardExtension->ReaderExtension->pBuffer, AM_USB_BLOCK_SIZE, TRUE, NULL); SmartcardExtension->ReaderExtension->pCardTrackingUrb = pUrb; SmartcardExtension->ReaderExtension->bCardTrackingRunning = true; //下面要改 m_Read->SubmitUrb(pUrb,(PIO_COMPLETION_ROUTINE)OnCardStatusChange,pUrb,0); //主要部分:想去掉里面完成例程,改为NULL,下面怎么做呢? return STATUS_PENDING; } NTSTATUS OnCardStatusChange(PDEVICE_OBJECT Cur_PDO,PIRP Irp,PVOID Context) { UCHAR TempBuffer[10]; PURB urb; _URB_BULK_OR_INTERRUPT_TRANSFER *UrbTransfer; PUCHAR p; urb = (PURB)Context; UrbTransfer = &urb->UrbBulkOrInterruptTransfer; p = ((UCHAR *)UrbTransfer->TransferBuffer); memcpy(TempBuffer,p,8); ExFreePool(SmartcardExtension->ReaderExtension->pCardTrackingUrb); //will cause Page Fault Error SmartcardExtension->ReaderExtension->pCardTrackingUrb=NULL; SmartcardExtension->ReaderExtension->bCardTrackingRunning = false; if(NT_SUCCESS(Irp->IoStatus.Status)) { if(TempBuffer[0] == 0x02) { if(TempBuffer[2]==AM_SCARD_PRESENT) SmartcardExtension->ReaderCapabilities.CurrentState=SCARD_PRESENT; else SmartcardExtension->ReaderCapabilities.CurrentState=SCARD_ABSENT; if(!SmartcardExtension->ReaderExtension->EventWaiting) { hFinishCardTracking(SmartcardExtension->ReaderCapabilities.CurrentState,SmartcardExtension); return STATUS_MORE_PROCESSING_REQUIRED; } } memcpy(SmartcardExtension->ReaderExtension->CyclicBuffer,TempBuffer,8); SmartcardExtension->ReaderExtension->DataInCyclicBuffer =true; if(SmartcardExtension->ReaderExtension->EventWaiting) { SmartcardExtension->ReaderExtension->EventWaiting=false; KeSetEvent(SmartcardExtension->ReaderExtension->Event, NULL,false); } return STATUS_MORE_PROCESSING_REQUIRED; } if(Irp->IoStatus.Status== STATUS_CANCELLED) { if(SmartcardExtension->ReaderExtension->EventWaiting) { SmartcardExtension->ReaderExtension->EventWaiting = false; KeSetEvent(SmartcardExtension->ReaderExtension->Event, NULL,false); } return STATUS_MORE_PROCESSING_REQUIRED; } return STATUS_MORE_PROCESSING_REQUIRED; } } |
|
|
沙发#
发布于:2002-03-07 20:31
提一下!
|
|
|
板凳#
发布于:2002-03-08 09:34
这么长。。。
你就直接写 m_Read->SubmitUrb(pUrb,NULL,pUrb,0); 会有问题吗? 不过,我觉得你的方案有点小小的问题,这样每次收到card tracking的irp都去读,然后返回,那你的系统会很忙。因为只要这个irp返回了,系统马上就会再发一个,你又要去读了。最好是reader有一个interrupt pipe,用来通知你有卡插入,这时候你再返回irp。 |
|
|
地板#
发布于:2002-03-08 09:49
直接写的话有个小问题,我想可以去解决,只是不知道这样改了会不会真的造成系统太忙呢?
请问您说的那个intrrupt pipe具体该怎么实施呢? |
|
|
地下室#
发布于:2002-03-11 10:14
interrupt,说白了,就是host在指定的时间间隔里面去查询device,只不过这个查询的效率比用你自己的程序要高。
如果有卡插入,你的driver就得到了通知,再返回那个irp吧! |
|
|