usb驱动问题,大家看看为什么在KeWaitForSingleObject处死等不回!!!!
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));
......