define IoSkipCurrentIrpStackLocation( Irp ) / (Irp)->CurrentLocation++; / (Irp)->Tail.Overlay.CurrentStackLocation++;#define IoCopyCurrentIrpStackLocationToNext ( Irp ) Value: { / PIO_STACK_LOCATION irpSp; / PIO_STACK_LOCATION nextIrpSp; / irpSp = IoGetCurrentIrpStackLocation( (Irp) ); / nextIrpSp = IoGetNextIrpStackLocation( (Irp) ); / RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); / nextIrpSp->Control = 0; }
NTSTATUS IoCallDriver( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ) { return IofCallDriver (DeviceObject, Irp); }
NTSTATUS FASTCALL IofCallDriver( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ) { // // This routine will either jump immediately to IopfCallDriver, or rather // IovCallDriver. // return pIofCallDriver(DeviceObject, Irp); }
NTSTATUS FASTCALL IopfCallDriver( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp )
/*++
Routine Description:
This routine is invoked to pass an I/O Request Packet (IRP) to another driver at its dispatch routine.
Arguments:
DeviceObject - Pointer to device object to which the IRP should be passed.
Irp - Pointer to IRP for request.
Return Value:
Return status from driver's dispatch routine.
--*/
{ PIO_STACK_LOCATION irpSp; PDRIVER_OBJECT driverObject; NTSTATUS status;
// // Ensure that this is really an I/O Request Packet. //
ASSERT( Irp->Type == IO_TYPE_IRP );
// // Update the IRP stack to point to the next location. // Irp->CurrentLocation--;
if (Irp->CurrentLocation <= 0) { KeBugCheckEx( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 0, 0, 0 ); }
irpSp = IoGetNextIrpStackLocation( Irp ); Irp->Tail.Overlay.CurrentStackLocation = irpSp;
// // Save a pointer to the device object for this request so that it can // be used later in completion. //
irpSp->DeviceObject = DeviceObject;
// // Invoke the driver at its dispatch routine entry point. //
driverObject = DeviceObject->DriverObject;
PERFINFO_DRIVER_MAJORFUNCTION_CALL(Irp, irpSp, driverObject);
status = driverObject->MajorFunction[irpSp->MajorFunction]( DeviceObject, Irp );
PERFINFO_DRIVER_MAJORFUNCTION_RETURN(Irp, irpSp, driverObject);
return status; }
windows driver中的IO_STACK_LOCATION
最新推荐文章于 2023-06-04 23:30:44 发布