• 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; }
     
  • 相关阅读:
    IDEA效率快捷键
    常用文件/文件夹操作
    git log状态下退出方法
    ImageList 构造函数
    ImageList 控件
    【转】图像分割代码合集
    【转】图像分割论文及代码资源汇总
    SLIC 算法
    c/c++内存分配详解
    c++内存分配
  • 原文地址:https://www.cnblogs.com/stonehat/p/2601597.html
Copyright © 2020-2023  润新知