#001 //该函数实现对发送URB到USB物理总线驱动 #002 NTSTATUS #003 CallUSBD( #004 IN PDEVICE_OBJECT DeviceObject, #005 IN PURB Urb #006 ) #007 { #008 PIRP irp; #009 KEVENT event; #010 NTSTATUS ntStatus; #011 IO_STATUS_BLOCK ioStatus; #012 PIO_STACK_LOCATION nextStack; #013 PDEVICE_EXTENSION deviceExtension; #014 #015 //首先是变量初始化 #016 irp = NULL; #017 deviceExtension = DeviceObject->DeviceExtension; #018 //初始化事件 #019 KeInitializeEvent(&event, NotificationEvent, FALSE); #020 //创建IO控制码相关的IRP #021 irp = IoBuildDeviceIoControlRequest (IOCTL_INTERNAL_USB_SUBMIT_URB, #022 deviceExtension-> TopOfStackDeviceObject, #023 NULL, #024 0, #025 NULL, #026 0, #027 TRUE, #028 &event, #029 &ioStatus); #030 #031 if(!irp) { #032 //如果IRP创建失败则返回 #033 BulkUsb_DbgPrint(1, ("IoBuildDeviceIo ControlRequest failed\n")); #034 return STATUS_INSUFFICIENT_RESOURCES; #035 } #036 //得到下一层设备栈 #037 nextStack = IoGetNextIrpStackLocation(irp); #038 ASSERT(nextStack != NULL); #039 nextStack->Parameters.Others.Argument1 = Urb; #040 BulkUsb_DbgPrint(3, ("CallUSBD::")); #041 BulkUsb_IoIncrement(deviceExtension); #042 //通过IoCallDriver将IRP发送到底层驱动 #043 ntStatus = IoCallDriver(deviceExtension-> TopOfStackDeviceObject, irp); #044 //如果IRP是异步完成时,等待其结束 #045 if(ntStatus == STATUS_PENDING) { #046 //等待IRP结束 #047 KeWaitForSingleObject(&event, #048 Executive, #049 KernelMode, #050 FALSE, #051 NULL); #052 ntStatus = ioStatus.Status; #053 } #054 //调用结束 #055 BulkUsb_DbgPrint(3, ("CallUSBD::")); #056 BulkUsb_IoDecrement(deviceExtension); #057 return ntStatus; #058 } |