2 * PROJECT: ReactOS Universal Serial Bus Bulk Driver Library
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: lib/drivers/libusb/misc.cpp
5 * PURPOSE: USB Common Driver Library.
7 * Michael Martin (michael.martin@reactos.org)
8 * Johannes Anderwald (johannes.anderwald@reactos.org)
19 IO_COMPLETION_ROUTINE SyncForwardIrpCompletionRoutine
;
23 SyncForwardIrpCompletionRoutine(
24 PDEVICE_OBJECT DeviceObject
,
28 if (Irp
->PendingReturned
)
30 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
32 return STATUS_MORE_PROCESSING_REQUIRED
;
37 SyncForwardIrp(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
45 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
48 // copy irp stack location
50 IoCopyCurrentIrpStackLocationToNext(Irp
);
53 // set completion routine
55 IoSetCompletionRoutine(Irp
, SyncForwardIrpCompletionRoutine
, &Event
, TRUE
, TRUE
, TRUE
);
61 Status
= IoCallDriver(DeviceObject
, Irp
);
67 if (Status
== STATUS_PENDING
)
70 // wait for the request to finish
72 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
77 Status
= Irp
->IoStatus
.Status
;
89 PDEVICE_OBJECT DeviceObject
,
90 PBUS_INTERFACE_STANDARD busInterface
)
95 IO_STATUS_BLOCK IoStatus
;
96 PIO_STACK_LOCATION Stack
;
98 if ((!DeviceObject
) || (!busInterface
))
99 return STATUS_UNSUCCESSFUL
;
101 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
103 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
113 return STATUS_INSUFFICIENT_RESOURCES
;
116 Stack
=IoGetNextIrpStackLocation(Irp
);
117 Stack
->MajorFunction
= IRP_MJ_PNP
;
118 Stack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
119 Stack
->Parameters
.QueryInterface
.Size
= sizeof(BUS_INTERFACE_STANDARD
);
120 Stack
->Parameters
.QueryInterface
.InterfaceType
= (LPGUID
)&GUID_BUS_INTERFACE_STANDARD
;
121 Stack
->Parameters
.QueryInterface
.Version
= 1;
122 Stack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)busInterface
;
123 Stack
->Parameters
.QueryInterface
.InterfaceSpecificData
= NULL
;
124 Irp
->IoStatus
.Status
=STATUS_NOT_SUPPORTED
;
126 Status
=IoCallDriver(DeviceObject
, Irp
);
128 if (Status
== STATUS_PENDING
)
130 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
132 Status
=IoStatus
.Status
;