2023驱动保护学习 -- 应用层与驱动层读写操作

简介: 2023驱动保护学习 -- 应用层与驱动层读写操作

一、在MFC中添加控制码,告诉驱动我们要进行的操作

#include <winioctl.h>
#define 写测试   CTL_CODE(FILE_DEVICE_UNKNOWN,    0x801,   METHOD_BUFFERED,FILE_ANY_ACCESS) 
#define 读测试   CTL_CODE(FILE_DEVICE_UNKNOWN,    0x802,   METHOD_BUFFERED,FILE_ANY_ACCESS) 
#define 读写测试   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803,   METHOD_BUFFERED,FILE_ANY_ACCESS)

二、MFC代码实现

1、双击写操作按钮,通过DeviceIoControl函数进行操作

char 输入缓冲区指针[] = "我是写操作测试!!!";
  int 返回缓冲区指针[] = { 0 };
  DWORD 实际读取字节数;
  DeviceIoControl(
    设备句柄,
    写测试,
    &输入缓冲区指针,
    sizeof(输入缓冲区指针),
    &返回缓冲区指针,
    sizeof(返回缓冲区指针),
    &实际读取字节数,
    NULL);

2、双击读操作按钮,通过

char 返回数据;
  DWORD 实际读取字节数;
  DeviceIoControl(
    设备句柄,
    读测试,
    NULL,
    0,
    &返回数据,
    sizeof(返回数据),
    &实际读取字节数,
    NULL);
  char 缓存区[256];
  sprintf_s(缓存区, "nxyn:读取到驱动内容:%s\n", 返回数据);
  OutputDebugStringA(缓存区);

3、应用层通过驱动实现加法运算

写入的数据是3个整数

char 缓存区[256];
  sprintf_s(缓存区, "nxyn:应用程序写测试控制为%X\n", 读写测试);
  OutputDebugStringA(缓存区);
  int 输入数据[] = { 1,2,3 };
  int 返回数据;
  DWORD 实际读取字节数;
  DeviceIoControl(
    设备句柄,
    读写测试,
    &输入数据,
    sizeof(输入数据),
    &返回数据,
    sizeof(返回数据),
    &实际读取字节数,
    NULL);
  sprintf_s(缓存区, "nxyn:读取到驱动内容:%d+%d+%d=%d\n", 输入数据[0], 输入数据[1], 输入数据[2],返回数据);
  OutputDebugStringA(缓存区);

三、驱动层代码实现

1、写测试函数

void IRP写测试(PIRP IRP指针)
{
  PIO_STACK_LOCATION 栈指针 = IoGetCurrentIrpStackLocation(IRP指针); //通过栈指针获取应用层传来的参数
  char* 缓冲区 = (char*)IRP指针->AssociatedIrp.SystemBuffer;
  KdPrint(("nxyn:应用层缓冲区写入驱动=%s",  缓冲区));
}

2、读测试函数

void IRP读测试(PIRP IRP指针)
{
  char* 缓冲区 = (char*)IRP指针->AssociatedIrp.SystemBuffer;
  char 返回数据[] = "我是来自驱动层的数据";
  memcpy_s(缓冲区, 256, 返回数据, sizeof(返回数据));
  IRP指针->IoStatus.Information = sizeof(返回数据);//设置操作的字节数
  IRP指针->IoStatus.Status = STATUS_SUCCESS;//返回状态
  IoCompleteRequest(IRP指针, IO_NO_INCREMENT);//完成一个IRP请求
  KdPrint(("nxyn:IRP函数处理完毕"));
}

3、读写测试函数

int* 缓冲区 = (int*)IRP指针->AssociatedIrp.SystemBuffer;
  int 计算结果=0;
  if(缓冲区)
  {
    计算结果 = 缓冲区[0] + 缓冲区[1] + 缓冲区[2];
    KdPrint(("nxyn:驱动层计算结果%d + %d + %d=%d", 缓冲区[0],缓冲区[1],缓冲区[2],计算结果));
  }
  *缓冲区 = 计算结果;

四、在IRP处理函数中调用

if (控制码==写测试)
    {
      IRP写测试(IRP指针);
    }
    else if (控制码 == 读测试)
    {
      IRP读测试(IRP指针);
      return STATUS_SUCCESS;
    }
    else if(控制码 == 读写测试)
    {
      IRP读写测试(IRP指针);
    }

五、查看效果

目录
相关文章
|
15小时前
2023驱动保护学习 -- 应用层与驱动层交互操作
2023驱动保护学习 -- 应用层与驱动层交互操作
16 0
|
15小时前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
12 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
|
15小时前
2023驱动保护学习 -- 应用层与驱动层读写操作(二)
2023驱动保护学习 -- 应用层与驱动层读写操作(二)
13 0
|
15小时前
|
Linux Shell Android开发
内核,驱动,应用程关系
内核,驱动,应用程关系
53 0
|
15小时前
|
Linux API
Linux驱动的软件架构(三):主机驱动与外设驱动分离的设计思想
Linux驱动的软件架构(三):主机驱动与外设驱动分离的设计思想
39 0
|
6月前
|
存储 安全 API
3.5 Windows驱动开发:应用层与内核层内存映射
在上一篇博文`《内核通过PEB得到进程参数》`中我们通过使用`KeStackAttachProcess`附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存区域通过这片区域可打通内核与应用层的隔离,此类功能的实现依附于MDL内存映射机制实现。
64 0
3.5 Windows驱动开发:应用层与内核层内存映射
|
7月前
2023驱动保护学习 -- 应用层与驱动层读写操作
2023驱动保护学习 -- 应用层与驱动层读写操作
21 0
|
9月前
|
Linux
Linux驱动入门(5)LED驱动---驱动分层和分离,平台总线模型
Linux驱动入门(5)LED驱动---驱动分层和分离,平台总线模型
63 0
驱动开发:通过ReadFile与内核层通信
驱动与应用程序的通信是非常有必要的,内核中执行代码后需要将其动态显示给应用层,但驱动程序与应用层毕竟不在一个地址空间内,为了实现内核与应用层数据交互则必须有通信的方法,微软为我们提供了三种通信方式,如下先来介绍通过`ReadFile`系列函数实现的通信模式。
282 0
驱动开发:通过ReadFile与内核层通信
|
11月前
|
Ubuntu Linux 开发者
韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点
韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点
109 0