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

  • 相关阅读:
    Spring RestTemplate 之put、delete请求
    Too many connections解决方案
    各个平台的mysql重启命令
    MySQL出现too many connections(1040)错误解决方法
    EXCEL中,如何引用一个单元格中的数据,作为另一个单元格内容中的一部分?
    [翻译][Java]ExecutorService的正确关闭方法
    MySQL:日期函数、时间函数总结(MySQL 5.X)
    MySQL 获得当前日期时间 函数
    线程本地变量ThreadLocal
    split 分割 字符串(分隔符如:* ^ : | , . ?) 及注意点
  • 原文地址:https://www.cnblogs.com/adylee/p/2575580.html
Copyright © 2011-2022 走看看