阅读:1432回复:5
急!!!!我的并口中断程序崩啦!!!!
写一个并口中断驱动,一来中断计算机就重启,主要代码如下:
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 ); } 中断一来就崩了 :( 我有哪里写的不对吗?? 我很急,谢谢大家帮个忙 |
|
沙发#
发布于:2005-06-17 17:46
现在程序不崩了,程序崩的问题找到了,但剩下的问题我还是没弄懂,麻烦谁能告诉我一下
|
|
板凳#
发布于:2005-06-18 11:36
好象还不对,我找到一个问题是
status = IoConnectInterrupt( &pDevExt->pIntObj , Isr , pDevObj , NULL , Vector , kIrql , kIrql , Latched , TRUE , Affinity , FALSE ); 的第三个参数,我把他改成正确的了,但是还是崩掉 :( |
|
地板#
发布于:2005-06-18 14:10
|
|
地下室#
发布于: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 ); 偶是初学者,偶想知道这是为什么??有谁能告诉我吗? |
|
5楼#
发布于:2005-06-20 09:55
不管怎么说 至少工作能进行下去了 :D
|
|