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;}