usb驱动问题,大家看看为什么在KeWaitForSingleObject处死等不回!!!!

coolqiu 2003-08-22 09:41:00
urb =(PURB) ExAllocatePool(NonPagedPool,sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));

if (urb)
{
RtlZeroMemory(urb,sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
urb->UrbHeader.Length = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
urb->UrbHeader.Function = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

urb->UrbBulkOrInterruptTransfer.TransferFlags =USBD_TRANSFER_DIRECTION_OUT;
urb->UrbBulkOrInterruptTransfer.PipeHandle=pdx->Pipe_Handle[5];
urb->UrbBulkOrInterruptTransfer.TransferBufferLength = 10;
urb->UrbBulkOrInterruptTransfer.TransferBuffer = (BYTE*)pciout;
urb->UrbBulkOrInterruptTransfer.TransferBufferMDL = NULL;

pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

KeInitializeEvent(&event, NotificationEvent, FALSE);//TRUE

irp = IoBuildDeviceIoControlRequest(
IOCTL_INTERNAL_USB_SUBMIT_URB,
pdx->LowerDeviceObject,
NULL,
0,
NULL,//(PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer,
0,//Urb->UrbBulkOrInterruptTransfer.TransferBufferLength,
TRUE,
&event,
&ioStatus);



if (!irp)
{
Printf(DEFAULT_PRINT,("DBGLVL_MEDIUM: Unable to allocate IRP for sending RB\n"));
return STATUS_INSUFFICIENT_RESOURCES;
}

PMDL NewMdl=IoAllocateMdl(MmGetMdlVirtualAddress(Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL),
Urb->UrbBulkOrInterruptTransfer.TransferBufferLength,
FALSE,
FALSE,
NULL);
// irp);

NewMdl->StartVa=NULL;
irp->MdlAddress=NewMdl;


// Prepare for calling the USB driver stack
nextStack = IoGetNextIrpStackLocation(irp);
ASSERT(nextStack != NULL);

// Set up the URB ptr to pass to the USB driver stack
nextStack->Parameters.Others.Argument1 = Urb;
nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;

Printf(DEFAULT_PRINT,("Calling USB Driver Stack\n"));

//
// Call the USB class driver to perform the operation. If the returned status
// is PENDING, wait for the request to complete.
//
// IoMarkIrpPending(irp);

IoSetCompletionRoutine(irp,
URB_Write_Complete,
fdo,
TRUE,
TRUE,
TRUE);

ntStatus = IoCallDriver(pdx->LowerDeviceObject,irp);

Printf(DEFAULT_PRINT,("return from IoCallDriver USBD %x\n", ntStatus));

if (ntStatus == STATUS_PENDING)
{
Printf(DEFAULT_PRINT,("Wait for single object\n"));

status = KeWaitForSingleObject(
&event,
Suspended,
KernelMode,
FALSE,
NULL);

Printf(DEFAULT_PRINT,("Wait for single object, returned %x\n", status));
}
else
{
ioStatus.Status = ntStatus;
}


Printf(DEFAULT_PRINT,("URB status = %x status = %x irp status %x\n",
Urb->UrbHeader.Status, status, ioStatus.Status));

ntStatus = ioStatus.Status;

Printf(DEFAULT_PRINT,("exit Ezusb_CallUSBD (%x)\n", ntStatus));

......
...全文
138 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a5868 2003-10-10
  • 打赏
  • 举报
回复
请你把IoSetCompletionRoutine这个例程贴出来看看,可能问题在这儿。
nianll 2003-08-23
  • 打赏
  • 举报
回复
你有在completeroutine 你有没有把那个event设上啊?
coolqiu 2003-08-22
  • 打赏
  • 举报
回复
帮忙看看这段代码,主要用来在驱动内部建立IRP进行USB端点的读写,但是出现死等现象,在应用程序中通过writefile函数写端点没问题

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧