IoCallDriver源碼剖析

來源:互聯網
上載者:User

 

IoCallDriver是一個宏:

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

顯然用的是IofCallDriver();

IofCallDriver()代碼如下:

NTSTATUSFASTCALLIofCallDriver(    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則是一個函數指標

typedefNTSTATUS(FASTCALL *PIO_CALL_DRIVER) (    IN      PDEVICE_OBJECT  DeviceObject,    IN OUT  PIRP            Irp,    IN      PVOID           ReturnAddress    );

 

再來說IopfCallDriver
NTSTATUSFORCEINLINEIopfCallDriver(    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;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.