zoukankan      html  css  js  c++  java
  • IoCallDriver源码剖析

    IoCallDriver是一个宏:

    #define IoCallDriver(a,b)   \
            IofCallDriver(a,b)

    显然用的是IofCallDriver();

    IofCallDriver()代码如下:

    NTSTATUS
    FASTCALL
    IofCallDriver(
        IN PDEVICE_OBJECT DeviceObject,
        IN OUT PIRP Irp
        )
    {
        if (pIofCallDriver != NULL) {
    
            //
            // This routine will either jump immediately to IovCallDriver or
            // IoPerfCallDriver.
            //
            return pIofCallDriver(DeviceObject, Irp, _ReturnAddress());
        }
    
        return IopfCallDriver(DeviceObject, Irp);
    }
    pIofCallDriver 好像是(在头文件定义)
    extern PIO_CALL_DRIVER        pIofCallDriver;

    PIO_CALL_DRIVER则是一个函数指针

    typedef
    NTSTATUS
    (FASTCALL *PIO_CALL_DRIVER) (
        IN      PDEVICE_OBJECT  DeviceObject,
        IN OUT  PIRP            Irp,
        IN      PVOID           ReturnAddress
        );
    再来说IopfCallDriver
    NTSTATUS
    FORCEINLINE
    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的那个数组标号越大表示越顶层设备
    // 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; }
     
  • 相关阅读:
    [每日一题] OCP1z0-047 :2013-07-29 视图――别名
    Java动态规划实现最短路径问题
    Java动态规划实现最短路径问题
    Java实现堆排序问题(变治法)
    Java实现堆排序问题(变治法)
    Java实现堆排序问题(变治法)
    Java实现堆排序问题(变治法)
    Java实现堆排序问题(变治法)
    Java实现8枚硬币问题(减治法)
    Java实现8枚硬币问题(减治法)
  • 原文地址:https://www.cnblogs.com/stonehat/p/2601597.html
Copyright © 2011-2022 走看看