2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Parallel Port Function Driver
4 * FILE: drivers/parallel/parport/misc.c
5 * PURPOSE: Miscellaneous functions
11 static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion
;
13 /* FUNCTIONS ****************************************************************/
18 ForwardIrpAndWaitCompletion(IN PDEVICE_OBJECT DeviceObject
,
22 if (Irp
->PendingReturned
)
23 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
24 return STATUS_MORE_PROCESSING_REQUIRED
;
29 ForwardIrpAndWait(IN PDEVICE_OBJECT DeviceObject
,
32 PDEVICE_OBJECT LowerDevice
;
36 LowerDevice
= ((PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->LowerDevice
;
39 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
40 IoCopyCurrentIrpStackLocationToNext(Irp
);
42 DPRINT("Calling lower device %p\n", LowerDevice
);
43 IoSetCompletionRoutine(Irp
, ForwardIrpAndWaitCompletion
, &Event
, TRUE
, TRUE
, TRUE
);
45 Status
= IoCallDriver(LowerDevice
, Irp
);
46 if (Status
== STATUS_PENDING
)
48 Status
= KeWaitForSingleObject(&Event
, Suspended
, KernelMode
, FALSE
, NULL
);
49 if (NT_SUCCESS(Status
))
50 Status
= Irp
->IoStatus
.Status
;
59 ForwardIrpAndForget(IN PDEVICE_OBJECT DeviceObject
,
62 PDEVICE_OBJECT LowerDevice
;
64 if (((PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->Common
.IsFDO
)
65 LowerDevice
= ((PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->LowerDevice
;
67 LowerDevice
= ((PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->AttachedFdo
;
70 IoSkipCurrentIrpStackLocation(Irp
);
71 return IoCallDriver(LowerDevice
, Irp
);
76 GetUserBuffer(IN PIRP Irp
)
81 return Irp
->MdlAddress
;
83 return Irp
->AssociatedIrp
.SystemBuffer
;