2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbohci/misc.cpp
5 * PURPOSE: USB OHCI device driver.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
16 IO_COMPLETION_ROUTINE SyncForwardIrpCompletionRoutine
;
20 SyncForwardIrpCompletionRoutine(
21 PDEVICE_OBJECT DeviceObject
,
25 if (Irp
->PendingReturned
)
27 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
29 return STATUS_MORE_PROCESSING_REQUIRED
;
34 SyncForwardIrp(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
42 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
45 // copy irp stack location
47 IoCopyCurrentIrpStackLocationToNext(Irp
);
50 // set completion routine
52 IoSetCompletionRoutine(Irp
, SyncForwardIrpCompletionRoutine
, &Event
, TRUE
, TRUE
, TRUE
);
58 Status
= IoCallDriver(DeviceObject
, Irp
);
64 if (Status
== STATUS_PENDING
)
67 // wait for the request to finish
69 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
74 Status
= Irp
->IoStatus
.Status
;
86 PDEVICE_OBJECT DeviceObject
,
87 PBUS_INTERFACE_STANDARD busInterface
)
92 IO_STATUS_BLOCK IoStatus
;
93 PIO_STACK_LOCATION Stack
;
95 if ((!DeviceObject
) || (!busInterface
))
96 return STATUS_UNSUCCESSFUL
;
98 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
100 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
110 return STATUS_INSUFFICIENT_RESOURCES
;
113 Stack
=IoGetNextIrpStackLocation(Irp
);
114 Stack
->MajorFunction
= IRP_MJ_PNP
;
115 Stack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
116 Stack
->Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
117 Stack
->Parameters
.QueryInterface
.InterfaceType
= (LPGUID
)&GUID_BUS_INTERFACE_STANDARD
;
118 Stack
->Parameters
.QueryInterface
.Version
= 1;
119 Stack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)busInterface
;
120 Stack
->Parameters
.QueryInterface
.InterfaceSpecificData
= NULL
;
121 Irp
->IoStatus
.Status
=STATUS_NOT_SUPPORTED
;
123 Status
=IoCallDriver(DeviceObject
, Irp
);
125 if (Status
== STATUS_PENDING
)
127 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
129 Status
=IoStatus
.Status
;