阅读:847回复:0
超怪问题,大侠请进
在安装我的pci板卡驱动时,用debugprint打印跟踪,发现一抓破头都想不明白的问题。安装驱动时,开始一切正常,先进入driverentry,再adddevice,再pnp里startdevice,可是执行完这些后,他自动执行removedevice和unload例程,也就是说驱动装上了又被自动卸掉了,这是怎么回事阿,怪怪的说。下面是我的pnp部分,哪位大侠帮我看看,问题可能出在哪儿,搞定了分数多多:NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{ DebugPrintMsg(\"Start to dispose PNP IRP!\");//Debug NTSTATUS status; PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(Irp); PCM_RESOURCE_LIST pRawResourceList; PCM_RESOURCE_LIST pTranslatedResourceList; PCM_FULL_RESOURCE_DESCRIPTOR pRawFullDescriptor; PCM_FULL_RESOURCE_DESCRIPTOR pTranslatedFullDescriptor; PCM_PARTIAL_RESOURCE_LIST raw; PCM_PARTIAL_RESOURCE_LIST translated; pRawResourceList=stack->Parameters.StartDevice.AllocatedResources; pRawFullDescriptor=pRawResourceList->List; raw=&pRawFullDescriptor->PartialResourceList; pTranslatedResourceList=stack->Parameters.StartDevice.AllocatedResourcesTranslated; pTranslatedFullDescriptor=pTranslatedResourceList->List; translated=&pTranslatedFullDescriptor->PartialResourceList; PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fdo->DeviceExtension; ULONG MinorFunction=stack->MinorFunction; switch(MinorFunction) { case IRP_MN_START_DEVICE: StartDevice(fdo, raw, translated); status=IoConnectInterrupt(&pdx->InterruptObject, (PKSERVICE_ROUTINE)ISR, (PVOID)pdx, NULL,pdx->Vector, pdx->IRQL, pdx->IRQL, pdx->I_Mode, pdx->IrqShare, pdx->Affinity, FALSE); return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_QUERY_REMOVE_DEVICE: DebugPrintMsg(\"Start to query remove device!\"); return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_REMOVE_DEVICE: DebugPrintMsg(\"Start to remove device!\"); IoDeleteSymbolicLink(&(UNICODE_STRING)pdx->ustrSymLinkName); if (pdx->pLowerDevice) { IoDetachDevice(pdx->pLowerDevice); } IoDeleteDevice(fdo); return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_CANCEL_REMOVE_DEVICE: return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_STOP_DEVICE: DebugPrintMsg(\"Start to stop device!\"); StopDevice(fdo); return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_QUERY_STOP_DEVICE: DebugPrintMsg(\"Start to stop device!\"); return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_CANCEL_STOP_DEVICE: return CompleteRequest(Irp,STATUS_SUCCESS,0); case IRP_MN_SURPRISE_REMOVAL: return CompleteRequest(Irp,STATUS_SUCCESS,0); default: IoSkipCurrentIrpStackLocation(Irp); status=IoCallDriver(pdx->pLowerDevice, Irp); return status; } } |
|