zoukankan      html  css  js  c++  java
  • [转]IoCallDriver实现

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

  • 相关阅读:
    带你剖析WebGis的世界奥秘----点和线的世界
    XML解析
    Java-工厂设计模式
    分享:软件包和文档
    启航,新开始
    docker容器网络通信原理分析(转)
    【好书分享】容器网络到kubernetes网络
    go语言接受者的选取
    go语言的unsafe包(转)
    protocol buffers生成go代码原理
  • 原文地址:https://www.cnblogs.com/adylee/p/2575580.html
Copyright © 2011-2022 走看看