LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1432回复:5

急!!!!我的并口中断程序崩啦!!!!

楼主#
更多 发布于:2005-06-17 16:56
写一个并口中断驱动,一来中断计算机就重启,主要代码如下:

DriverEntry中

IoInitializeDpcRequest( pDevObj, InterruptDpcRoutine );

pDevExt->Irq = 7;

Vector = HalGetInterruptVector( Isa
, 0
, pDevExt->Irq
, 0
, &kIrql
, &Affinity );

status = IoConnectInterrupt( &pDevExt->pIntObj
, Isr
, pDevObj
, NULL
, Vector
, kIrql
, kIrql
, Latched
, TRUE
, Affinity
, FALSE );

然后写isr
BOOLEAN Isr(IN PKINTERRUPT pIntObj, IN OUT PVOID pServiceContext)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pServiceContext;
PDEVICE_OBJECT pDevObj = pDevExt->pDevice;

IoRequestDpc( pDevObj, pDevObj->CurrentIrp, pDevExt );
return TRUE;
}

这里我是想把主要工作放到dpc中去处理

再写dpc
VOID DpcRoutine(IN PKDPC pDpc,
PDEVICE_OBJECT pDevObj,
IN PIRP pIrp,
IN PVOID pContext)
{
// 这里为了测试是否能收到中断而已,所以没多少代码
KdPrint( (\"DPC Running!\\n\") );
pIrp->IoStatus.Information = 0;
pIrp->IoStatus.Status = STATUS_SUCCESS;
if( pDpc == NULL )    // 麻烦帮我解释一下,为什么这里要作pDpc的判断?
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
else
IoCompleteRequest( pIrp, IO_PARALLEL_INCREMENT );  // 这里为什么要写IO_PARALLEL_INCREMENT,为什么不能写IO_NO_INCREMENT
IoStartNextPacket( pDevObj, FALSE );
}

然后再写startio(有谁能告诉我,为什么一定要写startio?)
VOID StartIo(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp )
{
PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp );
KdPrint( (\"StartIo loading\\n\") );
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
IoStartNextPacket( pDevObj, FALSE );
}

中断一来就崩了 :(

我有哪里写的不对吗??

我很急,谢谢大家帮个忙
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-17 17:46
现在程序不崩了,程序崩的问题找到了,但剩下的问题我还是没弄懂,麻烦谁能告诉我一下
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-18 11:36
好象还不对,我找到一个问题是
status = IoConnectInterrupt( &pDevExt->pIntObj
, Isr
, pDevObj
, NULL
, Vector
, kIrql
, kIrql
, Latched
, TRUE
, Affinity
, FALSE );
的第三个参数,我把他改成正确的了,但是还是崩掉 :(
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
地板#
发布于:2005-06-18 14:10
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-20 09:54
谢谢楼上的兄弟,我看了一下,这个是不会崩掉,我的代码是从书上东拼西凑下来的,我发现只要去掉dpc中的下面这几句,就不会崩了

if( pDpc == NULL ) // 麻烦帮我解释一下,为什么这里要作pDpc的判断?
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
else
IoCompleteRequest( pIrp, IO_PARALLEL_INCREMENT ); // 这里为什么要写IO_PARALLEL_INCREMENT,为什么不能写IO_NO_INCREMENT
IoStartNextPacket( pDevObj, FALSE );


偶是初学者,偶想知道这是为什么??有谁能告诉我吗?
LittleCoffee
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2007-10-03
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-20 09:55
不管怎么说 至少工作能进行下去了 :D
游客

返回顶部