IO_STACK_LOCATION 结构和处理过程

IO_STACK_LOCATION 结构

The IO_STACK_LOCATION structure defines an I/O stack location , which is an entry in the I/O stack that is associated with each IRP. Each I/O stack location in an IRP has some common members and some request-type-specific members.

IO_STACK_LOCATION 处理过程

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;
}

你可能感兴趣的:(location)