xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:970回复:2

请教大家:这段代码有什么问题?

楼主#
更多 发布于:2002-06-25 14:20
使用windows startio ,iostartpacket & iostartnextpacket
在complete例程中,有如下代码:
NTSTATUS OnComplete(PDEVICE_OBJECT pdo, PIRP Irp, PDEVICE_EXTENSION pdx)
{

LONG m_seglen;
URB urb;
URB urb_1;
KEVENT event;
IO_STATUS_BLOCK iostatus;

if (Irp->PendingReturned)
{
IoMarkIrpPending(Irp);

}



Irp->IoStatus.Status=STATUS_SUCCESS;
Irp->IoStatus.Information =pdx->Length;
IoStartNextPacket(pdo,TRUE);---------------?
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;


}
调试时,在?处,出现页故障(fatal error 0E),什么原因呢?有请高手指点,谢了先!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-25 16:30
看看你的OnComplete是在什么时候被调用的,irql是否正确。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
xinghaiyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-13
  • 最后登录2004-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-25 16:48
先谢谢版主的回答.
下面是我的源码,调用iomanager的device queue的程序,请高手指正:
NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp)
{ // DispatchControl

PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

NTSTATUS status;
        ... ... UsbBuildInterruptOrBulkTransferRequest(&urb_1,sizeof(_URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->houtpipe, buff,NULL,m_seglen,0,NULL);

PIRP Irp_1 = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->LowerDeviceObject, NULL, 0, NULL, 0, TRUE,NULL, NULL);
if (!Irp_1)
{
KdPrint((DRIVERNAME \" - Unable to allocate IRP for sending URB\\n\"));
return STATUS_INSUFFICIENT_RESOURCES;
}

PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp_1);
stack->Parameters.Others.Argument1 = (PVOID) &urb_1;
IoMarkIrpPending(Irp_1);
IoStartPacket(fdo,Irp_1,NULL,OnCancel);
status=STATUS_PENDING;
return status;
}

VOID StartIo(IN PDEVICE_OBJECT pdo, IN PIRP Irp)
{

KIRQL oldirql;
NTSTATUS status;
IoAcquireCancelSpinLock(&oldirql);
if (Irp != pdo->CurrentIrp || Irp->Cancel)
{
IoReleaseCancelSpinLock(oldirql);
return;
}
else
{
IoSetCancelRoutine(Irp, NULL);
IoReleaseCancelSpinLock(oldirql);
}
  
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) pdo->DeviceExtension;

PVOID ctx;
IoSetCompletionRoutine(Irp,  (PIO_COMPLETION_ROUTINE)OnComplete/*(pdo,Irp,pdx)*/, (PVOID) ctx, TRUE, FALSE,FALSE);
status=IoCallDriver(pdx->LowerDeviceObject, Irp);
return;

}


NTSTATUS OnComplete(PDEVICE_OBJECT pdo, PIRP Irp, PDEVICE_EXTENSION pdx)
{

LONG m_seglen;
URB urb;
URB urb_1;
KEVENT event;
IO_STATUS_BLOCK iostatus;

if (Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}


Irp->IoStatus.Status=STATUS_SUCCESS;
Irp->IoStatus.Information =pdx->Length;
IoStartNextPacket(pdo,TRUE);
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;


}
游客

返回顶部