028_实战EXE和SYS通信-28课(缓冲模式)_sys_驱动源码
来源:互联网 发布:毕业证制作软件下载 编辑:程序博客网 时间:2024/05/18 02:40
#include"ntddk.h" #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED,FILE_ANY_ACCESS)#define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED,FILE_ANY_ACCESS)void xiezai1(PDRIVER_OBJECT qudongduixiang1){UNICODE_STRING fuhaolianjieming1;RtlInitUnicodeString(&fuhaolianjieming1, L"\\??\\shebeiduixiangfuhaolianjieming1");KdPrint(("222222222222222222222222222\n"));IoDeleteSymbolicLink(&fuhaolianjieming1);//删除符号连接 KdPrint(("符号连接名删除成功\n"));IoDeleteDevice(qudongduixiang1->DeviceObject);//删除设备 KdPrint(("设备对象删除成功\n"));}NTSTATUS chuangjianshebei1(PDRIVER_OBJECT qudongduixiang1){NTSTATUS zhuangtai1;//状态 UNICODE_STRING shebeiming1;//设备名 UNICODE_STRING fuhaolianjieming1;//符号连接名 PDEVICE_OBJECT shebeiduixiang;//设备对象 (输出的) RtlInitUnicodeString(&shebeiming1, L"\\Device\\shebeiduixiangming1");//用winobj工具找的到 RtlInitUnicodeString(&fuhaolianjieming1, L"\\??\\shebeiduixiangfuhaolianjieming1");zhuangtai1 = IoCreateDevice(qudongduixiang1, 0, &shebeiming1, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, TRUE, &shebeiduixiang);//创建设备 if (NT_SUCCESS(zhuangtai1)){KdPrint(("设备对象创建成功\n"));}shebeiduixiang->Flags |= DO_BUFFERED_IO;//给设备对象赋值 zhuangtai1 = IoCreateSymbolicLink(&fuhaolianjieming1, &shebeiming1);//创建符号连接 if (NT_SUCCESS(zhuangtai1)){KdPrint(("符号连接创建成功\n"));}return zhuangtai1;}NTSTATUS chuangjianlicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp)//必须这种格式 pirp是很重要的东西 请求包的意思_inout_ io管理器和驱动驱动程序互相传递的数据包 动态记录驱动信息 和io 管理器信息 io管理器在调用历程的时候 //用户层在创建历程的时候 调用进入内核 内核就生成IRP对象 IRP对象就负责请求的信息 比如请求是什么请求或者我们请求的标志 我们的请求是属于(下发)哪个设备的 我们请求携带的用户层传来的一些信息 //比如用户层传来的缓冲区内存 具体的读信息 具体的写信息 只是用于在io管理器和驱动程序互相传递的一个数据包 会变的在io管理器是这样的 传给驱动程序 我们驱动程序可以对它进行操作 {pirp->IoStatus.Status = STATUS_SUCCESS;//pirp的io完成状态 io传递已经成功了 pirp->IoStatus.Information = 0;//驱动程序操作应用程序提供的缓冲区的字节数 IoCompleteRequest(pirp, IO_NO_INCREMENT); //设置irp已经完成不用传给其它东西了 irp不需要再设备栈上滚动了 不需要流动了 KdPrint(("创建设备历程\n"));return STATUS_SUCCESS;//什么事都没做 }NTSTATUS guanbilicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp){NTSTATUS zhuangtai1;zhuangtai1 = STATUS_SUCCESS;KdPrint(("关闭驱动中的设备的历程成功\n"));pirp->IoStatus.Status = STATUS_SUCCESS;//pirp的io完成状态 io传递已经成功了 pirp->IoStatus.Information = 0;//驱动程序操作应用程序提供的缓冲区的字节数 IoCompleteRequest(pirp, IO_NO_INCREMENT); //设置irp已经完成不用传给其它东西了 irp不需要再设备栈上滚动了 不需要流动了 return zhuangtai1;}NTSTATUS dulicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp){KdPrint(("读历程\n"));return STATUS_SUCCESS;}NTSTATUS xielicheng(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp){KdPrint(("写历程\n"));return STATUS_SUCCESS;}NTSTATUS ddk_DispatchRoutine_CONTROL(PDEVICE_OBJECT shebeiduixiang1, PIRP pirp){ULONG info;//得到当前栈指针PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp);KdPrint(("Enter myDriver_DeviceIOControl\n"));NTSTATUS status = STATUS_SUCCESS;//得到输入缓冲区大小ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;//得到输出缓冲区大小ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;//得到IOCTL码ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;switch (code){case add_code:{ int a, b; KdPrint(("add_code 1111111111111111111\n")); //缓冲区方式IOCTL //获取缓冲区数据a,b int * InputBuffer = (int*)pirp->AssociatedIrp.SystemBuffer; _asm { mov eax, InputBuffer mov ebx, [eax] mov a, ebx mov ebx, [eax + 4] mov b, ebx } KdPrint(("a=%d,b=%d \n", a, b)); a = a + b; //C、驱动层返回数据至用户层 //操作输出缓冲区 int* OutputBuffer = (int*)pirp->AssociatedIrp.SystemBuffer; _asm { mov eax, a mov ebx, OutputBuffer mov[ebx], eax //bufferet=a+b } KdPrint(("a+b=%d \n", a)); //设置实际操作输出缓冲区长度 info = 4; break;}}//对相应的IPR进行处理pirp->IoStatus.Information = info;//设置操作的字节数为0,这里无实际意义pirp->IoStatus.Status = STATUS_SUCCESS;//返回成功IoCompleteRequest(pirp, IO_NO_INCREMENT);//指示完成此IRPKdPrint(("离开派遣函数\n"));//调试信息return STATUS_SUCCESS; //返回成功}NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang1, PUNICODE_STRING zhucebiao1){KdPrint(("11111111111111111111111111111\n"));KdPrint(("注册表路径 %wZ\n", zhucebiao1));//%wZ打印字符串 chuangjianshebei1(qudongduixiang1);qudongduixiang1->MajorFunction[IRP_MJ_CREATE] = chuangjianlicheng; // 创建设备历程 返回必须是NTSTATUS 必须设定2个参数 用户层有28种不同的请求 比如对设备的读 写 查询 打开 关闭 等等 IRP_MJ_CREATE打开设备的请求 //应用程序发来请求提交给IO管理器 io管理器设备对象对应驱动程序 有没有 这几个请求 如果提供就调用这几个请求 没有提供用默认历程 返回失败信息 给应用程序 qudongduixiang1->MajorFunction[IRP_MJ_READ] = dulicheng; //通用函数 具体请求我们编写的驱动程序要做的事情了 qudongduixiang1->MajorFunction[IRP_MJ_WRITE] = xielicheng;qudongduixiang1->MajorFunction[IRP_MJ_CLOSE] = guanbilicheng;qudongduixiang1->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ddk_DispatchRoutine_CONTROL; //IRP_MJ_CREATE相关IRP处理函数qudongduixiang1->DriverUnload = xiezai1;//卸载历程 return STATUS_SUCCESS;}
阅读全文
0 0
- 028_实战EXE和SYS通信-28课(缓冲模式)_sys_驱动源码
- 028_实战EXE和SYS通信-28课(缓冲模式)_exe_控制台
- EXE与SYS通信(缓冲模式)
- EXE与SYS通信(缓冲模式)
- EXE和SYS通信DeviceIoControl
- EXE与SYS通信(直接访问模式)
- EXE与SYS通信(其他模式)
- EXE与SYS通信(直接访问模式)
- EXE与SYS通信(其他模式)
- EXE和SYS通信IOCTL方式
- EXE和SYS通信MiniFilter方式
- EXE和SYS通信(FltSendMessage+FilterReplyMessage)
- EXE和SYS通信IOCTL方式
- EXE和SYS通信(ReadFile WriteFile DO_BUFFERED_IO) 缓冲区方式
- EXE和SYS通信(ReadFile WriteFile DO_DIRECT_IO) 直接方式
- EXE和SYS通信(ReadFile WriteFile) 其他方式
- EXE和SYS通信MiniFilter基于事件方式
- EXE和SYS通信(ReadFile WriteFile DO_BUFFERED_IO) 缓冲区方式
- java.lang.SecurityException: Can't make field constructor accessible
- 单设备登录与单点登录(SSO)
- 欢迎使用CSDN-markdown编辑器
- 【排序算法】冒泡排序原理及Java实现
- vue-router 快速入门
- 028_实战EXE和SYS通信-28课(缓冲模式)_sys_驱动源码
- 常用杂记 一
- Android小考-----一款天气APP钦天监
- 机器学习知识点(三十三)机器学习入门的数学基础
- 原始套接字编程(五)
- 网络计划技术
- 九度1015:还是A+B
- Python3 使用 unicode-escape 处理 unicode 16进制字符串编解码问题
- Linux命令执行顺序控制与管道