IoCallDriver函数与PoCallDriver函数

简介:  今天看书的时候看到了这两个函数,开始还没在意,以为是同一个,功能应该一样。后来想想一样的干嘛还弄两个呢,于是就查了一下,发现这两个函数差别还蛮大的。 首先来看这两个函数的原型: view plaincopy to clipboardprint?...

 今天看书的时候看到了这两个函数,开始还没在意,以为是同一个,功能应该一样。后来想想一样的干嘛还弄两个呢,于是就查了一下,发现这两个函数差别还蛮大的。

首先来看这两个函数的原型:

view plaincopy to clipboardprint?
NTSTATUS   
  IoCallDriver(  
    IN PDEVICE_OBJECT  DeviceObject,  
    IN OUT PIRP  Irp  
    );  
NTSTATUS  
  PoCallDriver(  
    IN PDEVICE_OBJECT  DeviceObject,  
    IN OUT PIRP  Irp  
    ); 
NTSTATUS
  IoCallDriver(
    IN PDEVICE_OBJECT  DeviceObject,
    IN OUT PIRP  Irp
    );
NTSTATUS
  PoCallDriver(
    IN PDEVICE_OBJECT  DeviceObject,
    IN OUT PIRP  Irp
    );

      除了函数名不同之外,其他都一样。参数都是两个,一个是设备对象的指针,另一个是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成员。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vangoals/archive/2009/07/19/4361847.aspx

目录
相关文章
|
存储 安全 数据安全/隐私保护
VMware16安装Win11虚拟机(最全步骤+踩坑)
VMware16安装Win11虚拟机(最全步骤+踩坑)
11036 0
VMware16安装Win11虚拟机(最全步骤+踩坑)
|
机器学习/深度学习 人工智能 并行计算
CPU和GPU的区别
【10月更文挑战第14天】
|
小程序 API 开发者
【异常解决】“errcode“:47003,“errmsg“:“argument invalid! data.date4.value invalid rid:xxxxxx
【异常解决】“errcode“:47003,“errmsg“:“argument invalid! data.date4.value invalid rid:xxxxxx
1600 0
【异常解决】“errcode“:47003,“errmsg“:“argument invalid! data.date4.value invalid rid:xxxxxx
|
Java Spring
spring boot 中WebMvcConfigurer相关使用总结
spring boot 中WebMvcConfigurer相关使用总结
250 3
|
安全 开发工具 虚拟化
使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境
使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境
|
Ubuntu Shell
【Ubuntu系统】三步更新自己的Cmake最新版本
Ubuntu系统中通过三步简单流程更新Cmake到最新版本的具体操作方法,包括卸载旧版本、下载并运行安装脚本以及创建软链接。
3623 1
|
Windows
windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
2225 0
|
机器人 Linux 开发工具
嵌入式BSP工程师基本任务分析
嵌入式BSP工程师基本任务分析
596 1
|
Ubuntu Linux 开发工具
E2000 UEFI使用设备树方式启动linux系统
E2000 UEFI使用设备树方式启动linux系统
3318 0
E2000 UEFI使用设备树方式启动linux系统
|
消息中间件 Linux 芯片
soc的核间通信机制-->mailbox
soc的核间通信机制-->mailbox
1059 0