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; }
     
  • 相关阅读:
    UVA 10618 Tango Tango Insurrection
    UVA 10118 Free Candies
    HDU 1024 Max Sum Plus Plus
    POJ 1984 Navigation Nightmare
    CODEVS 3546 矩阵链乘法
    UVA 1625 Color Length
    UVA 1347 Tour
    UVA 437 The Tower of Babylon
    UVA 1622 Robot
    UVA127-"Accordian" Patience(模拟)
  • 原文地址:https://www.cnblogs.com/stonehat/p/2601597.html
Copyright © 2011-2022 走看看