zhoutinge
驱动牛犊
驱动牛犊
  • 注册日期2003-03-29
  • 最后登录2004-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:846回复:0

超怪问题,大侠请进

楼主#
更多 发布于:2003-05-21 19:01
在安装我的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;
}
}
游客

返回顶部