Wing
驱动牛犊
驱动牛犊
  • 注册日期2001-07-09
  • 最后登录2002-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1595回复:4

请大家看看这两段程序如何合并?(20分)

楼主#
更多 发布于:2002-03-07 11:00
关于智能卡读卡器的程序,用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;
}
}
Wing ―――――――――――― 一对正在飞翔的翅膀
Wing
驱动牛犊
驱动牛犊
  • 注册日期2001-07-09
  • 最后登录2002-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-07 20:31
提一下!
Wing ―――――――――――― 一对正在飞翔的翅膀
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-08 09:34
这么长。。。
你就直接写
m_Read->SubmitUrb(pUrb,NULL,pUrb,0);
会有问题吗?

不过,我觉得你的方案有点小小的问题,这样每次收到card tracking的irp都去读,然后返回,那你的系统会很忙。因为只要这个irp返回了,系统马上就会再发一个,你又要去读了。最好是reader有一个interrupt pipe,用来通知你有卡插入,这时候你再返回irp。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
Wing
驱动牛犊
驱动牛犊
  • 注册日期2001-07-09
  • 最后登录2002-03-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-08 09:49
直接写的话有个小问题,我想可以去解决,只是不知道这样改了会不会真的造成系统太忙呢?

请问您说的那个intrrupt pipe具体该怎么实施呢?
Wing ―――――――――――― 一对正在飞翔的翅膀
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-11 10:14
interrupt,说白了,就是host在指定的时间间隔里面去查询device,只不过这个查询的效率比用你自己的程序要高。
如果有卡插入,你的driver就得到了通知,再返回那个irp吧!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
游客

返回顶部