Windows核心學習筆記(二)– IoCallDriver函數與PoCallDriver函數

來源:互聯網
上載者:User

      今天看書的時候看到了這兩個函數,開始還沒在意,以為是同一個,功能應該一樣。後來想想一樣的幹嘛還弄兩個呢,於是就查了一下,發現這兩個函數差別還蠻大的。

首先來看這兩個函數的原型:

NTSTATUS<br /> IoCallDriver(<br /> IN PDEVICE_OBJECT DeviceObject,<br /> IN OUT PIRP Irp<br /> );<br />NTSTATUS<br /> PoCallDriver(<br /> IN PDEVICE_OBJECT DeviceObject,<br /> IN OUT PIRP Irp<br /> );

      除了函數名不同之外,其他都一樣。參數都是兩個,一個是裝置對象的指標,另一個是IRP請求對象的指標。傳回值也是一樣。那麼區別到底是什麼呢?

      我們來看WDK Documentation上的解釋:

The IoCallDriver
routine sends an IRP to the driver associated with a
specified device object.

The PoCallDriver
routine passes a power IRP
to the
next-lower driver in the device stack. (Windows Server 2003, Windows XP, and
Windows 2000 only.)

      從上面的這兩句話中可以看出:IoCallDriver這個函數向DeviceObject裝置對象的驅動對象發送一個IRP請求;而PoCallDriver函數向裝置棧中的下層裝置傳遞一個主功能號為IRP_MJ_POWER的請求,且限於特定的OS。

      而且,調用IoCallDriver之前,主調驅動程式必須要為目標驅動程式建立IRP裡的I/O stack location;同時,調用時,IoCallDriver函數還會協助驅動程式將輸入參數的DeviceObject值賦給IO_STACK_LOCATION結構裡的DeviceObject成員。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.