mfc_boy
驱动牛犊
驱动牛犊
  • 注册日期2003-04-02
  • 最后登录2012-09-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望50点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1036回复:0

紧急求助

楼主#
更多 发布于:2003-05-08 09:40
我现在正在做给笔记本的PCMCIA的Sram卡写驱动程序,遇到了一个非常奇怪的问题,请大家帮帮忙
1、我的inf文件的Class是MTD。
2、在AddDevice的时候没有错误返回。
3、在进行DispatchPnp处理IRP_MN_START_DEVICE的时候,一调用IoCallDriver的时候,笔记本就发出鸣叫声,然后返回的错误是STATUS_INSUFFICIENT_RESOURCES。

我真的不知道是哪里错了,希望大家帮帮我

附件是我的代码。

NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp)
{ // DispatchPnp
NTSTATUS stat;
PDEVICE_EXTENSION pDe=(PDEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION pIrpStk=IoGetCurrentIrpStackLocation(Irp);
KEVENT event;

stat = IoAcquireRemoveLock(&pDe->RemoveLock,NULL);
if( !NT_SUCCESS(stat) ) return CompleteRequest(Irp,stat,0);

switch( pIrpStk->MinorFunction ) {
case IRP_MN_START_DEVICE:
IoCopyCurrentIrpStackLocationToNext(Irp);

KeInitializeEvent(&event,NotificationEvent,FALSE);

IoSetCompletionRoutine(Irp,
(PIO_COMPLETION_ROUTINE)CompletionRoutine,&event,
TRUE,TRUE,TRUE);

//stat = PnpDefaHand(fdo,Irp);
stat = IoCallDriver(pDe->LowerDeviceObject,Irp);
if( stat==STATUS_PENDING ) {
KeWaitForSingleObject(&event,Executive,KernelMode,FALSE,NULL);
stat = Irp->IoStatus.Status;
}
if( !NT_SUCCESS(stat) ) {
stat = CompleteRequest(Irp,stat,Irp->IoStatus.Information);
break;
}
stat = StartDevice(fdo,pIrpStk);
if( NT_SUCCESS(stat) ) IoSetDeviceInterfaceState(&pDe->ifname,TRUE);
stat = CompleteRequest(Irp,stat,0);
break;
case IRP_MN_QUERY_STOP_DEVICE:
Irp->IoStatus.Status = STATUS_SUCCESS;
stat = PnpDefaHand(fdo,Irp);
break;
case IRP_MN_QUERY_REMOVE_DEVICE:
Irp->IoStatus.Status = STATUS_SUCCESS;
stat = PnpDefaHand(fdo,Irp);
break;
case IRP_MN_SURPRISE_REMOVAL:
RemoveDevice(Irp,pDe);
Irp->IoStatus.Status = STATUS_SUCCESS;
stat = PnpDefaHand(fdo,Irp);
break;
case IRP_MN_REMOVE_DEVICE:
IoReleaseRemoveLockAndWait(&pDe->RemoveLock,Irp);
RemoveDevice(Irp,pDe);
Irp->IoStatus.Status = STATUS_SUCCESS;
stat = PnpDefaHand(fdo,Irp);
IoSetDeviceInterfaceState(&pDe->ifname,FALSE);
RtlFreeUnicodeString(&pDe->ifname);
IoDetachDevice(pDe->LowerDeviceObject);
IoDeleteDevice(fdo);
return stat;
case IRP_MN_STOP_DEVICE:
RemoveDevice(Irp,pDe);
Irp->IoStatus.Status = STATUS_SUCCESS;
stat = PnpDefaHand(fdo,Irp);
break;
case IRP_MN_CANCEL_REMOVE_DEVICE:
case IRP_MN_CANCEL_STOP_DEVICE:
Irp->IoStatus.Status = STATUS_SUCCESS;
stat = PnpDefaHand(fdo,Irp);
break;
/*case IRP_MN_QUERY_INTERFACE:
stat = IoCallDriver(pDe->LowerDeviceObject,Irp);
if( stat==STATUS_PENDING ) {
KeWaitForSingleObject(&event,Executive,KernelMode,FALSE,NULL);
stat = Irp->IoStatus.Status;
}
if( !NT_SUCCESS(stat) )
{
stat = CompleteRequest(Irp,stat,Irp->IoStatus.Information);
}
break;*/
case 0x18:
break;
default:
stat = PnpDefaHand(fdo,Irp);
}
if( !NT_SUCCESS(stat) )
{
stat = stat;
}

IoReleaseRemoveLock(&pDe->RemoveLock,NULL);
return stat;
}
附件名称/大小 下载次数 最后更新
2003-05-08_wdm.rar (27KB)  0
游客

返回顶部