驱动学习笔记–irp
来源:互联网 发布:excel编程入门教程 编辑:程序博客网 时间:2024/06/08 05:36
irp是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。
irp相当于ring3下的消息,应用程序对驱动程序进行操作的时候会发出相应的消息,驱动程序根据这些消息做出相应的操作。这些操作通过我们自己编写的派遣函数来决定执行什么样的操作。
看下面流程:
1.为不同的irp类型设置派遣函数
2.编写派遣函数来处理收到不懂类型的irp的不同操作
3.创建设备与符号链接
4.在卸载历程中删除设备与符号链接
流程很简单,但是处理起来就不那么简单了。
代码如下:
#include “ntddk.h”
VOID Unload(IN PDRIVER_OBJECT DriverObject)//卸载时删除符号链接
{
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L”//??//mysymboliclink”);
IoDeleteSymbolicLink(&symLinkName);
IoDeleteDevice(DriverObject->DeviceObject);
KdPrint((”Device Delete Success/n”));
}
NTSTATUS MyMajor(IN PDEVICE_OBJECT Device,IN PIRP irp)
{
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(irp);//动态获取irp的IO堆栈
irp->IoStatus.Status = STATUS_SUCCESS;//填充返回的状态值
irp->IoStatus.Information = 0;
//判断是否为打开驱动的irp,如果是则输出“IRP_MJ_CREATE”
if (stack->MajorFunction==IRP_MJ_CREATE)
{
KdPrint((”IRP_MJ_CREATE/n”));
}
//判断是否为关闭驱动的irp,如果是则输出“IRP_MJ_CLOS”
if (stack->MajorFunction==IRP_MJ_CLOSE)
{
KdPrint((”IRP_MJ_CLOSE/n”));
}
IoCompleteRequest( irp, IO_NO_INCREMENT );//结束掉irp
return irp->IoStatus.Status;//返回
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT mydevice;//定义设备对象
UNICODE_STRING devicename;//定义设备名称
UNICODE_STRING symboliclinkname;//定义符号连接名称
//为不同的irp类型设置派遣函数
DriverObject->MajorFunction[IRP_MJ_CREATE]=MyMajor;//打开
DriverObject->MajorFunction[IRP_MJ_CLOSE]=MyMajor;//关闭
DriverObject->DriverUnload=Unload;
RtlInitUnicodeString(&devicename,L”//Device//mydevice”);//初始化设备名称
RtlInitUnicodeString(&symboliclinkname,L”//??//mysymboliclink”);//初始化符号连接名称
//创建设备
IoCreateDevice(
DriverObject,//驱动对象
0,
&devicename,//设备名称
FILE_DEVICE_UNKNOWN,//类型
0,
FALSE,
&mydevice//设备对象
);
//创建符号链接
IoCreateSymbolicLink(
&symboliclinkname,//符号链接名称
&devicename//设备名称
);
return STATUS_SUCCESS;
}
下面写一个简单的vc程序打开然后关闭驱动,打开的时候会发送给两个消息转换成irp就是IRP_MJ_CREATE和IRP_MJ_CLOSE,然后截获到输出“IRP_MJ_CREATE和IRP_MJ_CLOSE”。
- 驱动学习笔记–irp
- windows驱动编程学习笔记——(三)IRP
- 内核学习笔记之IRP
- 驱动学习(1)---IRP和IO堆栈
- 驱动中的IRP
- Windows驱动中的IRP
- 【驱动之一】IRP结构
- 驱动中IRP分类
- WDM驱动之IRP处理:取消IRP
- WDM驱动之IRP处理:取消IRP
- 分层驱动将IRP分解成多个IRP
- 《Windows NT FileSystem Internals》学习笔记之Complete IRP
- Windows NT FileSystem Internals》学习笔记之Complete IRP
- IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
- 《寒江独钓》内核学习笔记(1)-- IRP - .Little Hann
- 创建 IRP 给底层驱动
- 驱动开发之 常见IRP
- 分层驱动向下转发IRP
- CMD文件的编写
- ccna 1 Chapter 4
- set html as readonly
- J2EE系统的概念及如何开发
- 创建窗口代码分析一
- 驱动学习笔记–irp
- Python的reduce
- 功能强大的串口工具:GhostyComm 4.0(万能通讯精灵)
- 越是基础越是强大--英语对做软件的影响,是全方位的
- pb 编程好多年
- 修改action
- 如何防止基于ICMP的网络攻击
- MySQL 客户端游标未启用导致BLOB更新失败
- 初试My-SQL