IoCallDriver 정보

2091 단어
보통 IoCall Driver는irp를 다음 장치에 전달하는 것으로 알고 있는데, 전달은 도대체 무슨 뜻입니까?IoCall Driver에서 Iopf Call Driver가 실제로 호출되었는데 그 코드는 다음과 같다. NTSTATUS FORCEINLINE Iopf Call Driver(IN PDEVICE OBJECT Device Object, 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) {
    KiBugCheck3( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 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;

//
// Prevent the driver from unloading.
//


status = driverObject->MajorFunction[irpSp->MajorFunction]( DeviceObject,
                                                          Irp );

return status;

}
IopfCallDriver가 먼저 irp의 현재 위치를 하나 줄이면 다음 위치를 얻을 수 있습니다.IoGetNextIrpStackLocation은 매크로로 다음irp창고의 지침을 받고 이 지침을 현재irp창고 지침으로 한다.실제로irp->Tail.Overlay.CurrentStackLocation - 1.그리고irp 창고에서 대응하는 device object를 꺼내서driver object를 가져옵니다.마지막으로irp를 전달하는 것은 사실상 이번 요청에 대응하는 규칙을 호출하는 것이다.이 요청은irp 창고에서 파라미터를 꺼내거나 다른 일을 하든지 상관없습니다.
그리고 완성 루틴 IoCompletionRoutine에 관해서는 어떻게 호출되었습니까?irp가 완성되면 IoCompleteRequest를 호출합니다.이 함수는irp창고를 한 번 훑어보며, 창고에 IoCompletionRoutine 포인터가 설정되어 있는 것을 발견하면 호출합니다.

좋은 웹페이지 즐겨찾기