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

  • 相关阅读:
    mysql 下 计算 两点 经纬度 之间的距离
    富爸爸财务自由之路
    Ubuntu16.04忘记MySQL5.7的root用户密码之解决方案
    Windowns下code: command not found
    Linux下CRMEB环境搭建
    PHP无法使用curl_init()函数
    请在mysql配置文件修sql-mode或sql_mode为NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    apache不能解析php之解决办法
    windows上hexo: command not found
    SyntaxError: Non-ASCII character 'æ' in file csdn.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
  • 原文地址:https://www.cnblogs.com/adylee/p/2575580.html
Copyright © 2011-2022 走看看