阅读:2451回复:11
IRP是通过I/O管理器发送给下层驱动的吗?
每一层驱动都是通过I/O管理器将IRP发送给下层驱动的吗?
|
|
沙发#
发布于:2005-06-05 20:15
看一下IoCallDriver
|
|
板凳#
发布于:2005-06-06 12:05
IoCallDriver没有讲到这个问题。
|
|
地板#
发布于:2005-06-07 23:45
每一层驱动都是通过I/O管理器将IRP发送给下层驱动的吗? dui |
|
|
地下室#
发布于:2005-06-08 09:47
[quote]每一层驱动都是通过I/O管理器将IRP发送给下层驱动的吗? dui [/quote] 老大也不说仔细点,小心把人家整ft了 |
|
|
5楼#
发布于:2005-06-08 16:48
bmyyyud:你讲一讲吧!
|
|
6楼#
发布于:2005-06-09 09:25
IoCallDriver就在I/O Manager中 :D
|
|
|
7楼#
发布于:2005-06-10 11:03
位于I/O管理器中是什么意思?
[编辑 - 6/10/05 by cicada] |
|
8楼#
发布于:2005-06-10 12:50
win2k src中IoCallDriver的实现
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; } 注意这里是IopfCallDriver不IoCallDriver,IoCallDirver最终还是调的IopfCallDriver,PERFINFO_DRIVER_MAJORFUNCTION_CALL和PERFINFO_DRIVER_MAJORFUNCTION_RETURN可以看作两个空的宏。 这个实现还是很简单明了的。 |
|
9楼#
发布于:2005-06-10 13:25
其实并不存在实际的i/o管理器。
在Windows中,把一堆管理io的函数集合称为i/o管理器是为了方便描述。 |
|
|
10楼#
发布于:2005-06-10 15:42
明白了。
|
|
11楼#
发布于:2010-03-13 09:47
还是不明白
|
|