Here is where I'm getting confused. It starts out like this. I've added some DPRINT1 statements:
The beginning file I'm looking at looks like this.
ntoskrnl/io/iomgr/file.c, IopParseDevice:
Code: Select all
DPRINT1("Before IoCallDriver\n", DeviceObject);
Status = IoCallDriver(DeviceObject, Irp);
DPRINT1("After IoCallDriver\n", DeviceObject);
Code: Select all
DPRINT1("DeviceObject: %p\n", DeviceObject);
DPRINT1("Irp: %p\n", Irp);
DPRINT1("DriverObject->MajorFunction: %x\n", DriverObject->MajorFunction);
DPRINT1("StackPtr->MajorFunction: %x\n", StackPtr->MajorFunction);
return DriverObject->MajorFunction[StackPtr->MajorFunction](DeviceObject,
Irp);
drivers/storage/port/scsiport/scsiport.c, ScsiPortDispatchScsi:
Code: Select all
static NTSTATUS NTAPI
ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
PSCSI_PORT_LUN_EXTENSION LunExtension;
PIO_STACK_LOCATION Stack;
PSCSI_REQUEST_BLOCK Srb;
KIRQL Irql;
NTSTATUS Status = STATUS_SUCCESS;
PIRP NextIrp, IrpList;
PKDEVICE_QUEUE_ENTRY Entry;
DPRINT1("ScsiPortDispatchScsi(DeviceObject %p Irp %p)\n",
DeviceObject, Irp);
DPRINT1("0 DeviceObject->Flags: %I64x\n", DeviceObject->Flags);
...
...
...
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DPRINT1("1 DeviceObject->Flags: %I64x\n", DeviceObject->Flags);
return(Status);
}
Code: Select all
(ntoskrnl/io/iomgr/irp.c:1295) DeviceObject: B02A2A70
(ntoskrnl/io/iomgr/irp.c:1296) Irp: B029E620
(ntoskrnl/io/iomgr/irp.c:1297) DriverObject->MajorFunction: b02b58a8
(ntoskrnl/io/iomgr/irp.c:1298) StackPtr->MajorFunction: f
(drivers/storage/port/scsiport/scsiport.c:2572) ScsiPortDispatchScsi(DeviceObject B02A2A70 Irp B029E620)
(drivers/storage/port/scsiport/scsiport.c:2574) 0 DeviceObject->Flags: b029e62000000050
(drivers/storage/port/scsiport/scsiport.c:2825) 1 DeviceObject->Flags: b029e62000000050
(ntoskrnl/io/iomgr/irp.c:1270) irp.c DeviceObject->Flags: b029c0c000000150
(ntoskrnl/io/iomgr/irp.c:1295) DeviceObject: B02169F0
What's going on with that?